42
44
# #print "Device removal completed"
49
d = {'device_type': self.get_device_type(),
50
'friendly_name': self.get_friendly_name(),
52
'services': [x.as_dict() for x in self.services]}
54
for icon in self.icons:
55
icons.append({"mimetype":icon['mimetype'],"url":icon['url'], "height":icon['height'], "width":icon['width'], "depth":icon['depth']})
45
59
def remove(self,*args):
46
60
self.info("removal of ", self.friendly_name, self.udn)
47
61
while len(self.devices)>0:
60
def receiver( self, signal, *args, **kwargs):
61
self.debug("device receiver called with %r %r", signal, kwargs)
74
def receiver(self, *args, **kwargs):
62
75
if self.detection_completed == True:
64
77
for s in self.services:
65
78
if s.detection_completed == False:
67
82
self.detection_completed = True
68
83
if self.parent != None:
69
84
self.info("embedded device %r %r initialized, parent %r" % (self.friendly_name,self.device_type,self.parent))
112
127
def get_device_type(self):
113
128
return self.device_type
130
def get_friendly_device_type(self):
131
return self.friendly_device_type
133
def get_markup_name(self):
135
return self._markup_name
136
except AttributeError:
137
self._markup_name = u"%s:%s %s" % (self.friendly_device_type,
138
self.device_type_version, self.friendly_name)
139
return self._markup_name
141
def get_device_type_version(self):
142
return self.device_type_version
115
144
def set_client(self, client):
116
145
self.client = client
146
175
def parse_device(self, d):
176
self.info("parse_device %r" %d)
147
177
self.device_type = unicode(d.findtext('./{%s}deviceType' % ns))
178
self.friendly_device_type, self.device_type_version = \
179
self.device_type.split(':')[-2:]
148
180
self.friendly_name = unicode(d.findtext('./{%s}friendlyName' % ns))
149
self.udn = d.findtext('.//{%s}UDN' % ns)
181
self.udn = d.findtext('./{%s}UDN' % ns)
182
self.info("found udn %r %r" % (self.udn,self.friendly_name))
152
self.manufacturer = d.findtext('.//{%s}manufacturer' % ns)
156
self.manufacturer_url = d.findtext('.//{%s}manufacturerURL' % ns)
160
self.model_name = d.findtext('.//{%s}modelName' % ns)
164
self.model_description = d.findtext('.//{%s}modelDescription' % ns)
168
self.model_number = d.findtext('.//{%s}modelNumber' % ns)
172
self.model_url = d.findtext('.//{%s}modelURL' % ns)
176
self.serial_number = d.findtext('.//{%s}serialNumber' % ns)
180
self.upc = d.findtext('.//{%s}UPC' % ns)
184
self.presentation_url = d.findtext('.//{%s}presentationURL' % ns)
185
self.manufacturer = d.findtext('./{%s}manufacturer' % ns)
189
self.manufacturer_url = d.findtext('./{%s}manufacturerURL' % ns)
193
self.model_name = d.findtext('./{%s}modelName' % ns)
197
self.model_description = d.findtext('./{%s}modelDescription' % ns)
201
self.model_number = d.findtext('./{%s}modelNumber' % ns)
205
self.model_url = d.findtext('./{%s}modelURL' % ns)
209
self.serial_number = d.findtext('./{%s}serialNumber' % ns)
213
self.upc = d.findtext('./{%s}UPC' % ns)
217
self.presentation_url = d.findtext('./{%s}presentationURL' % ns)
273
308
def get_urlbase(self):
274
309
return self.parent.get_urlbase()
311
def get_presentation_url(self):
313
return self.make_fullyqualified(self.presentation_url)
317
def get_parent_id(self):
319
return self.parent.get_id()
276
323
def make_fullyqualified(self,url):
277
324
return self.parent.make_fullyqualified(url)
329
def append(name,attribute):
331
if isinstance(attribute,tuple):
332
if callable(attribute[0]):
335
v1 = getattr(self,attribute[0])
336
if v1 in [None,'None']:
338
if callable(attribute[1]):
341
v2 = getattr(self,attribute[1])
342
if v2 in [None,'None']:
344
r.append((name,(v1,v2)))
346
elif callable(attribute):
349
v = getattr(self,attribute)
350
if v not in [None,'None']:
354
self.debug(traceback.format_exc())
357
r.append(('Location',(self.get_location(),self.get_location())))
361
append('URL base',self.get_urlbase)
365
r.append(('UDN',self.get_id()))
369
r.append(('Type',self.device_type))
373
r.append(('UPnP Version',self.upnp_version))
377
r.append(('DLNA Device Class',','.join(self.dlna_dc)))
381
r.append(('DLNA Device Capability',','.join(self.dlna_cap)))
385
r.append(('Friendly Name',self.friendly_name))
389
append('Manufacturer','manufacturer')
393
append('Manufacturer URL',('manufacturer_url','manufacturer_url'))
397
append('Model Description','model_description')
401
append('Model Name','model_name')
405
append('Model Number','model_number')
409
append('Model URL',('model_url','model_url'))
413
append('Serial Number','serial_number')
421
append('Presentation URL',('presentation_url',lambda: self.make_fullyqualified(getattr(self,'presentation_url'))))
425
for icon in self.icons:
426
r.append(('Icon', (icon['realurl'],
427
self.make_fullyqualified(icon['realurl']),
428
{'Mimetype': icon['mimetype'],
429
'Width':icon['width'],
430
'Height':icon['height'],
431
'Depth':icon['depth']})))
280
436
class RootDevice(Device):
359
515
data, headers = x
360
516
tree = utils.parse_xml(data, 'utf-8').getroot()
362
major = tree.findtext('.//{%s}specVersion/{%s}major' % (ns,ns))
363
minor = tree.findtext('.//{%s}specVersion/{%s}minor' % (ns,ns))
518
major = tree.findtext('./{%s}specVersion/{%s}major' % (ns,ns))
519
minor = tree.findtext('./{%s}specVersion/{%s}minor' % (ns,ns))
365
521
self.upnp_version = '.'.join((major,minor))
367
523
self.upnp_version = 'n/a'
369
self.urlbase = tree.findtext('.//{%s}URLBase' % ns)
525
self.urlbase = tree.findtext('./{%s}URLBase' % ns)
372
528
self.debug(traceback.format_exc())
374
d = tree.find('.//{%s}device' % ns)
530
d = tree.find('./{%s}device' % ns)
375
531
if d is not None:
376
532
self.parse_device(d) # root device
378
534
def gotError(failure, url):
379
self.warning("error requesting %r", url)
535
self.warning("error getting device description from %r", url)
380
536
self.info(failure)
382
538
utils.getPage(self.location).addCallbacks(gotPage, gotError, None, None, [self.location], None)
394
550
r = urlparse.urljoin(self.get_location(),url)
401
def append(name,attribute):
403
if isinstance(attribute,tuple):
404
if callable(attribute[0]):
407
v1 = getattr(self,attribute[0])
408
if v1 in [None,'None']:
410
if callable(attribute[1]):
413
v2 = getattr(self,attribute[1])
414
if v2 in [None,'None']:
416
r.append((name,(v1,v2)))
418
elif callable(attribute):
421
v = getattr(self,attribute)
422
if v not in [None,'None']:
426
self.debug(traceback.format_exc())
428
r.append(('Location',(self.get_location(),self.get_location())))
429
append('URL base',self.get_urlbase)
430
r.append(('UDN',self.get_id()))
431
r.append(('Type',self.device_type))
432
r.append(('UPnP Version',self.upnp_version))
434
r.append(('DLNA Device Class',','.join(self.dlna_dc)))
438
r.append(('DLNA Device Capability',','.join(self.dlna_cap)))
441
r.append(('Friendly Name',self.friendly_name))
443
append('Manufacturer','manufacturer')
444
append('Manufacturer URL',('manufacturerURL','manufacturerURL'))
445
append('Model Name','model_name')
446
append('Model Description','model_description')
447
append('Model Number','model_number')
448
append('Model URL',('model_url','model_url'))
449
append('Serial Number','serial_number')
451
append('Presentation URL',('presentation_url',lambda: self.make_fullyqualified(getattr(self,'presentation_url'))))
453
for icon in self.icons:
454
r.append(('Icon', (icon['realurl'],
455
self.make_fullyqualified(icon['realurl']),
456
{'Mimetype': icon['mimetype'],
457
'Width':icon['width'],
458
'Height':icon['height'],
459
'Depth':icon['depth']})))
b'\\ No newline at end of file'