Changeset 721

Show
Ignore:
Timestamp:
07/20/08 07:43:36 (4 months ago)
Author:
sylvain
Message:

Extended PubSub? support.
Added subscription dialog box

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • oss/jlib/designer/ui/createnodedialog.ui

    r719 r721  
    77    <y>0</y> 
    88    <width>405</width> 
    9     <height>70</height> 
     9    <height>73</height> 
    1010   </rect> 
    1111  </property> 
     
    1313   <string>Dialog</string> 
    1414  </property> 
    15   <layout class="QGridLayout" name="gridLayout"
     15  <layout class="QGridLayout"
    1616   <item row="0" column="0" > 
    1717    <widget class="QLabel" name="label" > 
     
    3030     </property> 
    3131     <property name="standardButtons" > 
    32       <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> 
     32      <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set> 
    3333     </property> 
    3434    </widget> 
  • oss/jlib/examples/basic/client.py

    r720 r721  
    1111from jlib.gui.pubsub.feature import jlibPubSubFeatureWidget 
    1212from jlib.core.pubsub import jlibSubscriptionDiscoveryModel, \ 
    13      jlibFeatureDiscoveryModel, jlibAffiliationDiscoveryModel 
     13     jlibFeatureDiscoveryModel, jlibAffiliationDiscoveryModel,\ 
     14     jlibNodeItem, jlibNodeItemModel 
    1415 
    1516from clientui import Ui_MainWindow 
     
    2627        self.actionStart.setEnabled(False) 
    2728        self.actionStop.setEnabled(False) 
     29        self.options = parse_commandline() 
    2830 
    2931        self.openedChats = [] 
     
    4446        self.affsUi = jlibPubSubAffiliationWidget(parent=self.page_5) 
    4547         
    46         self.toolBox.setItemText(4, "Nodes") 
     48        self.toolBox.setItemText(4, "Items") 
    4749        self.nodesUi = jlibPubSubNodeWidget(parent=self.page_4) 
    4850 
     
    5153                               self.clientReady) 
    5254        self.connection.emit(QtCore.SIGNAL("activateChat()")) 
    53         self.connection.emit(QtCore.SIGNAL("activatePubSub(PyQt_PyObject)"), u'pubsub.localhost'
     55        self.connection.emit(QtCore.SIGNAL("activatePubSub(PyQt_PyObject)"), unicode(self.options.pubsub)
    5456        self.connection.emit(QtCore.SIGNAL("registerLinkages(PyQt_PyObject)"), self.contactUi.contact) 
    5557        self.connection.emit(QtCore.SIGNAL("registerLinkages(PyQt_PyObject)"), self.contactUi.presence) 
     
    6769        self.dialog = jlibConnectionDialog() 
    6870 
    69         # Just because I can't be bothered to type them over and over again 
    70         self.dialog.connection.domain.setText('localhost') 
     71        host, port = self.options.address.rsplit(':', 1) 
     72 
     73        self.dialog.connection.username.setText(self.options.username) 
     74        self.dialog.connection.password.setText(self.options.password) 
     75        self.dialog.connection.domain.setText(self.options.domain or 'localhost') 
    7176        self.dialog.connection.resource.setText('Home') 
    72         self.dialog.connection.host.setText('localhost') 
     77        self.dialog.connection.host.setText(host) 
     78        self.dialog.connection.port.setText(port) 
    7379 
    7480        if self.dialog.exec_() == QtGui.QDialog.Accepted: 
     
    96102        disco.emit(QtCore.SIGNAL("discoverAffiliations()")) 
    97103 
     104        QtCore.QObject.connect(disco, QtCore.SIGNAL("receivedItems(PyQt_PyObject)"), 
     105                               self.setItemsModel) 
     106 
    98107    def setSubscriptionsModel(self, subscriptions): 
    99108        model = jlibSubscriptionDiscoveryModel(parent=self.connection.qobj.discovery) 
    100109        model.setSubscriptions(subscriptions) 
     110        self.subsUi.setPubSub(self.connection.qobj.pubsubnode) 
     111        self.subsUi.setDiscovery(self.connection.qobj.discovery) 
    101112        self.subsUi.setModel(model) 
    102113 
     
    111122        self.affsUi.setPubSub(self.connection.qobj.pubsubnode) 
    112123        self.affsUi.setModel(model) 
     124 
     125    def setItemsModel(self, items): 
     126        model = jlibNodeItemModel(parent=self.connection.qobj.discovery) 
     127        model.setNodeItems(items) 
     128        self.nodesUi.setPubSub(self.connection.qobj.pubsubnode) 
     129        self.nodesUi.setModel(model) 
    113130 
    114131    def messageReceived(self, message): 
     
    131148        self.tabWidget.setCurrentIndex(tab) 
    132149 
    133         
     150 
     151def parse_commandline(): 
     152    from optparse import OptionParser 
     153    parser = OptionParser() 
     154    parser.add_option("-u", "--username", dest="username", 
     155                      help="Jabber username") 
     156    parser.add_option("-p", "--password", dest="password", 
     157                      help="Jabber password") 
     158    parser.add_option("-d", "--domain", dest="domain", 
     159                      help="Jabber domain") 
     160    parser.add_option("-a", "--address", dest="address", 
     161                      help="Jabber server address (default: localhost:5222)") 
     162    parser.set_defaults(address='localhost:5222') 
     163    parser.add_option("-s", "--pubsub-service", dest="pubsub", 
     164                      help="Jabber PubSub service name (default: pubsub.localhost)") 
     165    parser.set_defaults(pubsub='pubsub.localhost') 
     166 
     167    args = [str(arg) for arg in QtGui.QApplication.instance().arguments()] 
     168    (options, args) = parser.parse_args(args=args) 
     169 
     170    return options 
     171 
    134172if __name__ == "__main__": 
    135173    import sys 
  • oss/jlib/jlib/core/connection.py

    r719 r721  
    109109        ClientStream.Outboxes["%s.publish" % XMPP_PUBSUB_NS] = "Pubsub item publication handler" 
    110110        ClientStream.Outboxes["%s.retract" % XMPP_PUBSUB_NS] = "Pubsub item deletion handler" 
     111        ClientStream.Outboxes["%s.items" % XMPP_PUBSUB_NS] = "Pubsub item retrieval handler" 
    111112        ClientStream.Outboxes["%s.x" % XMPP_PUBSUB_EVENT_NS] = "" 
    112113        ClientStream.Outboxes["%s.event" % XMPP_PUBSUB_EVENT_NS] = "" 
  • oss/jlib/jlib/core/pubsub.py

    r720 r721  
    2525           'jlibFeatureItem', 'jlibFeatureDiscoveryModel', 
    2626           'jlibAffiliationItem', 'jlibAffiliationDiscoveryModel', 
    27            'jlibPubSubNode', 'jlibPubSubNodeComponent'] 
     27           'jlibPubSubNode', 'jlibPubSubNodeComponent', 
     28           'jlibNodeItem', 'jlibNodeItemModel'] 
    2829 
    2930class jlibPubSubDiscovery(QAxonObject): 
     
    7071         
    7172    def discoverNodeSubscriptions(self, node_name): 
    72         self._deliver(None, 'request-node-subscriptions-disco') 
     73        self._deliver(node_name, 'request-node-subscriptions-disco') 
    7374 
    7475    def discoverItems(self, node_name): 
     
    290291 
    291292    def type(self): 
    292         return QtGui.QStandardItem.UserType + 104 
     293        return QtGui.QStandardItem.UserType + 105 
    293294     
    294295class jlibAffiliationDiscoveryModel(QtGui.QStandardItemModel): 
     
    349350        QtCore.QObject.connect(self, QtCore.SIGNAL("unsubscribeNode(PyQt_PyObject)"), self.unsubscribeNode)   
    350351        QtCore.QObject.connect(self, QtCore.SIGNAL("publishItem(PyQt_PyObject, PyQt_PyObject)"), self.publishItem)   
    351         QtCore.QObject.connect(self, QtCore.SIGNAL("deleteItem(PyQt_PyObject, PyQt_PyObject)"), self.deleteItem)   
    352         QtCore.QObject.connect(self, QtCore.SIGNAL("purgeCollectionNode(PyQt_PyObject)"), self.purgeCollectionNode)   
     352        QtCore.QObject.connect(self, QtCore.SIGNAL("deleteItem(PyQt_PyObject, PyQt_PyObject)"), self.deleteItem) 
     353        QtCore.QObject.connect(self, QtCore.SIGNAL("retrieveItem(PyQt_PyObject, PyQt_PyObject)"), self.retrieveItem)      
     354        QtCore.QObject.connect(self, QtCore.SIGNAL("purgeCollectionNode(PyQt_PyObject)"), self.purgeCollectionNode)  
    353355 
    354356    def setComponent(self, component): 
     
    364366                    ("xmpp", "%s.publish" % XMPP_PUBSUB_NS): ("pubsubdisp", "publish.inbox"), 
    365367                    ("xmpp", "%s.retract" % XMPP_PUBSUB_NS): ("pubsubdisp", "retract.inbox"), 
     368                    ("xmpp", "%s.items" % XMPP_PUBSUB_NS): ("pubsubdisp", "retrieve.inbox"), 
    366369                    ("xmpp", "%s.x" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), 
    367370                    ("xmpp", "%s.event" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), 
     
    369372                    ("itemshandler", "create-node"): ("pubsubdisp", "create.forward"), 
    370373                    ("itemshandler", "delete-node"): ("pubsubdisp", "delete.forward"), 
     374                    ("itemshandler", "retrieve-item"): ("pubsubdisp", "retrieve.forward"), 
    371375                    ("itemshandler", "subscribe-node"): ("pubsubdisp", "subscribe.forward"), 
    372376                    ("itemshandler", "unsubscribe-node"): ("pubsubdisp", "unsubscribe.forward"), 
     
    374378                    ('itemshandler', 'delete-item'): ('pubsubdisp', 'retract.forward'), 
    375379                    ('itemshandler', 'purge-collection-node'): ('pubsubdisp', 'purge.forward'), 
     380                    ("pubsubdisp", "retrieve.outbox"): ("xmpp", "forward"), 
    376381                    ("pubsubdisp", "create.outbox"): ("xmpp", "forward"), 
    377382                    ("pubsubdisp", "delete.outbox"): ("xmpp", "forward"), 
     
    381386                    ("pubsubdisp", "publish.outbox"): ("xmpp", "forward"), 
    382387                    ("pubsubdisp", "retract.outbox"): ("xmpp", "forward"), 
     388                    ("pubsubdisp", "out.retrieve.result"): ("itemshandler", "retrieved"), 
    383389                    ("pubsubdisp", "out.create.result"): ("itemshandler", "created"), 
    384390                    ("pubsubdisp", "out.subscribe.result"): ("itemshandler", "subscribed"), 
    385391                    ("pubsubdisp", "out.delete.result"): ("itemshandler", "deleted"), 
     392                    ("pubsubdisp", "out.retrieve.error"): ("itemshandler", "error"), 
    386393                    ("pubsubdisp", "out.create.error"): ("itemshandler", "error"), 
    387394                    ("pubsubdisp", "out.delete.error"): ("itemshandler", "error"), 
     
    414421    def purgeCollectionNode(self, node_id): 
    415422        self._deliver(node_id, 'request-purge-collection-node') 
     423 
     424    def retrieveItem(self, node_id, item_id): 
     425        self._deliver((node_id, item_id), 'request-item') 
    416426 
    417427class jlibPubSubNodeComponent(component): 
     
    427437               "request-publish-item":     "", 
    428438               "request-delete-item":     "", 
     439               "request-item": "", 
    429440               "request-purge-collection-node": "", 
    430441                
    431442               "subscribed": "", 
     443               "retrieved": "", 
    432444               "created": "", 
    433445               "deleted" : "", 
     
    444456                "publish-item"  : "", 
    445457                "delete-item"  : "", 
     458                "retrieve-item": "", 
    446459                "purge-collection-node": "", 
    447460                "subscribe-node"   : "", 
     
    487500                p = Node(unicode(self.from_jid), self.pubsub_service, node_name=nodeid) 
    488501                self.send(p, "create-node") 
     502 
     503            if self.dataReady('request-item'): 
     504                node_id, item_id = self.recv('request-item') 
     505                p = Node(unicode(self.from_jid), self.pubsub_service, type=u"get", 
     506                         node_name=node_id, item=Item(id=item_id)) 
     507                self.send(p, "retrieve-item") 
    489508 
    490509            if self.dataReady('request-create-collection-node'): 
     
    532551   
    533552            yield 1 
     553 
     554class jlibNodeItem(QtGui.QStandardItem): 
     555    def __init__(self, node_item): 
     556        QtGui.QStandardItem.__init__(self) 
     557        self.node_item = node_item 
     558 
     559    def type(self): 
     560        return QtGui.QStandardItem.UserType + 106 
     561     
     562class jlibNodeItemModel(QtGui.QStandardItemModel): 
     563    def __init__(self, parent=None): 
     564        QtGui.QStandardItemModel.__init__(self, 0, 1, parent) 
     565        self.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant("Item ID")) 
     566        self.items = {} 
     567 
     568    def flags(self, index): 
     569        return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled 
     570 
     571    def setNodeItems(self, node_items): 
     572        for item in node_items.items: 
     573            self.setNodeItem(item) 
     574 
     575    def hasNodeItem(self, item_id): 
     576        return item_id in self.items 
     577 
     578    def getNodeItemIndex(self, node_item): 
     579        item_id = str(node_item.name) 
     580        if self.hasNodeItem(item_id): 
     581            return self.items[item_id].index() 
     582 
     583        return QtCore.QModelIndex() 
     584 
     585    def getNodeItem(self, index): 
     586        return self.itemFromIndex(index) 
     587 
     588    def setNodeItem(self, node_item): 
     589        rootItem = self.invisibleRootItem() 
     590 
     591        item_id = str(node_item.name) 
     592        index = self.getNodeItemIndex(node_item) 
     593        if index.isValid(): 
     594            item = self.items[item_id] 
     595        else: 
     596            item = jlibNodeItem(node_item) 
     597         
     598        rootItem.appendRow(item) 
     599        self.setData(self.index(item.row(), 0), QtCore.QVariant(QtCore.QString(item_id)), 
     600                    QtCore.Qt.DisplayRole) 
     601 
     602        self.items[item_id] = item 
     603 
     604        return item 
  • oss/jlib/jlib/gui/pubsub/node.py

    r719 r721  
    1616 
    1717        self.nodes.contextMenuEvent = self.contextMenuEvent 
     18        QtCore.QObject.connect(self.nodes, QtCore.SIGNAL("clicked(QModelIndex)"), self.clicked) 
    1819 
    1920    def setPubSub(self, pubsub): 
     
    2122        QtCore.QObject.connect(self.pubsub, QtCore.SIGNAL("receivedError(PyQt_PyObject)"), 
    2223                               self.handleError) 
     24 
     25    def setModel(self, model): 
     26        self.nodes.setModel(model) 
    2327 
    2428    def handleError(self, node): 
     
    3135            self.pubsub.emit(QtCore.SIGNAL("createNode(PyQt_PyObject)"), unicode(ui.nodeName.text())) 
    3236 
     37    def clicked(self, index): 
     38        model = self.nodes.model() 
     39        item = model.getNodeItem(index) 
     40        self.pubsub.emit(QtCore.SIGNAL("retrieveItem(PyQt_PyObject, PyQt_PyObject)"), 
     41                         item.node_item.node, item.node_item.name) 
     42 
    3343    def contextMenuEvent(self, event): 
    3444        menu = QtGui.QMenu(self.parent()) 
  • oss/jlib/jlib/gui/pubsub/subscription.py

    r719 r721  
    33 
    44from jlib.gui.pubsub.subscriptionsui import Ui_jlibPubSubSubscription 
     5from jlib.gui.pubsub.subscribenodedialog import jlibSubscribeNodeDialog 
    56 
    67__all__ = ['jlibPubSubSubscriptionWidget'] 
     
    1314    def setupUi(self, parent=None): 
    1415        Ui_jlibPubSubSubscription.setupUi(self, parent) 
     16        self.subscriptions.contextMenuEvent = self.contextMenuEvent 
    1517 
    1618    def setModel(self, model): 
    1719        self.subscriptions.setModel(model) 
     20 
     21    def setPubSub(self, pubsub): 
     22        self.pubsub = pubsub 
     23 
     24    def setDiscovery(self, discovery): 
     25        self.discovery = discovery 
     26 
     27    def subscribeNode(self): 
     28        ui = jlibSubscribeNodeDialog() 
     29        ui.show() 
     30        if ui.exec_() == QtGui.QDialog.Accepted: 
     31            self.pubsub.emit(QtCore.SIGNAL("subscribeNode(PyQt_PyObject)"), unicode(ui.nodeName.text())) 
     32            self.discovery.emit(QtCore.SIGNAL("discoverSubscriptions()")) 
     33 
     34    def unsubscribeNode(self): 
     35        model = self.subscriptions.model() 
     36        subscription = model.getSubscriptionItem(self.subscriptions.currentIndex()).subscription 
     37        self.pubsub.emit(QtCore.SIGNAL("unsubscribeNode(PyQt_PyObject)"), unicode(subscription.node)) 
     38        self.discovery.emit(QtCore.SIGNAL("discoverSubscriptions()")) 
     39 
     40    def discoverNode(self): 
     41        model = self.subscriptions.model() 
     42        subscription = model.getSubscriptionItem(self.subscriptions.currentIndex()).subscription 
     43        self.discovery.emit(QtCore.SIGNAL("discoverNodeSubscriptions(PyQt_PyObject)"), subscription.node) 
     44 
     45    def discoverItems(self): 
     46        model = self.subscriptions.model() 
     47        subscription = model.getSubscriptionItem(self.subscriptions.currentIndex()).subscription 
     48        self.discovery.emit(QtCore.SIGNAL("discoverItems(PyQt_PyObject)"), subscription.node) 
     49 
     50    def contextMenuEvent(self, event): 
     51        menu = QtGui.QMenu(self.parent()) 
     52 
     53        actionSubscribeNode = QtGui.QAction(QtCore.QString("Subscribe to a node"), self.parent()) 
     54        QtCore.QObject.connect(actionSubscribeNode, QtCore.SIGNAL("triggered()"), self.subscribeNode) 
     55        menu.addAction(actionSubscribeNode) 
     56 
     57        actionUnsubscribeNode = QtGui.QAction(QtCore.QString("Unsubscribe from a node"), self.parent()) 
     58        QtCore.QObject.connect(actionUnsubscribeNode, QtCore.SIGNAL("triggered()"), self.unsubscribeNode) 
     59        menu.addAction(actionUnsubscribeNode) 
     60 
     61        actionDiscoverNode = QtGui.QAction(QtCore.QString("Discover node"), self.parent()) 
     62        QtCore.QObject.connect(actionDiscoverNode, QtCore.SIGNAL("triggered()"), self.discoverNode) 
     63        menu.addAction(actionDiscoverNode) 
     64 
     65        actionDiscoverItem = QtGui.QAction(QtCore.QString("Discover items"), self.parent()) 
     66        QtCore.QObject.connect(actionDiscoverItem, QtCore.SIGNAL("triggered()"), self.discoverItems) 
     67        menu.addAction(actionDiscoverItem) 
     68 
     69        menu.exec_(event.globalPos())