gajim-plural/common/hub.py

106 lines
3.0 KiB
Python
Raw Normal View History

2003-10-22 20:45:13 +02:00
#!/usr/bin/env python
## common/hub.py
##
## Gajim Team:
## - Yann Le Boulanger <asterix@crans.org>
2004-06-18 11:25:15 +02:00
## - Vincent Hanquez <tab@snarc.org>
2003-10-22 20:45:13 +02:00
##
## Copyright (C) 2003 Gajim Team
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 2 only.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
import Queue
import common.plugin
import common.thread
""" Hub definitions """
class GajimHub:
2004-07-08 21:56:30 +02:00
def __init__(self):
self.queues = {}
# {event1:[queue1, queue2]}
self.events = {}
self.queueIn = self.newQueue('in', 100)
self.saveQueue = Queue.Queue(100)
self.events_to_store = ['WARNING', 'MSG', 'MSGERROR', 'SUBSCRIBED', 'UNSUBSCRIBED', 'SUBSCRIBE']
self.queue_to_send = None
2004-07-08 21:56:30 +02:00
# END __init__
2003-10-22 20:45:13 +02:00
2004-07-08 21:56:30 +02:00
def newQueue(self, name, size):
""" Creates a new queue """
qu = Queue.Queue(size)
self.queues[name] = qu
return qu
# END newQueue
2003-10-22 20:45:13 +02:00
2004-07-08 21:56:30 +02:00
def newPlugin(self, name):
"""Creates a new Plugin """
if name in self.queues.keys():
return 0
2004-07-08 21:56:30 +02:00
qu = self.newQueue(name, 100)
pl = common.plugin.GajimPlugin(name, qu, self.queueIn)
return pl
# END newPlugin
2003-10-22 20:45:13 +02:00
2004-07-08 21:56:30 +02:00
def register(self, name, event):
""" Records a plugin from an event """
if not self.queues.has_key(name):
return
2004-07-08 21:56:30 +02:00
qu = self.queues[name]
if event == 'VISUAL' and not self.saveQueue.empty():
# we save the queue in whitch we must send saved events
# after the roster is sent
self.queue_to_send = qu
if self.events.has_key(event):
if not qu in self.events[event]:
self.events[event].append(qu)
2004-07-08 21:56:30 +02:00
else :
self.events[event] = [qu]
# END register
def unregisterEvents(self, name, event):
""" Records a plugin from an event """
if not self.queues.has_key(name):
return
qu = self.queues[name]
if self.events.has_key(event) :
if qu in self.events[event]:
self.events[event].remove(qu)
# END register
def unregister(self, name):
if not self.queues.has_key(name):
return
qu = self.queues[name]
for event in self.events:
if qu in self.events[event]:
self.events[event].remove(qu)
del self.queues[name]
# END unregister
def sendPlugin(self, event, con, data, qu=None):
""" Sends an event to registered plugins"""
2004-07-08 21:56:30 +02:00
if self.events.has_key(event):
if event in self.events_to_store and len(self.events['VISUAL']) == 0:
# Save event if no visual plugin is registered
self.saveQueue.put((event, con, data))
for queue in self.events[event]:
if qu == None or qu == queue:
queue.put((event, con, data))
if event == 'ROSTER' and self.queue_to_send in self.events[event]:
# send saved events
while not self.saveQueue.empty():
ev = self.saveQueue.get()
self.queue_to_send.put(ev)
self.queue_to_send = None
2004-07-08 21:56:30 +02:00
# END sendPlugin
2003-10-22 20:45:13 +02:00
# END GajimHub