Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
2d8eb31e
Commit
2d8eb31e
authored
Jun 03, 2010
by
Austin Burrow
Committed by
Jean-Baptiste Kempf
Jun 08, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
UPNP: Cleaned up code so it goes by the code conventions.
Signed-off-by:
Jean-Baptiste Kempf
<
jb@videolan.org
>
parent
b5ddf37d
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
246 additions
and
246 deletions
+246
-246
modules/services_discovery/upnp_intel.cpp
modules/services_discovery/upnp_intel.cpp
+246
-246
No files found.
modules/services_discovery/upnp_intel.cpp
View file @
2d8eb31e
...
@@ -47,9 +47,9 @@ const char* CONTENT_DIRECTORY_SERVICE_TYPE = "urn:schemas-upnp-org:service:Conte
...
@@ -47,9 +47,9 @@ const char* CONTENT_DIRECTORY_SERVICE_TYPE = "urn:schemas-upnp-org:service:Conte
// VLC handle
// VLC handle
struct
services_discovery_sys_t
struct
services_discovery_sys_t
{
{
UpnpClient_Handle
client
H
andle
;
UpnpClient_Handle
client
_h
andle
;
MediaServerList
*
serverL
ist
;
MediaServerList
*
p_server_l
ist
;
vlc_mutex_t
callback
L
ock
;
vlc_mutex_t
callback
_l
ock
;
};
};
// VLC callback prototypes
// VLC callback prototypes
...
@@ -73,19 +73,19 @@ vlc_module_end();
...
@@ -73,19 +73,19 @@ vlc_module_end();
// More prototypes...
// More prototypes...
static
int
Callback
(
Upnp_EventType
event
Type
,
void
*
event
,
void
*
user_data
);
static
int
Callback
(
Upnp_EventType
event
_type
,
void
*
p_event
,
void
*
p_
user_data
);
const
char
*
xml_getChildElementValue
(
IXML_Element
*
parent
,
const
char
*
xml_getChildElementValue
(
IXML_Element
*
p
_p
arent
,
const
char
*
tagN
ame
);
const
char
*
psz_tag_n
ame
);
IXML_Document
*
parseBrowseResult
(
IXML_Document
*
doc
);
IXML_Document
*
parseBrowseResult
(
IXML_Document
*
p_
doc
);
// VLC callbacks...
// VLC callbacks...
static
int
Open
(
vlc_object_t
*
p_this
)
static
int
Open
(
vlc_object_t
*
p_this
)
{
{
int
res
;
int
i_
res
;
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
p_this
;
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
p_this
;
services_discovery_sys_t
*
p_sys
=
(
services_discovery_sys_t
*
)
services_discovery_sys_t
*
p_sys
=
(
services_discovery_sys_t
*
)
calloc
(
1
,
sizeof
(
services_discovery_sys_t
)
);
calloc
(
1
,
sizeof
(
services_discovery_sys_t
)
);
...
@@ -93,39 +93,39 @@ static int Open( vlc_object_t *p_this )
...
@@ -93,39 +93,39 @@ static int Open( vlc_object_t *p_this )
if
(
!
(
p_sd
->
p_sys
=
p_sys
))
if
(
!
(
p_sd
->
p_sys
=
p_sys
))
return
VLC_ENOMEM
;
return
VLC_ENOMEM
;
res
=
UpnpInit
(
0
,
0
);
i_
res
=
UpnpInit
(
0
,
0
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
res
)
);
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
i_
res
)
);
free
(
p_sys
);
free
(
p_sys
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
p_sys
->
serverL
ist
=
new
MediaServerList
(
p_sd
);
p_sys
->
p_server_l
ist
=
new
MediaServerList
(
p_sd
);
vlc_mutex_init
(
&
p_sys
->
callback
L
ock
);
vlc_mutex_init
(
&
p_sys
->
callback
_l
ock
);
res
=
UpnpRegisterClient
(
Callback
,
p_sd
,
&
p_sys
->
clientH
andle
);
i_res
=
UpnpRegisterClient
(
Callback
,
p_sd
,
&
p_sys
->
client_h
andle
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
res
)
);
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
i_
res
)
);
Close
(
(
vlc_object_t
*
)
p_sd
);
Close
(
(
vlc_object_t
*
)
p_sd
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
res
=
UpnpSearchAsync
(
p_sys
->
clientH
andle
,
5
,
i_res
=
UpnpSearchAsync
(
p_sys
->
client_h
andle
,
5
,
MEDIA_SERVER_DEVICE_TYPE
,
p_sd
);
MEDIA_SERVER_DEVICE_TYPE
,
p_sd
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
res
)
);
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
i_
res
)
);
Close
(
(
vlc_object_t
*
)
p_sd
);
Close
(
(
vlc_object_t
*
)
p_sd
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
res
=
UpnpSetMaxContentLength
(
262144
);
i_
res
=
UpnpSetMaxContentLength
(
262144
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
res
)
);
msg_Err
(
p_sd
,
"%s"
,
UpnpGetErrorMessage
(
i_
res
)
);
Close
(
(
vlc_object_t
*
)
p_sd
);
Close
(
(
vlc_object_t
*
)
p_sd
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
...
@@ -138,8 +138,8 @@ static void Close( vlc_object_t *p_this )
...
@@ -138,8 +138,8 @@ static void Close( vlc_object_t *p_this )
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
p_this
;
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
p_this
;
UpnpFinish
();
UpnpFinish
();
delete
p_sd
->
p_sys
->
serverL
ist
;
delete
p_sd
->
p_sys
->
p_server_l
ist
;
vlc_mutex_destroy
(
&
p_sd
->
p_sys
->
callback
L
ock
);
vlc_mutex_destroy
(
&
p_sd
->
p_sys
->
callback
_l
ock
);
free
(
p_sd
->
p_sys
);
free
(
p_sd
->
p_sys
);
}
}
...
@@ -147,106 +147,106 @@ static void Close( vlc_object_t *p_this )
...
@@ -147,106 +147,106 @@ static void Close( vlc_object_t *p_this )
// XML utility functions:
// XML utility functions:
// Returns the value of a child element, or 0 on error
// Returns the value of a child element, or 0 on error
const
char
*
xml_getChildElementValue
(
IXML_Element
*
parent
,
const
char
*
xml_getChildElementValue
(
IXML_Element
*
p
_p
arent
,
const
char
*
tagN
ame
)
const
char
*
_psz_tag_n
ame
)
{
{
if
(
!
parent
)
return
0
;
if
(
!
p
_p
arent
)
return
0
;
if
(
!
tagN
ame
)
return
0
;
if
(
!
_psz_tag_n
ame
)
return
0
;
char
*
s
=
strdup
(
tagN
ame
);
char
*
psz_tag_name
=
strdup
(
_psz_tag_n
ame
);
IXML_NodeList
*
nodeList
=
ixmlElement_getElementsByTagName
(
parent
,
s
);
IXML_NodeList
*
p_node_list
=
ixmlElement_getElementsByTagName
(
p_parent
,
psz_tag_name
);
free
(
s
);
free
(
psz_tag_name
);
if
(
!
nodeL
ist
)
return
0
;
if
(
!
p_node_l
ist
)
return
0
;
IXML_Node
*
element
=
ixmlNodeList_item
(
nodeL
ist
,
0
);
IXML_Node
*
p_element
=
ixmlNodeList_item
(
p_node_l
ist
,
0
);
ixmlNodeList_free
(
nodeL
ist
);
ixmlNodeList_free
(
p_node_l
ist
);
if
(
!
element
)
return
0
;
if
(
!
p_
element
)
return
0
;
IXML_Node
*
textNode
=
ixmlNode_getFirstChild
(
element
);
IXML_Node
*
p_text_node
=
ixmlNode_getFirstChild
(
p_
element
);
if
(
!
textN
ode
)
return
0
;
if
(
!
p_text_n
ode
)
return
0
;
return
ixmlNode_getNodeValue
(
textN
ode
);
return
ixmlNode_getNodeValue
(
p_text_n
ode
);
}
}
// Extracts the result document from a SOAP response
// Extracts the result document from a SOAP response
IXML_Document
*
parseBrowseResult
(
IXML_Document
*
doc
)
IXML_Document
*
parseBrowseResult
(
IXML_Document
*
p_
doc
)
{
{
ixmlRelaxParser
(
1
);
ixmlRelaxParser
(
1
);
if
(
!
doc
)
return
0
;
if
(
!
p_
doc
)
return
0
;
IXML_NodeList
*
resultList
=
ixmlDocument_getElementsByTagName
(
doc
,
IXML_NodeList
*
p_result_list
=
ixmlDocument_getElementsByTagName
(
p_
doc
,
"Result"
);
"Result"
);
if
(
!
resultL
ist
)
return
0
;
if
(
!
p_result_l
ist
)
return
0
;
IXML_Node
*
resultNode
=
ixmlNodeList_item
(
resultL
ist
,
0
);
IXML_Node
*
p_result_node
=
ixmlNodeList_item
(
p_result_l
ist
,
0
);
ixmlNodeList_free
(
resultL
ist
);
ixmlNodeList_free
(
p_result_l
ist
);
if
(
!
resultN
ode
)
return
0
;
if
(
!
p_result_n
ode
)
return
0
;
IXML_Node
*
textNode
=
ixmlNode_getFirstChild
(
resultN
ode
);
IXML_Node
*
p_text_node
=
ixmlNode_getFirstChild
(
p_result_n
ode
);
if
(
!
textN
ode
)
return
0
;
if
(
!
p_text_n
ode
)
return
0
;
const
char
*
resultString
=
ixmlNode_getNodeValue
(
textN
ode
);
const
char
*
psz_result_string
=
ixmlNode_getNodeValue
(
p_text_n
ode
);
char
*
resultXML
=
strdup
(
resultS
tring
);
char
*
psz_result_xml
=
strdup
(
psz_result_s
tring
);
IXML_Document
*
browseDoc
=
ixmlParseBuffer
(
resultXML
);
IXML_Document
*
p_browse_doc
=
ixmlParseBuffer
(
psz_result_xml
);
free
(
resultXML
);
free
(
psz_result_xml
);
return
browseD
oc
;
return
p_browse_d
oc
;
}
}
// Handles all UPnP events
// Handles all UPnP events
static
int
Callback
(
Upnp_EventType
event
Type
,
void
*
event
,
void
*
user_data
)
static
int
Callback
(
Upnp_EventType
event
_type
,
void
*
p_event
,
void
*
p_
user_data
)
{
{
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
user_data
;
services_discovery_t
*
p_sd
=
(
services_discovery_t
*
)
p_
user_data
;
services_discovery_sys_t
*
p_sys
=
p_sd
->
p_sys
;
services_discovery_sys_t
*
p_sys
=
p_sd
->
p_sys
;
vlc_mutex_locker
locker
(
&
p_sys
->
callbackLock
);
vlc_mutex_locker
locker
(
&
p_sys
->
callback_lock
);
switch
(
eventType
)
{
switch
(
event_type
)
{
case
UPNP_DISCOVERY_ADVERTISEMENT_ALIVE
:
case
UPNP_DISCOVERY_ADVERTISEMENT_ALIVE
:
case
UPNP_DISCOVERY_SEARCH_RESULT
:
case
UPNP_DISCOVERY_SEARCH_RESULT
:
{
{
struct
Upnp_Discovery
*
discovery
=
(
struct
Upnp_Discovery
*
)
event
;
struct
Upnp_Discovery
*
p_discovery
=
(
struct
Upnp_Discovery
*
)
p_
event
;
IXML_Document
*
descriptionD
oc
=
0
;
IXML_Document
*
p_description_d
oc
=
0
;
int
res
;
int
i_
res
;
res
=
UpnpDownloadXmlDoc
(
discovery
->
Location
,
&
descriptionD
oc
);
i_res
=
UpnpDownloadXmlDoc
(
p_discovery
->
Location
,
&
p_description_d
oc
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
p_sd
,
msg_Dbg
(
p_sd
,
"%s:%d: Could not download device description!"
,
"%s:%d: Could not download device description!"
,
__FILE__
,
__LINE__
);
__FILE__
,
__LINE__
);
return
res
;
return
i_
res
;
}
}
MediaServer
::
parseDeviceDescription
(
descriptionD
oc
,
MediaServer
::
parseDeviceDescription
(
p_description_d
oc
,
discovery
->
Location
,
p_sd
);
p_
discovery
->
Location
,
p_sd
);
ixmlDocument_free
(
descriptionD
oc
);
ixmlDocument_free
(
p_description_d
oc
);
}
}
break
;
break
;
case
UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE
:
case
UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE
:
{
{
struct
Upnp_Discovery
*
discovery
=
(
struct
Upnp_Discovery
*
)
event
;
struct
Upnp_Discovery
*
p_discovery
=
(
struct
Upnp_Discovery
*
)
p_
event
;
p_sys
->
serverList
->
removeServer
(
discovery
->
DeviceId
);
p_sys
->
p_server_list
->
removeServer
(
p_
discovery
->
DeviceId
);
}
}
break
;
break
;
case
UPNP_EVENT_RECEIVED
:
case
UPNP_EVENT_RECEIVED
:
{
{
Upnp_Event
*
e
=
(
Upnp_Event
*
)
event
;
Upnp_Event
*
p_e
=
(
Upnp_Event
*
)
p_
event
;
MediaServer
*
server
=
p_sys
->
serverList
->
getServerBySID
(
e
->
Sid
);
MediaServer
*
p_server
=
p_sys
->
p_server_list
->
getServerBySID
(
p_
e
->
Sid
);
if
(
server
)
server
->
fetchContents
();
if
(
p_server
)
p_
server
->
fetchContents
();
}
}
break
;
break
;
...
@@ -255,10 +255,10 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
...
@@ -255,10 +255,10 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
{
{
// Re-subscribe...
// Re-subscribe...
Upnp_Event_Subscribe
*
s
=
(
Upnp_Event_Subscribe
*
)
event
;
Upnp_Event_Subscribe
*
p_s
=
(
Upnp_Event_Subscribe
*
)
p_
event
;
MediaServer
*
server
=
p_sys
->
serverList
->
getServerBySID
(
s
->
Sid
);
MediaServer
*
p_server
=
p_sys
->
p_server_list
->
getServerBySID
(
p_
s
->
Sid
);
if
(
server
)
server
->
subscribeToContentDirectory
();
if
(
p_server
)
p_
server
->
subscribeToContentDirectory
();
}
}
break
;
break
;
...
@@ -273,7 +273,7 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
...
@@ -273,7 +273,7 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
default:
default:
msg_Dbg
(
p_sd
,
msg_Dbg
(
p_sd
,
"%s:%d: DEBUG: UNHANDLED EVENT ( TYPE=%d )"
,
"%s:%d: DEBUG: UNHANDLED EVENT ( TYPE=%d )"
,
__FILE__
,
__LINE__
,
event
T
ype
);
__FILE__
,
__LINE__
,
event
_t
ype
);
break
;
break
;
}
}
...
@@ -285,54 +285,54 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
...
@@ -285,54 +285,54 @@ static int Callback( Upnp_EventType eventType, void* event, void* user_data )
// MediaServer...
// MediaServer...
void
MediaServer
::
parseDeviceDescription
(
IXML_Document
*
doc
,
void
MediaServer
::
parseDeviceDescription
(
IXML_Document
*
p_
doc
,
const
char
*
location
,
const
char
*
p_
location
,
services_discovery_t
*
p_sd
)
services_discovery_t
*
p_sd
)
{
{
if
(
!
doc
)
if
(
!
p_
doc
)
{
{
msg_Dbg
(
p_sd
,
"%s:%d: NULL"
,
__FILE__
,
__LINE__
);
msg_Dbg
(
p_sd
,
"%s:%d: NULL"
,
__FILE__
,
__LINE__
);
return
;
return
;
}
}
if
(
!
location
)
if
(
!
p_
location
)
{
{
msg_Dbg
(
p_sd
,
"%s:%d: NULL"
,
__FILE__
,
__LINE__
);
msg_Dbg
(
p_sd
,
"%s:%d: NULL"
,
__FILE__
,
__LINE__
);
return
;
return
;
}
}
const
char
*
baseURL
=
location
;
const
char
*
psz_base_url
=
p_
location
;
// Try to extract baseURL
// Try to extract baseURL
IXML_NodeList
*
urlList
=
ixmlDocument_getElementsByTagName
(
doc
,
"baseURL"
);
IXML_NodeList
*
p_url_list
=
ixmlDocument_getElementsByTagName
(
p_
doc
,
"baseURL"
);
if
(
!
urlL
ist
)
if
(
!
p_url_l
ist
)
{
{
if
(
IXML_Node
*
urlNode
=
ixmlNodeList_item
(
urlL
ist
,
0
)
)
if
(
IXML_Node
*
p_url_node
=
ixmlNodeList_item
(
p_url_l
ist
,
0
)
)
{
{
IXML_Node
*
textNode
=
ixmlNode_getFirstChild
(
urlN
ode
);
IXML_Node
*
p_text_node
=
ixmlNode_getFirstChild
(
p_url_n
ode
);
if
(
textNode
)
baseURL
=
ixmlNode_getNodeValue
(
textN
ode
);
if
(
p_text_node
)
psz_base_url
=
ixmlNode_getNodeValue
(
p_text_n
ode
);
}
}
ixmlNodeList_free
(
urlL
ist
);
ixmlNodeList_free
(
p_url_l
ist
);
}
}
// Get devices
// Get devices
IXML_NodeList
*
deviceL
ist
=
IXML_NodeList
*
p_device_l
ist
=
ixmlDocument_getElementsByTagName
(
doc
,
"device"
);
ixmlDocument_getElementsByTagName
(
p_
doc
,
"device"
);
if
(
deviceL
ist
)
if
(
p_device_l
ist
)
{
{
for
(
unsigned
int
i
=
0
;
i
<
ixmlNodeList_length
(
deviceL
ist
);
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
ixmlNodeList_length
(
p_device_l
ist
);
i
++
)
{
{
IXML_Element
*
deviceE
lement
=
IXML_Element
*
p_device_e
lement
=
(
IXML_Element
*
)
ixmlNodeList_item
(
deviceL
ist
,
i
);
(
IXML_Element
*
)
ixmlNodeList_item
(
p_device_l
ist
,
i
);
const
char
*
deviceType
=
xml_getChildElementValue
(
deviceE
lement
,
const
char
*
psz_device_type
=
xml_getChildElementValue
(
p_device_e
lement
,
"deviceType"
);
"deviceType"
);
if
(
!
deviceT
ype
)
if
(
!
psz_device_t
ype
)
{
{
msg_Dbg
(
p_sd
,
msg_Dbg
(
p_sd
,
"%s:%d: no deviceType!"
,
"%s:%d: no deviceType!"
,
...
@@ -340,131 +340,131 @@ void MediaServer::parseDeviceDescription( IXML_Document* doc,
...
@@ -340,131 +340,131 @@ void MediaServer::parseDeviceDescription( IXML_Document* doc,
continue
;
continue
;
}
}
if
(
strcmp
(
MEDIA_SERVER_DEVICE_TYPE
,
deviceT
ype
)
!=
0
)
if
(
strcmp
(
MEDIA_SERVER_DEVICE_TYPE
,
psz_device_t
ype
)
!=
0
)
continue
;
continue
;
const
char
*
UDN
=
xml_getChildElementValue
(
deviceE
lement
,
"UDN"
);
const
char
*
psz_udn
=
xml_getChildElementValue
(
p_device_e
lement
,
"UDN"
);
if
(
!
UDN
)
if
(
!
psz_udn
)
{
{
msg_Dbg
(
p_sd
,
"%s:%d: no UDN!"
,
msg_Dbg
(
p_sd
,
"%s:%d: no UDN!"
,
__FILE__
,
__LINE__
);
__FILE__
,
__LINE__
);
continue
;
continue
;
}
}
if
(
p_sd
->
p_sys
->
serverList
->
getServer
(
UDN
)
!=
0
)
if
(
p_sd
->
p_sys
->
p_server_list
->
getServer
(
psz_udn
)
!=
0
)
continue
;
continue
;
const
char
*
friendlyN
ame
=
const
char
*
psz_friendly_n
ame
=
xml_getChildElementValue
(
deviceE
lement
,
xml_getChildElementValue
(
p_device_e
lement
,
"friendlyName"
);
"friendlyName"
);
if
(
!
friendlyN
ame
)
if
(
!
psz_friendly_n
ame
)
{
{
msg_Dbg
(
p_sd
,
"%s:%d: no friendlyName!"
,
__FILE__
,
__LINE__
);
msg_Dbg
(
p_sd
,
"%s:%d: no friendlyName!"
,
__FILE__
,
__LINE__
);
continue
;
continue
;
}
}
MediaServer
*
server
=
new
MediaServer
(
UDN
,
friendlyN
ame
,
p_sd
);
MediaServer
*
p_server
=
new
MediaServer
(
psz_udn
,
psz_friendly_n
ame
,
p_sd
);
if
(
!
p_sd
->
p_sys
->
serverList
->
addServer
(
server
)
)
if
(
!
p_sd
->
p_sys
->
p_server_list
->
addServer
(
p_
server
)
)
{
{
delete
server
;
delete
p_
server
;
server
=
0
;
p_
server
=
0
;
continue
;
continue
;
}
}
// Check for ContentDirectory service...
// Check for ContentDirectory service...
IXML_NodeList
*
serviceL
ist
=
IXML_NodeList
*
p_service_l
ist
=
ixmlElement_getElementsByTagName
(
deviceE
lement
,
ixmlElement_getElementsByTagName
(
p_device_e
lement
,
"service"
);
"service"
);
if
(
serviceL
ist
)
if
(
p_service_l
ist
)
{
{
for
(
unsigned
int
j
=
0
;
for
(
unsigned
int
j
=
0
;
j
<
ixmlNodeList_length
(
serviceL
ist
);
j
++
)
j
<
ixmlNodeList_length
(
p_service_l
ist
);
j
++
)
{
{
IXML_Element
*
serviceE
lement
=
IXML_Element
*
p_service_e
lement
=
(
IXML_Element
*
)
ixmlNodeList_item
(
serviceL
ist
,
j
);
(
IXML_Element
*
)
ixmlNodeList_item
(
p_service_l
ist
,
j
);
const
char
*
serviceT
ype
=
const
char
*
psz_service_t
ype
=
xml_getChildElementValue
(
serviceE
lement
,
xml_getChildElementValue
(
p_service_e
lement
,
"serviceType"
);
"serviceType"
);
if
(
!
serviceT
ype
)
if
(
!
psz_service_t
ype
)
continue
;
continue
;
if
(
strcmp
(
CONTENT_DIRECTORY_SERVICE_TYPE
,
if
(
strcmp
(
CONTENT_DIRECTORY_SERVICE_TYPE
,
serviceT
ype
)
!=
0
)
psz_service_t
ype
)
!=
0
)
continue
;
continue
;
const
char
*
eventSubURL
=
const
char
*
psz_event_sub_url
=
xml_getChildElementValue
(
serviceE
lement
,
xml_getChildElementValue
(
p_service_e
lement
,
"eventSubURL"
);
"eventSubURL"
);
if
(
!
eventSubURL
)
if
(
!
psz_event_sub_url
)
continue
;
continue
;
const
char
*
controlURL
=
const
char
*
psz_control_url
=
xml_getChildElementValue
(
serviceE
lement
,
xml_getChildElementValue
(
p_service_e
lement
,
"controlURL"
);
"controlURL"
);
if
(
!
controlURL
)
if
(
!
psz_control_url
)
continue
;
continue
;
// Try to subscribe to ContentDirectory service
// Try to subscribe to ContentDirectory service
char
*
url
=
(
char
*
)
malloc
(
strlen
(
baseURL
)
+
char
*
psz_url
=
(
char
*
)
malloc
(
strlen
(
psz_base_url
)
+
strlen
(
eventSubURL
)
+
1
);
strlen
(
psz_event_sub_url
)
+
1
);
if
(
url
)
if
(
psz_
url
)
{
{
char
*
s1
=
strdup
(
baseURL
);
char
*
psz_s1
=
strdup
(
psz_base_url
);
char
*
s2
=
strdup
(
eventSubURL
);
char
*
psz_s2
=
strdup
(
psz_event_sub_url
);
if
(
UpnpResolveURL
(
s1
,
s2
,
url
)
==
if
(
UpnpResolveURL
(
psz_s1
,
psz_s2
,
psz_
url
)
==
UPNP_E_SUCCESS
)
UPNP_E_SUCCESS
)
{
{
server
->
setContentDirectoryEventURL
(
url
);
p_server
->
setContentDirectoryEventURL
(
psz_
url
);
server
->
subscribeToContentDirectory
();
p_
server
->
subscribeToContentDirectory
();
}
}
free
(
s1
);
free
(
psz_
s1
);
free
(
s2
);
free
(
psz_
s2
);
free
(
url
);
free
(
psz_
url
);
}
}
// Try to browse content directory...
// Try to browse content directory...
url
=
(
char
*
)
malloc
(
strlen
(
baseURL
)
+
psz_url
=
(
char
*
)
malloc
(
strlen
(
psz_base_url
)
+
strlen
(
controlURL
)
+
1
);
strlen
(
psz_control_url
)
+
1
);
if
(
url
)
if
(
psz_
url
)
{
{
char
*
s1
=
strdup
(
baseURL
);
char
*
psz_s1
=
strdup
(
psz_base_url
);
char
*
s2
=
strdup
(
controlURL
);
char
*
psz_s2
=
strdup
(
psz_control_url
);
if
(
UpnpResolveURL
(
s1
,
s2
,
url
)
==
if
(
UpnpResolveURL
(
psz_s1
,
psz_s2
,
psz_
url
)
==
UPNP_E_SUCCESS
)
UPNP_E_SUCCESS
)
{
{
server
->
setContentDirectoryControlURL
(
url
);
p_server
->
setContentDirectoryControlURL
(
psz_
url
);
server
->
fetchContents
();
p_
server
->
fetchContents
();
}
}
free
(
s1
);
free
(
psz_
s1
);
free
(
s2
);
free
(
psz_
s2
);
free
(
url
);
free
(
psz_
url
);
}
}
}
}
ixmlNodeList_free
(
serviceL
ist
);
ixmlNodeList_free
(
p_service_l
ist
);
}
}
}
}
ixmlNodeList_free
(
deviceL
ist
);
ixmlNodeList_free
(
p_device_l
ist
);
}
}
}
}
MediaServer
::
MediaServer
(
const
char
*
UDN
,
MediaServer
::
MediaServer
(
const
char
*
psz_udn
,
const
char
*
friendlyN
ame
,
const
char
*
psz_friendly_n
ame
,
services_discovery_t
*
p_sd
)
services_discovery_t
*
p_sd
)
{
{
_p_sd
=
p_sd
;
_p_sd
=
p_sd
;
_UDN
=
UDN
;
_UDN
=
psz_udn
;
_friendlyName
=
friendlyN
ame
;
_friendlyName
=
psz_friendly_n
ame
;
_contents
=
NULL
;
_contents
=
NULL
;
_inputItem
=
NULL
;
_inputItem
=
NULL
;
...
@@ -487,9 +487,9 @@ const char* MediaServer::getFriendlyName() const
...
@@ -487,9 +487,9 @@ const char* MediaServer::getFriendlyName() const
return
s
;
return
s
;
}
}
void
MediaServer
::
setContentDirectoryEventURL
(
const
char
*
url
)
void
MediaServer
::
setContentDirectoryEventURL
(
const
char
*
psz_
url
)
{
{
_contentDirectoryEventURL
=
url
;
_contentDirectoryEventURL
=
psz_
url
;
}
}
const
char
*
MediaServer
::
getContentDirectoryEventURL
()
const
const
char
*
MediaServer
::
getContentDirectoryEventURL
()
const
...
@@ -498,9 +498,9 @@ const char* MediaServer::getContentDirectoryEventURL() const
...
@@ -498,9 +498,9 @@ const char* MediaServer::getContentDirectoryEventURL() const
return
s
;
return
s
;
}
}
void
MediaServer
::
setContentDirectoryControlURL
(
const
char
*
url
)
void
MediaServer
::
setContentDirectoryControlURL
(
const
char
*
psz_
url
)
{
{
_contentDirectoryControlURL
=
url
;
_contentDirectoryControlURL
=
psz_
url
;
}
}
const
char
*
MediaServer
::
getContentDirectoryControlURL
()
const
const
char
*
MediaServer
::
getContentDirectoryControlURL
()
const
...
@@ -510,28 +510,28 @@ const char* MediaServer::getContentDirectoryControlURL() const
...
@@ -510,28 +510,28 @@ const char* MediaServer::getContentDirectoryControlURL() const
void
MediaServer
::
subscribeToContentDirectory
()
void
MediaServer
::
subscribeToContentDirectory
()
{
{
const
char
*
url
=
getContentDirectoryEventURL
();
const
char
*
psz_
url
=
getContentDirectoryEventURL
();
if
(
!
url
||
strcmp
(
url
,
""
)
==
0
)
if
(
!
psz_url
||
strcmp
(
psz_
url
,
""
)
==
0
)
{
{
msg_Dbg
(
_p_sd
,
"No subscription url set!"
);
msg_Dbg
(
_p_sd
,
"No subscription url set!"
);
return
;
return
;
}
}
int
timeO
ut
=
1810
;
int
i_timeo
ut
=
1810
;
Upnp_SID
sid
;
Upnp_SID
sid
;
int
res
=
UpnpSubscribe
(
_p_sd
->
p_sys
->
clientHandle
,
url
,
&
timeO
ut
,
sid
);
int
i_res
=
UpnpSubscribe
(
_p_sd
->
p_sys
->
client_handle
,
psz_url
,
&
i_timeo
ut
,
sid
);
if
(
res
==
UPNP_E_SUCCESS
)
if
(
i_
res
==
UPNP_E_SUCCESS
)
{
{
_subscriptionTimeOut
=
timeO
ut
;
_subscriptionTimeOut
=
i_timeo
ut
;
memcpy
(
_subscriptionID
,
sid
,
sizeof
(
Upnp_SID
)
);
memcpy
(
_subscriptionID
,
sid
,
sizeof
(
Upnp_SID
)
);
}
}
else
else
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: WARNING: '%s': %s"
,
__FILE__
,
__LINE__
,
"%s:%d: WARNING: '%s': %s"
,
__FILE__
,
__LINE__
,
getFriendlyName
(),
UpnpGetErrorMessage
(
res
)
);
getFriendlyName
(),
UpnpGetErrorMessage
(
i_
res
)
);
}
}
}
}
...
@@ -542,121 +542,121 @@ IXML_Document* MediaServer::_browseAction( const char* pObjectID,
...
@@ -542,121 +542,121 @@ IXML_Document* MediaServer::_browseAction( const char* pObjectID,
const
char
*
pRequestedCount
,
const
char
*
pRequestedCount
,
const
char
*
pSortCriteria
)
const
char
*
pSortCriteria
)
{
{
IXML_Document
*
action
=
0
;
IXML_Document
*
p_
action
=
0
;
IXML_Document
*
response
=
0
;
IXML_Document
*
p_
response
=
0
;
const
char
*
url
=
getContentDirectoryControlURL
();
const
char
*
psz_
url
=
getContentDirectoryControlURL
();
if
(
!
url
||
strcmp
(
url
,
""
)
==
0
)
if
(
!
psz_url
||
strcmp
(
psz_
url
,
""
)
==
0
)
{
{
msg_Dbg
(
_p_sd
,
"No subscription url set!"
);
msg_Dbg
(
_p_sd
,
"No subscription url set!"
);
return
0
;
return
0
;
}
}
char
*
ObjectID
=
strdup
(
pObjectID
);
char
*
psz_object_id
=
strdup
(
pObjectID
);
char
*
BrowseF
lag
=
strdup
(
pBrowseFlag
);
char
*
psz_browse_f
lag
=
strdup
(
pBrowseFlag
);
char
*
F
ilter
=
strdup
(
pFilter
);
char
*
psz_f
ilter
=
strdup
(
pFilter
);
char
*
StartingI
ndex
=
strdup
(
pStartingIndex
);
char
*
psz_starting_i
ndex
=
strdup
(
pStartingIndex
);
char
*
RequestedC
ount
=
strdup
(
pRequestedCount
);
char
*
psz_requested_c
ount
=
strdup
(
pRequestedCount
);
char
*
SortC
riteria
=
strdup
(
pSortCriteria
);
char
*
psz_sort_c
riteria
=
strdup
(
pSortCriteria
);
char
*
serviceT
ype
=
strdup
(
CONTENT_DIRECTORY_SERVICE_TYPE
);
char
*
psz_service_t
ype
=
strdup
(
CONTENT_DIRECTORY_SERVICE_TYPE
);
int
res
;
int
i_
res
;
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"ObjectID"
,
ObjectID
);
psz_service_type
,
"ObjectID"
,
psz_object_id
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
goto
browseActionCleanup
;
}
}
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"BrowseFlag"
,
BrowseF
lag
);
psz_service_type
,
"BrowseFlag"
,
psz_browse_f
lag
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
goto
browseActionCleanup
;
}
}
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"Filter"
,
F
ilter
);
psz_service_type
,
"Filter"
,
psz_f
ilter
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
goto
browseActionCleanup
;
}
}
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"StartingIndex"
,
StartingI
ndex
);
psz_service_type
,
"StartingIndex"
,
psz_starting_i
ndex
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
goto
browseActionCleanup
;
}
}
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"RequestedCount"
,
RequestedC
ount
);
psz_service_type
,
"RequestedCount"
,
psz_requested_c
ount
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
goto
browseActionCleanup
;
}
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
}
res
=
UpnpAddToAction
(
&
action
,
"Browse"
,
i_res
=
UpnpAddToAction
(
&
p_
action
,
"Browse"
,
serviceType
,
"SortCriteria"
,
SortC
riteria
);
psz_service_type
,
"SortCriteria"
,
psz_sort_c
riteria
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
"%s:%d: ERROR: %s"
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
)
);
UpnpGetErrorMessage
(
i_
res
)
);
goto
browseActionCleanup
;
goto
browseActionCleanup
;
}
}
res
=
UpnpSendAction
(
_p_sd
->
p_sys
->
clientH
andle
,
i_res
=
UpnpSendAction
(
_p_sd
->
p_sys
->
client_h
andle
,
url
,
psz_
url
,
CONTENT_DIRECTORY_SERVICE_TYPE
,
CONTENT_DIRECTORY_SERVICE_TYPE
,
0
,
0
,
action
,
p_
action
,
&
response
);
&
p_
response
);
if
(
res
!=
UPNP_E_SUCCESS
)
if
(
i_
res
!=
UPNP_E_SUCCESS
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR: %s when trying the send() action with URL: %s"
,
"%s:%d: ERROR: %s when trying the send() action with URL: %s"
,
__FILE__
,
__LINE__
,
__FILE__
,
__LINE__
,
UpnpGetErrorMessage
(
res
),
url
);
UpnpGetErrorMessage
(
i_res
),
psz_
url
);
ixmlDocument_free
(
response
);
ixmlDocument_free
(
p_
response
);
response
=
0
;
p_
response
=
0
;
}
}
browseActionCleanup:
browseActionCleanup:
free
(
ObjectID
);
free
(
psz_object_id
);
free
(
BrowseF
lag
);
free
(
psz_browse_f
lag
);
free
(
F
ilter
);
free
(
psz_f
ilter
);
free
(
StartingI
ndex
);
free
(
psz_starting_i
ndex
);
free
(
RequestedC
ount
);
free
(
psz_requested_c
ount
);
free
(
SortC
riteria
);
free
(
psz_sort_c
riteria
);
free
(
serviceT
ype
);
free
(
psz_service_t
ype
);
ixmlDocument_free
(
action
);
ixmlDocument_free
(
p_
action
);
return
response
;
return
p_
response
;
}
}
void
MediaServer
::
fetchContents
()
void
MediaServer
::
fetchContents
()
...
@@ -670,19 +670,19 @@ void MediaServer::fetchContents()
...
@@ -670,19 +670,19 @@ void MediaServer::fetchContents()
_buildPlaylist
(
_contents
,
NULL
);
_buildPlaylist
(
_contents
,
NULL
);
}
}
bool
MediaServer
::
_fetchContents
(
Container
*
parent
)
bool
MediaServer
::
_fetchContents
(
Container
*
p
_p
arent
)
{
{
if
(
!
parent
)
if
(
!
p
_p
arent
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: parent==NULL"
,
__FILE__
,
__LINE__
);
"%s:%d: parent==NULL"
,
__FILE__
,
__LINE__
);
return
false
;
return
false
;
}
}
IXML_Document
*
response
=
_browseAction
(
parent
->
getObjectID
(),
IXML_Document
*
p_response
=
_browseAction
(
p_
parent
->
getObjectID
(),
"BrowseDirectChildren"
,
"BrowseDirectChildren"
,
"*"
,
"0"
,
"0"
,
""
);
"*"
,
"0"
,
"0"
,
""
);
if
(
!
response
)
if
(
!
p_
response
)
{
{
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"%s:%d: ERROR! No response from browse() action"
,
"%s:%d: ERROR! No response from browse() action"
,
...
@@ -690,8 +690,8 @@ bool MediaServer::_fetchContents( Container* parent )
...
@@ -690,8 +690,8 @@ bool MediaServer::_fetchContents( Container* parent )
return
false
;
return
false
;
}
}
IXML_Document
*
result
=
parseBrowseResult
(
response
);
IXML_Document
*
result
=
parseBrowseResult
(
p_
response
);
ixmlDocument_free
(
response
);
ixmlDocument_free
(
p_
response
);
if
(
!
result
)
if
(
!
result
)
{
{
...
@@ -735,14 +735,14 @@ bool MediaServer::_fetchContents( Container* parent )
...
@@ -735,14 +735,14 @@ bool MediaServer::_fetchContents( Container* parent )
if
(
resource
&&
childCount
<
1
)
if
(
resource
&&
childCount
<
1
)
{
{
Item
*
item
=
new
Item
(
parent
,
objectID
,
title
,
resource
);
Item
*
item
=
new
Item
(
p
_p
arent
,
objectID
,
title
,
resource
);
parent
->
addItem
(
item
);
p
_p
arent
->
addItem
(
item
);
}
}
else
else
{
{
Container
*
container
=
new
Container
(
parent
,
objectID
,
title
);
Container
*
container
=
new
Container
(
p
_p
arent
,
objectID
,
title
);
parent
->
addContainer
(
container
);
p
_p
arent
->
addContainer
(
container
);
if
(
childCount
>
0
)
if
(
childCount
>
0
)
_fetchContents
(
container
);
_fetchContents
(
container
);
...
@@ -778,8 +778,8 @@ bool MediaServer::_fetchContents( Container* parent )
...
@@ -778,8 +778,8 @@ bool MediaServer::_fetchContents( Container* parent )
if
(
!
resource
)
if
(
!
resource
)
continue
;
continue
;
Item
*
item
=
new
Item
(
parent
,
objectID
,
title
,
resource
);
Item
*
item
=
new
Item
(
p
_p
arent
,
objectID
,
title
,
resource
);
parent
->
addItem
(
item
);
p
_p
arent
->
addItem
(
item
);
}
}
ixmlNodeList_free
(
itemNodeList
);
ixmlNodeList_free
(
itemNodeList
);
}
}
...
@@ -788,15 +788,15 @@ bool MediaServer::_fetchContents( Container* parent )
...
@@ -788,15 +788,15 @@ bool MediaServer::_fetchContents( Container* parent )
return
true
;
return
true
;
}
}
void
MediaServer
::
_buildPlaylist
(
Container
*
parent
,
input_item_node_t
*
p_input_node
)
void
MediaServer
::
_buildPlaylist
(
Container
*
p
_p
arent
,
input_item_node_t
*
p_input_node
)
{
{
bool
send
=
p_input_node
==
NULL
;
bool
send
=
p_input_node
==
NULL
;
if
(
send
)
if
(
send
)
p_input_node
=
input_item_node_Create
(
parent
->
getInputItem
()
);
p_input_node
=
input_item_node_Create
(
p
_p
arent
->
getInputItem
()
);
for
(
unsigned
int
i
=
0
;
i
<
parent
->
getNumContainers
();
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
p
_p
arent
->
getNumContainers
();
i
++
)
{
{
Container
*
container
=
parent
->
getContainer
(
i
);
Container
*
container
=
p
_p
arent
->
getContainer
(
i
);
input_item_t
*
p_input_item
=
input_item_New
(
_p_sd
,
"vlc://nop"
,
container
->
getTitle
()
);
input_item_t
*
p_input_item
=
input_item_New
(
_p_sd
,
"vlc://nop"
,
container
->
getTitle
()
);
input_item_node_t
*
p_new_node
=
input_item_node_t
*
p_new_node
=
...
@@ -806,9 +806,9 @@ void MediaServer::_buildPlaylist( Container* parent, input_item_node_t *p_input_
...
@@ -806,9 +806,9 @@ void MediaServer::_buildPlaylist( Container* parent, input_item_node_t *p_input_
_buildPlaylist
(
container
,
p_new_node
);
_buildPlaylist
(
container
,
p_new_node
);
}
}
for
(
unsigned
int
i
=
0
;
i
<
parent
->
getNumItems
();
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
p
_p
arent
->
getNumItems
();
i
++
)
{
{
Item
*
item
=
parent
->
getItem
(
i
);
Item
*
item
=
p
_p
arent
->
getItem
(
i
);
input_item_t
*
p_input_item
=
input_item_New
(
_p_sd
,
input_item_t
*
p_input_item
=
input_item_New
(
_p_sd
,
item
->
getResource
(),
item
->
getResource
(),
...
@@ -875,13 +875,13 @@ bool MediaServerList::addServer( MediaServer* s )
...
@@ -875,13 +875,13 @@ bool MediaServerList::addServer( MediaServer* s )
return
true
;
return
true
;
}
}
MediaServer
*
MediaServerList
::
getServer
(
const
char
*
UDN
)
MediaServer
*
MediaServerList
::
getServer
(
const
char
*
psz_udn
)
{
{
MediaServer
*
result
=
0
;
MediaServer
*
result
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
_list
.
size
();
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
_list
.
size
();
i
++
)
{
{
if
(
strcmp
(
UDN
,
_list
[
i
]
->
getUDN
()
)
==
0
)
if
(
strcmp
(
psz_udn
,
_list
[
i
]
->
getUDN
()
)
==
0
)
{
{
result
=
_list
[
i
];
result
=
_list
[
i
];
break
;
break
;
...
@@ -893,35 +893,35 @@ MediaServer* MediaServerList::getServer( const char* UDN )
...
@@ -893,35 +893,35 @@ MediaServer* MediaServerList::getServer( const char* UDN )
MediaServer
*
MediaServerList
::
getServerBySID
(
const
char
*
sid
)
MediaServer
*
MediaServerList
::
getServerBySID
(
const
char
*
sid
)
{
{
MediaServer
*
server
=
0
;
MediaServer
*
p_
server
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
_list
.
size
();
i
++
)
for
(
unsigned
int
i
=
0
;
i
<
_list
.
size
();
i
++
)
{
{
if
(
_list
[
i
]
->
compareSID
(
sid
)
)
if
(
_list
[
i
]
->
compareSID
(
sid
)
)
{
{
server
=
_list
[
i
];
p_
server
=
_list
[
i
];
break
;
break
;
}
}
}
}
return
server
;
return
p_
server
;
}
}
void
MediaServerList
::
removeServer
(
const
char
*
UDN
)
void
MediaServerList
::
removeServer
(
const
char
*
psz_udn
)
{
{
MediaServer
*
server
=
getServer
(
UDN
);
MediaServer
*
p_server
=
getServer
(
psz_udn
);
if
(
!
server
)
return
;
if
(
!
p_
server
)
return
;
msg_Dbg
(
_p_sd
,
msg_Dbg
(
_p_sd
,
"Removing server '%s'"
,
server
->
getFriendlyName
()
);
"Removing server '%s'"
,
p_
server
->
getFriendlyName
()
);
std
::
vector
<
MediaServer
*>::
iterator
it
;
std
::
vector
<
MediaServer
*>::
iterator
it
;
for
(
it
=
_list
.
begin
();
it
!=
_list
.
end
();
it
++
)
for
(
it
=
_list
.
begin
();
it
!=
_list
.
end
();
it
++
)
{
{
if
(
*
it
==
server
)
if
(
*
it
==
p_
server
)
{
{
_list
.
erase
(
it
);
_list
.
erase
(
it
);
delete
server
;
delete
p_
server
;
break
;
break
;
}
}
}
}
...
@@ -930,9 +930,9 @@ void MediaServerList::removeServer( const char* UDN )
...
@@ -930,9 +930,9 @@ void MediaServerList::removeServer( const char* UDN )
// Item...
// Item...
Item
::
Item
(
Container
*
parent
,
const
char
*
objectID
,
const
char
*
title
,
const
char
*
resource
)
Item
::
Item
(
Container
*
p
_p
arent
,
const
char
*
objectID
,
const
char
*
title
,
const
char
*
resource
)
{
{
_parent
=
parent
;
_parent
=
p
_p
arent
;
_objectID
=
objectID
;
_objectID
=
objectID
;
_title
=
title
;
_title
=
title
;
...
@@ -982,11 +982,11 @@ input_item_t* Item::getInputItem() const
...
@@ -982,11 +982,11 @@ input_item_t* Item::getInputItem() const
// Container...
// Container...
Container
::
Container
(
Container
*
parent
,
Container
::
Container
(
Container
*
p
_p
arent
,
const
char
*
objectID
,
const
char
*
objectID
,
const
char
*
title
)
const
char
*
title
)
{
{
_parent
=
parent
;
_parent
=
p
_p
arent
;
_objectID
=
objectID
;
_objectID
=
objectID
;
_title
=
title
;
_title
=
title
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment