Changeset 103:e17a30fe7144 for wokkel/disco.py
- Timestamp:
- Aug 3, 2011, 9:49:23 AM (9 years ago)
- Branch:
- default
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
wokkel/disco.py
r96 r103 15 15 from twisted.words.xish import domish 16 16 17 from wokkel import data_form 18 from wokkel.compat import IQ 17 from wokkel import data_form, generic 19 18 from wokkel.iwokkel import IDisco 20 19 from wokkel.subprotocols import IQHandlerMixin, XMPPHandler … … 347 346 348 347 349 class _DiscoRequest(IQ): 350 """ 351 Element representing an XMPP service discovery request. 352 """ 353 354 def __init__(self, xs, namespace, nodeIdentifier=''): 355 """ 356 Initialize the request. 357 358 @param xs: XML Stream the request should go out on. 359 @type xs: L{xmlstream.XmlStream} 360 @param namespace: Request namespace. 361 @type namespace: C{str} 362 @param nodeIdentifier: Node to request info from. 363 @type nodeIdentifier: C{unicode} 364 """ 365 IQ.__init__(self, xs, "get") 366 query = self.addElement((namespace, 'query')) 367 if nodeIdentifier: 368 query['node'] = nodeIdentifier 348 class _DiscoRequest(generic.Request): 349 """ 350 A Service Discovery request. 351 352 @ivar verb: Type of request: C{'info'} or C{'items'}. 353 @type verb: C{str} 354 @ivar nodeIdentifier: Optional node to request info for. 355 @type nodeIdentifier: C{unicode} 356 """ 357 358 verb = None 359 nodeIdentifier = '' 360 361 _requestVerbMap = { 362 NS_DISCO_INFO: 'info', 363 NS_DISCO_ITEMS: 'items', 364 } 365 366 _verbRequestMap = dict(((v, k) for k, v in _requestVerbMap.iteritems())) 367 368 def __init__(self, verb=None, nodeIdentifier='', 369 recipient=None, sender=None): 370 generic.Request.__init__(self, recipient=recipient, sender=sender, 371 stanzaType='get') 372 self.verb = verb 373 self.nodeIdentifier = nodeIdentifier 374 375 376 def parseElement(self, element): 377 generic.Request.parseElement(self, element) 378 379 verbElement = None 380 for child in element.elements(): 381 if child.name == 'query' and child.uri in self._requestVerbMap: 382 self.verb = self._requestVerbMap[child.uri] 383 verbElement = child 384 385 if verbElement: 386 self.nodeIdentifier = verbElement.getAttribute('node', '') 387 388 389 def toElement(self): 390 element = generic.Request.toElement(self) 391 392 childURI = self._verbRequestMap[self.verb] 393 query = element.addElement((childURI, 'query')) 394 395 if self.nodeIdentifier: 396 query['node'] = self.nodeIdentifier 397 398 return element 369 399 370 400 … … 389 419 """ 390 420 391 request = _DiscoRequest( self.xmlstream, NS_DISCO_INFO, nodeIdentifier)392 if sender is not None:393 request['from'] = unicode(sender)394 395 d = request.send(entity.full())421 request = _DiscoRequest('info', nodeIdentifier) 422 request.sender = sender 423 request.recipient = entity 424 425 d = self.request(request) 396 426 d.addCallback(lambda iq: DiscoInfo.fromElement(iq.query)) 397 427 return d … … 412 442 """ 413 443 414 request = _DiscoRequest( self.xmlstream, NS_DISCO_ITEMS, nodeIdentifier)415 if sender is not None:416 request['from'] = unicode(sender)417 418 d = request.send(entity.full())444 request = _DiscoRequest('items', nodeIdentifier) 445 request.sender = sender 446 request.recipient = entity 447 448 d = self.request(request) 419 449 d.addCallback(lambda iq: DiscoItems.fromElement(iq.query)) 420 450 return d … … 446 476 @type iq: L{Element<twisted.words.xish.domish.Element>} 447 477 """ 448 requestor = jid.internJID(iq["from"]) 449 target = jid.internJID(iq["to"]) 450 nodeIdentifier = iq.query.getAttribute("node", '') 478 request = _DiscoRequest.fromElement(iq) 451 479 452 480 def toResponse(info): 453 if nodeIdentifier and not info:481 if request.nodeIdentifier and not info: 454 482 raise error.StanzaError('item-not-found') 455 483 else: 456 484 response = DiscoInfo() 457 response.nodeIdentifier = nodeIdentifier485 response.nodeIdentifier = request.nodeIdentifier 458 486 459 487 for item in info: … … 462 490 return response.toElement() 463 491 464 d = self.info(requestor, target, nodeIdentifier) 492 d = self.info(request.sender, request.recipient, 493 request.nodeIdentifier) 465 494 d.addCallback(toResponse) 466 495 return d … … 474 503 @type iq: L{Element<twisted.words.xish.domish.Element>} 475 504 """ 476 requestor = jid.internJID(iq["from"]) 477 target = jid.internJID(iq["to"]) 478 nodeIdentifier = iq.query.getAttribute("node", '') 505 request = _DiscoRequest.fromElement(iq) 479 506 480 507 def toResponse(items): 481 508 response = DiscoItems() 482 response.nodeIdentifier = nodeIdentifier509 response.nodeIdentifier = request.nodeIdentifier 483 510 484 511 for item in items: … … 487 514 return response.toElement() 488 515 489 d = self.items(requestor, target, nodeIdentifier) 516 d = self.items(request.sender, request.recipient, 517 request.nodeIdentifier) 490 518 d.addCallback(toResponse) 491 519 return d
Note: See TracChangeset
for help on using the changeset viewer.