Package brisa :: Package upnp :: Package device :: Module xml_gen
[hide private]
[frames] | no frames]

Source Code for Module brisa.upnp.device.xml_gen

  1  # Licensed under the MIT license 
  2  # http://opensource.org/licenses/mit-license.php 
  3  # Copyright 2007-2008 Brisa Team <brisa-develop@garage.maemo.org> 
  4   
  5  """ Device description XML generator. 
  6  """ 
  7   
  8  from xml.etree.cElementTree import ElementTree, Element, SubElement 
  9   
 10  from brisa.upnp.upnp_defaults import UPnPDefaults 
 11   
 12   
13 -class DeviceXMLBuilder(object):
14
15 - def __init__(self, device):
16 self.device = device 17 self.url_base = device.location
18
19 - def get_element(self):
20 # <root> 21 elt = Element('root', xmlns = 'urn:schemas-upnp-org:' + 22 UPnPDefaults.SCHEMA_VERSION) 23 # <specVersion> 24 spec_version_element = SubElement(elt, 'specVersion') 25 element = SubElement(spec_version_element, 'major') 26 element.text = UPnPDefaults.SCHEMA_VERSION_MAJOR 27 element = SubElement(spec_version_element, 'minor') 28 element.text = UPnPDefaults.SCHEMA_VERSION_MINOR 29 30 # <urlBase> 31 if self.url_base != None: 32 element = SubElement(elt, 'URLBase') 33 element.text = self.url_base 34 35 # <device> 36 elt.append(DeviceXMLGenerator(self.device).generate()) 37 return elt
38
39 - def generate_to_file(self, filepath):
40 ElementTree(self.get_element()).write(filepath)
41
42 - def generate(self):
43 ElementTree(self.get_element())
44 45
46 -class DeviceXMLGenerator(object):
47
48 - def __init__(self, device):
49 self.device = device
50
51 - def generate(self):
52 self.device_element = Element("device") 53 self._create_device() 54 self._create_icon_list() 55 self._create_service_list() 56 self._create_embedded_devices() 57 return self.device_element
58
59 - def _create_device(self):
60 element = SubElement(self.device_element, 'dlna:X_DLNADOC') 61 element.attrib['xmlns:dlna'] = 'urn:schemas-dlna-org:device-1-0' 62 element.text = 'DMS-1.50' 63 64 element = SubElement(self.device_element, 'dlna:X_DLNACAP') 65 element.attrib['xmlns:dlna'] = 'urn:schemas-dlna-org:device-1-0' 66 element.text = 'av-upload,image-upload,audio-upload' 67 68 element = SubElement(self.device_element, "deviceType") 69 element.text = self.device.device_type 70 71 element = SubElement(self.device_element, "friendlyName") 72 element.text = self.device.friendly_name 73 74 element = SubElement(self.device_element, "manufacturer") 75 element.text = self.device.manufacturer 76 77 element = SubElement(self.device_element, "manufacturerURL") 78 element.text = self.device.manufacturer_url 79 80 element = SubElement(self.device_element, "modelDescription") 81 element.text = self.device.model_description 82 83 element = SubElement(self.device_element, "modelName") 84 element.text = self.device.model_name 85 86 element = SubElement(self.device_element, "modelNumber") 87 element.text = self.device.model_number 88 89 element = SubElement(self.device_element, "modelURL") 90 element.text = self.device.model_url 91 92 element = SubElement(self.device_element, "serialNumber") 93 element.text = self.device.serial_number 94 95 element = SubElement(self.device_element, "UDN") 96 element.text = self.device.udn 97 98 element = SubElement(self.device_element, "UPC") 99 element.text = self.device.upc 100 101 element = SubElement(self.device_element, "presentationURL") 102 element.text = self.device.presentation_url
103
104 - def _create_icon_list(self):
105 #<device><iconList> 106 device_icons = self.device.icons 107 if len(device_icons) > 0: 108 icon_list_element = SubElement(self.device_element, "iconList") 109 for device_icon in device_icons: 110 icon_element = SubElement(icon_list_element, "icon") 111 element = SubElement(icon_element, "mimetype") 112 element.text = device_icon.get_mimetype() 113 114 element = SubElement(icon_element, "width") 115 element.text = device_icon.get_width() 116 117 element = SubElement(icon_element, "height") 118 element.text = device_icon.get_height() 119 120 element = SubElement(icon_element, "depth") 121 element.text = device_icon.get_depth() 122 123 element = SubElement(icon_element, "url") 124 element.text = device_icon.get_url()
125
126 - def _create_service_list(self):
127 device_services = self.device.services 128 if len(device_services) > 0: 129 service_list_element = SubElement(self.device_element, 130 "serviceList") 131 for k, device_service in device_services.items(): 132 service_element = SubElement(service_list_element, "service") 133 element = SubElement(service_element, "serviceType") 134 element.text = device_service.service_type 135 136 element = SubElement(service_element, "serviceId") 137 element.text = device_service.id 138 139 element = SubElement(service_element, "SCPDURL") 140 element.text = device_service.scpd_url 141 142 element = SubElement(service_element, "controlURL") 143 element.text = device_service.control_url 144 145 element = SubElement(service_element, "eventSubURL") 146 element.text = device_service.event_sub_url 147 148 element = SubElement(service_element, "presentationURL") 149 element.text = device_service.presentation_url
150
151 - def _create_embedded_devices(self):
152 if self.device.is_root_device(): 153 embedded_devices = self.device.devices 154 155 if len(embedded_devices) > 0: 156 device_list_element = SubElement(self.device_element, 157 "deviceList") 158 for embedded_device in embedded_devices: 159 embedded_device_description = DeviceXMLGenerator( 160 embedded_device) 161 device_list_element.append(embedded_device_description. 162 create_description())
163 164
165 -class ServiceXMLBuilder(object):
166
167 - def __init__(self, service):
168 self.service = service
169
170 - def get_element(self):
171 # <root> 172 elt = Element('scpd', xmlns = 'urn:schemas-upnp-org:' + 173 UPnPDefaults.SERVICE_SCHEMA_VERSION) 174 # <specVersion> 175 spec_version_element = SubElement(elt, 'specVersion') 176 element = SubElement(spec_version_element, 'major') 177 element.text = UPnPDefaults.SCHEMA_VERSION_MAJOR 178 element = SubElement(spec_version_element, 'minor') 179 element.text = UPnPDefaults.SCHEMA_VERSION_MINOR 180 181 # <actionList> and <serviceStateTable> 182 action_list_element, service_state_table_element = ServiceXMLGenerator(self.service).generate() 183 elt.append(action_list_element) 184 elt.append(service_state_table_element) 185 return elt
186
187 - def generate_to_file(self, filepath):
188 ElementTree(self.get_element()).write(filepath)
189
190 - def generate(self):
191 ElementTree(self.get_element())
192 193
194 -class ServiceXMLGenerator(object):
195
196 - def __init__(self, service):
197 self.service = service
198
199 - def generate(self):
200 self.action_list_element = Element("actionList") 201 if self.service.get_actions(): 202 self._create_actions(self.service.get_actions()) 203 self.service_state_table_element = Element("serviceStateTable") 204 self._create_variables(self.service.get_variables()) 205 return self.action_list_element, self.service_state_table_element
206
207 - def _create_actions(self, actions):
208 for action_name, action in actions.iteritems(): 209 action_element = SubElement(self.action_list_element, "action") 210 211 element = SubElement(action_element, "name") 212 element.text = action.name 213 214 # <argumentList> 215 argument_list_element = SubElement(action_element, "argumentList") 216 if action.arguments: 217 self._create_arguments(argument_list_element, action.arguments)
218
219 - def _create_arguments(self, argument_list_element, arguments):
220 for arg in arguments: 221 arg_element = SubElement(argument_list_element, "argument") 222 223 element = SubElement(arg_element, "name") 224 element.text = arg.name 225 226 element = SubElement(arg_element, "direction") 227 element.text = arg.direction 228 229 element = SubElement(arg_element, "relatedStateVariable") 230 element.text = arg.state_var.name
231
232 - def _create_variables(self, state_variables):
233 for var_name, var in state_variables.iteritems(): 234 var_element = SubElement(self.service_state_table_element, "stateVariable") 235 if var.send_events: 236 var_element.attrib['sendEvents'] = 'yes' 237 else: 238 var_element.attrib['sendEvents'] = 'no' 239 240 element = SubElement(var_element, "name") 241 element.text = var.name 242 243 element = SubElement(var_element, "dataType") 244 element.text = var.data_type 245 246 element = SubElement(var_element, "defaultValue") 247 element.text = var.get_value() 248 249 # <allowedValueList> 250 allowed_value_list_element = SubElement(var_element, "allowedValueList") 251 252 for allowed_value in var.allowed_values: 253 element = SubElement(allowed_value_list_element, "allowedValue") 254 element.text = allowed_value
255