2003-10-22 22:23:45 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
## core/core.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 22:23:45 +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.
|
|
|
|
##
|
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
import sys, os, time, string, logging
|
2003-11-30 16:50:23 +01:00
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
import common.hub, common.optparser
|
2003-10-22 22:23:45 +02:00
|
|
|
import common.jabber
|
2004-07-17 17:31:47 +02:00
|
|
|
import socket, select, pickle
|
|
|
|
|
2003-10-22 22:23:45 +02:00
|
|
|
|
2004-05-17 01:47:14 +02:00
|
|
|
from common import i18n
|
|
|
|
_ = i18n._
|
|
|
|
|
2003-10-22 22:23:45 +02:00
|
|
|
log = logging.getLogger('core.core')
|
|
|
|
log.setLevel(logging.DEBUG)
|
2003-11-30 16:50:23 +01:00
|
|
|
|
2004-01-18 23:56:28 +01:00
|
|
|
CONFPATH = "~/.gajim/config"
|
2004-04-05 00:09:56 +02:00
|
|
|
LOGPATH = os.path.expanduser("~/.gajim/logs/")
|
2003-10-22 22:23:45 +02:00
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def XMLescape(txt):
|
|
|
|
"Escape XML entities"
|
|
|
|
txt = txt.replace("&", "&")
|
|
|
|
txt = txt.replace("<", "<")
|
|
|
|
txt = txt.replace(">", ">")
|
|
|
|
return txt
|
|
|
|
|
|
|
|
def XMLunescape(txt):
|
|
|
|
"Unescape XML entities"
|
|
|
|
txt = txt.replace(">", ">")
|
|
|
|
txt = txt.replace("<", "<")
|
|
|
|
txt = txt.replace("&", "&")
|
|
|
|
return txt
|
|
|
|
|
2003-10-22 22:23:45 +02:00
|
|
|
class GajimCore:
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Core"""
|
2004-07-17 17:31:47 +02:00
|
|
|
def __init__(self, mode='client'):
|
|
|
|
self.mode = mode
|
2004-05-10 16:57:03 +02:00
|
|
|
self.log = 0
|
2004-02-25 01:33:06 +01:00
|
|
|
self.init_cfg_file()
|
2004-07-17 17:31:47 +02:00
|
|
|
if mode == 'client':
|
|
|
|
self.data = ''
|
|
|
|
self.connect_core()
|
2003-10-22 22:23:45 +02:00
|
|
|
self.hub = common.hub.GajimHub()
|
2004-05-10 16:57:03 +02:00
|
|
|
if self.log:
|
|
|
|
log.setLevel(logging.DEBUG)
|
|
|
|
else:
|
|
|
|
log.setLevel(None)
|
2004-07-17 17:31:47 +02:00
|
|
|
if mode == 'server':
|
|
|
|
self.connected = {}
|
|
|
|
#connexions {con: name, ...}
|
|
|
|
self.connexions = {}
|
|
|
|
for a in self.accounts:
|
2004-08-01 13:57:30 +02:00
|
|
|
self.connected[a] = 0 #0:offline, 1:online, 2:away,
|
|
|
|
#3:xa, 4:dnd, 5:invisible
|
2004-07-17 17:31:47 +02:00
|
|
|
self.myVCardID = []
|
|
|
|
self.loadPlugins(self.cfgParser.tab['Core']['modules'])
|
|
|
|
else:
|
|
|
|
self.loadPlugins(self.cfgParser.tab['Core_client']['modules'])
|
2003-10-22 22:23:45 +02:00
|
|
|
# END __init__
|
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def loadPlugins(self, moduleStr):
|
|
|
|
"""Load defaults plugins : plugins in 'modules' option of Core section
|
|
|
|
in ConfFile and register them to the hub"""
|
|
|
|
if moduleStr:
|
|
|
|
mods = string.split (moduleStr, ' ')
|
|
|
|
|
|
|
|
for mod in mods:
|
2004-07-17 23:00:38 +02:00
|
|
|
try:
|
|
|
|
modObj = self.hub.newPlugin(mod)
|
|
|
|
except:
|
2004-09-06 17:30:44 +02:00
|
|
|
print _("The plugin %s cannot be launched" % mod)
|
2004-07-17 23:00:38 +02:00
|
|
|
if not modObj:
|
|
|
|
print _("The plugin %s is already launched" % mod)
|
|
|
|
return
|
2004-07-17 17:31:47 +02:00
|
|
|
modObj.load()
|
|
|
|
# END loadPLugins
|
|
|
|
|
|
|
|
def connect_core(self):
|
|
|
|
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
self.socket.connect((self.cfgParser.tab['Core_client']['host'], \
|
|
|
|
self.cfgParser.tab['Core_client']['port']))
|
|
|
|
# END connect_core
|
|
|
|
|
2004-02-25 01:33:06 +01:00
|
|
|
def init_cfg_file(self):
|
2004-04-22 14:31:20 +02:00
|
|
|
"""Initialize configuration file"""
|
2004-07-17 17:31:47 +02:00
|
|
|
if self.mode == 'server':
|
|
|
|
default_tab = {'Profile': {'accounts': '', 'log': 0}, 'Core': \
|
|
|
|
{'delauth': 1, 'alwaysauth': 0, 'modules': 'logger gtkgui', \
|
|
|
|
'delroster': 1}}
|
|
|
|
else:
|
|
|
|
default_tab = {'Profile': {'log': 0}, 'Core_client': {'host': \
|
|
|
|
'localhost', 'port': 8255, 'modules': 'gtkgui'}}
|
2004-02-25 01:33:06 +01:00
|
|
|
fname = os.path.expanduser(CONFPATH)
|
|
|
|
reps = string.split(fname, '/')
|
|
|
|
del reps[0]
|
|
|
|
path = ''
|
|
|
|
while len(reps) > 1:
|
|
|
|
path = path + '/' + reps[0]
|
|
|
|
del reps[0]
|
|
|
|
try:
|
|
|
|
os.stat(os.path.expanduser(path))
|
|
|
|
except OSError:
|
|
|
|
try:
|
|
|
|
os.mkdir(os.path.expanduser(path))
|
|
|
|
except:
|
2004-05-17 01:47:14 +02:00
|
|
|
print _("Can't create %s") % path
|
2004-02-25 01:33:06 +01:00
|
|
|
sys.exit
|
|
|
|
try:
|
|
|
|
os.stat(fname)
|
|
|
|
except:
|
2004-05-17 01:47:14 +02:00
|
|
|
print _("creating %s") % fname
|
2004-02-25 01:33:06 +01:00
|
|
|
fic = open(fname, "w")
|
|
|
|
fic.close()
|
2004-07-17 17:31:47 +02:00
|
|
|
self.cfgParser = common.optparser.OptionsParser(CONFPATH)
|
|
|
|
self.parse()
|
|
|
|
for part in default_tab.keys():
|
|
|
|
if not self.cfgParser.tab.has_key(part):
|
|
|
|
self.cfgParser.tab[part] = {}
|
|
|
|
self.cfgParser.writeCfgFile()
|
|
|
|
for option in default_tab[part].keys():
|
|
|
|
if not self.cfgParser.tab[part].has_key(option):
|
|
|
|
self.cfgParser.tab[part][option] = default_tab[part][option]
|
|
|
|
self.cfgParser.writeCfgFile()
|
2004-07-18 17:47:37 +02:00
|
|
|
self.parse()
|
2004-02-25 01:33:06 +01:00
|
|
|
# END init_cfg_file
|
|
|
|
|
2004-01-24 21:32:51 +01:00
|
|
|
def parse(self):
|
2004-04-22 14:31:20 +02:00
|
|
|
"""Parse configuratoin file and create self.accounts"""
|
2004-01-24 21:32:51 +01:00
|
|
|
self.cfgParser.parseCfgFile()
|
2004-05-10 16:57:03 +02:00
|
|
|
if self.cfgParser.tab.has_key('Profile'):
|
|
|
|
if self.cfgParser.tab['Profile'].has_key('log'):
|
|
|
|
self.log = self.cfgParser.tab['Profile']['log']
|
2004-07-17 17:31:47 +02:00
|
|
|
if self.mode == 'server':
|
|
|
|
self.accounts = {}
|
|
|
|
if self.cfgParser.tab['Profile'].has_key('accounts'):
|
|
|
|
accts = string.split(self.cfgParser.tab['Profile']['accounts'], ' ')
|
|
|
|
if accts == ['']:
|
|
|
|
accts = []
|
|
|
|
for a in accts:
|
|
|
|
self.accounts[a] = self.cfgParser.tab[a]
|
2004-01-24 21:32:51 +01:00
|
|
|
|
2004-02-18 22:03:45 +01:00
|
|
|
def vCardCB(self, con, vc):
|
2004-04-22 14:31:20 +02:00
|
|
|
"""Called when we recieve a vCard
|
|
|
|
Parse the vCard and send it to plugins"""
|
2004-02-19 05:20:40 +01:00
|
|
|
vcard = {'jid': vc.getFrom().getBasic()}
|
2004-02-21 19:57:29 +01:00
|
|
|
if vc._getTag('vCard') == common.jabber.NS_VCARD:
|
2004-02-18 22:03:45 +01:00
|
|
|
card = vc.getChildren()[0]
|
|
|
|
for info in card.getChildren():
|
2004-02-19 05:20:40 +01:00
|
|
|
if info.getChildren() == []:
|
|
|
|
vcard[info.getName()] = info.getData()
|
|
|
|
else:
|
2004-02-21 19:57:29 +01:00
|
|
|
vcard[info.getName()] = {}
|
2004-02-19 05:20:40 +01:00
|
|
|
for c in info.getChildren():
|
2004-02-21 19:57:29 +01:00
|
|
|
vcard[info.getName()][c.getName()] = c.getData()
|
2004-04-22 14:31:20 +02:00
|
|
|
if vc.getID() in self.myVCardID:
|
|
|
|
self.myVCardID.remove(vc.getID())
|
|
|
|
self.hub.sendPlugin('MYVCARD', self.connexions[con], vcard)
|
|
|
|
else:
|
|
|
|
self.hub.sendPlugin('VCARD', self.connexions[con], vcard)
|
2004-02-18 22:03:45 +01:00
|
|
|
|
2003-10-22 22:23:45 +02:00
|
|
|
def messageCB(self, con, msg):
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Called when we recieve a message"""
|
2004-08-05 00:40:22 +02:00
|
|
|
typ = msg.getType()
|
2004-09-27 19:51:51 +02:00
|
|
|
tim = msg.getTimestamp()
|
|
|
|
tim = time.strptime(tim, "%Y%m%dT%H:%M:%S")
|
2004-08-05 00:40:22 +02:00
|
|
|
if typ == 'error':
|
2004-07-08 21:46:24 +02:00
|
|
|
self.hub.sendPlugin('MSGERROR', self.connexions[con], \
|
|
|
|
(str(msg.getFrom()), msg.getErrorCode(), msg.getError(), \
|
2004-09-27 19:51:51 +02:00
|
|
|
msg.getBody(), tim))
|
2004-08-05 00:40:22 +02:00
|
|
|
elif typ == 'groupchat':
|
|
|
|
self.hub.sendPlugin('GC_MSG', self.connexions[con], \
|
2004-09-27 19:51:51 +02:00
|
|
|
(str(msg.getFrom()), msg.getBody(), tim))
|
2004-07-08 21:46:24 +02:00
|
|
|
else:
|
|
|
|
self.hub.sendPlugin('MSG', self.connexions[con], \
|
2004-09-27 19:51:51 +02:00
|
|
|
(str(msg.getFrom()), msg.getBody(), tim))
|
2003-10-22 22:23:45 +02:00
|
|
|
# END messageCB
|
|
|
|
|
|
|
|
def presenceCB(self, con, prs):
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Called when we recieve a presence"""
|
2003-10-22 22:23:45 +02:00
|
|
|
who = str(prs.getFrom())
|
2004-06-06 03:27:18 +02:00
|
|
|
prio = prs.getPriority()
|
|
|
|
if not prio:
|
|
|
|
prio = 0
|
2004-08-02 11:11:50 +02:00
|
|
|
typ = prs.getType()
|
|
|
|
if typ == None: typ = 'available'
|
|
|
|
log.debug("PresenceCB : %s" % typ)
|
|
|
|
if typ == 'available':
|
2004-06-06 03:27:18 +02:00
|
|
|
show = prs.getShow()
|
|
|
|
if not show:
|
2003-10-22 22:23:45 +02:00
|
|
|
show = 'online'
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('NOTIFY', self.connexions[con], \
|
|
|
|
(prs.getFrom().getBasic(), show, prs.getStatus(), \
|
2004-09-25 17:19:07 +02:00
|
|
|
prs.getFrom().getResource(), prio, prs.getRole(), \
|
|
|
|
prs.getAffiliation(), prs.getJid(), prs.getReason(), \
|
|
|
|
prs.getActor(), prs.getStatusCode()))
|
2004-08-02 11:11:50 +02:00
|
|
|
elif typ == 'unavailable':
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('NOTIFY', self.connexions[con], \
|
2004-01-24 21:32:51 +01:00
|
|
|
(prs.getFrom().getBasic(), 'offline', prs.getStatus(), \
|
2004-09-25 17:19:07 +02:00
|
|
|
prs.getFrom().getResource(), prio, prs.getRole(), \
|
|
|
|
prs.getAffiliation(), prs.getJid(), prs.getReason(), \
|
|
|
|
prs.getActor(), prs.getStatusCode()))
|
2004-08-02 11:11:50 +02:00
|
|
|
elif typ == 'subscribe':
|
2003-10-27 17:30:37 +01:00
|
|
|
log.debug("subscribe request from %s" % who)
|
2004-01-24 21:32:51 +01:00
|
|
|
if self.cfgParser.Core['alwaysauth'] == 1 or \
|
|
|
|
string.find(who, "@") <= 0:
|
2004-03-16 16:39:36 +01:00
|
|
|
con.send(common.jabber.Presence(who, 'subscribed'))
|
2003-12-20 14:22:37 +01:00
|
|
|
if string.find(who, "@") <= 0:
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('NOTIFY', self.connexions[con], \
|
2004-05-24 21:23:02 +02:00
|
|
|
(prs.getFrom().getBasic(), 'offline', 'offline', \
|
2004-09-25 17:19:07 +02:00
|
|
|
prs.getFrom().getResource(), prio, None, None, None, None, \
|
|
|
|
None, None))
|
2003-11-04 13:14:40 +01:00
|
|
|
else:
|
2004-02-25 01:33:06 +01:00
|
|
|
txt = prs.getStatus()
|
|
|
|
if not txt:
|
2004-05-17 01:47:14 +02:00
|
|
|
txt = _("I would like to add you to my roster.")
|
2004-08-02 11:11:50 +02:00
|
|
|
self.hub.sendPlugin('SUBSCRIBE', self.connexions[con], (who, txt))
|
|
|
|
elif typ == 'subscribed':
|
2003-10-28 20:37:40 +01:00
|
|
|
jid = prs.getFrom()
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('SUBSCRIBED', self.connexions[con],\
|
|
|
|
(jid.getBasic(), jid.getNode(), jid.getResource()))
|
|
|
|
self.hub.queueIn.put(('UPDUSER', self.connexions[con], \
|
|
|
|
(jid.getBasic(), jid.getNode(), ['general'])))
|
|
|
|
#BE CAREFUL : no con.updateRosterItem() in a callback
|
2003-10-27 17:30:37 +01:00
|
|
|
log.debug("we are now subscribed to %s" % who)
|
2004-08-02 11:11:50 +02:00
|
|
|
elif typ == 'unsubscribe':
|
2003-10-27 17:30:37 +01:00
|
|
|
log.debug("unsubscribe request from %s" % who)
|
2004-08-02 11:11:50 +02:00
|
|
|
elif typ == 'unsubscribed':
|
2003-10-27 17:30:37 +01:00
|
|
|
log.debug("we are now unsubscribed to %s" % who)
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('UNSUBSCRIBED', self.connexions[con], \
|
|
|
|
prs.getFrom().getBasic())
|
2004-08-02 11:11:50 +02:00
|
|
|
elif typ == 'error':
|
2004-09-06 17:30:44 +02:00
|
|
|
errmsg = prs.getError()
|
|
|
|
errcode = prs.getErrorCode()
|
|
|
|
if errcode == '400': #Bad Request : JID Malformed or Private message when not allowed
|
|
|
|
pass
|
|
|
|
elif errcode == '401': #No Password Provided
|
|
|
|
pass
|
|
|
|
elif errcode == '403': #forbidden : User is Banned
|
|
|
|
# Unauthorized Subject Change
|
|
|
|
# Attempt by Mere Member to Invite Others to a Members-Only Room
|
|
|
|
# Configuration Access to Non-Owner
|
|
|
|
# Attempt by Non-Owner to Modify Owner List
|
|
|
|
# Attempt by Non-Owner to Modify Admin List
|
|
|
|
# Destroy Request Submitted by Non-Owner
|
|
|
|
pass
|
|
|
|
elif errcode == '404': #item not found : Room Does Not Exist
|
|
|
|
pass
|
|
|
|
elif errcode == '405': #Not allowed : Attempt to Kick Moderator, Admin, or Owner
|
|
|
|
# Attempt to Ban an Admin or Owner
|
|
|
|
# Attempt to Revoke Voice from an Admin, Owner, or User with a Higher Affiliation
|
|
|
|
# Attempt to Revoke Moderator Privileges from an Admin or Owner
|
|
|
|
pass
|
|
|
|
elif errcode == '407': #registration required : User Is Not on Member List
|
|
|
|
#
|
|
|
|
pass
|
|
|
|
elif errcode == '409': #conflict : Nick Conflict
|
|
|
|
self.hub.sendPlugin('WARNING', None, errmsg)
|
|
|
|
else:
|
|
|
|
self.hub.sendPlugin('NOTIFY', self.connexions[con], \
|
|
|
|
(prs.getFrom().getBasic(), 'error', errmsg, \
|
2004-09-25 17:19:07 +02:00
|
|
|
prs.getFrom().getResource(), prio, None, None, None, None, None,\
|
|
|
|
None))
|
2003-10-22 22:23:45 +02:00
|
|
|
# END presenceCB
|
|
|
|
|
|
|
|
def disconnectedCB(self, con):
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Called when we are disconnected"""
|
2003-10-22 22:23:45 +02:00
|
|
|
log.debug("disconnectedCB")
|
2004-04-02 03:26:48 +02:00
|
|
|
if self.connexions.has_key(con):
|
2004-08-01 13:57:30 +02:00
|
|
|
self.connected[self.connexions[con]] = 0
|
2004-05-12 15:12:39 +02:00
|
|
|
self.hub.sendPlugin('STATUS', self.connexions[con], 'offline')
|
2003-10-22 22:23:45 +02:00
|
|
|
# END disconenctedCB
|
2003-11-01 20:41:35 +01:00
|
|
|
|
2003-11-30 23:40:24 +01:00
|
|
|
def connect(self, account):
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Connect and authentificate to the Jabber server"""
|
2004-01-24 21:32:51 +01:00
|
|
|
hostname = self.cfgParser.tab[account]["hostname"]
|
|
|
|
name = self.cfgParser.tab[account]["name"]
|
|
|
|
password = self.cfgParser.tab[account]["password"]
|
|
|
|
ressource = self.cfgParser.tab[account]["ressource"]
|
2004-08-05 00:40:22 +02:00
|
|
|
|
|
|
|
#create connexion if it doesn't already existe
|
|
|
|
con = None
|
|
|
|
for conn in self.connexions:
|
|
|
|
if self.connexions[conn] == account:
|
|
|
|
con = conn
|
|
|
|
if not con:
|
|
|
|
if self.cfgParser.tab[account]["use_proxy"]:
|
|
|
|
proxy = {"host":self.cfgParser.tab[account]["proxyhost"]}
|
|
|
|
proxy["port"] = self.cfgParser.tab[account]["proxyport"]
|
|
|
|
else:
|
|
|
|
proxy = None
|
|
|
|
if self.log:
|
|
|
|
con = common.jabber.Client(host = hostname, debug = [], \
|
|
|
|
log = sys.stderr, connection=common.xmlstream.TCP, port=5222, \
|
|
|
|
proxy = proxy)
|
|
|
|
else:
|
|
|
|
con = common.jabber.Client(host = hostname, debug = [], log = None,\
|
|
|
|
connection=common.xmlstream.TCP, port=5222, proxy = proxy)
|
|
|
|
#debug = [common.jabber.DBG_ALWAYS], log = sys.stderr, \
|
|
|
|
#connection=common.xmlstream.TCP_SSL, port=5223, proxy = proxy)
|
|
|
|
con.setDisconnectHandler(self.disconnectedCB)
|
|
|
|
con.registerHandler('message', self.messageCB)
|
|
|
|
con.registerHandler('presence', self.presenceCB)
|
|
|
|
con.registerHandler('iq',self.vCardCB,'result')#common.jabber.NS_VCARD)
|
2003-10-22 22:23:45 +02:00
|
|
|
try:
|
2004-03-16 16:39:36 +01:00
|
|
|
con.connect()
|
2003-10-22 22:23:45 +02:00
|
|
|
except IOError, e:
|
2003-12-02 13:39:28 +01:00
|
|
|
log.debug("Couldn't connect to %s %s" % (hostname, e))
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('STATUS', account, 'offline')
|
2004-05-17 01:47:14 +02:00
|
|
|
self.hub.sendPlugin('WARNING', None, _("Couldn't connect to %s") \
|
2004-03-16 16:39:36 +01:00
|
|
|
% hostname)
|
2003-12-02 13:39:28 +01:00
|
|
|
return 0
|
2004-02-17 19:06:18 +01:00
|
|
|
except common.xmlstream.socket.error, e:
|
2004-01-17 16:38:29 +01:00
|
|
|
log.debug("Couldn't connect to %s %s" % (hostname, e))
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('STATUS', account, 'offline')
|
2004-05-17 01:47:14 +02:00
|
|
|
self.hub.sendPlugin('WARNING', None, _("Couldn't connect to %s : %s") \
|
2004-03-16 16:39:36 +01:00
|
|
|
% (hostname, e))
|
2004-01-17 16:38:29 +01:00
|
|
|
return 0
|
2004-06-11 16:03:14 +02:00
|
|
|
except common.xmlstream.error, e:
|
|
|
|
log.debug("Couldn't connect to %s %s" % (hostname, e))
|
|
|
|
self.hub.sendPlugin('STATUS', account, 'offline')
|
|
|
|
self.hub.sendPlugin('WARNING', None, _("Couldn't connect to %s : %s") \
|
|
|
|
% (hostname, e))
|
|
|
|
return 0
|
2004-08-05 00:40:22 +02:00
|
|
|
except:
|
|
|
|
sys.exc_info()[1][0]
|
|
|
|
sys.exc_info()[1][1]
|
2003-10-22 22:23:45 +02:00
|
|
|
else:
|
|
|
|
log.debug("Connected to server")
|
|
|
|
|
2003-12-02 13:39:28 +01:00
|
|
|
#BUG in jabberpy library : if hostname is wrong : "boucle"
|
2004-03-16 16:39:36 +01:00
|
|
|
if con.auth(name, password, ressource):
|
2004-05-20 17:47:50 +02:00
|
|
|
self.connexions[con] = account
|
2004-03-16 16:39:36 +01:00
|
|
|
con.requestRoster()
|
|
|
|
roster = con.getRoster().getRaw()
|
2003-11-02 22:39:40 +01:00
|
|
|
if not roster :
|
|
|
|
roster = {}
|
2004-08-01 18:25:41 +02:00
|
|
|
self.hub.sendPlugin('ROSTER', account, (0, roster))
|
2004-03-16 16:39:36 +01:00
|
|
|
self.connected[account] = 1
|
2004-03-16 19:53:49 +01:00
|
|
|
return con
|
2003-10-22 22:23:45 +02:00
|
|
|
else:
|
2003-12-02 13:39:28 +01:00
|
|
|
log.debug("Couldn't authentificate to %s" % hostname)
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('STATUS', account, 'offline')
|
|
|
|
self.hub.sendPlugin('WARNING', None, \
|
2004-05-17 01:47:14 +02:00
|
|
|
_("Authentification failed with %s, check your login and password") % hostname)
|
2003-12-02 13:39:28 +01:00
|
|
|
return 0
|
2003-10-22 22:23:45 +02:00
|
|
|
# END connect
|
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def send_to_socket(self, ev, sock):
|
|
|
|
evp = pickle.dumps(ev)
|
|
|
|
sock.send('<'+XMLescape(evp)+'>')
|
|
|
|
|
|
|
|
def unparse_socket(self):
|
|
|
|
list_ev = []
|
|
|
|
while self.data:
|
|
|
|
deb = self.data.find('<')
|
|
|
|
if deb == -1:
|
|
|
|
break
|
|
|
|
end = self.data.find('>', deb)
|
|
|
|
if end == -1:
|
|
|
|
break
|
|
|
|
list_ev.append(pickle.loads(self.data[deb+1:end]))
|
|
|
|
self.data = self.data[end+1:]
|
|
|
|
return list_ev
|
|
|
|
|
2004-09-06 16:55:10 +02:00
|
|
|
def request_infos(self, account, con, jid):
|
|
|
|
identities, features = con.discoverInfo(jid)
|
|
|
|
if not identities:
|
|
|
|
identities, features, items = con.browseAgent(jid)
|
|
|
|
else:
|
|
|
|
items = con.discoverItems(jid)
|
|
|
|
self.hub.sendPlugin('AGENT_INFO', account, (jid, identities, features, items))
|
|
|
|
for item in items:
|
|
|
|
self.request_infos(account, con, item['jid'])
|
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def read_queue(self):
|
|
|
|
while self.hub.queueIn.empty() == 0:
|
|
|
|
ev = self.hub.queueIn.get()
|
|
|
|
if self.mode == 'client':
|
|
|
|
#('REG_MESSAGE', module, list_message)
|
|
|
|
if ev[0] == 'REG_MESSAGE':
|
|
|
|
for msg in ev[2]:
|
|
|
|
self.hub.register(ev[1], msg)
|
|
|
|
# ready_to_read, ready_to_write, in_error = select.select(
|
|
|
|
# [], [self.socket], [])
|
|
|
|
self.send_to_socket(ev, self.socket)
|
|
|
|
return 0
|
|
|
|
if ev[1] and (ev[1] in self.connexions.values()):
|
|
|
|
for con in self.connexions.keys():
|
|
|
|
if ev[1] == self.connexions[con]:
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
con = None
|
2004-07-28 20:31:31 +02:00
|
|
|
#('QUIT', None, (plugin, kill_core ?)) kill core : 0 or 1
|
2004-07-17 17:31:47 +02:00
|
|
|
if ev[0] == 'QUIT':
|
2004-07-28 20:31:31 +02:00
|
|
|
self.hub.unregister(ev[2][0])
|
|
|
|
if ev[2][1]:
|
|
|
|
for con in self.connexions.keys():
|
2004-08-01 13:57:30 +02:00
|
|
|
if self.connected[self.connexions[con]]:
|
2004-07-28 20:31:31 +02:00
|
|
|
self.connected[self.connexions[con]] = 0
|
|
|
|
con.disconnect()
|
|
|
|
self.hub.sendPlugin('QUIT', None, ())
|
|
|
|
return 1
|
2004-08-01 18:25:41 +02:00
|
|
|
#('ASK_ROSTER', account, queue_for_response)
|
|
|
|
elif ev[0] == 'ASK_ROSTER':
|
|
|
|
roster = {}
|
|
|
|
if con:
|
|
|
|
roster = con.getRoster().getRaw()
|
|
|
|
self.hub.sendPlugin('ROSTER', ev[1], (self.connected[ev[1]], \
|
|
|
|
roster), ev[2])
|
2004-07-17 17:31:47 +02:00
|
|
|
#('ASK_CONFIG', account, (who_ask, section, default_config))
|
|
|
|
elif ev[0] == 'ASK_CONFIG':
|
|
|
|
if ev[2][1] == 'accounts':
|
|
|
|
self.hub.sendPlugin('CONFIG', None, (ev[2][0], self.accounts))
|
2004-03-22 14:09:59 +01:00
|
|
|
else:
|
2004-07-17 17:31:47 +02:00
|
|
|
if self.cfgParser.tab.has_key(ev[2][1]):
|
|
|
|
config = self.cfgParser.__getattr__(ev[2][1])
|
|
|
|
for item in ev[2][2].keys():
|
|
|
|
if not config.has_key(item):
|
|
|
|
config[item] = ev[2][2][item]
|
|
|
|
self.hub.sendPlugin('CONFIG', None, (ev[2][0], config))
|
2004-01-24 21:32:51 +01:00
|
|
|
else:
|
2004-07-17 17:31:47 +02:00
|
|
|
self.cfgParser.tab[ev[2][1]] = ev[2][2]
|
|
|
|
self.cfgParser.writeCfgFile()
|
|
|
|
self.hub.sendPlugin('CONFIG', None, (ev[2][0], ev[2][2]))
|
|
|
|
#('CONFIG', account, (section, config))
|
|
|
|
elif ev[0] == 'CONFIG':
|
|
|
|
if ev[2][0] == 'accounts':
|
|
|
|
#Remove all old accounts
|
|
|
|
accts = string.split(self.cfgParser.tab\
|
|
|
|
['Profile']['accounts'], ' ')
|
|
|
|
if accts == ['']:
|
|
|
|
accts = []
|
|
|
|
for a in accts:
|
|
|
|
del self.cfgParser.tab[a]
|
|
|
|
#Write all new accounts
|
|
|
|
accts = ev[2][1].keys()
|
|
|
|
self.cfgParser.tab['Profile']['accounts'] = \
|
|
|
|
string.join(accts)
|
|
|
|
for a in accts:
|
|
|
|
self.cfgParser.tab[a] = ev[2][1][a]
|
|
|
|
if not a in self.connected.keys():
|
2004-08-01 13:57:30 +02:00
|
|
|
self.connected[a] = 0
|
2004-07-17 17:31:47 +02:00
|
|
|
else:
|
|
|
|
self.cfgParser.tab[ev[2][0]] = ev[2][1]
|
|
|
|
self.cfgParser.writeCfgFile()
|
|
|
|
#TODO: tell the changes to other plugins
|
|
|
|
#('STATUS', account, (status, msg))
|
|
|
|
elif ev[0] == 'STATUS':
|
|
|
|
if (ev[2][0] != 'offline') and (self.connected[ev[1]] == 0):
|
|
|
|
con = self.connect(ev[1])
|
|
|
|
if self.connected[ev[1]]:
|
2004-08-01 13:57:30 +02:00
|
|
|
statuss = ['offline', 'online', 'away', 'xa', 'dnd', \
|
|
|
|
'invisible']
|
|
|
|
self.connected[ev[1]] = statuss.index(ev[2][0])
|
2004-07-17 17:31:47 +02:00
|
|
|
#send our presence
|
2004-08-02 11:11:50 +02:00
|
|
|
typ = 'available'
|
2004-05-31 20:12:57 +02:00
|
|
|
if ev[2][0] == 'invisible':
|
2004-08-02 11:11:50 +02:00
|
|
|
typ = 'invisible'
|
2004-06-09 22:38:01 +02:00
|
|
|
prio = 0
|
|
|
|
if self.cfgParser.tab[ev[1]].has_key('priority'):
|
|
|
|
prio = str(self.cfgParser.tab[ev[1]]['priority'])
|
2004-08-02 11:11:50 +02:00
|
|
|
con.sendPresence(typ, prio, ev[2][0], ev[2][1])
|
2004-03-16 16:39:36 +01:00
|
|
|
self.hub.sendPlugin('STATUS', ev[1], ev[2][0])
|
2004-07-17 17:31:47 +02:00
|
|
|
#ask our VCard
|
|
|
|
iq = common.jabber.Iq(type="get")
|
|
|
|
iq._setTag('vCard', common.jabber.NS_VCARD)
|
|
|
|
id = con.getAnID()
|
|
|
|
iq.setID(id)
|
|
|
|
con.send(iq)
|
|
|
|
self.myVCardID.append(id)
|
2004-08-01 13:57:30 +02:00
|
|
|
elif (ev[2][0] == 'offline') and (self.connected[ev[1]]):
|
2004-07-17 17:31:47 +02:00
|
|
|
self.connected[ev[1]] = 0
|
|
|
|
con.disconnect()
|
|
|
|
self.hub.sendPlugin('STATUS', ev[1], 'offline')
|
2004-08-01 13:57:30 +02:00
|
|
|
elif ev[2][0] != 'offline' and self.connected[ev[1]]:
|
|
|
|
statuss = ['offline', 'online', 'away', 'xa', 'dnd', \
|
|
|
|
'invisible']
|
|
|
|
self.connected[ev[1]] = statuss.index(ev[2][0])
|
2004-08-02 11:11:50 +02:00
|
|
|
typ = 'available'
|
2004-07-17 17:31:47 +02:00
|
|
|
if ev[2][0] == 'invisible':
|
2004-08-02 11:11:50 +02:00
|
|
|
typ = 'invisible'
|
2004-07-17 17:31:47 +02:00
|
|
|
prio = 0
|
|
|
|
if self.cfgParser.tab[ev[1]].has_key('priority'):
|
|
|
|
prio = str(self.cfgParser.tab[ev[1]]['priority'])
|
2004-08-02 11:11:50 +02:00
|
|
|
con.sendPresence(typ, prio, ev[2][0], ev[2][1])
|
2004-07-17 17:31:47 +02:00
|
|
|
self.hub.sendPlugin('STATUS', ev[1], ev[2][0])
|
|
|
|
#('MSG', account, (jid, msg))
|
|
|
|
elif ev[0] == 'MSG':
|
|
|
|
msg = common.jabber.Message(ev[2][0], ev[2][1])
|
|
|
|
msg.setType('chat')
|
|
|
|
con.send(msg)
|
|
|
|
self.hub.sendPlugin('MSGSENT', ev[1], ev[2])
|
|
|
|
#('SUB', account, (jid, txt))
|
|
|
|
elif ev[0] == 'SUB':
|
|
|
|
log.debug('subscription request for %s' % ev[2][0])
|
|
|
|
pres = common.jabber.Presence(ev[2][0], 'subscribe')
|
|
|
|
if ev[2][1]:
|
|
|
|
pres.setStatus(ev[2][1])
|
|
|
|
else:
|
|
|
|
pres.setStatus(_("I would like to add you to my roster."))
|
|
|
|
con.send(pres)
|
|
|
|
#('REQ', account, jid)
|
|
|
|
elif ev[0] == 'AUTH':
|
|
|
|
con.send(common.jabber.Presence(ev[2], 'subscribed'))
|
|
|
|
#('DENY', account, jid)
|
|
|
|
elif ev[0] == 'DENY':
|
|
|
|
con.send(common.jabber.Presence(ev[2], 'unsubscribed'))
|
|
|
|
#('UNSUB', account, jid)
|
|
|
|
elif ev[0] == 'UNSUB':
|
|
|
|
delauth = 1
|
|
|
|
if self.cfgParser.Core.has_key('delauth'):
|
|
|
|
delauth = self.cfgParser.Core['delauth']
|
|
|
|
delroster = 1
|
|
|
|
if self.cfgParser.Core.has_key('delroster'):
|
|
|
|
delroster = self.cfgParser.Core['delroster']
|
|
|
|
if delauth:
|
|
|
|
con.send(common.jabber.Presence(ev[2], 'unsubscribe'))
|
|
|
|
if delroster:
|
2004-06-21 19:06:43 +02:00
|
|
|
con.removeRosterItem(ev[2])
|
2004-07-17 17:31:47 +02:00
|
|
|
#('UNSUB_AGENT', account, agent)
|
|
|
|
elif ev[0] == 'UNSUB_AGENT':
|
|
|
|
con.removeRosterItem(ev[2])
|
|
|
|
con.requestRegInfo(ev[2])
|
|
|
|
agent_info = con.getRegInfo()
|
|
|
|
key = agent_info['key']
|
|
|
|
iq = common.jabber.Iq(to=ev[2], type="set")
|
|
|
|
q = iq.setQuery(common.jabber.NS_REGISTER)
|
|
|
|
q.insertTag('remove')
|
|
|
|
q.insertTag('key').insertData(key)
|
|
|
|
id = con.getAnID()
|
|
|
|
iq.setID(id)
|
|
|
|
con.send(iq)
|
|
|
|
self.hub.sendPlugin('AGENT_REMOVED', ev[1], ev[2])
|
|
|
|
#('UPDUSER', account, (jid, name, groups))
|
|
|
|
elif ev[0] == 'UPDUSER':
|
|
|
|
con.updateRosterItem(jid=ev[2][0], name=ev[2][1], \
|
|
|
|
groups=ev[2][2])
|
|
|
|
#('REQ_AGENTS', account, ())
|
|
|
|
elif ev[0] == 'REQ_AGENTS':
|
2004-09-06 16:55:10 +02:00
|
|
|
# agents = con.requestAgents()
|
|
|
|
#do we need that ?
|
|
|
|
#con.discoverInfo('jabber.lagaule.org')
|
|
|
|
agents = con.discoverItems('jabber.lagaule.org')
|
2004-07-17 17:31:47 +02:00
|
|
|
self.hub.sendPlugin('AGENTS', ev[1], agents)
|
2004-09-06 16:55:10 +02:00
|
|
|
for agent in agents:
|
|
|
|
self.request_infos(ev[1], con, agent['jid'])
|
|
|
|
#('REG_AGENT_INFO', account, agent)
|
|
|
|
elif ev[0] == 'REG_AGENT_INFO':
|
2004-07-17 17:31:47 +02:00
|
|
|
con.requestRegInfo(ev[2])
|
|
|
|
agent_info = con.getRegInfo()
|
2004-09-06 16:55:10 +02:00
|
|
|
self.hub.sendPlugin('REG_AGENT_INFO', ev[1], (ev[2], agent_info))
|
2004-07-17 17:31:47 +02:00
|
|
|
#('REG_AGENT', account, infos)
|
|
|
|
elif ev[0] == 'REG_AGENT':
|
|
|
|
con.sendRegInfo(ev[2])
|
|
|
|
#('NEW_ACC', (hostname, login, password, name, ressource, prio, \
|
|
|
|
# use_proxy, proxyhost, proxyport))
|
|
|
|
elif ev[0] == 'NEW_ACC':
|
|
|
|
if ev[2][6]:
|
|
|
|
proxy = {'host': ev[2][7], 'port': ev[2][8]}
|
|
|
|
else:
|
|
|
|
proxy = None
|
|
|
|
c = common.jabber.Client(host = ev[2][0], debug = [], \
|
|
|
|
log = None, proxy = proxy)
|
|
|
|
try:
|
|
|
|
c.connect()
|
|
|
|
except IOError, e:
|
|
|
|
log.debug("Couldn't connect to %s %s" % (hostname, e))
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
log.debug("Connected to server")
|
|
|
|
c.requestRegInfo()
|
|
|
|
req = c.getRegInfo()
|
|
|
|
c.setRegInfo( 'username', ev[2][1])
|
|
|
|
c.setRegInfo( 'password', ev[2][2])
|
|
|
|
#FIXME: if users already exist, no error message :(
|
|
|
|
if not c.sendRegInfo():
|
|
|
|
print "error " + c.lastErr
|
2003-12-14 01:47:00 +01:00
|
|
|
else:
|
2004-07-17 17:31:47 +02:00
|
|
|
self.hub.sendPlugin('ACC_OK', ev[1], ev[2])
|
|
|
|
#('ACC_CHG', old_account, new_account)
|
|
|
|
elif ev[0] == 'ACC_CHG':
|
|
|
|
self.connected[ev[2]] = self.connected[ev[1]]
|
|
|
|
del self.connected[ev[1]]
|
|
|
|
if con:
|
2004-08-01 13:57:30 +02:00
|
|
|
self.connexions[con] = ev[2]
|
2004-07-17 17:31:47 +02:00
|
|
|
#('ASK_VCARD', account, jid)
|
|
|
|
elif ev[0] == 'ASK_VCARD':
|
|
|
|
iq = common.jabber.Iq(to=ev[2], type="get")
|
|
|
|
iq._setTag('vCard', common.jabber.NS_VCARD)
|
|
|
|
iq.setID(con.getAnID())
|
|
|
|
con.send(iq)
|
|
|
|
#('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...})
|
|
|
|
elif ev[0] == 'VCARD':
|
|
|
|
iq = common.jabber.Iq(type="set")
|
|
|
|
iq.setID(con.getAnID())
|
|
|
|
iq2 = iq._setTag('vCard', common.jabber.NS_VCARD)
|
|
|
|
for i in ev[2].keys():
|
|
|
|
if i != 'jid':
|
|
|
|
if type(ev[2][i]) == type({}):
|
|
|
|
iq3 = iq2.insertTag(i)
|
|
|
|
for j in ev[2][i].keys():
|
|
|
|
iq3.insertTag(j).putData(ev[2][i][j])
|
2003-12-14 01:47:00 +01:00
|
|
|
else:
|
2004-07-17 17:31:47 +02:00
|
|
|
iq2.insertTag(i).putData(ev[2][i])
|
|
|
|
con.send(iq)
|
2004-08-02 11:11:50 +02:00
|
|
|
#('AGENT_LOGGING', account, (agent, typ))
|
2004-07-17 17:31:47 +02:00
|
|
|
elif ev[0] == 'AGENT_LOGGING':
|
|
|
|
t = ev[2][1];
|
|
|
|
if not t:
|
|
|
|
t='available';
|
|
|
|
p = common.jabber.Presence(to=ev[2][0], type=t)
|
|
|
|
con.send(p)
|
|
|
|
#('LOG_NB_LINE', account, jid)
|
|
|
|
elif ev[0] == 'LOG_NB_LINE':
|
|
|
|
fic = open(LOGPATH + ev[2], "r")
|
|
|
|
nb = 0
|
|
|
|
while (fic.readline()):
|
|
|
|
nb = nb+1
|
|
|
|
fic.close()
|
|
|
|
self.hub.sendPlugin('LOG_NB_LINE', ev[1], (ev[2], nb))
|
|
|
|
#('LOG_GET_RANGE', account, (jid, line_begin, line_end))
|
|
|
|
elif ev[0] == 'LOG_GET_RANGE':
|
|
|
|
fic = open(LOGPATH + ev[2][0], "r")
|
|
|
|
nb = 0
|
|
|
|
while (nb < ev[2][1] and fic.readline()):
|
|
|
|
nb = nb+1
|
|
|
|
while nb < ev[2][2]:
|
|
|
|
line = fic.readline()
|
|
|
|
nb = nb+1
|
|
|
|
if line:
|
|
|
|
lineSplited = string.split(line, ':')
|
|
|
|
if len(lineSplited) > 2:
|
|
|
|
self.hub.sendPlugin('LOG_LINE', ev[1], (ev[2][0], nb, \
|
|
|
|
lineSplited[0], lineSplited[1], lineSplited[2:]))
|
|
|
|
fic.close()
|
|
|
|
#('REG_MESSAGE', module, list_message)
|
|
|
|
elif ev[0] == 'REG_MESSAGE':
|
|
|
|
for msg in ev[2]:
|
|
|
|
self.hub.register(ev[1], msg)
|
2004-07-17 23:00:38 +02:00
|
|
|
elif ev[0] == 'EXEC_PLUGIN':
|
|
|
|
self.loadPlugins(ev[2])
|
2004-08-05 00:40:22 +02:00
|
|
|
#('GC_JOIN', account, (nick, room, server, passwd))
|
|
|
|
elif ev[0] == 'GC_JOIN':
|
|
|
|
p = common.jabber.Presence(to='%s@%s/%s' % (ev[2][1], ev[2][2], \
|
|
|
|
ev[2][0]))
|
|
|
|
con.send(p)
|
2004-08-06 01:13:40 +02:00
|
|
|
#('GC_MSG', account, (jid, msg))
|
|
|
|
elif ev[0] == 'GC_MSG':
|
|
|
|
msg = common.jabber.Message(ev[2][0], ev[2][1])
|
|
|
|
msg.setType('groupchat')
|
|
|
|
con.send(msg)
|
|
|
|
self.hub.sendPlugin('MSGSENT', ev[1], ev[2])
|
|
|
|
#('GC_STATUS', account, (nick, jid, show, status))
|
|
|
|
elif ev[0] == 'GC_STATUS':
|
|
|
|
if ev[2][2] == 'offline':
|
|
|
|
con.send(common.jabber.Presence('%s/%s' % (ev[2][1], ev[2][0]), \
|
|
|
|
'unavailable'))
|
|
|
|
else:
|
|
|
|
con.send(common.jabber.Presence('%s/%s' % (ev[2][1], ev[2][0]), \
|
|
|
|
'available', show=ev[2][2], status = ev[2][3]))
|
2004-03-16 16:39:36 +01:00
|
|
|
else:
|
2004-07-17 17:31:47 +02:00
|
|
|
log.debug(_("Unknown Command %s") % ev[0])
|
|
|
|
if self.mode == 'server':
|
|
|
|
for con in self.connexions:
|
2004-08-01 13:57:30 +02:00
|
|
|
if self.connected[self.connexions[con]]:
|
2004-07-17 17:31:47 +02:00
|
|
|
con.process(1)
|
|
|
|
#remove connexion that have been broken
|
|
|
|
for acc in self.connected:
|
|
|
|
if self.connected[acc]:
|
|
|
|
break
|
2004-03-16 16:39:36 +01:00
|
|
|
for con in self.connexions:
|
2004-07-17 17:31:47 +02:00
|
|
|
if self.connexions[con] == acc:
|
|
|
|
del self.connexions[con]
|
|
|
|
break
|
|
|
|
|
2003-10-22 22:23:45 +02:00
|
|
|
time.sleep(0.1)
|
2004-07-17 17:31:47 +02:00
|
|
|
return 0
|
|
|
|
|
|
|
|
# END read_queue
|
|
|
|
|
|
|
|
def read_socket(self):
|
|
|
|
ready_to_read, ready_to_write, in_error = select.select(
|
|
|
|
[self.socket], [], [], 0.1)
|
|
|
|
for sock in ready_to_read:
|
|
|
|
self.data += sock.recv(1024)
|
|
|
|
if not self.data:
|
|
|
|
continue
|
|
|
|
while len(self.data) == 1024:
|
|
|
|
self.data += sock.recv(1024)
|
|
|
|
list_ev = self.unparse_socket()
|
|
|
|
for ev in list_ev:
|
|
|
|
self.hub.sendPlugin(ev[0], ev[1], ev[2])
|
|
|
|
if ev[0] == 'QUIT':
|
|
|
|
sock.close()
|
|
|
|
return 1
|
|
|
|
return 0
|
|
|
|
# END read_socket
|
2003-10-22 22:23:45 +02:00
|
|
|
|
2003-11-30 16:50:23 +01:00
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def mainLoop(self):
|
|
|
|
"""Main Loop : Read the incomming queue to execute commands comming from
|
|
|
|
plugins and process Jabber"""
|
|
|
|
end = 0
|
|
|
|
while not end:
|
|
|
|
end = self.read_queue()
|
|
|
|
if self.mode == 'client':
|
|
|
|
end = self.read_socket()
|
|
|
|
# END main
|
|
|
|
# END GajimCore
|
2003-11-30 16:50:23 +01:00
|
|
|
|
2004-07-17 17:31:47 +02:00
|
|
|
def start(mode='server'):
|
2004-01-17 16:38:29 +01:00
|
|
|
"""Start the Core"""
|
2004-07-17 17:31:47 +02:00
|
|
|
gc = GajimCore(mode)
|
2004-01-17 16:38:29 +01:00
|
|
|
try:
|
|
|
|
gc.mainLoop()
|
|
|
|
except KeyboardInterrupt:
|
2004-05-17 01:47:14 +02:00
|
|
|
print _("Keyboard Interrupt : Bye!")
|
2004-03-16 16:39:36 +01:00
|
|
|
gc.hub.sendPlugin('QUIT', None, ())
|
2004-01-17 16:38:29 +01:00
|
|
|
return 0
|
2004-02-17 19:06:18 +01:00
|
|
|
# except:
|
|
|
|
# print "Erreur survenue"
|
|
|
|
# gc.hub.sendPlugin('QUIT', ())
|
2003-11-30 16:50:23 +01:00
|
|
|
# END start
|