| 1 | ## common/hub.py |
|---|
| 2 | ## |
|---|
| 3 | ## Gajim Team: |
|---|
| 4 | ## - Yann Le Boulanger <asterix@lagaule.org> |
|---|
| 5 | ## - Vincent Hanquez <tab@snarc.org> |
|---|
| 6 | ## |
|---|
| 7 | ## Copyright (C) 2003-2005 Gajim Team |
|---|
| 8 | ## |
|---|
| 9 | ## This program is free software; you can redistribute it and/or modify |
|---|
| 10 | ## it under the terms of the GNU General Public License as published |
|---|
| 11 | ## by the Free Software Foundation; version 2 only. |
|---|
| 12 | ## |
|---|
| 13 | ## This program is distributed in the hope that it will be useful, |
|---|
| 14 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 15 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 16 | ## GNU General Public License for more details. |
|---|
| 17 | ## |
|---|
| 18 | |
|---|
| 19 | import Queue |
|---|
| 20 | import common.plugin |
|---|
| 21 | import common.thread |
|---|
| 22 | |
|---|
| 23 | """ Hub definitions """ |
|---|
| 24 | |
|---|
| 25 | class GajimHub: |
|---|
| 26 | def __init__(self): |
|---|
| 27 | self.queues = {} |
|---|
| 28 | # {event1:[queue1, queue2]} |
|---|
| 29 | self.events = {} |
|---|
| 30 | self.queueIn = self.newQueue('in', 100) |
|---|
| 31 | self.saveQueue = Queue.Queue(100) |
|---|
| 32 | self.events_to_store = ['WARNING', 'MSG', 'MSGERROR', 'SUBSCRIBED', 'UNSUBSCRIBED', 'SUBSCRIBE'] |
|---|
| 33 | self.queue_to_send = None |
|---|
| 34 | # END __init__ |
|---|
| 35 | |
|---|
| 36 | def newQueue(self, name, size): |
|---|
| 37 | """ Creates a new queue """ |
|---|
| 38 | qu = Queue.Queue(size) |
|---|
| 39 | self.queues[name] = qu |
|---|
| 40 | return qu |
|---|
| 41 | # END newQueue |
|---|
| 42 | |
|---|
| 43 | def newPlugin(self, name): |
|---|
| 44 | """Creates a new Plugin """ |
|---|
| 45 | if name in self.queues.keys(): |
|---|
| 46 | return 0 |
|---|
| 47 | qu = self.newQueue(name, 100) |
|---|
| 48 | pl = common.plugin.GajimPlugin(name, qu, self.queueIn) |
|---|
| 49 | return pl |
|---|
| 50 | # END newPlugin |
|---|
| 51 | |
|---|
| 52 | def register(self, name, event): |
|---|
| 53 | """ Records a plugin from an event """ |
|---|
| 54 | if not self.queues.has_key(name): |
|---|
| 55 | return |
|---|
| 56 | qu = self.queues[name] |
|---|
| 57 | if event == 'VISUAL' and not self.saveQueue.empty(): |
|---|
| 58 | # we save the queue in whitch we must send saved events |
|---|
| 59 | # after the roster is sent |
|---|
| 60 | self.queue_to_send = qu |
|---|
| 61 | if self.events.has_key(event): |
|---|
| 62 | if not qu in self.events[event]: |
|---|
| 63 | self.events[event].append(qu) |
|---|
| 64 | else : |
|---|
| 65 | self.events[event] = [qu] |
|---|
| 66 | # END register |
|---|
| 67 | |
|---|
| 68 | def unregisterEvents(self, name, event): |
|---|
| 69 | """ Records a plugin from an event """ |
|---|
| 70 | if not self.queues.has_key(name): |
|---|
| 71 | return |
|---|
| 72 | qu = self.queues[name] |
|---|
| 73 | if self.events.has_key(event) : |
|---|
| 74 | if qu in self.events[event]: |
|---|
| 75 | self.events[event].remove(qu) |
|---|
| 76 | # END register |
|---|
| 77 | |
|---|
| 78 | def unregister(self, name): |
|---|
| 79 | if not self.queues.has_key(name): |
|---|
| 80 | return |
|---|
| 81 | qu = self.queues[name] |
|---|
| 82 | for event in self.events: |
|---|
| 83 | if qu in self.events[event]: |
|---|
| 84 | self.events[event].remove(qu) |
|---|
| 85 | del self.queues[name] |
|---|
| 86 | # END unregister |
|---|
| 87 | |
|---|
| 88 | def sendPlugin(self, event, con, data, qu=None): |
|---|
| 89 | """ Sends an event to registered plugins""" |
|---|
| 90 | if self.events.has_key(event): |
|---|
| 91 | if event in self.events_to_store and len(self.events['VISUAL']) == 0: |
|---|
| 92 | # Save event if no visual plugin is registered |
|---|
| 93 | self.saveQueue.put((event, con, data)) |
|---|
| 94 | for queue in self.events[event]: |
|---|
| 95 | if qu == None or qu == queue: |
|---|
| 96 | queue.put((event, con, data)) |
|---|
| 97 | if event == 'ROSTER' and self.queue_to_send in self.events[event]: |
|---|
| 98 | # send saved events |
|---|
| 99 | while not self.saveQueue.empty(): |
|---|
| 100 | ev = self.saveQueue.get() |
|---|
| 101 | self.queue_to_send.put(ev) |
|---|
| 102 | self.queue_to_send = None |
|---|
| 103 | # END sendPlugin |
|---|
| 104 | # END GajimHub |
|---|