Ignore:
Timestamp:
Jan 5, 2010, 2:55:40 PM (13 years ago)
Author:
Ralph Meijer <ralphm@…>
Branch:
default
Message:

Add support for subscription options in subscribe requests

Fixes #63.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • wokkel/pubsub.py

    r82 r83  
    229229    _parameters = {
    230230        'publish': ['node', 'items'],
    231         'subscribe': ['nodeOrEmpty', 'jid'],
     231        'subscribe': ['nodeOrEmpty', 'jid', 'optionsWithSubscribe'],
    232232        'unsubscribe': ['nodeOrEmpty', 'jid'],
    233233        'optionsGet': ['nodeOrEmpty', 'jid'],
     
    373373                form = data_form.findForm(element, NS_PUBSUB_NODE_CONFIG)
    374374                if form:
    375                     if form.formType == 'submit':
    376                         self.options = form
    377                     else:
     375                    if form.formType != 'submit':
    378376                        raise BadRequest(text=u"Unexpected form type '%s'" %
    379377                                              form.formType)
     
    381379                    form = data_form.Form('submit',
    382380                                          formNamespace=NS_PUBSUB_NODE_CONFIG)
    383                     self.options = form
     381                self.options = form
    384382
    385383
     
    452450
    453451
     452
     453    def _render_options(self, verbElement):
     454        verbElement.addChild(self.options.toElement())
     455
     456
     457    def _parse_optionsWithSubscribe(self, verbElement):
     458        for element in verbElement.parent.elements():
     459            if element.name == 'options' and element.uri == NS_PUBSUB:
     460                form = data_form.findForm(element,
     461                                          NS_PUBSUB_SUBSCRIBE_OPTIONS)
     462                if form:
     463                    if form.formType != 'submit':
     464                        raise BadRequest(text=u"Unexpected form type '%s'" %
     465                                              form.formType)
     466                else:
     467                    form = data_form.Form('submit',
     468                                          formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
     469                self.options = form
     470
     471
     472    def _render_optionsWithSubscribe(self, verbElement):
     473        if self.options:
     474            optionsElement = verbElement.parent.addElement('options')
     475            self._render_options(optionsElement)
     476
     477
    454478    def parseElement(self, element):
    455479        """
     
    458482        generic.Stanza.parseElement(self, element)
    459483
     484        verbs = []
     485        children = []
    460486        for child in element.pubsub.elements():
    461487            key = (self.stanzaType, child.uri, child.name)
     
    464490            except KeyError:
    465491                continue
     492
     493            verbs.append(verb)
     494            children.append(child)
     495
     496        if not verbs:
     497            raise NotImplementedError()
     498
     499        if len(verbs) > 1:
     500            if 'optionsSet' in verbs and 'subscribe' in verbs:
     501                self.verb = 'subscribe'
     502                child = children[verbs.index('subscribe')]
    466503            else:
    467                 self.verb = verb
    468                 break
    469 
    470         if not self.verb:
    471             raise NotImplementedError()
    472 
    473         for parameter in self._parameters[verb]:
     504                raise NotImplementedError()
     505        else:
     506            self.verb = verbs[0]
     507
     508        for parameter in self._parameters[self.verb]:
    474509            getattr(self, '_parse_%s' % parameter)(child)
     510
    475511
    476512
     
    687723
    688724
    689     def subscribe(self, service, nodeIdentifier, subscriber, sender=None):
     725    def subscribe(self, service, nodeIdentifier, subscriber,
     726                        options=None, sender=None):
    690727        """
    691728        Subscribe to a publish subscribe node.
     
    698735                           will get notifications of new published items.
    699736        @type subscriber: L{JID}
     737        @param options: Subscription options.
     738        @type options: C{dict}.
    700739        """
    701740        request = PubSubRequest('subscribe')
     
    704743        request.subscriber = subscriber
    705744        request.sender = sender
     745
     746        if options:
     747            form = data_form.Form(formType='submit',
     748                                  formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
     749            form.makeFields(options)
     750            request.options = form
    706751
    707752        def cb(iq):
     
    788833        d = request.send(self.xmlstream)
    789834        d.addCallback(cb)
     835        return d
     836
     837
     838    def getOptions(self, service, nodeIdentifier, subscriber, sender=None):
     839        """
     840        Get subscription options.
     841
     842        @param service: The publish subscribe service that keeps the node.
     843        @type service: L{JID}
     844
     845        @param nodeIdentifier: The identifier of the node.
     846        @type nodeIdentifier: C{unicode}
     847
     848        @param subscriber: The entity subscribed to the node.
     849        @type subscriber: L{JID}
     850
     851        @rtype: L{data_form.Form}
     852        """
     853        request = PubSubRequest('optionsGet')
     854        request.recipient = service
     855        request.nodeIdentifier = nodeIdentifier
     856        request.subscriber = subscriber
     857        request.sender = sender
     858
     859        def cb(iq):
     860            form = data_form.findForm(iq.pubsub.options,
     861                                      NS_PUBSUB_SUBSCRIBE_OPTIONS)
     862            form.typeCheck()
     863            return form
     864
     865        d = request.send(self.xmlstream)
     866        d.addCallback(cb)
     867        return d
     868
     869
     870    def setOptions(self, service, nodeIdentifier, subscriber,
     871                         options, sender=None):
     872        """
     873        Set subscription options.
     874
     875        @param service: The publish subscribe service that keeps the node.
     876        @type service: L{JID}
     877
     878        @param nodeIdentifier: The identifier of the node.
     879        @type nodeIdentifier: C{unicode}
     880
     881        @param subscriber: The entity subscribed to the node.
     882        @type subscriber: L{JID}
     883
     884        @param options: Subscription options.
     885        @type options: C{dict}.
     886        """
     887        request = PubSubRequest('optionsSet')
     888        request.recipient = service
     889        request.nodeIdentifier = nodeIdentifier
     890        request.subscriber = subscriber
     891        request.sender = sender
     892
     893        form = data_form.Form(formType='submit',
     894                              formNamespace=NS_PUBSUB_SUBSCRIBE_OPTIONS)
     895        form.makeFields(options)
     896        request.options = form
     897
     898        d = request.send(self.xmlstream)
    790899        return d
    791900
Note: See TracChangeset for help on using the changeset viewer.