instrumentation: add next-share/
[cs-p2p-next.git] / instrumentation / next-share / BaseLib / UPnP / upnpserver / servicemanager.py
1 # Written by Ingar Arntzen
2 # see LICENSE.txt for license information
3
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. """
8
9 import socket
10 import platform
11
12 _SSDP_PORT = 44443
13 _HTTP_PORT = 44444
14
15 ##############################################
16 # SERVICE MANAGER
17 ##############################################
18
19 class ServiceManager:
20
21     """
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.
29     """
30
31     def __init__(self, task_runner, ssdp_server, http_server, 
32                  event_dispatcher, root_device,
33                  product_name, logger=None):
34
35         self._task_runner = task_runner
36         self._ssdp_server = ssdp_server
37         self._http_server = http_server
38         self._event_dispatcher = event_dispatcher
39
40         self._services = {}
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
47         self._logger = logger
48         
49         self._root_device.set_service_manager(self)
50         self._ssdp_server.set_service_manager(self)
51         self._http_server.set_service_manager(self)
52
53     def startup(self):
54         """Startup http server and ssdp server."""
55         self._http_server.startup()        
56         self._ssdp_server.startup()
57         
58     def get_http_port(self):
59         """Return HTTP port used by UPnP server."""
60         return self._http_server.get_port()
61
62     def get_ssdp_port(self):
63         """Return SSDP port used by UPnP server."""
64         return self._ssdp_server.get_port()
65
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())
69
70     def get_description_path(self):
71         """Return description path for UPnP server."""
72         return self._description_path
73
74     def get_presentation_path(self):
75         """Return presentation path for UPnP server."""
76         return self._presentation_path
77     
78     def get_description_url(self):
79         """Return description url for UPnP server."""
80         return self.get_base_url() + self._description_path
81
82     def get_presentation_url(self):
83         """Return presentation url for UPnP server."""
84         return self.get_base_url() + self._presentation_path
85
86     def get_host(self):
87         """Return host for UPnP server."""
88         return self._host
89
90     def get_os_version(self):
91         """Return OS version for UPnP server."""
92         return self._os_version
93
94     def get_product_version(self):
95         """Return product name/version for UPnP server."""
96         return self._product_version
97
98     def get_logger(self):
99         """Return the global logger for UPnP server."""
100         return self._logger
101
102     def set_root_device(self, device):
103         """Register a device as root."""
104         device.set_service_manager(self)
105         self._root_device = device
106
107     def get_root_device(self):
108         """Returns the root device."""
109         return self._root_device
110
111     def get_device(self, name):
112         """Get device by name."""
113         if self._root_device.name == name:
114             return self._root_device
115         
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
120
121     def get_service(self, service_id):
122         """Get service by service_id."""
123         return self._services.get(service_id, None)
124     
125     def get_service_ids(self):
126         """Return a list of service ids."""
127         return self._services.keys()
128
129     def get_task_runner(self):
130         """Get task runner."""
131         return self._task_runner
132
133     def get_event_dispatcher(self):
134         """Get event dispatcher."""
135         return self._event_dispatcher
136
137     def get_devices_of_device(self, device):
138         """Get subdevices of a device."""
139         return []
140
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()
145         else: return []
146
147     def close(self):
148         """Close service manager."""
149         for service in self._services.values():
150             service.close()
151         self._root_device.close()