merged: Platinum from linuxport branches
[xbmc:xbmc-antiquated.git] / xbmc / lib / libUPnP / Platinum / Source / Apps / MicroMediaController / PltMicroMediaController.h
1 /*****************************************************************\r
2 |\r
3 |   Platinum - Micro Media Controller\r
4 |\r
5 |   Copyright (c) 2004-2008 Sylvain Rebaud\r
6 |   Author: Sylvain Rebaud (sylvain@rebaud.com)\r
7 |\r
8 ****************************************************************/\r
9 \r
10 #ifndef _MICRO_MEDIA_CONTROLLER_H_\r
11 #define _MICRO_MEDIA_CONTROLLER_H_\r
12 \r
13 #include "Platinum.h"\r
14 #include "PltMediaServer.h"\r
15 #include "PltSyncMediaBrowser.h"\r
16 #include "PltMediaController.h"\r
17 #include "NptMap.h"\r
18 #include "NptStack.h"\r
19 \r
20 /*----------------------------------------------------------------------\r
21  |   definitions\r
22  +---------------------------------------------------------------------*/\r
23 typedef NPT_Map<NPT_String, NPT_String>        PLT_StringMap;\r
24 typedef NPT_Lock<PLT_StringMap>                PLT_LockStringMap;\r
25 typedef NPT_Map<NPT_String, NPT_String>::Entry PLT_StringMapEntry;\r
26 \r
27 /*----------------------------------------------------------------------\r
28  |   PLT_MediaItemIDFinder\r
29  +---------------------------------------------------------------------*/\r
30 class PLT_MediaItemIDFinder\r
31 {\r
32 public:\r
33     // methods\r
34     PLT_MediaItemIDFinder(const char* object_id) : m_ObjectID(object_id) {}\r
35 \r
36     bool operator()(const PLT_MediaObject* const & item) const {\r
37         return item->m_ObjectID.Compare(m_ObjectID, true) ? false : true;\r
38     }\r
39 \r
40 private:\r
41     // members\r
42     NPT_String m_ObjectID;\r
43 };\r
44 \r
45 /*----------------------------------------------------------------------\r
46  |   PLT_MicroMediaController\r
47  +---------------------------------------------------------------------*/\r
48 class PLT_MicroMediaController : public PLT_MediaControllerListener\r
49 {\r
50 public:\r
51     PLT_MicroMediaController(PLT_CtrlPointReference& ctrlPoint);\r
52     virtual ~PLT_MicroMediaController();\r
53 \r
54     void ProcessCommandLoop();\r
55 \r
56     // PLT_MediaControllerListener\r
57     void OnMRAddedRemoved(PLT_DeviceDataReference& device, int added);\r
58     void OnMRStateVariablesChanged(PLT_Service* /* service */, NPT_List<PLT_StateVariable*>* /* vars */) {};\r
59 \r
60 private:\r
61     const char* ChooseIDFromTable(PLT_StringMap& table);\r
62     void        PopDirectoryStackToRoot(void);\r
63     NPT_Result  DoBrowse();\r
64 \r
65     void        GetCurMediaServer(PLT_DeviceDataReference& server);\r
66     void        GetCurMediaRenderer(PLT_DeviceDataReference& renderer);\r
67 \r
68     PLT_DeviceDataReference ChooseDevice(const NPT_Lock<PLT_DeviceMap>& deviceList);\r
69 \r
70     // Command Handlers\r
71     void    HandleCmd_scan(const char* ip);\r
72     void    HandleCmd_getms();\r
73     void    HandleCmd_setms();\r
74     void    HandleCmd_ls();\r
75     void    HandleCmd_cd();\r
76     void    HandleCmd_cdup();\r
77     void    HandleCmd_pwd();\r
78     void    HandleCmd_help();\r
79     void    HandleCmd_getmr();\r
80     void    HandleCmd_setmr();\r
81     void    HandleCmd_open();\r
82     void    HandleCmd_play();\r
83     void    HandleCmd_stop();\r
84 \r
85 private:\r
86     /* The tables of known devices on the network.  These are updated via the\r
87      * OnMSAddedRemoved and OnMRAddedRemoved callbacks.  Note that you should first lock\r
88      * before accessing them using the NPT_Map::Lock function.\r
89      */\r
90     NPT_Lock<PLT_DeviceMap> m_MediaServers;\r
91     NPT_Lock<PLT_DeviceMap> m_MediaRenderers;\r
92 \r
93     /* The UPnP MediaServer control point. */\r
94     PLT_SyncMediaBrowser*   m_MediaBrowser;\r
95 \r
96     /* The UPnP MediaRenderer control point. */\r
97     PLT_MediaController*    m_MediaController;\r
98 \r
99     /* The currently selected media server as well as \r
100      * a lock.  If you ever want to hold both the m_CurMediaRendererLock lock and the \r
101      * m_CurMediaServerLock lock, make sure you grab the server lock first.\r
102      */\r
103     PLT_DeviceDataReference m_CurMediaServer;\r
104     NPT_Mutex               m_CurMediaServerLock;\r
105 \r
106     /* The currently selected media renderer as well as \r
107      * a lock.  If you ever want to hold both the m_CurMediaRendererLock lock and the \r
108      * m_CurMediaServerLock lock, make sure you grab the server lock first.\r
109      */\r
110     PLT_DeviceDataReference m_CurMediaRenderer;\r
111     NPT_Mutex               m_CurMediaRendererLock;\r
112 \r
113     /* the most recent results from a browse request.  The results come back in a \r
114      * callback instead of being returned to the calling function, so this \r
115      * global variable is necessary in order to give the results back to the calling \r
116      * function.\r
117      */\r
118     PLT_MediaObjectListReference m_MostRecentBrowseResults;\r
119 \r
120     /* When browsing through the tree on a media server, this is the stack \r
121      * symbolizing the current position in the tree.  The contents of the \r
122      * stack are the object ID's of the nodes.  Note that the object id: "0" should\r
123      * always be at the bottom of the stack.\r
124      */\r
125     NPT_Stack<NPT_String> m_CurBrowseDirectoryStack;\r
126 \r
127     /* the semaphore on which to block when waiting for a response from over\r
128      * the network \r
129      */\r
130     NPT_SharedVariable m_CallbackResponseSemaphore;\r
131 };\r
132 \r
133 #endif /* _MICRO_MEDIA_CONTROLLER_H_ */\r
134 \r