upnp: move UpnpInstanceWrapper to upnp-wrapper
[vlc.git] / modules / services_discovery / upnp.hpp
1 /*****************************************************************************
2  * upnp.hpp :  UPnP discovery module (libupnp) header
3  *****************************************************************************
4  * Copyright (C) 2004-2018 VLC authors and VideoLAN
5  *
6  * Authors: Rémi Denis-Courmont <rem # videolan.org> (original plugin)
7  *          Christian Henz <henz # c-lab.de>
8  *          Mirsal Ennaime <mirsal dot ennaime at gmail dot com>
9  *          Hugo Beauzée-Luyssen <hugo@beauzee.fr>
10  *          Shaleen Jain <shaleen@jain.sh>
11  *
12  * This program is free software; you can redistribute it and/or modify it
13  * under the terms of the GNU Lesser General Public License as published by
14  * the Free Software Foundation; either version 2.1 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public License
23  * along with this program; if not, write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25  *****************************************************************************/
26 #include "upnp-wrapper.hpp"
27
28 #include <vector>
29 #include <string>
30
31 #ifdef _WIN32
32 #include <windows.h>
33 #include <wincrypt.h>
34 #endif
35
36 #include <vlc_url.h>
37
38 namespace SD
39 {
40
41 struct MediaServerDesc
42 {
43     MediaServerDesc( const std::string& udn, const std::string& fName,
44                     const std::string& loc, const std::string& iconUrl );
45     ~MediaServerDesc();
46     std::string UDN;
47     std::string friendlyName;
48     std::string location;
49     std::string iconUrl;
50     input_item_t* inputItem;
51     bool isSatIp;
52     std::string satIpHost;
53 };
54
55
56 class MediaServerList : public UpnpInstanceWrapper::Listener
57 {
58 public:
59
60     MediaServerList( services_discovery_t* p_sd );
61     ~MediaServerList();
62
63     bool addServer(MediaServerDesc *desc );
64     void removeServer(const std::string &udn );
65     MediaServerDesc* getServer( const std::string& udn );
66     int onEvent( Upnp_EventType event_type,
67                  UpnpEventPtr p_event,
68                  void* p_user_data ) override;
69
70 private:
71     void parseNewServer( IXML_Document* doc, const std::string& location );
72     std::string getIconURL( IXML_Element* p_device_elem , const char* psz_base_url );
73
74 private:
75     services_discovery_t* const m_sd;
76     std::vector<MediaServerDesc*> m_list;
77 };
78
79 }
80
81 namespace Access
82 {
83
84 class Upnp_i11e_cb
85 {
86 public:
87     Upnp_i11e_cb( Upnp_FunPtr callback, void *cookie );
88     ~Upnp_i11e_cb();
89     void waitAndRelease( void );
90     static int run( Upnp_EventType, UpnpEventPtr, void *);
91
92 private:
93     vlc_sem_t       m_sem;
94     vlc_mutex_t     m_lock;
95     int             m_refCount;
96     Upnp_FunPtr     m_callback;
97     void*           m_cookie;
98 };
99
100 class MediaServer
101 {
102 public:
103     MediaServer( stream_t* p_access, input_item_node_t* node );
104     ~MediaServer();
105     bool fetchContents();
106
107 private:
108     MediaServer(const MediaServer&);
109     MediaServer& operator=(const MediaServer&);
110
111     bool addContainer( IXML_Element* containerElement );
112     bool addItem( IXML_Element* itemElement );
113
114     IXML_Document* _browseAction(const char*, const char*,
115             const char*, const char*, const char* );
116     static int sendActionCb( Upnp_EventType, UpnpEventPtr, void *);
117
118 private:
119     char* m_psz_root;
120     char* m_psz_objectId;
121     stream_t* m_access;
122     input_item_node_t* m_node;
123 };
124
125 }