1 # Written by Ingar Arntzen
2 # see LICENSE.txt for license information
4 """This module implements the servicemanager of the UPnP server.
5 The service manager manages all devices and services. Its reference
6 is given to all the other modules, so servicemanager is also used to
7 hold some global state. """
15 ##############################################
17 ##############################################
22 Holds devices and services, identified by deviceName and
23 serviceid, respectively.
24 todo : ServiceManager should also implement a
25 hierarchical name space
26 where devices are internal nodes and services are
27 Has some global state that is makes available for other modules.
28 This is the core of the UPnP Service implementation.
31 def __init__(self, task_runner, ssdp_server, http_server,
32 event_dispatcher, root_device,
33 product_name, logger=None):
35 self._task_runner = task_runner
36 self._ssdp_server = ssdp_server
37 self._http_server = http_server
38 self._event_dispatcher = event_dispatcher
41 self._root_device = root_device
42 self._host = socket.gethostbyname(socket.gethostname())
43 self._description_path = "description.xml"
44 self._presentation_path = "presentation.html"
45 self._os_version = platform.platform()
46 self._product_version = product_name
49 self._root_device.set_service_manager(self)
50 self._ssdp_server.set_service_manager(self)
51 self._http_server.set_service_manager(self)
54 """Startup http server and ssdp server."""
55 self._http_server.startup()
56 self._ssdp_server.startup()
58 def get_http_port(self):
59 """Return HTTP port used by UPnP server."""
60 return self._http_server.get_port()
62 def get_ssdp_port(self):
63 """Return SSDP port used by UPnP server."""
64 return self._ssdp_server.get_port()
66 def get_base_url(self):
67 """Return base url for UPnP server."""
68 return "http://%s:%d/" % (self.get_host(), self.get_http_port())
70 def get_description_path(self):
71 """Return description path for UPnP server."""
72 return self._description_path
74 def get_presentation_path(self):
75 """Return presentation path for UPnP server."""
76 return self._presentation_path
78 def get_description_url(self):
79 """Return description url for UPnP server."""
80 return self.get_base_url() + self._description_path
82 def get_presentation_url(self):
83 """Return presentation url for UPnP server."""
84 return self.get_base_url() + self._presentation_path
87 """Return host for UPnP server."""
90 def get_os_version(self):
91 """Return OS version for UPnP server."""
92 return self._os_version
94 def get_product_version(self):
95 """Return product name/version for UPnP server."""
96 return self._product_version
99 """Return the global logger for UPnP server."""
102 def set_root_device(self, device):
103 """Register a device as root."""
104 device.set_service_manager(self)
105 self._root_device = device
107 def get_root_device(self):
108 """Returns the root device."""
109 return self._root_device
111 def get_device(self, name):
112 """Get device by name."""
113 if self._root_device.name == name:
114 return self._root_device
116 def add_service(self, service):
117 """Add a new service to the UPnP Server."""
118 service.set_service_manager(self)
119 self._services[service.service_id] = service
121 def get_service(self, service_id):
122 """Get service by service_id."""
123 return self._services.get(service_id, None)
125 def get_service_ids(self):
126 """Return a list of service ids."""
127 return self._services.keys()
129 def get_task_runner(self):
130 """Get task runner."""
131 return self._task_runner
133 def get_event_dispatcher(self):
134 """Get event dispatcher."""
135 return self._event_dispatcher
137 def get_devices_of_device(self, device):
138 """Get subdevices of a device."""
141 def get_services_of_device(self, device):
142 """Get services contained within a device."""
143 if device == self._root_device:
144 return self._services.values()
148 """Close service manager."""
149 for service in self._services.values():
151 self._root_device.close()