def on_description(self, iq): # print( # 'Received description from %s: %s' # % (iq['from'], iq.toXml().encode('utf-8'))) pause = IQ(self.xmlstream, 'set') pause['to'] = iq['from'] # enveloppe = domish.Element( # ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope')) enveloppe = domish.Element( ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'), localPrefixes={'s': 'http://schemas.xmlsoap.org/soap/envelope/'}) enveloppe['s:encodingStyle'] = "http://schemas.xmlsoap.org/soap/encoding/" header = domish.Element((None, 's:Header')) # header = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Header')) header['mustUnderstand'] = "1" uc = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'uc')) uc['serviceId'] = 'urn:av-openhome-org:serviceId:Playlist' header.addChild(uc) enveloppe.addChild(header) body = domish.Element((None, 's:Body')) # body = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Body')) action = domish.Element( ('urn:av-openhome-org:service:Playlist:1', 'Read'), localPrefixes={'u': 'urn:av-openhome-org:service:Playlist:1'}) # action = domish.Element( # ('urn:av-openhome-org:service:Playlist:1', 'Pause')) body.addChild(action) enveloppe.addChild(body) pause.addChild(enveloppe) pause.addCallback(self.paused) print('send pause') print(pause.toXml()) pause.send()
def dump_description(self, dest): def sent(res): self.log.debug('description sent') pass self.log.debug('send description') # print(dest['id']) if self.description: self.log.debug('cached description') iq = IQ(self.xmlstream, 'result') iq.addRawXml(self.description) iq['id'] = dest['id'] else: self.log.debug('generate description') iq = IQ(self.xmlstream, 'result') query = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'query')) query['type'] = 'described' query['name'] = self.device.uuid d = tostring(self.device.dump(), encoding='unicode') query.addRawXml(d) # print(query.toXml()) for service in self.device.services: s = tostring(service.dump(), encoding='unicode') # print(s) query.addRawXml(s) # print(query.toXml()) self.description = query.toXml() iq.addChild(query) iq['id'] = dest['id'] # self.description = iq # print(iq.toXml()) iq.addCallback(sent) iq.send(to=dest['from'])
def on_description(self, iq): # print( # 'Received description from %s: %s' # % (iq['from'], iq.toXml().encode('utf-8'))) pause = IQ(self.xmlstream, 'set') pause['to'] = iq['from'] # enveloppe = domish.Element( # ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope')) enveloppe = domish.Element( ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'), localPrefixes={'s': 'http://schemas.xmlsoap.org/soap/envelope/'}) enveloppe[ 's:encodingStyle'] = "http://schemas.xmlsoap.org/soap/encoding/" header = domish.Element((None, 's:Header')) # header = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Header')) header['mustUnderstand'] = "1" uc = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'uc')) uc['serviceId'] = 'urn:av-openhome-org:serviceId:Playlist' header.addChild(uc) enveloppe.addChild(header) body = domish.Element((None, 's:Body')) # body = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Body')) action = domish.Element( ('urn:av-openhome-org:service:Playlist:1', 'Read'), localPrefixes={'u': 'urn:av-openhome-org:service:Playlist:1'}) # action = domish.Element( # ('urn:av-openhome-org:service:Playlist:1', 'Pause')) body.addChild(action) enveloppe.addChild(body) pause.addChild(enveloppe) pause.addCallback(self.paused) print('send pause') print(pause.toXml()) pause.send()
def on_presence(self, presence): print('received presence: %s' % presence.toXml().encode('utf-8')) user, host, res = parse(presence['from']) jid = '@'.join((user, host)) if presence.hasAttribute('type'): if presence['type'] == 'subscribe': if jid in self.users: print('received subscription') if self.users[jid] is False: iq = IQ(self.xmlstream, 'set') query = domish.Element(('jabber:iq:roster', 'query')) item = domish.Element((None, 'item')) item['jid'] = jid item['name'] = jid item.addElement('group', content='controllers') query.addChild(item) iq.addChild(query) iq.addCallback(self.subscribed, jid) self.xmlstream.send(iq) pres = domish.Element((None, 'presence')) pres['type'] = 'subscribed' pres['to'] = jid self.xmlstream.send(pres) else: presence = domish.Element((None, 'presence')) presence['type'] = 'unsubscribed' presence['to'] = presence['from'] self.xmlstream.send(presence)
def getStats(self, jid = "icq.netlab.cz"): iq = IQ(self.xmlstream, "get") iq['to'] = jid iq.addElement(("http://jabber.org/protocol/stats", "query")) iq.addCallback(self._statsReceived) iq.send()
def invalid_user(self, xs): iq = IQ(self.xmlstream, "set") iq.addElement(("jabber:iq:register", "query")) iq.query.addElement("username", content = self.jid.user) iq.query.addElement("password", content = self.password) iq.addCallback(self._registerResultEvent) iq.send()
def authenticated(self, xs): presence = domish.Element((None, 'presence')) xs.send(presence) iq = IQ(self.xmlstream, "set") iq.addElement(("jabber:iq:register", "query")) iq.query.addElement("remove") iq.addCallback(self._result) iq.send()
def moderate(self, jn, jid_nick, ra, set_to, reason=None): if not reason: reason = self.bot.nick packet = IQ(self.globalbot.wrapper.x, 'set') query = packet.addElement('query', 'http://jabber.org/protocol/muc#admin') i = query.addElement('item') i[jn] = jid_nick i[ra] = set_to i.addElement('reason').addContent(reason) d = Deferred() packet.addCallback(d.callback) #print packet.toXml() callFromThread(packet.send, self.jid) return d
def _statsReceived(self, el): iq = IQ(self.xmlstream, "get") iq['to'] = el['from'] q = iq.addElement(("http://jabber.org/protocol/stats", "query")) query = el.firstChildElement() for child in query.children: s = q.addElement('stat') s['name'] = child['name'] iq.addCallback(self._statsDataReceived) iq.send()
def registerAccount(self, username=None, password=None): if username: self.jid.user = username if password: self.password = password iq = IQ(self.xmlstream, "set") iq.addElement(("jabber:iq:register", "query")) iq.query.addElement("username", content=self.jid.user) iq.query.addElement("password", content=self.password) iq.addCallback(self._registerResultEvent) iq.send()
def authenticated(self, xs): self.log.debug('Cloud Authenticated') presence = domish.Element((None, 'presence')) xs.send(presence) xs.addObserver('/presence', self.on_presence) xs.addObserver('/iq', self.on_iq) xs.addObserver('/message', self.on_event) disco = IQ(xs, 'get') disco.addElement(('http://jabber.org/protocol/disco#items', 'query')) disco.addCallback(self.cloud_discovered) disco.send() # self.reactor.callLater(120, xs.sendFooter) self.reactor.callLater(5, self.check_users)
def authenticated(self, xs): self.xmlstream.addObserver("/presence[@type='subscribe']", self.onSubscribe, 1) self.xmlstream.addObserver("/presence[@type='subscribed']", self.onSubscribed, 1) presence = domish.Element((None, 'presence')) xs.send(presence) iq = IQ(self.xmlstream, "get") iq['to'] = transport iq.addElement(("jabber:iq:register", "query")) iq.addCallback(self._result) iq.send()
def _result2(self, iq): if iq['type'] != 'result': self.failed() query = iq.firstChildElement() if query.name != "query": self.failed() iq = IQ(self.xmlstream, "get") iq['to'] = transport iq.addElement(("jabber:iq:register", "query")) iq.addCallback(self._result3) iq.send()
def check_users(self): for user, value in self.users.items(): if value['state'] is False: iq = IQ(self.xmlstream, 'set') query = domish.Element(('jabber:iq:roster', 'query')) item = domish.Element((None, 'item')) item['name'] = user item['jid'] = user item.addElement('group', content='hosts') query.addChild(item) iq.addChild(query) iq.addCallback(self.cloud_subscribe, user) # print('send IQ: %s' % (iq.toXml().encode('utf-8'))) iq.send()
def check_users(self): for user, value in self.users.items(): if value['state'] is False: iq = IQ(self.xmlstream, 'set') query = domish.Element(('jabber:iq:roster', 'query')) item = domish.Element((None, 'item')) item['name'] = user item['jid'] = user item.addElement('group', content='hosts') query.addChild(item) iq.addChild(query) iq.addCallback(self.subscribe, user) print('send IQ: %s' % (iq.toXml().encode('utf-8'))) iq.send()
def __call__(self, *args, **kwargs): d = defer.Deferred() self.ctx, = self.contexts self.get_out_object(self.ctx, args, kwargs) self.get_out_string(self.ctx) self.ctx.in_string = [] action = IQ(self.url[0], 'set') for item in self.ctx.out_string: action.addRawXml(item) if action.callbacks: action.addCallback(self.on_response, d) else: print('wtf?') action.send(to=self.url[1]) return d
def moderate(self, jn, jid_nick, ra, set_to, reason=None): if not reason: try: reason = self.bot.nick except: reason = 'freQ' packet = IQ(self.globalbot.wrapper.x, 'set') query = packet.addElement('query', 'http://jabber.org/protocol/muc#admin') i = query.addElement('item') i[jn] = jid_nick i[ra] = set_to i.addElement('reason').addContent(reason) d = Deferred() packet.addCallback(d.callback) #print packet.toXml() callFromThread(packet.send, self.jid) return d
def create_ps_node(self, node): def registered(node, iq): if iq['type'] == 'result': node_name = '/'.join((self._jid, node[1])) if node_name in self.registrations: return event = XmppEvent(node_name, self, 'pubsub.' + self.jid.host) node[2].subscribe(event, 100) self.reactor.callLater(95, self.renew_subscription, *(node_name, node)) self.registrations.append(node_name) self.log.debug('node {node} registered', node=node_name) else: self.log.error('node creation {name} failed:{iq}', name=node, iq=iq.toXml()) iq = IQ(self.xmlstream, 'set') ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub')) create = domish.Element((None, 'create')) create['node'] = '/'.join((self._jid, node[1], node[0].name)) ps.addChild(create) configure = domish.Element((None, 'configure')) x = domish.Element(('jabber:x:data', 'x')) x['type'] = 'submit' field = domish.Element((None, 'field')) field['var'] = 'FORM_TYPE' field['type'] = 'hidden' field.addElement( 'value', content='http://jabber.org/protocol/pubsub#node_config') x.addChild(field) access = domish.Element((None, 'field')) access['var'] = 'pubsub#access_model' access.addElement('value', content='roster') x.addChild(access) # expire = domish.Element((None, 'field')) # expire['var'] = 'pubsub#item_expire' # expire.addElement('value', content='60') # x.addChild(expire) last = domish.Element((None, 'field')) last['var'] = 'pubsub#send_last_published_item' last.addElement('value', content='on_sub_and_presence') x.addChild(last) configure.addChild(x) ps.addChild(configure) iq.addChild(ps) iq.addCallback(registered, node) iq.send(to='pubsub.' + self.jid.host)
def on_presence(self, presence): self.log.debug('received presence: %s' % presence.toXml().encode('utf-8')) if presence.hasAttribute('from'): user, host, res = parse(presence['from']) if presence['from'] in self.active_controllers: if presence.hasAttribute('type'): if presence['type'] == 'unavailable': self.active_controllers.remove(presence['from']) self.log.info('User {_from} disconnected', _from=presence['from']) return elif 'ControlPoint' in res: if presence.hasAttribute('type'): if presence['type'] == 'unavailable': return self.log.info('control point %s added' % presence['from']) if len(self.active_controllers) == 0: self.check_ps_nodes() self.active_controllers.append(presence['from']) del (res) jid = '@'.join((user, host)) if presence.hasAttribute('type'): if presence['type'] == 'subscribe': if jid in self.users: self.log.info('received subscription from %s' % jid) if self.users[jid] is False: iq = IQ(self.xmlstream, 'set') query = domish.Element( ('jabber:iq:roster', 'query')) item = domish.Element((None, 'item')) item['jid'] = jid item['name'] = jid item.addElement('group', content='UPnPCloud') query.addChild(item) iq.addChild(query) iq.addCallback(self.subscribed, jid) iq.send() else: self.log.error('subscription for user %s failed: %s' % (jid, 'Not in user list')) pres = domish.Element((None, 'presence')) pres['type'] = 'unsubscribed' pres['to'] = presence['from'] self.xmlstream.send(pres)
def _result(self, iq): #<iq from='icq.localhost' to='t3@localhost/test' id='H_24' type='result'><query xmlns='jabber:iq:register'><instructions>Enter your Jabber ID and password:</instructions><username/><password/><x xmlns='jabber:x:data' type='form'><title>Registration</title><instructions>Enter your Jabber ID and password:</instructions><field type='hidden' var='FORM_TYPE'><value>jabber:iq:register</value></field><field type='text-single' var='username' label='Network username'><required/></field><field type='text-private' var='password' label='Password'><required/></field><field type='list-single' var='language' label='Language'><value>en</value><option label='Cesky'><value>cs</value></option><option label='English'><value>en</value></option></field></x></query></iq> # TODO: more tests if iq['type'] != 'result': self.failed() query = iq.firstChildElement() if query.name != "query": self.failed() iq = IQ(self.xmlstream, "set") iq['to'] = transport iq.addElement(("jabber:iq:register", "query")) iq.query.addElement("username", content = client_jid1.userhost()) iq.query.addElement("password", content = secret1) iq.addCallback(self._result2) iq.send()
def on_presence(self, resp): print('got presence: %s' % resp.toXml().encode('utf-8')) print('from :%s' % resp['from']) user, host, res = parse(resp['from']) jid = '@'.join((user, host)) if resp.hasAttribute('type'): if resp['type'] == 'subscribed': if jid in self.users: self.users[jid].update({'state': True}) if 'services' in self.users[jid]: self.users[jid]['services'].append(res) else: self.users[jid].update({'services': [res]}) presence = domish.Element((None, 'presence')) presence['type'] = 'subscribe' presence['to'] = resp['from'] self.xmlstream.send(presence) else: presence = domish.Element((None, 'presence')) presence['type'] = 'denying' presence['to'] = resp['from'] self.xmlstream.send(presence) elif resp['type'] == 'unsubscribed': if jid in self.users: print('subscription failed: %s' % resp['from']) return for child in resp.elements(): if child.name == 'ConfigIdCloud': print('Found UPnP Cloud device : %s type is: %s' % ( jid, res)) # if jid == self._jid: # return info = IQ(self.xmlstream, 'get') info['to'] = resp ['from'] query = domish.Element( ('urn:schemas-upnp-org:cloud-1-0', 'query')) query['type'] = 'description' query['name'] = ':'.join(res.split(':')[-2:]) info.addChild(query) info.addCallback(self.on_description) info.send()
def on_presence(self, resp): self.log.debug('got presence: %s' % resp.toXml().encode('utf-8')) # print('from :%s' % resp['from']) user, host, res = parse(resp['from']) jid = '@'.join((user, host)) if resp.hasAttribute('type'): if resp['type'] == 'subscribed': if jid in self.users: self.users[jid].update({'state': True}) if 'services' in self.users[jid]: self.users[jid]['services'].append(res) else: self.users[jid].update({'services': [res]}) presence = domish.Element((None, 'presence')) presence['type'] = 'subscribe' presence['to'] = resp['from'] self.xmlstream.send(presence) else: presence = domish.Element((None, 'presence')) presence['type'] = 'denying' presence['to'] = resp['from'] self.xmlstream.send(presence) elif resp['type'] == 'unsubscribed': if jid in self.users: self.log.warn('subscription failed: %s' % resp['from']) return for child in resp.elements(): if child.name == 'ConfigIdCloud': self.log.debug('Found UPnP Cloud device : %s type is: %s' % ( jid, res)) info = IQ(self.xmlstream, 'get') # info['to'] = resp['from'] query = domish.Element( ('urn:schemas-upnp-org:cloud-1-0', 'query')) query['type'] = 'description' query['name'] = ':'.join(res.split(':')[-2:]) info.addChild(query) info.addCallback(self.on_description, res) # info.send() info.send(to=resp['from'])
def authenticated(self, xs): # print "Authenticated." xs.addObserver('/presence', self.on_presence) xs.addObserver('/iq', self.on_iq) presence = domish.Element((None, 'presence')) uc = domish.Element( ('urn:schemas-upnp-org:cloud-1-0', 'ConfigIdCloud')) uc['hash'] = 'uda' uc.addContent('1.0') # print(uc.toXml()) presence.addChild(uc) # print(presence.toXml()) xs.send(presence) disco = IQ(xs, 'get') disco.addElement(('http://jabber.org/protocol/disco#info', 'query')) disco.addCallback(self.check_server) disco.send(to='pubsub.xmpp.bertrandverdu.me') self.check_ps_nodes() self.reactor.callLater(30, self.ping)
def authenticated(self, xs): print "Authenticated." # bind = IQ(xs, 'set') # # res = domish.Element((None, 'resource'), content=self.resource) # res = domish.Element(('urn:ietf:params:xml:ns:xmpp-bind', 'bind')) # res.addElement('resource', content=self.resource) # bind.addChild(res) # # bind['from'] = self._jid # # bind['to'] = self.jid.host # xs.send(bind) presence = domish.Element((None, 'presence')) xs.send(presence) xs.addObserver('/presence', self.on_presence) xs.addObserver('/iq', self.on_iq) disco = IQ(xs, 'get') # disco['to'] = '[email protected]/urn:schemas-upnp-org:device:MediaRenderer:1:uuid:e70e9d0e-d9eb-4748-b163-636a323e7950' # search = domish.Element(('http://jabber.org/protocol/disco#items', 'query')) disco.addElement(('http://jabber.org/protocol/disco#items', 'query')) disco.addCallback(self.discovered) disco.send() self.reactor.callLater(120, xs.sendFooter) self.reactor.callLater(5, self.check_users)
def ping(self): def pong(res): if res['type'] == 'result': # log.debug('pong !') self.timeout = False self.reactor.callLater(30, self.ping) else: self.log.error('ping error: %s' % res.toXml()) self.timeout = False # self.startService() def check_timeout(): if self.timeout: self.log.error('ping timeout !') # self.connector.connect() iq = IQ(self.xmlstream, 'get') iq.addElement('ping', 'urn:xmpp:ping') self.reactor.callLater(10, check_timeout) iq.addCallback(pong) self.timeout = True iq.send(to=self.jid.host)
class TwistedQuery(Query): """Implementation of Query for TwistedModel""" def __init__(self, model, method, fetch, single_result, params): Query.__init__(self, params, single_result) self.__model = model self.__iq = IQ(model._xmlstream, "get") self.__single_result = single_result element = self.__iq.addElement(method) for name in self._params: param = element.addElement(("http://mugshot.org/p/system", "param")) param["name"] = name param.addContent(self._params[name]) if fetch != None: element[("http://mugshot.org/p/system", "fetch")] = fetch self.__iq.addCallback(self.__on_reply) def __is_indirect(self, resource_element): indirect_attr = resource_element.getAttribute(("http://mugshot.org/p/system", "indirect")) return indirect_attr != None and indirect_attr.lower() == "true" def __on_reply(self, iq): child = iq.firstChildElement() result = [] for resource_element in child.elements(): resource = self.__model._update_resource_from_element(resource_element) if resource != None and not self.__is_indirect(resource_element): result.append(resource) self._on_success(result) def execute(self): self.__iq.send()
def unsubscribe_cloud(self, name): def unsubscribed(name, d, res): if res['type'] == 'result': # print('unsubscribed: %s' % name) del self.subscriptions_cloud[name] print('ok') d.callback(None) else: d.errback(Exception(res.toXml())) d = defer.Deferred() iq = IQ(self.xmlstream, 'set') ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub')) unsubscribe = domish.Element((None, 'unsubscribe')) unsubscribe['node'] = name unsubscribe['jid'] = self.jid.full() ps.addChild(unsubscribe) iq.addChild(ps) iq.addCallback(unsubscribed, name, d) iq.send(to='pubsub.' + self.jid.host) return d
def authenticated(self, xs): print "Authenticated." xs.addObserver('/presence', self.on_presence) xs.addObserver('/iq', self.on_iq) presence = domish.Element((None, 'presence')) uc = domish.Element( ('urn:schemas-upnp-org:cloud-1-0', 'ConfigIdCloud')) uc['hash'] = 'uda' uc.addContent('1.0') # print(uc.toXml()) presence.addChild(uc) # print(presence.toXml()) xs.send(presence) disco = IQ(xs, 'get') # disco['to'] = 'pubsub.xmpp.bertrandverdu.me' # search = domish.Element(('http://jabber.org/protocol/disco#items', 'query')) disco.addElement(('http://jabber.org/protocol/disco#info', 'query')) disco.addCallback(self.check_server) disco.send(to='pubsub.xmpp.bertrandverdu.me') self.reactor.callLater(120, xs.sendFooter)
def publish(self, event): if len(self.parent.active_controllers) == 0: # self.log.debug('event cancelled') self.parent.registrations = [] return def success(res): # print('event sent') if res['type'] == 'error': self.log.error('Publish Event failed :%s' % res.toXml()) else: if 'Id' in res.children[0].children[0]['node']: self.log.debug('Event Published: %s' % res.toXml()) name, data = event if name == 'Seconds': return iq = IQ(self.parent.xmlstream, 'set') ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub')) publish = domish.Element((None, 'publish')) publish['node'] = '/'.join((self.nodeId, name)) item = domish.Element((None, 'item')) propertyset = domish.Element( ('urn:schemas-upnp-org:event-1-0', 'propertyset'), localPrefixes={'e': 'urn:schemas-upnp-org:event-1-0'}) prop = domish.Element((None, 'e:property')) evt = domish.Element((None, name)) if isinstance(data.value, dict): ev = domish.Element((data.namespace, 'Event')) inst = domish.Element((None, 'InstanceID')) inst['val'] = '0' for k, v in data.value.items: if 'namespace' in v: var = domish.Element((v['namespace'], k)) else: var = domish.Element((None, k)) if 'attrib' in v: attr = v['attrib'] else: attr = {} value = v['value'] if isinstance(value, bool): value = int(value) attr.update({'val': str(value).decode('utf-8')}) for attname, attval in attr: var[attname] = attval inst.addChild(var) ev.addChild(inst) evt.addChild(ev) else: # print(str(data.value).decode('utf-8')) if isinstance(data.value, bool): data.value = int(data.value) evt.addContent(str(data.value).decode('utf-8')) prop.addChild(evt) propertyset.addChild(prop) item.addChild(propertyset) publish.addChild(item) ps.addChild(publish) iq.addChild(ps) iq.addCallback(success) iq.send(to=self.addr)
def subscribe_cloud( self, device, svc, var, callback_fct=None, callback_args=()): # print('suscribe to %s' % var) name = device.keys()[0] dev = device[name] if not callback_fct: callback_fct = self.log.debug d = defer.Deferred() def subscribe_failed(err, name): self.parent.remove_device(name.split('_')[0]) def subscribed(node_name, deferred, iq): if iq['type'] == 'result': self.subscriptions_cloud[str(node_name)] = True # print('%s suscribed !' % str(node_name)) # iq = IQ(self.xmlstream, 'get') # ps = domish.Element( # ('http://jabber.org/protocol/pubsub', 'pubsub')) # items = domish.Element((None, 'items')) # items['node'] = node_name # items['max_items'] = '1' # ps.addChild(items) # iq.addChild(ps) # iq.addCallback(self.on_event) # iq.send(to='pubsub.' + self.jid.host) # print(iq.toXml()) deferred.callback(str(node_name)) else: deferred.errback(Exception('subscription to %s failed: %s' % (node_name, iq.toXml()))) if svc in dev['services']: # print('service %s ok' % svc) # print('subscriptions :%s' % self.subscriptions_cloud) if not self.cloud_event_catcher: self.cloud_event_catcher = CloudEventCatcher( {}, {}, logger=self.log) subscription_name = '/'.join((dev['location'], svc, var)) # subscription_service = svc if subscription_name in self.cloud_event_catcher.callbacks: self.cloud_event_catcher.callbacks[subscription_name].update( {var: (callback_fct, callback_args,)}) else: self.cloud_event_catcher.callbacks.update( {subscription_name: {var: (callback_fct, callback_args,)}}) # if var in self.cloud_event_catcher.callbacks: # self.cloud_event_catcher.callbacks[var].update( # {var: (callback_fct, callback_args,)}) # else: # self.cloud_event_catcher.callbacks.update( # {var: {var: (callback_fct, callback_args,)}}) # log.error(self.event_catcher.catcher.childs) if subscription_name in self.subscriptions_cloud: if self.subscriptions_cloud[subscription_name]: # print('already subscribed: %s' % subscription_name) for k, value in\ self.cloud_event_catcher.unfiltered_dict.items(): # print('is %s == %s ?' % (k, var)) if k == var: if value == 'False': value = False elif value == 'True': value = True if isinstance(callback_args, str)\ or isinstance(callback_args, bool): callback_fct(value, callback_args) else: callback_fct(value, *callback_args) del self.cloud_event_catcher.unfiltered_dict[k] return defer.succeed(None) self.subscriptions_cloud.update({str(subscription_name): False}) # print(subscription_name) # print(subscription_service) iq = IQ(self.xmlstream, 'set') ps = domish.Element( ('http://jabber.org/protocol/pubsub', 'pubsub')) subscribe = domish.Element((None, 'subscribe')) subscribe['node'] = subscription_name subscribe['jid'] = self.jid.full() ps.addChild(subscribe) iq.addChild(ps) iq.addCallback(subscribed, subscription_name, d) iq.send(to='pubsub.' + self.jid.host) return d return defer.fail(Exception('Service unknow'))
def publish(self, event): if len(self.parent.active_controllers) == 0: # self.log.debug('event cancelled') self.parent.registrations = [] return def success(res): # print('event sent') if res['type'] == 'error': self.log.error('Publish Event failed :%s' % res.toXml()) else: if 'Id' in res.children[0].children[0]['node']: self.log.debug('Event Published: %s' % res.toXml()) name, data = event if name == 'Seconds': return iq = IQ(self.parent.xmlstream, 'set') ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub')) publish = domish.Element((None, 'publish')) publish['node'] = '/'.join((self.nodeId, name)) item = domish.Element((None, 'item')) propertyset = domish.Element( ('urn:schemas-upnp-org:event-1-0', 'propertyset'), localPrefixes={'e': 'urn:schemas-upnp-org:event-1-0'}) prop = domish.Element((None, 'e:property')) evt = domish.Element((None, name)) if isinstance(data.value, dict): ev = domish.Element((data.namespace, 'Event')) inst = domish.Element((None, 'InstanceID')) inst['val'] = '0' for k, v in data.value.items: if 'namespace' in v: var = domish.Element((v['namespace'], k)) else: var = domish.Element((None, k)) if 'attrib' in v: attr = v['attrib'] else: attr = {} value = v['value'] if isinstance(value, bool): value = int(value) attr.update( {'val': str(value) .decode('utf-8')}) for attname, attval in attr: var[attname] = attval inst.addChild(var) ev.addChild(inst) evt.addChild(ev) else: # print(str(data.value).decode('utf-8')) if isinstance(data.value, bool): data.value = int(data.value) evt.addContent(str(data.value).decode('utf-8')) prop.addChild(evt) propertyset.addChild(prop) item.addChild(propertyset) publish.addChild(item) ps.addChild(publish) iq.addChild(ps) iq.addCallback(success) iq.send(to=self.addr)