2006-11-18 21:52:28 +01:00
#!/usr/bin/env python
2008-08-15 05:20:23 +02:00
## src/gajim.py
2003-11-30 23:40:24 +01:00
##
2008-08-15 05:20:23 +02:00
## Copyright (C) 2003-2008 Yann Leboulanger <asterix AT lagaule.org>
## Copyright (C) 2004-2005 Vincent Hanquez <tab AT snarc.org>
## Copyright (C) 2005 Alex Podaras <bigpod AT gmail.com>
## Norman Rasmussen <norman AT rasmussen.co.za>
2008-08-15 05:39:27 +02:00
## Stephan Kochen <stephan AT kochen.nl>
2008-08-15 05:20:23 +02:00
## Copyright (C) 2005-2006 Dimitur Kirov <dkirov AT gmail.com>
## Alex Mauer <hawke AT hawkesnest.net>
## Copyright (C) 2005-2007 Travis Shirk <travis AT pobox.com>
## Nikos Kouremenos <kourem AT gmail.com>
## Copyright (C) 2006 Junglecow <junglecow AT gmail.com>
## Stefan Bethge <stefan AT lanpartei.de>
## Copyright (C) 2006-2008 Jean-Marie Traissard <jim AT lapin.org>
## Copyright (C) 2007 Lukas Petrovicky <lukas AT petrovicky.net>
## James Newton <redshodan AT gmail.com>
## Copyright (C) 2007-2008 Brendan Taylor <whateley AT gmail.com>
## Julien Pivotto <roidelapluie AT gmail.com>
## Stephan Erb <steve-e AT h3c.de>
## Copyright (C) 2008 Jonathan Schleifer <js-gajim AT webkeks.org>
2003-11-30 23:40:24 +01:00
##
2007-12-12 09:44:46 +01:00
## This file is part of Gajim.
##
## Gajim is free software; you can redistribute it and/or modify
2003-11-30 23:40:24 +01:00
## it under the terms of the GNU General Public License as published
2007-12-12 09:44:46 +01:00
## by the Free Software Foundation; version 3 only.
2003-11-30 23:40:24 +01:00
##
2007-12-12 09:44:46 +01:00
## Gajim is distributed in the hope that it will be useful,
2003-11-30 23:40:24 +01:00
## but WITHOUT ANY WARRANTY; without even the implied warranty of
2008-08-15 05:20:23 +02:00
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2003-11-30 23:40:24 +01:00
## GNU General Public License for more details.
##
2007-12-12 09:44:46 +01:00
## You should have received a copy of the GNU General Public License
2008-08-15 05:20:23 +02:00
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
2007-12-12 09:44:46 +01:00
##
2005-11-13 15:55:52 +01:00
2005-08-16 13:55:29 +02:00
import os
2007-12-12 09:44:46 +01:00
if os . name == ' nt ' :
import warnings
warnings . filterwarnings ( action = ' ignore ' )
2008-05-19 12:58:03 +02:00
if os . path . isdir ( ' gtk ' ) :
# Used to create windows installer with GTK included
paths = os . environ [ ' PATH ' ]
list_ = paths . split ( ' ; ' )
new_list = [ ]
for p in list_ :
if p . find ( ' gtk ' ) < 0 and p . find ( ' GTK ' ) < 0 :
new_list . append ( p )
new_list . insert ( 0 , ' gtk/lib ' )
new_list . insert ( 0 , ' gtk/bin ' )
os . environ [ ' PATH ' ] = ' ; ' . join ( new_list )
os . environ [ ' GTK_BASEPATH ' ] = ' gtk '
2007-12-12 09:44:46 +01:00
import sys
2005-09-07 21:46:09 +02:00
2006-12-23 22:18:07 +01:00
import logging
consoleloghandler = logging . StreamHandler ( )
2006-12-27 19:38:50 +01:00
consoleloghandler . setLevel ( 1 )
2006-12-23 22:18:07 +01:00
consoleloghandler . setFormatter (
logging . Formatter ( ' %(asctime)s %(name)s : %(levelname)s : %(message)s ' ) )
log = logging . getLogger ( ' gajim ' )
2006-12-27 19:38:50 +01:00
log . setLevel ( logging . WARNING )
2006-12-23 22:18:07 +01:00
log . addHandler ( consoleloghandler )
log . propagate = False
log = logging . getLogger ( ' gajim.gajim ' )
# create intermediate loggers
logging . getLogger ( ' gajim.c ' )
logging . getLogger ( ' gajim.c.x ' )
import getopt
2006-06-15 08:49:04 +02:00
from common import i18n
2006-12-23 22:18:07 +01:00
def parseLogLevel ( arg ) :
if arg . isdigit ( ) :
return int ( arg )
if arg . isupper ( ) :
return getattr ( logging , arg )
2008-08-01 12:22:24 +02:00
raise ValueError ( _ ( ' %s is not a valid loglevel ' ) , repr ( arg ) )
2006-12-23 22:18:07 +01:00
def parseLogTarget ( arg ) :
arg = arg . lower ( )
if arg . startswith ( ' . ' ) : return arg [ 1 : ]
if arg . startswith ( ' gajim ' ) : return arg
return ' gajim. ' + arg
def parseAndSetLogLevels ( arg ) :
2006-12-27 19:38:50 +01:00
for directive in arg . split ( ' , ' ) :
2006-12-23 22:18:07 +01:00
directive = directive . strip ( )
2006-12-27 19:38:50 +01:00
targets , level = directive . rsplit ( ' = ' , 1 )
2006-12-23 22:18:07 +01:00
level = parseLogLevel ( level . strip ( ) )
2006-12-27 19:38:50 +01:00
for target in targets . split ( ' = ' ) :
target = parseLogTarget ( target . strip ( ) )
if target == ' ' :
consoleloghandler . setLevel ( level )
print " consoleloghandler level set to %s " % level
else :
logger = logging . getLogger ( target )
logger . setLevel ( level )
print " Logger %s level set to %d " % ( target , level )
2006-12-23 22:18:07 +01:00
def parseOpts ( ) :
profile = ' '
verbose = False
2007-08-09 17:39:18 +02:00
config_path = None
2006-12-23 22:18:07 +01:00
try :
2007-08-09 17:39:18 +02:00
shortargs = ' hqvl:p:c: '
longargs = ' help quiet verbose loglevel= profile= config_path= '
2006-12-23 22:18:07 +01:00
opts , args = getopt . getopt ( sys . argv [ 1 : ] , shortargs , longargs . split ( ) )
except getopt . error , msg :
print msg
print ' for help use --help '
sys . exit ( 2 )
for o , a in opts :
if o in ( ' -h ' , ' --help ' ) :
2008-03-27 14:59:03 +01:00
print ' gajim [--help] [--quiet] [--verbose] [--loglevel subsystem=level[,subsystem=level[...]]] [--profile name] [--config-path] '
2006-12-23 22:18:07 +01:00
sys . exit ( )
elif o in ( ' -q ' , ' --quiet ' ) :
consoleloghandler . setLevel ( logging . CRITICAL )
verbose = False
elif o in ( ' -v ' , ' --verbose ' ) :
consoleloghandler . setLevel ( logging . INFO )
verbose = True
elif o in ( ' -p ' , ' --profile ' ) : # gajim --profile name
profile = a
elif o in ( ' -l ' , ' --loglevel ' ) :
parseAndSetLogLevels ( a )
2007-08-09 17:39:18 +02:00
elif o in ( ' -c ' , ' --config-path ' ) :
config_path = a
return profile , verbose , config_path
2006-12-23 22:18:07 +01:00
2007-08-09 17:39:18 +02:00
profile , verbose , config_path = parseOpts ( )
2006-12-27 19:38:50 +01:00
del parseOpts , parseAndSetLogLevels , parseLogTarget , parseLogLevel
2006-12-23 22:18:07 +01:00
2007-08-09 17:39:18 +02:00
import locale
profile = unicode ( profile , locale . getpreferredencoding ( ) )
import common . configpaths
common . configpaths . gajimpaths . init ( config_path )
del config_path
common . configpaths . gajimpaths . init_profile ( profile )
del profile
2007-12-12 09:44:46 +01:00
# PyGTK2.10+ only throws a warning
import warnings
warnings . filterwarnings ( ' error ' , module = ' gtk ' )
try :
import gtk
except Warning , msg :
if str ( msg ) == ' could not open display ' :
2008-06-29 01:05:14 +02:00
print >> sys . stderr , _ ( ' Gajim needs X server to run. Quiting... ' )
sys . exit ( )
2007-12-12 09:44:46 +01:00
warnings . resetwarnings ( )
2008-04-04 23:31:27 +02:00
if os . name == ' nt ' :
import warnings
warnings . filterwarnings ( action = ' ignore ' )
2005-12-01 18:17:20 +01:00
pritext = ' '
2005-09-11 16:20:20 +02:00
2008-03-17 08:22:43 +01:00
from common import exceptions
2005-09-22 18:30:46 +02:00
try :
2008-03-17 08:22:43 +01:00
from common import gajim
except exceptions . DatabaseMalformed :
pritext = _ ( ' Database Error ' )
sectext = _ ( ' The database file ( %s ) cannot be read. Try to repare it or remove it (all history will be lost). ' ) % common . logger . LOG_DB_PATH
else :
from common import dbus_support
if dbus_support . supported :
import dbus
if os . name == ' posix ' : # dl module is Unix Only
try : # rename the process name to gajim
import dl
libc = dl . open ( ' /lib/libc.so.6 ' )
libc . call ( ' prctl ' , 15 , ' gajim \0 ' , 0 , 0 , 0 )
except :
pass
if gtk . pygtk_version < ( 2 , 8 , 0 ) :
pritext = _ ( ' Gajim needs PyGTK 2.8 or above ' )
sectext = _ ( ' Gajim needs PyGTK 2.8 or above to run. Quiting... ' )
elif gtk . gtk_version < ( 2 , 8 , 0 ) :
pritext = _ ( ' Gajim needs GTK 2.8 or above ' )
sectext = _ ( ' Gajim needs GTK 2.8 or above to run. Quiting... ' )
2005-12-01 18:17:20 +01:00
2008-03-17 08:22:43 +01:00
try :
import gtk . glade # check if user has libglade (in pygtk and in gtk)
except ImportError :
pritext = _ ( ' GTK+ runtime is missing libglade support ' )
if os . name == ' nt ' :
sectext = _ ( ' Please remove your current GTK+ runtime and install the latest stable version from %s ' ) % ' http://gladewin32.sourceforge.net '
else :
sectext = _ ( ' Please make sure that GTK+ and PyGTK have libglade support in your system. ' )
2005-12-01 18:17:20 +01:00
2006-09-13 18:47:58 +02:00
try :
2008-03-17 08:22:43 +01:00
from common import check_paths
except exceptions . PysqliteNotAvailable , e :
pritext = _ ( ' Gajim needs PySQLite2 to run ' )
sectext = str ( e )
if os . name == ' nt ' :
try :
import winsound # windows-only built-in module for playing wav
import win32api # do NOT remove. we req this module
except :
pritext = _ ( ' Gajim needs pywin32 to run ' )
sectext = _ ( ' Please make sure that Pywin32 is installed on your system. You can get it at %s ' ) % ' http://sourceforge.net/project/showfiles.php?group_id=78018 '
2006-09-13 18:47:58 +02:00
2005-12-01 18:17:20 +01:00
if pritext :
2007-12-12 09:44:46 +01:00
dlg = gtk . MessageDialog ( None ,
2006-11-18 21:52:28 +01:00
gtk . DIALOG_DESTROY_WITH_PARENT | gtk . DIALOG_MODAL ,
gtk . MESSAGE_ERROR , gtk . BUTTONS_OK , message_format = pritext )
2005-09-22 18:30:46 +02:00
dlg . format_secondary_text ( sectext )
dlg . run ( )
dlg . destroy ( )
sys . exit ( )
2007-02-04 15:09:38 +01:00
del pritext
2008-07-20 16:53:34 +02:00
import gtkexcepthook
2005-11-12 22:24:54 +01:00
2005-02-28 19:15:48 +01:00
import gobject
2008-02-14 20:18:07 +01:00
if not hasattr ( gobject , ' timeout_add_seconds ' ) :
def timeout_add_seconds_fake ( time_sec , * args ) :
return gobject . timeout_add ( time_sec * 1000 , * args )
gobject . timeout_add_seconds = timeout_add_seconds_fake
2005-10-03 18:14:41 +02:00
2006-11-19 00:21:59 +01:00
import re
2005-04-18 16:05:30 +02:00
import signal
2005-06-28 21:03:00 +02:00
import time
2006-04-05 11:55:22 +02:00
import math
2005-08-08 16:53:21 +02:00
2005-07-25 16:38:21 +02:00
import gtkgui_helpers
2005-11-11 20:06:48 +01:00
import notify
2008-03-17 08:22:43 +01:00
import message_control
from chat_control import ChatControlBase
2008-04-20 20:14:04 +02:00
from chat_control import ChatControl
from groupchat_control import GroupchatControl
from groupchat_control import PrivateChatControl
2008-03-17 08:22:43 +01:00
from atom_window import AtomWindow
2008-05-13 03:59:10 +02:00
from session import ChatControlSession
2005-02-28 19:15:48 +01:00
2005-05-21 18:01:52 +02:00
import common . sleepy
2005-09-09 19:43:39 +02:00
2006-02-03 13:17:34 +01:00
from common . xmpp import idlequeue
2008-03-17 08:22:43 +01:00
from common . zeroconf import connection_zeroconf
2006-02-03 13:17:34 +01:00
from common import nslookup
2006-03-19 21:43:30 +01:00
from common import proxy65_manager
2005-11-11 20:06:48 +01:00
from common import socks5
2005-08-10 00:46:13 +02:00
from common import helpers
2005-04-17 00:12:41 +02:00
from common import optparser
2007-12-12 09:44:46 +01:00
from common import dataforms
2005-04-14 09:05:10 +02:00
2006-12-23 22:18:07 +01:00
if verbose : gajim . verbose = True
2007-02-04 15:09:38 +01:00
del verbose
2005-05-14 00:38:48 +02:00
2006-11-18 21:52:28 +01:00
gajimpaths = common . configpaths . gajimpaths
pid_filename = gajimpaths [ ' PID_FILE ' ]
config_filename = gajimpaths [ ' CONFIG_FILE ' ]
2006-11-22 21:56:25 +01:00
import traceback
import errno
2006-06-14 10:45:30 +02:00
import dialogs
2006-11-22 17:15:16 +01:00
def pid_alive ( ) :
2006-11-22 21:56:25 +01:00
try :
2006-11-22 17:15:16 +01:00
pf = open ( pid_filename )
2008-07-20 15:48:50 +02:00
except IOError :
2006-11-22 21:56:25 +01:00
# probably file not found
return False
2006-12-15 11:57:25 +01:00
try :
pid = int ( pf . read ( ) . strip ( ) )
pf . close ( )
except :
traceback . print_exc ( )
# PID file exists, but something happened trying to read PID
# Could be 0.10 style empty PID file, so assume Gajim is running
return True
2006-11-23 00:27:54 +01:00
2006-12-13 15:41:57 +01:00
if os . name == ' nt ' :
try :
from ctypes import ( windll , c_ulong , c_int , Structure , c_char , POINTER , pointer , )
except :
return True
class PROCESSENTRY32 ( Structure ) :
_fields_ = [
( ' dwSize ' , c_ulong , ) ,
( ' cntUsage ' , c_ulong , ) ,
( ' th32ProcessID ' , c_ulong , ) ,
( ' th32DefaultHeapID ' , c_ulong , ) ,
( ' th32ModuleID ' , c_ulong , ) ,
( ' cntThreads ' , c_ulong , ) ,
( ' th32ParentProcessID ' , c_ulong , ) ,
( ' pcPriClassBase ' , c_ulong , ) ,
( ' dwFlags ' , c_ulong , ) ,
( ' szExeFile ' , c_char * 512 , ) ,
]
def __init__ ( self ) :
Structure . __init__ ( self , 512 + 9 * 4 )
k = windll . kernel32
k . CreateToolhelp32Snapshot . argtypes = c_ulong , c_ulong ,
k . CreateToolhelp32Snapshot . restype = c_int
k . Process32First . argtypes = c_int , POINTER ( PROCESSENTRY32 ) ,
k . Process32First . restype = c_int
k . Process32Next . argtypes = c_int , POINTER ( PROCESSENTRY32 ) ,
k . Process32Next . restype = c_int
def get_p ( p ) :
h = k . CreateToolhelp32Snapshot ( 2 , 0 ) # TH32CS_SNAPPROCESS
assert h > 0 , ' CreateToolhelp32Snapshot failed '
b = pointer ( PROCESSENTRY32 ( ) )
f = k . Process32First ( h , b )
while f :
if b . contents . th32ProcessID == p :
return b . contents . szExeFile
f = k . Process32Next ( h , b )
2007-03-22 19:37:23 +01:00
if get_p ( pid ) in ( ' python.exe ' , ' gajim.exe ' ) :
2006-12-13 15:41:57 +01:00
return True
return False
2007-12-12 09:44:46 +01:00
elif sys . platform == ' darwin ' :
from osx import checkPID
return checkPID ( pid , ' Gajim.bin ' )
2006-12-13 15:41:57 +01:00
try :
2006-11-23 00:27:54 +01:00
if not os . path . exists ( ' /proc ' ) :
return True # no /proc, assume Gajim is running
2006-11-22 21:56:25 +01:00
try :
2007-12-12 09:44:46 +01:00
f = open ( ' /proc/ %d /cmdline ' % pid )
2006-11-22 21:56:25 +01:00
except IOError , e :
if e . errno == errno . ENOENT :
return False # file/pid does not exist
2007-12-12 09:44:46 +01:00
raise
2006-11-22 21:56:25 +01:00
n = f . read ( ) . lower ( )
2006-11-22 17:15:16 +01:00
f . close ( )
2006-11-22 21:56:25 +01:00
if n . find ( ' gajim ' ) < 0 :
return False
return True # Running Gajim found at pid
2006-11-22 17:15:16 +01:00
except :
2006-11-22 21:56:25 +01:00
traceback . print_exc ( )
# If we are here, pidfile exists, but some unexpected error occured.
# Assume Gajim is running.
return True
2006-11-22 17:15:16 +01:00
if pid_alive ( ) :
2006-06-15 11:43:08 +02:00
path_to_file = os . path . join ( gajim . DATA_DIR , ' pixmaps/gajim.png ' )
pix = gtk . gdk . pixbuf_new_from_file ( path_to_file )
gtk . window_set_default_icon ( pix ) # set the icon to all newly opened wind
2006-05-26 15:32:52 +02:00
pritext = _ ( ' Gajim is already running ' )
2006-06-14 10:45:30 +02:00
sectext = _ ( ' Another instance of Gajim seems to be running \n Run anyway? ' )
dialog = dialogs . YesNoDialog ( pritext , sectext )
2008-08-11 10:41:44 +02:00
dialog . popup ( )
2008-08-11 16:10:30 +02:00
if dialog . run ( ) != gtk . RESPONSE_YES :
2006-06-14 10:45:30 +02:00
sys . exit ( 3 )
2008-08-11 10:41:44 +02:00
dialog . destroy ( )
2006-11-21 19:46:33 +01:00
# run anyway, delete pid and useless global vars
2006-06-15 11:43:08 +02:00
if os . path . exists ( pid_filename ) :
os . remove ( pid_filename )
2006-11-21 19:46:33 +01:00
del path_to_file
del pix
del pritext
del sectext
2006-06-14 10:45:30 +02:00
dialog . destroy ( )
2006-05-26 15:32:52 +02:00
2006-06-15 11:49:44 +02:00
# Create .gajim dir
pid_dir = os . path . dirname ( pid_filename )
if not os . path . exists ( pid_dir ) :
check_paths . create_path ( pid_dir )
# Create pid file
2007-08-09 17:39:18 +02:00
try :
f = open ( pid_filename , ' w ' )
f . write ( str ( os . getpid ( ) ) )
f . close ( )
except IOError , e :
dlg = dialogs . ErrorDialog ( _ ( ' Disk Write Error ' ) , str ( e ) )
dlg . run ( )
dlg . destroy ( )
sys . exit ( )
2006-11-21 19:46:33 +01:00
del pid_dir
2007-02-04 15:09:38 +01:00
del f
2006-05-26 15:32:52 +02:00
def on_exit ( ) :
# delete pid file on normal exit
if os . path . exists ( pid_filename ) :
os . remove ( pid_filename )
2008-08-03 23:48:30 +02:00
# Save config
gajim . interface . save_config ( )
2007-12-12 09:44:46 +01:00
if sys . platform == ' darwin ' :
2008-06-07 22:42:15 +02:00
try :
import osx
osx . shutdown ( )
2008-06-08 12:19:26 +02:00
except ImportError :
2008-06-07 22:42:15 +02:00
pass
2006-05-26 15:32:52 +02:00
import atexit
atexit . register ( on_exit )
2005-05-14 00:38:48 +02:00
2005-05-20 20:08:24 +02:00
parser = optparser . OptionsParser ( config_filename )
2005-05-14 00:38:48 +02:00
2005-04-14 19:07:55 +02:00
import roster_window
2006-09-13 18:47:58 +02:00
import profile_window
2005-04-14 19:07:55 +02:00
import config
2004-06-11 23:36:17 +02:00
2006-02-03 13:17:34 +01:00
class GlibIdleQueue ( idlequeue . IdleQueue ) :
2007-12-12 09:44:46 +01:00
'''
2006-02-03 13:17:34 +01:00
Extends IdleQueue to use glib io_add_wath , instead of select / poll
In another , ` non gui ' implementation of Gajim IdleQueue can be used safetly.
'''
def init_idle ( self ) :
''' this method is called at the end of class constructor.
Creates a dict , which maps file / pipe / sock descriptor to glib event id '''
self . events = { }
2007-12-12 09:44:46 +01:00
# time() is already called in glib, we just get the last value
2007-01-17 00:26:38 +01:00
# overrides IdleQueue.current_time()
self . current_time = lambda : gobject . get_current_time ( )
2007-12-12 09:44:46 +01:00
2006-02-03 13:17:34 +01:00
def add_idle ( self , fd , flags ) :
''' this method is called when we plug a new idle object.
Start listening for events from fd
'''
2007-12-12 09:44:46 +01:00
res = gobject . io_add_watch ( fd , flags , self . process_events ,
2006-11-18 21:52:28 +01:00
priority = gobject . PRIORITY_LOW )
2006-02-03 13:17:34 +01:00
# store the id of the watch, so that we can remove it on unplug
self . events [ fd ] = res
2007-12-12 09:44:46 +01:00
2006-02-03 13:17:34 +01:00
def remove_idle ( self , fd ) :
''' this method is called when we unplug a new idle object.
Stop listening for events from fd
'''
gobject . source_remove ( self . events [ fd ] )
del ( self . events [ fd ] )
2007-12-12 09:44:46 +01:00
2006-02-03 13:17:34 +01:00
def process ( self ) :
self . check_time_events ( )
2007-12-12 09:44:46 +01:00
2008-07-31 21:24:34 +02:00
class PassphraseRequest :
def __init__ ( self , keyid ) :
self . keyid = keyid
self . callbacks = [ ]
self . dialog_created = False
self . completed = False
def run_callback ( self , account , callback ) :
gajim . connections [ account ] . gpg_passphrase ( self . passphrase )
callback ( )
def add_callback ( self , account , cb ) :
if self . completed :
self . run_callback ( account , cb )
else :
self . callbacks . append ( ( account , cb ) )
if not self . dialog_created :
self . create_dialog ( account )
def complete ( self , passphrase ) :
self . passphrase = passphrase
self . completed = True
if passphrase is not None :
gobject . timeout_add ( 30000 , gajim . interface . forget_gpg_passphrase ,
self . keyid )
for ( account , cb ) in self . callbacks :
self . run_callback ( account , cb )
del self . callbacks
def create_dialog ( self , account ) :
title = _ ( ' Passphrase Required ' )
2008-08-01 11:30:36 +02:00
second = _ ( ' Enter GPG key passphrase for key %(keyid)s (account '
2008-08-01 12:01:45 +02:00
' %(account)s ). ' ) % { ' keyid ' : self . keyid , ' account ' : account }
2008-07-31 21:24:34 +02:00
def _cancel ( ) :
# user cancelled, continue without GPG
2008-07-31 22:08:36 +02:00
self . complete ( None )
2008-07-31 21:24:34 +02:00
def _ok ( passphrase , checked , count ) :
2008-08-01 12:22:24 +02:00
if gajim . connections [ account ] . test_gpg_passphrase ( passphrase ) :
# passphrase is good
2008-07-31 21:24:34 +02:00
self . complete ( passphrase )
2008-08-01 12:22:24 +02:00
return
if count < 3 :
2008-07-31 21:24:34 +02:00
# ask again
dialogs . PassphraseDialog ( _ ( ' Wrong Passphrase ' ) ,
_ ( ' Please retype your GPG passphrase or press Cancel. ' ) ,
ok_handler = ( _ok , count + 1 ) , cancel_handler = _cancel )
2008-08-01 12:22:24 +02:00
else :
# user failed 3 times, continue without GPG
self . complete ( None )
2008-07-31 21:24:34 +02:00
2008-08-01 12:22:24 +02:00
dialogs . PassphraseDialog ( title , second , ok_handler = ( _ok , 1 ) ,
2008-07-31 21:24:34 +02:00
cancel_handler = _cancel )
self . dialog_created = True
2005-04-18 16:05:30 +02:00
class Interface :
2008-04-20 20:14:04 +02:00
################################################################################
### Methods handling events from connection
################################################################################
2004-08-01 18:25:41 +02:00
def handle_event_roster ( self , account , data ) :
2005-04-26 20:45:54 +02:00
#('ROSTER', account, array)
2008-05-19 23:17:43 +02:00
# FIXME: Those methods depend to highly on each other
# and the order in which they are called
2005-07-22 16:30:35 +02:00
self . roster . fill_contacts_and_groups_dicts ( data , account )
2006-02-19 23:20:45 +01:00
self . roster . add_account_contacts ( account )
2006-04-11 12:32:16 +02:00
self . roster . fire_up_unread_messages_events ( account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Roster ' , ( account , data ) )
2005-06-24 18:46:45 +02:00
2005-06-07 09:40:15 +02:00
def handle_event_warning ( self , unused , data ) :
#('WARNING', account, (title_text, section_text))
2006-04-02 18:11:21 +02:00
dialogs . WarningDialog ( data [ 0 ] , data [ 1 ] )
2005-06-24 18:46:45 +02:00
2005-06-07 09:40:15 +02:00
def handle_event_error ( self , unused , data ) :
#('ERROR', account, (title_text, section_text))
2006-04-02 18:11:21 +02:00
dialogs . ErrorDialog ( data [ 0 ] , data [ 1 ] )
2005-06-24 18:46:45 +02:00
def handle_event_information ( self , unused , data ) :
#('INFORMATION', account, (title_text, section_text))
2005-08-14 18:12:36 +02:00
dialogs . InformationDialog ( data [ 0 ] , data [ 1 ] )
2007-12-12 09:44:46 +01:00
2005-10-03 20:19:31 +02:00
def handle_event_ask_new_nick ( self , account , data ) :
#('ASK_NEW_NICK', account, (room_jid, title_text, prompt_text, proposed_nick))
2005-10-02 23:56:38 +02:00
room_jid = data [ 0 ]
title = data [ 1 ]
prompt = data [ 2 ]
2005-10-03 20:19:31 +02:00
proposed_nick = data [ 3 ]
2008-05-02 04:32:28 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( room_jid , account )
2007-08-09 17:39:18 +02:00
if not gc_control and \
room_jid in self . minimized_controls [ account ] :
gc_control = self . minimized_controls [ account ] [ room_jid ]
2006-01-06 07:59:55 +01:00
if gc_control : # user may close the window before we are here
gc_control . show_change_nick_input_dialog ( title , prompt , proposed_nick )
2005-06-24 18:46:45 +02:00
2005-08-05 15:29:39 +02:00
def handle_event_http_auth ( self , account , data ) :
2007-06-03 12:04:20 +02:00
#('HTTP_AUTH', account, (method, url, transaction_id, iq_obj, msg))
2008-01-22 17:06:16 +01:00
def response ( account , iq_obj , answer ) :
2006-04-02 18:11:21 +02:00
self . dialog . destroy ( )
gajim . connections [ account ] . build_http_auth_answer ( iq_obj , answer )
2008-02-04 22:38:36 +01:00
def on_yes ( is_checked , account , iq_obj ) :
response ( account , iq_obj , ' yes ' )
2007-06-03 12:04:20 +02:00
sec_msg = _ ( ' Do you accept this request? ' )
2007-12-12 09:44:46 +01:00
if gajim . get_number_of_connected_accounts ( ) > 1 :
sec_msg = _ ( ' Do you accept this request on account %s ? ' ) % account
2007-06-03 12:04:20 +02:00
if data [ 4 ] :
sec_msg = data [ 4 ] + ' \n ' + sec_msg
2008-08-01 11:30:36 +02:00
self . dialog = dialogs . YesNoDialog ( _ ( ' HTTP ( %(method)s ) Authorization for '
' %(url)s (id: %(id)s ) ' ) % { ' method ' : data [ 0 ] , ' url ' : data [ 1 ] ,
' id ' : data [ 2 ] } , sec_msg , on_response_yes = ( on_yes , account , data [ 3 ] ) ,
2008-02-04 22:38:36 +01:00
on_response_no = ( response , account , data [ 3 ] , ' no ' ) )
2005-08-05 15:29:39 +02:00
2005-05-10 18:53:28 +02:00
def handle_event_error_answer ( self , account , array ) :
2006-11-18 21:52:28 +01:00
#('ERROR_ANSWER', account, (id, jid_from, errmsg, errcode))
2005-08-03 18:21:23 +02:00
id , jid_from , errmsg , errcode = array
2005-10-27 15:15:03 +02:00
if unicode ( errcode ) in ( ' 403 ' , ' 406 ' ) and id :
2005-08-06 18:18:25 +02:00
# show the error dialog
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02:00
sid = id
if len ( id ) > 3 and id [ 2 ] == ' _ ' :
sid = id [ 3 : ]
if ft . files_props [ ' s ' ] . has_key ( sid ) :
file_props = ft . files_props [ ' s ' ] [ sid ]
file_props [ ' error ' ] = - 4
2007-12-12 09:44:46 +01:00
self . handle_event_file_request_error ( account ,
2006-11-18 21:52:28 +01:00
( jid_from , file_props , errmsg ) )
2005-08-11 22:31:44 +02:00
conn = gajim . connections [ account ]
conn . disconnect_transfer ( file_props )
return
2005-08-26 02:52:44 +02:00
elif unicode ( errcode ) == ' 404 ' :
2005-08-06 18:18:25 +02:00
conn = gajim . connections [ account ]
2005-08-11 22:31:44 +02:00
sid = id
if len ( id ) > 3 and id [ 2 ] == ' _ ' :
sid = id [ 3 : ]
if conn . files_props . has_key ( sid ) :
file_props = conn . files_props [ sid ]
2007-12-12 09:44:46 +01:00
self . handle_event_file_send_error ( account ,
2005-08-11 22:31:44 +02:00
( jid_from , file_props ) )
conn . disconnect_transfer ( file_props )
return
2008-05-02 04:32:28 +02:00
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( jid_from , account )
if ctrl and ctrl . type_id == message_control . TYPE_GC :
ctrl . print_conversation ( ' Error %s : %s ' % ( array [ 2 ] , array [ 1 ] ) )
2005-05-10 18:53:28 +02:00
2005-06-29 14:57:46 +02:00
def handle_event_con_type ( self , account , con_type ) :
# ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp'
2005-07-18 23:08:31 +02:00
gajim . con_types [ account ] = con_type
2006-03-24 22:51:15 +01:00
self . roster . draw_account ( account )
2005-06-29 14:57:46 +02:00
2006-09-13 18:47:58 +02:00
def handle_event_connection_lost ( self , account , array ) :
# ('CONNECTION_LOST', account, [title, text])
path = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' ,
' connection_lost.png ' )
path = gtkgui_helpers . get_path_to_generic_or_avatar ( path )
notify . popup ( _ ( ' Connection Failed ' ) , account , account ,
' connection_failed ' , path , array [ 0 ] , array [ 1 ] )
2006-03-28 01:32:39 +02:00
def unblock_signed_in_notifications ( self , account ) :
gajim . block_signed_in_notifications [ account ] = False
2005-05-12 20:55:01 +02:00
2005-04-06 20:51:54 +02:00
def handle_event_status ( self , account , status ) : # OUR status
2004-06-20 23:58:12 +02:00
#('STATUS', account, status)
2005-10-11 00:46:28 +02:00
model = self . roster . status_combobox . get_model ( )
if status == ' offline ' :
2006-02-04 03:52:36 +01:00
# sensitivity for this menuitem
2006-04-23 19:36:33 +02:00
if gajim . get_number_of_connected_accounts ( ) == 0 :
model [ self . roster . status_message_menuitem_iter ] [ 3 ] = False
2006-03-28 01:32:39 +02:00
gajim . block_signed_in_notifications [ account ] = True
2005-10-11 00:46:28 +02:00
else :
2006-03-28 01:32:39 +02:00
# 30 seconds after we change our status to sth else than offline
# we stop blocking notifications of any kind
# this prevents from getting the roster items as 'just signed in'
# contacts. 30 seconds should be enough time
2008-02-14 20:18:07 +01:00
gobject . timeout_add_seconds ( 30 , self . unblock_signed_in_notifications , account )
2006-02-04 03:52:36 +01:00
# sensitivity for this menuitem
model [ self . roster . status_message_menuitem_iter ] [ 3 ] = True
# Inform all controls for this account of the connection state change
2007-08-09 17:39:18 +02:00
ctrls = self . msg_win_mgr . get_controls ( )
if self . minimized_controls . has_key ( account ) :
# Can not be the case when we remove account
ctrls + = self . minimized_controls [ account ] . values ( )
for ctrl in ctrls :
2006-02-04 03:52:36 +01:00
if ctrl . account == account :
2006-11-18 21:52:28 +01:00
if status == ' offline ' or ( status == ' invisible ' and \
2007-08-09 17:39:18 +02:00
gajim . connections [ account ] . is_zeroconf ) :
2006-02-04 03:52:36 +01:00
ctrl . got_disconnected ( )
else :
# Other code rejoins all GCs, so we don't do it here
if not ctrl . type_id == message_control . TYPE_GC :
ctrl . got_connected ( )
2007-08-09 17:39:18 +02:00
if ctrl . parent_win :
ctrl . parent_win . redraw_tab ( ctrl )
2006-02-04 03:52:36 +01:00
2004-06-20 23:58:12 +02:00
self . roster . on_status_changed ( account , status )
2005-11-07 16:43:47 +01:00
if account in self . show_vcard_when_connect :
2006-04-09 00:47:57 +02:00
self . edit_own_details ( account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' AccountPresence ' , ( status , account ) )
2007-12-12 09:44:46 +01:00
2006-04-09 00:47:57 +02:00
def edit_own_details ( self , account ) :
jid = gajim . get_jid_from_account ( account )
2006-09-13 18:47:58 +02:00
if not self . instances [ account ] . has_key ( ' profile ' ) :
self . instances [ account ] [ ' profile ' ] = \
profile_window . ProfileWindow ( account )
2006-04-09 00:47:57 +02:00
gajim . connections [ account ] . request_vcard ( jid )
2004-06-20 23:58:12 +02:00
def handle_event_notify ( self , account , array ) :
2008-07-22 16:13:37 +02:00
# 'NOTIFY' (account, (jid, status, status message, resource,
# priority, # keyID, timestamp, contact_nickname))
2008-06-10 23:18:55 +02:00
#
# Contact changed show
# FIXME: Drop and rewrite...
2008-08-05 00:44:48 +02:00
statuss = [ ' offline ' , ' error ' , ' online ' , ' chat ' , ' away ' , ' xa ' , ' dnd ' ,
' invisible ' ]
2007-01-24 21:54:22 +01:00
# Ignore invalid show
if array [ 1 ] not in statuss :
return
2005-02-15 00:48:32 +01:00
old_show = 0
2005-04-12 17:30:09 +02:00
new_show = statuss . index ( array [ 1 ] )
2006-04-01 11:35:07 +02:00
status_message = array [ 2 ]
2005-03-05 22:02:38 +01:00
jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
2004-10-07 16:43:59 +02:00
keyID = array [ 5 ]
2007-06-03 12:04:20 +02:00
contact_nickname = array [ 7 ]
2008-06-10 04:58:17 +02:00
2007-12-30 00:28:27 +01:00
# Get the proper keyID
2008-08-05 00:44:48 +02:00
keyID = helpers . prepare_and_validate_gpg_keyID ( account , jid , keyID )
2007-12-30 00:28:27 +01:00
2004-06-20 23:58:12 +02:00
resource = array [ 3 ]
if not resource :
resource = ' '
priority = array [ 4 ]
2006-03-28 13:32:53 +02:00
if gajim . jid_is_transport ( jid ) :
2005-10-11 00:46:28 +02:00
# It must be an agent
2005-03-05 22:02:38 +01:00
ji = jid . replace ( ' @ ' , ' ' )
2004-06-20 23:58:12 +02:00
else :
ji = jid
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
2008-07-22 16:13:37 +02:00
highest = gajim . contacts . \
get_contact_with_highest_priority ( account , jid )
2008-07-19 00:42:28 +02:00
was_highest = ( highest and highest . resource == resource )
2008-08-05 00:44:48 +02:00
conn = gajim . connections [ account ]
2006-03-28 01:10:41 +02:00
# Update contact
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
jid_list = gajim . contacts . get_jid_list ( account )
2006-07-19 13:01:09 +02:00
if ji in jid_list or jid == gajim . get_jid_from_account ( account ) :
2007-08-09 17:39:18 +02:00
lcontact = gajim . contacts . get_contacts ( account , ji )
2005-11-01 16:28:19 +01:00
contact1 = None
2004-06-20 23:58:12 +02:00
resources = [ ]
2005-11-01 16:28:19 +01:00
for c in lcontact :
2005-11-01 18:14:15 +01:00
resources . append ( c . resource )
2005-11-01 16:28:19 +01:00
if c . resource == resource :
contact1 = c
2004-06-20 23:58:12 +02:00
break
2008-06-10 04:58:17 +02:00
2005-11-01 16:28:19 +01:00
if contact1 :
if contact1 . show in statuss :
old_show = statuss . index ( contact1 . show )
2008-06-10 23:18:55 +02:00
# nick changed
2007-06-03 12:04:20 +02:00
if contact_nickname is not None and \
contact1 . contact_name != contact_nickname :
contact1 . contact_name = contact_nickname
self . roster . draw_contact ( jid , account )
2008-06-10 23:18:55 +02:00
2008-08-05 00:44:48 +02:00
if old_show == new_show and contact1 . status == status_message and \
2007-06-03 12:04:20 +02:00
contact1 . priority == priority : # no change
2005-07-19 20:23:27 +02:00
return
2005-02-15 00:48:32 +01:00
else :
2008-08-05 00:44:48 +02:00
contact1 = gajim . contacts . get_first_contact_from_jid ( account , ji )
2006-07-19 13:01:09 +02:00
if not contact1 :
2008-07-22 16:13:37 +02:00
# Presence of another resource of our
# jid
# Create self contact and add to roster
2008-08-05 00:44:48 +02:00
if resource == conn . server_resource :
2006-09-13 18:47:58 +02:00
return
2008-08-05 00:44:48 +02:00
contact1 = gajim . contacts . create_contact ( jid = ji ,
name = gajim . nicks [ account ] , groups = [ ' self_contact ' ] ,
show = array [ 1 ] , status = status_message , sub = ' both ' , ask = ' none ' ,
priority = priority , keyID = keyID , resource = resource ,
mood = conn . mood , tune = conn . tune , activity = conn . activity )
2006-07-19 13:01:09 +02:00
old_show = 0
2008-08-05 00:44:48 +02:00
gajim . contacts . add_contact ( account , contact1 )
2006-07-19 13:01:09 +02:00
lcontact . append ( contact1 )
elif contact1 . show in statuss :
2005-11-01 16:28:19 +01:00
old_show = statuss . index ( contact1 . show )
2008-07-22 16:13:37 +02:00
# FIXME: What am I?
2008-08-05 00:44:48 +02:00
if ( resources != [ ' ' ] and ( len ( lcontact ) != 1 or \
lcontact [ 0 ] . show != ' offline ' ) ) and jid . find ( ' @ ' ) > 0 :
2005-02-15 00:48:32 +01:00
old_show = 0
2008-08-05 00:44:48 +02:00
contact1 = gajim . contacts . copy_contact ( contact1 )
2005-11-01 16:28:19 +01:00
lcontact . append ( contact1 )
contact1 . resource = resource
2008-07-19 00:42:28 +02:00
2008-06-10 23:18:55 +02:00
self . roster . add_contact ( contact1 . jid , account )
2008-04-20 16:01:04 +02:00
2006-11-18 21:52:28 +01:00
if contact1 . jid . find ( ' @ ' ) > 0 and len ( lcontact ) == 1 :
# It's not an agent
2005-04-12 17:30:09 +02:00
if old_show == 0 and new_show > 1 :
2008-08-05 00:44:48 +02:00
if not contact1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . append ( contact1 . jid )
if contact1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . remove ( contact1 . jid )
gobject . timeout_add_seconds ( 5 , self . roster . remove_newly_added ,
2005-11-01 16:28:19 +01:00
contact1 . jid , account )
2008-08-05 00:44:48 +02:00
elif old_show > 1 and new_show == 0 and conn . connected > 1 :
if not contact1 . jid in gajim . to_be_removed [ account ] :
gajim . to_be_removed [ account ] . append ( contact1 . jid )
if contact1 . jid in gajim . newly_added [ account ] :
gajim . newly_added [ account ] . remove ( contact1 . jid )
self . roster . draw_contact ( contact1 . jid , account )
gobject . timeout_add_seconds ( 5 , self . roster . remove_to_be_removed ,
2008-04-20 16:01:04 +02:00
contact1 . jid , account )
2005-11-01 16:28:19 +01:00
contact1 . show = array [ 1 ]
2006-04-01 11:35:07 +02:00
contact1 . status = status_message
2005-11-01 16:28:19 +01:00
contact1 . priority = priority
contact1 . keyID = keyID
2006-04-01 20:16:06 +02:00
timestamp = array [ 6 ]
if timestamp :
contact1 . last_status_time = timestamp
elif not gajim . block_signed_in_notifications [ account ] :
# We're connected since more that 30 seconds
2006-02-22 15:31:01 +01:00
contact1 . last_status_time = time . localtime ( )
2007-06-03 12:04:20 +02:00
contact1 . contact_nickname = contact_nickname
2008-06-10 23:18:55 +02:00
2006-03-28 13:32:53 +02:00
if gajim . jid_is_transport ( jid ) :
2005-10-11 00:46:28 +02:00
# It must be an agent
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
if ji in jid_list :
2008-08-04 00:21:50 +02:00
# Update existing iter and group counting
2005-04-23 02:37:51 +02:00
self . roster . draw_contact ( ji , account )
2008-08-04 00:21:50 +02:00
self . roster . draw_group ( _ ( ' Transports ' ) , account )
2008-08-05 00:44:48 +02:00
if new_show > 1 and ji in gajim . transport_avatar [ account ] :
2008-07-22 16:13:37 +02:00
# transport just signed in.
# request avatars
2008-08-05 00:44:48 +02:00
for jid_ in gajim . transport_avatar [ account ] [ ji ] :
conn . request_vcard ( jid_ )
2008-07-22 16:13:37 +02:00
# transport just signed in/out, don't show
# popup notifications for 30s
2006-06-12 17:24:58 +02:00
account_ji = account + ' / ' + ji
2008-08-05 00:44:48 +02:00
gajim . block_signed_in_notifications [ account_ji ] = True
2008-07-22 16:13:37 +02:00
gobject . timeout_add_seconds ( 30 ,
2008-08-05 00:44:48 +02:00
self . unblock_signed_in_notifications , account_ji )
2006-09-13 18:47:58 +02:00
locations = ( self . instances , self . instances [ account ] )
for location in locations :
if location . has_key ( ' add_contact ' ) :
if old_show == 0 and new_show > 1 :
2008-08-05 00:44:48 +02:00
location [ ' add_contact ' ] . transport_signed_in ( jid )
2006-09-13 18:47:58 +02:00
break
elif old_show > 1 and new_show == 0 :
2008-08-05 00:44:48 +02:00
location [ ' add_contact ' ] . transport_signed_out ( jid )
2006-09-13 18:47:58 +02:00
break
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
elif ji in jid_list :
2005-10-11 00:46:28 +02:00
# It isn't an agent
2005-10-20 12:21:51 +02:00
# reset chatstate if needed:
2005-11-01 16:28:19 +01:00
# (when contact signs out or has errors)
2005-10-20 12:21:51 +02:00
if array [ 1 ] in ( ' offline ' , ' error ' ) :
2006-04-05 19:25:02 +02:00
contact1 . our_chatstate = contact1 . chatstate = \
2007-08-09 17:39:18 +02:00
contact1 . composing_xep = None
2008-07-26 07:28:15 +02:00
2008-07-22 16:13:37 +02:00
# TODO: This causes problems when another
# resource signs off!
2008-07-26 07:28:15 +02:00
conn . remove_transfers_for_contact ( contact1 )
2008-07-22 16:32:37 +02:00
# disable encryption, since if any messages are
# lost they'll be not decryptable (note that
2008-07-25 00:14:42 +02:00
# this contradicts XEP-0201 - trying to get that
2008-07-22 16:32:37 +02:00
# in the XEP, though)
2008-07-25 00:14:42 +02:00
#
# FIXME: This *REALLY* are TOO many leves of
# indentation! We even need to introduce
# a temp var here to make it somehow fit!
2008-08-09 08:10:04 +02:00
for sess in conn . get_sessions ( ji ) :
2008-07-26 07:28:15 +02:00
if ( ji + ' / ' + resource ) != str ( sess . jid ) :
continue
2008-08-09 23:13:41 +02:00
ctrl = sess . control
if ctrl :
ctrl . no_autonegotiation = False
2008-07-26 07:28:15 +02:00
if sess . enable_encryption :
sess . terminate_e2e ( )
conn . delete_session ( jid ,
sess . thread_id )
2008-07-22 16:32:37 +02:00
2008-08-05 00:44:48 +02:00
self . roster . chg_contact_status ( contact1 , array [ 1 ] , status_message ,
account )
2006-07-17 21:30:53 +02:00
# Notifications
2005-05-07 17:40:58 +02:00
if old_show < 2 and new_show > 1 :
2008-08-05 00:44:48 +02:00
notify . notify ( ' contact_connected ' , jid , account , status_message )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
2008-08-05 00:44:48 +02:00
self . remote_ctrl . raise_signal ( ' ContactPresence ' , ( account ,
array ) )
2006-07-17 21:30:53 +02:00
2005-05-11 17:21:13 +02:00
elif old_show > 1 and new_show < 2 :
2008-08-05 00:44:48 +02:00
notify . notify ( ' contact_disconnected ' , jid , account , status_message )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
2008-08-05 00:44:48 +02:00
self . remote_ctrl . raise_signal ( ' ContactAbsence ' , ( account , array ) )
2005-11-19 23:01:10 +01:00
# FIXME: stop non active file transfers
2008-07-22 16:13:37 +02:00
# Status change (not connected/disconnected or
# error (<1))
elif new_show > 1 :
2008-08-05 00:44:48 +02:00
notify . notify ( ' status_change ' , jid , account , [ new_show ,
status_message ] )
2008-04-20 16:39:08 +02:00
if self . remote_ctrl :
2008-08-05 00:44:48 +02:00
self . remote_ctrl . raise_signal ( ' ContactStatus ' , ( account , array ) )
2008-03-10 23:40:46 +01:00
else :
2008-07-22 16:13:37 +02:00
# FIXME: MSN transport (CMSN1.2.1 and PyMSN) don't
# follow the XEP, still the case in 2008.
# It's maybe a GC_NOTIFY (specialy for MSN gc)
2008-08-05 00:44:48 +02:00
self . handle_event_gc_notify ( account , ( jid , array [ 1 ] , status_message ,
array [ 3 ] , None , None , None , None , None , [ ] , None , None ) )
2008-07-22 16:13:37 +02:00
2008-08-05 00:44:48 +02:00
highest = gajim . contacts . get_contact_with_highest_priority ( account , jid )
2008-07-19 00:42:28 +02:00
is_highest = ( highest and highest . resource == resource )
2008-08-09 08:10:04 +02:00
# disconnect the session from the ctrl if the highest resource has changed
if ( was_highest and not is_highest ) or ( not was_highest and is_highest ) :
2008-07-19 00:42:28 +02:00
ctrl = self . msg_win_mgr . get_control ( jid , account )
2008-08-09 08:10:04 +02:00
2008-07-19 00:42:28 +02:00
if ctrl :
ctrl . set_session ( None )
2008-07-23 20:21:02 +02:00
ctrl . contact = highest
2008-07-19 00:42:28 +02:00
2004-07-08 21:46:24 +02:00
def handle_event_msgerror ( self , account , array ) :
2008-05-13 03:59:10 +02:00
#'MSGERROR' (account, (jid, error_code, error_msg, msg, time[, session]))
2006-04-01 11:17:15 +02:00
full_jid_with_resource = array [ 0 ]
jids = full_jid_with_resource . split ( ' / ' , 1 )
2005-06-13 00:45:41 +02:00
jid = jids [ 0 ]
2008-06-14 10:43:20 +02:00
session = None
if len ( array ) > 5 :
session = array [ 5 ]
2008-05-03 02:10:17 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( jid , account )
2007-08-09 17:39:18 +02:00
if not gc_control and \
jid in self . minimized_controls [ account ] :
gc_control = self . minimized_controls [ account ] [ jid ]
2006-11-18 21:52:28 +01:00
if gc_control and gc_control . type_id != message_control . TYPE_GC :
gc_control = None
if gc_control :
if len ( jids ) > 1 : # it's a pm
nick = jids [ 1 ]
2008-06-14 10:43:20 +02:00
if session :
ctrl = session . control
2008-06-27 01:36:58 +02:00
else :
ctrl = self . msg_win_mgr . get_control ( full_jid_with_resource , account )
2008-06-14 10:43:20 +02:00
if not ctrl :
2006-11-18 21:52:28 +01:00
tv = gc_control . list_treeview
model = tv . get_model ( )
iter = gc_control . get_contact_iter ( nick )
if iter :
show = model [ iter ] [ 3 ]
else :
show = ' offline '
gc_c = gajim . contacts . create_gc_contact ( room_jid = jid ,
name = nick , show = show )
2008-06-14 10:43:20 +02:00
ctrl = self . new_private_chat ( gc_c , account , session )
2008-08-01 11:30:36 +02:00
ctrl . print_conversation ( _ ( ' Error %(code)s : %(msg)s ' ) % {
2008-08-01 12:01:45 +02:00
' code ' : array [ 1 ] , ' msg ' : array [ 2 ] } , ' status ' )
2005-06-13 00:45:41 +02:00
return
2006-01-06 07:59:55 +01:00
2008-08-01 11:30:36 +02:00
gc_control . print_conversation ( _ ( ' Error %(code)s : %(msg)s ' ) % {
2008-08-01 12:01:45 +02:00
' code ' : array [ 1 ] , ' msg ' : array [ 2 ] } , ' status ' )
2007-08-09 17:39:18 +02:00
if gc_control . parent_win and gc_control . parent_win . get_active_jid ( ) == jid :
2006-11-18 21:52:28 +01:00
gc_control . set_subject ( gc_control . subject )
return
2006-03-28 13:32:53 +02:00
if gajim . jid_is_transport ( jid ) :
2005-03-05 22:02:38 +01:00
jid = jid . replace ( ' @ ' , ' ' )
2006-04-10 16:00:04 +02:00
msg = array [ 2 ]
if array [ 3 ] :
2008-08-01 11:30:36 +02:00
msg = _ ( ' error while sending %(message)s ( %(error)s ) ' ) % {
' message ' : array [ 3 ] , ' error ' : msg }
2008-05-13 03:59:10 +02:00
array [ 5 ] . roster_message ( jid , msg , array [ 4 ] , msg_type = ' error ' )
2007-12-12 09:44:46 +01:00
2005-02-15 01:10:10 +01:00
def handle_event_msgsent ( self , account , array ) :
2005-07-20 13:39:01 +02:00
#('MSGSENT', account, (jid, msg, keyID))
2005-07-21 17:23:18 +02:00
msg = array [ 1 ]
# do not play sound when standalone chatstate message (eg no msg)
if msg and gajim . config . get_per ( ' soundevents ' , ' message_sent ' , ' enabled ' ) :
2005-08-10 00:46:13 +02:00
helpers . play_sound ( ' message_sent ' )
2006-12-06 17:19:47 +01:00
def handle_event_msgnotsent ( self , account , array ) :
2008-05-19 02:17:39 +02:00
#('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session))
2008-08-01 11:30:36 +02:00
msg = _ ( ' error while sending %(message)s ( %(error)s ) ' ) % {
' message ' : array [ 2 ] , ' error ' : array [ 1 ] }
2008-05-19 02:17:39 +02:00
array [ 4 ] . roster_message ( array [ 0 ] , msg , array [ 3 ] , account ,
2006-12-06 17:19:47 +01:00
msg_type = ' error ' )
2004-06-20 23:58:12 +02:00
def handle_event_subscribe ( self , account , array ) :
2006-06-01 17:23:38 +02:00
#('SUBSCRIBE', account, (jid, text, user_nick)) user_nick is JEP-0172
dialogs . SubscriptionRequestWindow ( array [ 0 ] , array [ 1 ] , account , array [ 2 ] )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribe ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
def handle_event_subscribed ( self , account , array ) :
2005-02-04 08:58:40 +01:00
#('SUBSCRIBED', account, (jid, resource))
2004-06-20 23:58:12 +02:00
jid = array [ 0 ]
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
if jid in gajim . contacts . get_jid_list ( account ) :
c = gajim . contacts . get_first_contact_from_jid ( account , jid )
2005-07-22 02:01:05 +02:00
c . resource = array [ 1 ]
2008-06-10 23:18:55 +02:00
self . roster . remove_contact_from_groups ( c . jid , account , [ ( ' Not in Roster ' ) , ] )
2004-06-20 23:58:12 +02:00
else :
2005-05-29 23:34:01 +02:00
keyID = ' '
attached_keys = gajim . config . get_per ( ' accounts ' , account ,
' attached_gpg_keys ' ) . split ( )
if jid in attached_keys :
keyID = attached_keys [ attached_keys . index ( jid ) + 1 ]
2005-10-12 22:00:59 +02:00
name = jid . split ( ' @ ' , 1 ) [ 0 ]
name = name . split ( ' % ' , 1 ) [ 0 ]
2008-07-05 21:04:27 +02:00
contact1 = gajim . contacts . create_contact ( jid = jid , name = name ,
groups = [ ] , show = ' online ' , status = ' online ' ,
ask = ' to ' , resource = array [ 1 ] , keyID = keyID )
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
gajim . contacts . add_contact ( account , contact1 )
2008-04-20 16:01:04 +02:00
self . roster . add_contact ( jid , account )
2005-06-10 23:14:16 +02:00
dialogs . InformationDialog ( _ ( ' Authorization accepted ' ) ,
2005-11-12 15:15:32 +01:00
_ ( ' The contact " %s " has authorized you to see his or her status. ' )
2005-08-14 18:12:36 +02:00
% jid )
2006-03-31 20:40:10 +02:00
if not gajim . config . get_per ( ' accounts ' , account , ' dont_ack_subscription ' ) :
2006-03-31 19:35:05 +02:00
gajim . connections [ account ] . ack_subscribed ( jid )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Subscribed ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
def handle_event_unsubscribed ( self , account , jid ) :
2006-01-13 06:07:09 +01:00
gajim . connections [ account ] . ack_unsubscribed ( jid )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' Unsubscribed ' , ( account , jid ) )
2007-12-12 09:44:46 +01:00
2008-01-22 17:06:16 +01:00
contact = gajim . contacts . get_first_contact_from_jid ( account , jid )
if not contact :
return
2008-02-04 22:38:36 +01:00
def on_yes ( is_checked , list_ ) :
2008-01-22 17:06:16 +01:00
self . roster . on_req_usub ( None , list_ )
list_ = [ ( contact , account ) ]
dialogs . YesNoDialog (
_ ( ' Contact " %s " removed subscription from you ' ) % jid ,
_ ( ' You will always see him or her as offline. \n Do you want to remove him or her from your contact list? ' ) ,
2008-02-04 22:38:36 +01:00
on_response_yes = ( on_yes , list_ ) )
2008-01-22 17:06:16 +01:00
# FIXME: Per RFC 3921, we can "deny" ack as well, but the GUI does not show deny
2005-10-30 10:58:13 +01:00
def handle_event_agent_info_error ( self , account , agent ) :
#('AGENT_ERROR_INFO', account, (agent))
try :
gajim . connections [ account ] . services_cache . agent_info_error ( agent )
except AttributeError :
return
2007-12-12 09:44:46 +01:00
2005-10-30 10:58:13 +01:00
def handle_event_agent_items_error ( self , account , agent ) :
#('AGENT_ERROR_INFO', account, (agent))
try :
gajim . connections [ account ] . services_cache . agent_items_error ( agent )
except AttributeError :
return
2004-09-06 16:55:10 +02:00
2006-05-01 20:29:12 +02:00
def handle_event_agent_removed ( self , account , agent ) :
# remove transport's contacts from treeview
jid_list = gajim . contacts . get_jid_list ( account )
for jid in jid_list :
if jid . endswith ( ' @ ' + agent ) :
c = gajim . contacts . get_first_contact_from_jid ( account , jid )
gajim . log . debug (
' Removing contact %s due to unregistered transport %s ' \
% ( jid , agent ) )
gajim . connections [ account ] . unsubscribe ( c . jid )
# Transport contacts can't have 2 resources
if c . jid in gajim . to_be_removed [ account ] :
# This way we'll really remove it
gajim . to_be_removed [ account ] . remove ( c . jid )
2008-07-07 00:24:58 +02:00
self . roster . remove_contact ( c . jid , account , backend = True )
2006-05-01 20:29:12 +02:00
2005-05-08 22:56:11 +02:00
def handle_event_register_agent_info ( self , account , array ) :
2007-02-15 10:18:24 +01:00
# ('REGISTER_AGENT_INFO', account, (agent, infos, is_form))
# info in a dataform if is_form is True
if array [ 2 ] or array [ 1 ] . has_key ( ' instructions ' ) :
2005-10-20 13:17:17 +02:00
config . ServiceRegistrationWindow ( array [ 0 ] , array [ 1 ] , account ,
2005-10-05 12:13:31 +02:00
array [ 2 ] )
2005-05-08 22:56:11 +02:00
else :
2006-11-18 21:52:28 +01:00
dialogs . ErrorDialog ( _ ( ' Contact with " %s " cannot be established ' ) \
% array [ 0 ] , _ ( ' Check your connection or try again later. ' ) )
2005-05-08 22:56:11 +02:00
2005-03-27 12:31:26 +02:00
def handle_event_agent_info_items ( self , account , array ) :
2005-04-23 23:54:12 +02:00
#('AGENT_INFO_ITEMS', account, (agent, node, items))
2007-06-03 12:30:34 +02:00
our_jid = gajim . get_jid_from_account ( account )
if gajim . interface . instances [ account ] . has_key ( ' pep_services ' ) and \
array [ 0 ] == our_jid :
gajim . interface . instances [ account ] [ ' pep_services ' ] . items_received (
array [ 2 ] )
2005-10-30 10:58:13 +01:00
try :
gajim . connections [ account ] . services_cache . agent_items ( array [ 0 ] ,
array [ 1 ] , array [ 2 ] )
except AttributeError :
return
2005-03-27 12:31:26 +02:00
def handle_event_agent_info_info ( self , account , array ) :
2005-10-30 10:58:13 +01:00
#('AGENT_INFO_INFO', account, (agent, node, identities, features, data))
try :
gajim . connections [ account ] . services_cache . agent_info ( array [ 0 ] ,
array [ 1 ] , array [ 2 ] , array [ 3 ] , array [ 4 ] )
except AttributeError :
return
2005-03-27 12:31:26 +02:00
2007-06-03 12:04:20 +02:00
def handle_event_new_acc_connected ( self , account , array ) :
2007-12-27 00:59:54 +01:00
#('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_err,
# ssl_cert, ssl_fingerprint))
2007-06-03 12:04:20 +02:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . new_acc_connected ( array [ 0 ] ,
2007-12-27 00:59:54 +01:00
array [ 1 ] , array [ 2 ] , array [ 3 ] , array [ 4 ] , array [ 5 ] )
2007-06-03 12:04:20 +02:00
def handle_event_new_acc_not_connected ( self , account , array ) :
#('NEW_ACC_NOT_CONNECTED', account, (reason))
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . new_acc_not_connected ( array )
2004-06-20 23:58:12 +02:00
def handle_event_acc_ok ( self , account , array ) :
2005-11-04 22:27:14 +01:00
#('ACC_OK', account, (config))
2005-11-13 16:08:47 +01:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_ok ( array )
2005-11-04 22:27:14 +01:00
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewAccount ' , ( account , array ) )
2004-06-20 23:58:12 +02:00
2005-11-04 22:27:14 +01:00
def handle_event_acc_not_ok ( self , account , array ) :
#('ACC_NOT_OK', account, (reason))
2005-11-13 16:08:47 +01:00
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . acc_is_not_ok ( array )
2005-11-04 22:27:14 +01:00
2004-06-20 23:58:12 +02:00
def handle_event_quit ( self , p1 , p2 ) :
2005-10-20 13:17:17 +02:00
self . roster . quit_gtkgui_interface ( )
2005-04-12 17:30:09 +02:00
2004-06-21 02:12:25 +02:00
def handle_event_myvcard ( self , account , array ) :
2004-06-20 23:58:12 +02:00
nick = ' '
2007-06-03 12:04:20 +02:00
if array . has_key ( ' NICKNAME ' ) and array [ ' NICKNAME ' ] :
gajim . nicks [ account ] = array [ ' NICKNAME ' ]
elif array . has_key ( ' FN ' ) and array [ ' FN ' ] :
gajim . nicks [ account ] = array [ ' FN ' ]
2006-09-13 18:47:58 +02:00
if self . instances [ account ] . has_key ( ' profile ' ) :
win = self . instances [ account ] [ ' profile ' ]
2005-11-07 16:43:47 +01:00
win . set_values ( array )
if account in self . show_vcard_when_connect :
self . show_vcard_when_connect . remove ( account )
2007-08-09 17:39:18 +02:00
jid = array [ ' jid ' ]
if self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
self . instances [ account ] [ ' infos ' ] [ jid ] . set_values ( array )
2004-06-20 23:58:12 +02:00
2005-10-03 18:14:41 +02:00
def handle_event_vcard ( self , account , vcard ) :
2005-10-12 22:10:42 +02:00
# ('VCARD', account, data)
2005-10-03 18:14:41 +02:00
''' vcard holds the vcard data '''
jid = vcard [ ' jid ' ]
2005-11-28 17:26:19 +01:00
resource = ' '
if vcard . has_key ( ' resource ' ) :
resource = vcard [ ' resource ' ]
2007-12-12 09:44:46 +01:00
2008-06-21 21:12:58 +02:00
fjid = jid + ' / ' + str ( resource )
2005-10-03 18:14:41 +02:00
# vcard window
2005-06-26 21:59:34 +02:00
win = None
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' infos ' ] . has_key ( jid ) :
win = self . instances [ account ] [ ' infos ' ] [ jid ]
2008-06-21 21:12:58 +02:00
elif resource and self . instances [ account ] [ ' infos ' ] . has_key ( fjid ) :
win = self . instances [ account ] [ ' infos ' ] [ fjid ]
2005-06-26 21:40:57 +02:00
if win :
2005-10-30 22:39:09 +01:00
win . set_values ( vcard )
2005-07-20 15:13:52 +02:00
2005-10-03 18:14:41 +02:00
# show avatar in chat
2008-06-27 01:37:24 +02:00
ctrl = None
2008-06-21 21:12:58 +02:00
if resource and self . msg_win_mgr . has_window ( fjid , account ) :
win = self . msg_win_mgr . get_window ( fjid , account )
2008-06-27 01:37:12 +02:00
ctrl = win . get_control ( fjid , account )
2006-03-15 09:40:19 +01:00
elif self . msg_win_mgr . has_window ( jid , account ) :
win = self . msg_win_mgr . get_window ( jid , account )
2008-06-27 01:37:12 +02:00
ctrl = win . get_control ( jid , account )
2008-05-02 04:32:28 +02:00
2008-06-27 01:37:12 +02:00
if ctrl and ctrl . type_id != message_control . TYPE_GC :
ctrl . show_avatar ( )
2006-01-09 00:14:50 +01:00
2006-03-13 14:25:51 +01:00
# Show avatar in roster or gc_roster
2008-05-02 04:32:28 +02:00
gc_ctrl = self . msg_win_mgr . get_gc_control ( jid , account )
2007-08-09 17:39:18 +02:00
if not gc_ctrl and \
jid in self . minimized_controls [ account ] :
gc_ctrl = self . minimized_controls [ account ] [ jid ]
2006-03-13 20:00:05 +01:00
if gc_ctrl and gc_ctrl . type_id == message_control . TYPE_GC :
2006-03-13 14:25:51 +01:00
gc_ctrl . draw_avatar ( resource )
else :
self . roster . draw_avatar ( jid , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' VcardInfo ' , ( account , vcard ) )
2004-06-20 23:58:12 +02:00
2006-02-22 15:31:01 +01:00
def handle_event_last_status_time ( self , account , array ) :
# ('LAST_STATUS_TIME', account, (jid, resource, seconds, status))
2008-02-05 15:50:21 +01:00
tim = array [ 2 ]
if tim < 0 :
# Ann error occured
return
2006-02-22 15:31:01 +01:00
win = None
if self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] ]
elif self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] + ' / ' + array [ 1 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] + ' / ' + array [ 1 ] ]
if win :
c = gajim . contacts . get_contact ( account , array [ 0 ] , array [ 1 ] )
2006-03-01 21:20:00 +01:00
if c : # c can be none if it's a gc contact
2008-02-05 15:50:21 +01:00
c . last_status_time = time . localtime ( time . time ( ) - tim )
2006-03-01 21:20:00 +01:00
if array [ 3 ] :
c . status = array [ 3 ]
win . set_last_status_time ( )
2006-02-22 15:31:01 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' LastStatusTime ' , ( account , array ) )
2005-04-06 22:18:55 +02:00
def handle_event_os_info ( self , account , array ) :
2006-11-18 21:52:28 +01:00
#'OS_INFO' (account, (jid, resource, client_info, os_info))
2005-07-20 14:48:11 +02:00
win = None
2005-11-13 16:08:47 +01:00
if self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] ]
elif self . instances [ account ] [ ' infos ' ] . has_key ( array [ 0 ] + ' / ' + array [ 1 ] ) :
win = self . instances [ account ] [ ' infos ' ] [ array [ 0 ] + ' / ' + array [ 1 ] ]
2005-07-20 14:48:11 +02:00
if win :
win . set_os_info ( array [ 1 ] , array [ 2 ] , array [ 3 ] )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' OsInfo ' , ( account , array ) )
2005-04-06 22:18:55 +02:00
2005-09-19 18:13:45 +02:00
def handle_event_gc_notify ( self , account , array ) :
2006-04-01 11:17:15 +02:00
#'GC_NOTIFY' (account, (room_jid, show, status, nick,
2007-06-03 12:04:20 +02:00
# role, affiliation, jid, reason, actor, statusCode, newNick, avatar_sha))
2005-12-11 12:22:18 +01:00
nick = array [ 3 ]
if not nick :
return
room_jid = array [ 0 ]
fjid = room_jid + ' / ' + nick
show = array [ 1 ]
status = array [ 2 ]
2006-11-21 21:55:56 +01:00
# Get the window and control for the updated status, this may be a
# PrivateChatControl
2008-05-02 04:32:28 +02:00
control = self . msg_win_mgr . get_gc_control ( room_jid , account )
2007-06-03 12:04:20 +02:00
if not control and \
room_jid in self . minimized_controls [ account ] :
control = self . minimized_controls [ account ] [ room_jid ]
2008-05-02 04:32:28 +02:00
if not control or ( control and control . type_id != message_control . TYPE_GC ) :
2006-11-21 21:55:56 +01:00
return
2007-08-09 17:39:18 +02:00
2008-05-02 04:32:28 +02:00
control . chg_contact_status ( nick , show , status , array [ 4 ] , array [ 5 ] ,
array [ 6 ] , array [ 7 ] , array [ 8 ] , array [ 9 ] , array [ 10 ] , array [ 11 ] )
2008-05-11 03:19:59 +02:00
2007-06-11 12:13:16 +02:00
contact = gajim . contacts . \
get_contact_with_highest_priority ( account , room_jid )
if contact :
2007-06-04 14:22:51 +02:00
self . roster . draw_contact ( room_jid , account )
2007-05-08 20:32:44 +02:00
2008-06-27 01:36:58 +02:00
# print status in chat window and update status/GPG image
ctrl = self . msg_win_mgr . get_control ( fjid , account )
if ctrl :
2007-12-12 09:44:46 +01:00
statusCode = array [ 9 ]
if ' 303 ' in statusCode :
new_nick = array [ 10 ]
2008-08-01 11:30:36 +02:00
ctrl . print_conversation ( _ ( ' %(nick)s is now known as %(new_nick)s ' ) \
% { ' nick ' : nick , ' new_nick ' : new_nick } , ' status ' )
2007-12-12 09:44:46 +01:00
gc_c = gajim . contacts . get_gc_contact ( account , room_jid , new_nick )
c = gajim . contacts . contact_from_gc_contact ( gc_c )
ctrl . gc_contact = gc_c
ctrl . contact = c
ctrl . draw_banner ( )
old_jid = room_jid + ' / ' + nick
new_jid = room_jid + ' / ' + new_nick
self . msg_win_mgr . change_key ( old_jid , new_jid , account )
2006-12-27 12:32:01 +01:00
else :
2007-12-12 09:44:46 +01:00
contact = ctrl . contact
contact . show = show
contact . status = status
uf_show = helpers . get_uf_show ( show )
2008-08-01 11:30:36 +02:00
ctrl . print_conversation ( _ ( ' %(nick)s is now %(status)s ' ) % {
' nick ' : nick , ' status ' : uf_show } , ' status ' )
2007-12-12 09:44:46 +01:00
if status :
2008-02-26 09:31:48 +01:00
ctrl . print_conversation ( ' ( ' , ' status ' , simple = True )
ctrl . print_conversation ( ' %s ' % ( status ) , ' status ' , simple = True )
ctrl . print_conversation ( ' ) ' , ' status ' , simple = True )
2007-12-12 09:44:46 +01:00
ctrl . parent_win . redraw_tab ( ctrl )
ctrl . update_ui ( )
2006-05-18 20:07:53 +02:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCPresence ' , ( account , array ) )
2006-05-11 23:46:55 +02:00
2004-08-05 00:40:22 +02:00
def handle_event_gc_msg ( self , account , array ) :
2007-12-12 09:44:46 +01:00
# ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg,
# [status_codes]))
2005-06-29 22:50:30 +02:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-09-23 23:01:42 +02:00
room_jid = jids [ 0 ]
2007-06-03 12:04:20 +02:00
2008-05-02 04:32:28 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( room_jid , account )
2007-06-03 12:04:20 +02:00
if not gc_control and \
room_jid in self . minimized_controls [ account ] :
gc_control = self . minimized_controls [ account ] [ room_jid ]
2006-01-05 06:51:28 +01:00
if not gc_control :
2004-08-05 00:40:22 +02:00
return
2006-11-18 21:52:28 +01:00
xhtml = array [ 4 ]
2007-06-03 12:04:20 +02:00
2006-11-18 21:52:28 +01:00
if gajim . config . get ( ' ignore_incoming_xhtml ' ) :
xhtml = None
2004-08-05 00:40:22 +02:00
if len ( jids ) == 1 :
2005-09-23 23:01:42 +02:00
# message from server
nick = ' '
2004-08-05 00:40:22 +02:00
else :
2005-09-23 23:01:42 +02:00
# message from someone
nick = jids [ 1 ]
2007-06-03 12:04:20 +02:00
2007-12-12 09:44:46 +01:00
gc_control . on_message ( nick , array [ 1 ] , array [ 2 ] , array [ 3 ] , xhtml , array [ 5 ] )
2007-06-03 12:04:20 +02:00
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' GCMessage ' , ( account , array ) )
2004-08-05 00:40:22 +02:00
2005-03-04 22:27:45 +01:00
def handle_event_gc_subject ( self , account , array ) :
2006-11-18 21:52:28 +01:00
#('GC_SUBJECT', account, (jid, subject, body, has_timestamp))
2005-06-29 22:50:30 +02:00
jids = array [ 0 ] . split ( ' / ' , 1 )
2005-03-04 22:27:45 +01:00
jid = jids [ 0 ]
2007-06-03 12:04:20 +02:00
2008-05-02 04:32:28 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( jid , account )
2007-06-03 12:04:20 +02:00
if not gc_control and \
jid in self . minimized_controls [ account ] :
gc_control = self . minimized_controls [ account ] [ jid ]
contact = gajim . contacts . \
get_contact_with_highest_priority ( account , jid )
if contact :
contact . status = array [ 1 ]
2007-08-09 17:39:18 +02:00
self . roster . draw_contact ( jid , account )
2007-06-03 12:04:20 +02:00
2006-01-06 07:59:55 +01:00
if not gc_control :
2005-03-04 22:27:45 +01:00
return
2006-01-06 07:59:55 +01:00
gc_control . set_subject ( array [ 1 ] )
2006-11-18 21:52:28 +01:00
# Standard way, the message comes from the occupant who set the subject
text = None
if len ( jids ) > 1 :
text = ' %s has set the subject to %s ' % ( jids [ 1 ] , array [ 1 ] )
2007-12-12 09:44:46 +01:00
# Workaround for psi bug http://flyspray.psi-im.org/task/595 , to be
# deleted one day. We can receive a subject with a body that contains
2006-11-18 21:52:28 +01:00
# "X has set the subject to Y" ...
elif array [ 2 ] :
text = array [ 2 ]
if text is not None :
if array [ 3 ] :
gc_control . print_old_conversation ( text )
else :
gc_control . print_conversation ( text )
2005-03-04 22:27:45 +01:00
2005-04-20 12:21:33 +02:00
def handle_event_gc_config ( self , account , array ) :
2007-02-14 17:48:25 +01:00
#('GC_CONFIG', account, (jid, form)) config is a dict
2006-09-13 18:47:58 +02:00
room_jid = array [ 0 ] . split ( ' / ' ) [ 0 ]
if room_jid in gajim . automatic_rooms [ account ] :
2007-12-12 09:44:46 +01:00
if gajim . automatic_rooms [ account ] [ room_jid ] . has_key ( ' continue_tag ' ) :
# We're converting chat to muc. allow participants to invite
form = dataforms . ExtendForm ( node = array [ 1 ] )
for f in form . iter_fields ( ) :
if f . var == ' muc#roomconfig_allowinvites ' :
f . value = True
2008-05-17 18:23:44 +02:00
elif f . var == ' muc#roomconfig_publicroom ' :
f . value = False
2008-08-11 10:12:11 +02:00
elif f . var == ' muc#roomconfig_membersonly ' :
f . value = True
2008-08-11 15:23:09 +02:00
elif f . var == ' public_list ' :
f . value = False
2007-12-12 09:44:46 +01:00
gajim . connections [ account ] . send_gc_config ( room_jid , form )
else :
# use default configuration
gajim . connections [ account ] . send_gc_config ( room_jid , array [ 1 ] )
2006-09-13 18:47:58 +02:00
# invite contacts
2007-12-12 09:44:46 +01:00
# check if it is necessary to add <continue />
continue_tag = False
if gajim . automatic_rooms [ account ] [ room_jid ] . has_key ( ' continue_tag ' ) :
continue_tag = True
2006-09-13 18:47:58 +02:00
if gajim . automatic_rooms [ account ] [ room_jid ] . has_key ( ' invities ' ) :
for jid in gajim . automatic_rooms [ account ] [ room_jid ] [ ' invities ' ] :
2007-12-12 09:44:46 +01:00
gajim . connections [ account ] . send_invite ( room_jid , jid ,
continue_tag = continue_tag )
2006-09-13 18:47:58 +02:00
del gajim . automatic_rooms [ account ] [ room_jid ]
elif not self . instances [ account ] [ ' gc_config ' ] . has_key ( room_jid ) :
self . instances [ account ] [ ' gc_config ' ] [ room_jid ] = \
config . GroupchatConfigWindow ( account , room_jid , array [ 1 ] )
2006-01-16 12:16:06 +01:00
2007-08-09 17:39:18 +02:00
def handle_event_gc_config_change ( self , account , array ) :
#('GC_CONFIG_CHANGE', account, (jid, statusCode)) statuscode is a list
# http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify
# http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes-init
jid = array [ 0 ]
statusCode = array [ 1 ]
2008-05-02 04:32:28 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( jid , account )
2007-08-09 17:39:18 +02:00
if not gc_control and \
jid in self . minimized_controls [ account ] :
gc_control = self . minimized_controls [ account ] [ jid ]
if not gc_control :
return
changes = [ ]
if ' 100 ' in statusCode :
2008-03-13 02:15:57 +01:00
# Can be a presence (see chg_contact_status in groupchat_control.py)
2007-08-09 17:39:18 +02:00
changes . append ( _ ( ' Any occupant is allowed to see your full JID ' ) )
2007-12-12 09:44:46 +01:00
gc_control . is_anonymous = False
2007-08-09 17:39:18 +02:00
if ' 102 ' in statusCode :
changes . append ( _ ( ' Room now shows unavailable member ' ) )
if ' 103 ' in statusCode :
changes . append ( _ ( ' room now does not show unavailable members ' ) )
if ' 104 ' in statusCode :
2008-08-01 12:22:24 +02:00
changes . append (
2007-08-09 17:39:18 +02:00
_ ( ' A non-privacy-related room configuration change has occurred ' ) )
if ' 170 ' in statusCode :
2008-03-13 02:15:57 +01:00
# Can be a presence (see chg_contact_status in groupchat_control.py)
2007-08-09 17:39:18 +02:00
changes . append ( _ ( ' Room logging is now enabled ' ) )
if ' 171 ' in statusCode :
changes . append ( _ ( ' Room logging is now disabled ' ) )
if ' 172 ' in statusCode :
changes . append ( _ ( ' Room is now non-anonymous ' ) )
2007-12-12 09:44:46 +01:00
gc_control . is_anonymous = False
2007-08-09 17:39:18 +02:00
if ' 173 ' in statusCode :
changes . append ( _ ( ' Room is now semi-anonymous ' ) )
2007-12-12 09:44:46 +01:00
gc_control . is_anonymous = True
2007-08-09 17:39:18 +02:00
if ' 174 ' in statusCode :
changes . append ( _ ( ' Room is now fully-anonymous ' ) )
2007-12-12 09:44:46 +01:00
gc_control . is_anonymous = True
2007-08-09 17:39:18 +02:00
for change in changes :
gc_control . print_conversation ( change )
2006-01-16 12:16:06 +01:00
def handle_event_gc_affiliation ( self , account , array ) :
2008-05-05 05:18:09 +02:00
#('GC_AFFILIATION', account, (room_jid, users_dict))
2006-01-16 12:16:06 +01:00
room_jid = array [ 0 ]
if self . instances [ account ] [ ' gc_config ' ] . has_key ( room_jid ) :
2006-03-18 12:53:30 +01:00
self . instances [ account ] [ ' gc_config ' ] [ room_jid ] . \
2008-05-05 02:38:52 +02:00
affiliation_list_received ( array [ 1 ] )
2006-01-16 12:16:06 +01:00
2007-08-09 17:39:18 +02:00
def handle_event_gc_password_required ( self , account , array ) :
#('GC_PASSWORD_REQUIRED', account, (room_jid, nick))
room_jid = array [ 0 ]
nick = array [ 1 ]
def on_ok ( text ) :
gajim . connections [ account ] . join_gc ( nick , room_jid , text )
gajim . gc_passwords [ room_jid ] = text
def on_cancel ( ) :
# get and destroy window
if room_jid in gajim . interface . minimized_controls [ account ] :
self . roster . on_disconnect ( None , room_jid , account )
else :
win = self . msg_win_mgr . get_window ( room_jid , account )
2008-05-02 04:32:28 +02:00
ctrl = win . get_gc_control ( room_jid , account )
2007-08-09 17:39:18 +02:00
win . remove_tab ( ctrl , 3 )
dlg = dialogs . InputDialog ( _ ( ' Password Required ' ) ,
2008-03-11 17:50:35 +01:00
_ ( ' A Password is required to join the room %s . Please type it. ' ) % \
2007-08-09 17:39:18 +02:00
room_jid , is_modal = False , ok_handler = on_ok , cancel_handler = on_cancel )
dlg . input_entry . set_visibility ( False )
2005-09-11 17:02:22 +02:00
def handle_event_gc_invitation ( self , account , array ) :
2007-12-12 09:44:46 +01:00
#('GC_INVITATION', (room_jid, jid_from, reason, password, is_continued))
2006-03-18 12:53:30 +01:00
jid = gajim . get_jid_without_resource ( array [ 1 ] )
room_jid = array [ 0 ]
2006-03-28 00:31:14 +02:00
if helpers . allow_popup_window ( account ) or not self . systray_enabled :
2006-03-18 12:53:30 +01:00
dialogs . InvitationReceivedDialog ( account , room_jid , jid , array [ 3 ] ,
2007-12-12 09:44:46 +01:00
array [ 2 ] , is_continued = array [ 4 ] )
2006-03-18 12:53:30 +01:00
return
self . add_event ( account , jid , ' gc-invitation ' , ( room_jid , array [ 2 ] ,
2007-12-12 09:44:46 +01:00
array [ 3 ] , array [ 4 ] ) )
2006-03-18 12:53:30 +01:00
2006-11-18 21:52:28 +01:00
if helpers . allow_showing_notification ( account ) :
2006-03-18 12:53:30 +01:00
path = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' ,
' gc_invitation.png ' )
2006-03-24 21:17:32 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( path )
2006-04-03 09:40:15 +02:00
event_type = _ ( ' Groupchat Invitation ' )
2006-05-10 22:25:51 +02:00
notify . popup ( event_type , jid , account , ' gc-invitation ' , path ,
2006-04-03 09:40:15 +02:00
event_type , room_jid )
2006-03-18 12:53:30 +01:00
2007-12-12 09:44:46 +01:00
def forget_gpg_passphrase ( self , keyid ) :
if self . gpg_passphrase . has_key ( keyid ) :
del self . gpg_passphrase [ keyid ]
return False
2004-10-10 20:44:38 +02:00
def handle_event_bad_passphrase ( self , account , array ) :
2007-12-12 09:44:46 +01:00
#('BAD_PASSPHRASE', account, ())
2005-08-30 23:10:14 +02:00
use_gpg_agent = gajim . config . get ( ' use_gpg_agent ' )
2007-12-12 09:44:46 +01:00
sectext = ' '
2005-08-30 23:10:14 +02:00
if use_gpg_agent :
2007-12-12 09:44:46 +01:00
sectext = _ ( ' You configured Gajim to use GPG agent, but there is no '
' GPG agent running or it returned a wrong passphrase. \n ' )
sectext + = _ ( ' You are currently connected without your OpenPGP key. ' )
2005-06-18 19:00:54 +02:00
keyID = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
2007-12-12 09:44:46 +01:00
self . forget_gpg_passphrase ( keyID )
dialogs . WarningDialog ( _ ( ' Your passphrase is incorrect ' ) , sectext )
def handle_event_gpg_password_required ( self , account , array ) :
#('GPG_PASSWORD_REQUIRED', account, (callback,))
callback = array [ 0 ]
keyid = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
2008-07-31 21:24:34 +02:00
if keyid in self . gpg_passphrase :
request = self . gpg_passphrase [ keyid ]
else :
request = PassphraseRequest ( keyid )
self . gpg_passphrase [ keyid ] = request
request . add_callback ( account , callback )
2004-10-10 20:44:38 +02:00
2004-11-18 18:15:15 +01:00
def handle_event_roster_info ( self , account , array ) :
#('ROSTER_INFO', account, (jid, name, sub, ask, groups))
jid = array [ 0 ]
2006-03-12 19:30:01 +01:00
name = array [ 1 ]
sub = array [ 2 ]
ask = array [ 3 ]
groups = array [ 4 ]
2007-08-09 17:39:18 +02:00
contacts = gajim . contacts . get_contacts ( account , jid )
2006-03-12 19:30:01 +01:00
if ( not sub or sub == ' none ' ) and ( not ask or ask == ' none ' ) and \
not name and not groups :
2008-06-17 21:25:17 +02:00
# contact removes us.
2006-03-30 20:48:24 +02:00
if contacts :
2008-07-07 00:24:58 +02:00
self . roster . remove_contact ( jid , account , backend = True )
2006-03-30 20:48:24 +02:00
return
elif not contacts :
2006-04-06 18:58:20 +02:00
if sub == ' remove ' :
return
2008-06-17 21:25:17 +02:00
# Add new contact to roster
2008-07-05 21:04:27 +02:00
contact = gajim . contacts . create_contact ( jid = jid , name = name ,
groups = groups , show = ' offline ' , sub = sub , ask = ask )
2006-03-30 20:48:24 +02:00
gajim . contacts . add_contact ( account , contact )
2008-04-20 16:01:04 +02:00
self . roster . add_contact ( jid , account )
2006-03-30 20:48:24 +02:00
else :
2008-06-17 21:25:17 +02:00
# it is an existing contact that might has changed
2006-04-19 12:07:47 +02:00
re_add = False
2008-06-17 21:25:17 +02:00
# if sub or groups changed: remove and re-add
# Maybe observer status changed:
2008-06-15 23:48:13 +02:00
# according to xep 0162, contact is not an observer anymore when
# we asked him is auth, so also remove him if ask changed
2008-06-17 21:25:17 +02:00
old_groups = contacts [ 0 ] . get_shown_groups ( )
if contacts [ 0 ] . sub != sub or contacts [ 0 ] . ask != ask or old_groups != groups :
self . roster . remove_contact ( jid , account )
2006-04-19 12:07:47 +02:00
re_add = True
2006-03-30 20:48:24 +02:00
for contact in contacts :
if not name :
name = ' '
contact . name = name
contact . sub = sub
contact . ask = ask
2008-06-17 21:25:17 +02:00
contact . groups = groups or [ ]
2006-04-19 12:07:47 +02:00
if re_add :
2008-04-20 16:01:04 +02:00
self . roster . add_contact ( jid , account )
2008-06-17 21:27:32 +02:00
# Refilter and update old groups
2008-06-17 21:25:17 +02:00
for group in old_groups :
self . roster . draw_group ( group , account )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' RosterInfo ' , ( account , array ) )
2004-11-18 18:15:15 +01:00
2005-06-11 19:21:30 +02:00
def handle_event_bookmarks ( self , account , bms ) :
2005-08-18 21:06:24 +02:00
# ('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}])
# We received a bookmark item from the server (JEP48)
# Auto join GC windows if neccessary
2007-12-12 09:44:46 +01:00
self . roster . set_actions_menu_needs_rebuild ( )
2005-11-16 11:35:11 +01:00
invisible_show = gajim . SHOW_LIST . index ( ' invisible ' )
# do not autojoin if we are invisible
if gajim . connections [ account ] . connected == invisible_show :
return
2008-04-20 21:45:09 +02:00
self . auto_join_bookmarks ( account )
2007-08-09 17:39:18 +02:00
2005-08-06 18:18:25 +02:00
def handle_event_file_send_error ( self , account , array ) :
jid = array [ 0 ]
file_props = array [ 1 ]
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 22:16:22 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_popup_window ( account ) :
2005-10-19 22:16:22 +02:00
ft . show_send_error ( file_props )
return
self . add_event ( account , jid , ' file-send-error ' , file_props )
2006-03-28 00:31:14 +02:00
if helpers . allow_showing_notification ( account ) :
2006-02-08 01:55:16 +01:00
img = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' , ' ft_error.png ' )
2006-01-22 00:15:35 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( img )
2006-04-03 09:40:15 +02:00
event_type = _ ( ' File Transfer Error ' )
2006-05-10 22:25:51 +02:00
notify . popup ( event_type , jid , account , ' file-send-error ' , path ,
2006-04-03 09:40:15 +02:00
event_type , file_props [ ' name ' ] )
2006-01-17 10:01:59 +01:00
2006-01-17 21:23:36 +01:00
def handle_event_gmail_notify ( self , account , array ) :
jid = array [ 0 ]
2006-01-20 18:40:45 +01:00
gmail_new_messages = int ( array [ 1 ] )
2006-07-17 21:30:53 +02:00
gmail_messages_list = array [ 2 ]
Merged revisions 5017-5020,5022-5029 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r5017 | asterix | 2006-01-06 01:55:51 -0700 (Fri, 06 Jan 2006) | 2 lines
use escape for pango markup
........
r5018 | asterix | 2006-01-06 02:21:39 -0700 (Fri, 06 Jan 2006) | 2 lines
missing new contacts function
........
r5019 | asterix | 2006-01-06 11:03:07 -0700 (Fri, 06 Jan 2006) | 2 lines
handle the click on toggle_gpg_encryption menuitem
........
r5020 | asterix | 2006-01-06 11:14:14 -0700 (Fri, 06 Jan 2006) | 2 lines
use the saved size even if a chat window is already opened
........
r5022 | asterix | 2006-01-07 03:43:47 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now resume filetransfert
........
r5023 | asterix | 2006-01-07 03:56:31 -0700 (Sat, 07 Jan 2006) | 2 lines
[Knuckles] Google E-Mail Notification
........
r5024 | asterix | 2006-01-07 04:02:16 -0700 (Sat, 07 Jan 2006) | 2 lines
better string
........
r5025 | asterix | 2006-01-07 04:14:32 -0700 (Sat, 07 Jan 2006) | 2 lines
fix a TB
........
r5026 | asterix | 2006-01-07 05:36:55 -0700 (Sat, 07 Jan 2006) | 2 lines
we can now drag a file on a contact in the roster to send him a file
........
r5027 | asterix | 2006-01-07 06:26:28 -0700 (Sat, 07 Jan 2006) | 2 lines
contact.groups is always a list, even if emtpy
........
r5028 | asterix | 2006-01-07 06:54:30 -0700 (Sat, 07 Jan 2006) | 2 lines
make all buttons insensitive on a category row in disco
........
r5029 | asterix | 2006-01-07 07:19:25 -0700 (Sat, 07 Jan 2006) | 2 lines
auto open groupchat configuration window when we create a new room
........
2006-01-07 18:25:35 +01:00
if gajim . config . get ( ' notify_on_new_gmail_email ' ) :
2006-02-08 01:55:16 +01:00
img = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' ,
2006-11-18 21:52:28 +01:00
' new_email_recv.png ' )
title = _ ( ' New mail on %(gmail_mail_address)s ' ) % \
2006-04-03 09:40:15 +02:00
{ ' gmail_mail_address ' : jid }
2006-11-18 21:52:28 +01:00
text = i18n . ngettext ( ' You have %d new mail conversation ' ,
' You have %d new mail conversations ' , gmail_new_messages ,
gmail_new_messages , gmail_new_messages )
2007-12-12 09:44:46 +01:00
2006-07-17 21:30:53 +02:00
if gajim . config . get ( ' notify_on_new_gmail_email_extra ' ) :
2008-06-03 16:15:57 +02:00
cnt = 0
2006-07-17 21:30:53 +02:00
for gmessage in gmail_messages_list :
2008-06-03 16:15:57 +02:00
#FIXME: emulate Gtalk client popups. find out what they parse and
# how they decide what to show each message has a 'From',
# 'Subject' and 'Snippet' field
if cnt > = 5 :
break
senders = reduce ( lambda b , a : a + ' , \n ' + b ,
gmessage [ ' From ' ] )
text + = _ ( ' \n \n From: %(from_address)s \n Subject: %(subject)s \n %(snippet)s ' ) % \
{ ' from_address ' : senders , ' subject ' : gmessage [ ' Subject ' ] ,
' snippet ' : gmessage [ ' Snippet ' ] }
cnt + = 1
2007-12-12 09:44:46 +01:00
2006-12-03 14:49:16 +01:00
if gajim . config . get_per ( ' soundevents ' , ' gmail_received ' , ' enabled ' ) :
helpers . play_sound ( ' gmail_received ' )
2006-01-22 00:15:35 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( img )
2006-05-10 22:25:51 +02:00
notify . popup ( _ ( ' New E-mail ' ) , jid , account , ' gmail ' ,
2008-06-03 16:15:57 +02:00
path_to_image = path , title = title ,
text = gobject . markup_escape_text ( text ) )
2005-10-18 22:30:26 +02:00
2006-05-15 19:27:48 +02:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewGmail ' , ( account , array ) )
2005-08-06 18:18:25 +02:00
def handle_event_file_request_error ( self , account , array ) :
2006-11-18 21:52:28 +01:00
# ('FILE_REQUEST_ERROR', account, (jid, file_props, error_msg))
jid , file_props , errmsg = array
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-11 22:31:44 +02:00
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-10-19 22:16:22 +02:00
errno = file_props [ ' error ' ]
2005-10-18 22:30:26 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_popup_window ( account ) :
2005-10-18 22:30:26 +02:00
if errno in ( - 4 , - 5 ) :
2006-11-18 21:52:28 +01:00
ft . show_stopped ( jid , file_props , errmsg )
2005-10-18 22:30:26 +02:00
else :
ft . show_request_error ( file_props )
return
2005-10-19 22:16:22 +02:00
if errno in ( - 4 , - 5 ) :
msg_type = ' file-error '
else :
msg_type = ' file-request-error '
2005-11-01 18:12:40 +01:00
self . add_event ( account , jid , msg_type , file_props )
2005-10-18 22:30:26 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_showing_notification ( account ) :
2005-08-06 18:18:25 +02:00
# check if we should be notified
2006-02-08 01:55:16 +01:00
img = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' , ' ft_error.png ' )
2006-09-13 18:47:58 +02:00
2006-01-22 00:15:35 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( img )
2006-04-03 09:40:15 +02:00
event_type = _ ( ' File Transfer Error ' )
2006-05-10 22:25:51 +02:00
notify . popup ( event_type , jid , account , msg_type , path ,
2006-04-03 09:40:15 +02:00
title = event_type , text = file_props [ ' name ' ] )
2005-10-18 22:30:26 +02:00
2005-07-30 12:20:46 +02:00
def handle_event_file_request ( self , account , array ) :
jid = array [ 0 ]
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
if jid not in gajim . contacts . get_jid_list ( account ) :
2007-12-12 09:44:46 +01:00
keyID = ' '
attached_keys = gajim . config . get_per ( ' accounts ' , account ,
' attached_gpg_keys ' ) . split ( )
if jid in attached_keys :
keyID = attached_keys [ attached_keys . index ( jid ) + 1 ]
2008-07-05 21:04:27 +02:00
contact = gajim . contacts . create_contact ( jid = jid , name = ' ' ,
groups = [ _ ( ' Not in Roster ' ) ] , show = ' not in roster ' , status = ' ' ,
sub = ' none ' , keyID = keyID )
2007-12-12 09:44:46 +01:00
gajim . contacts . add_contact ( account , contact )
2008-04-20 16:01:04 +02:00
self . roster . add_contact ( contact . jid , account )
2005-07-30 12:20:46 +02:00
file_props = array [ 1 ]
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
contact = gajim . contacts . get_first_contact_from_jid ( account , jid )
2005-10-18 11:07:52 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_popup_window ( account ) :
2005-11-13 16:08:47 +01:00
self . instances [ ' file_transfers ' ] . show_file_request ( account , contact ,
2005-10-18 11:07:52 +02:00
file_props )
return
2005-10-19 12:39:23 +02:00
self . add_event ( account , jid , ' file-request ' , file_props )
2005-10-18 11:07:52 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_showing_notification ( account ) :
2006-02-08 01:55:16 +01:00
img = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' ,
' ft_request.png ' )
2006-09-13 18:47:58 +02:00
txt = _ ( ' %s wants to send you a file. ' ) % gajim . get_name_from_jid (
account , jid )
2006-01-22 00:15:35 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( img )
2006-04-03 09:40:15 +02:00
event_type = _ ( ' File Transfer Request ' )
2006-05-10 22:25:51 +02:00
notify . popup ( event_type , jid , account , ' file-request ' ,
2006-04-03 09:40:15 +02:00
path_to_image = path , title = event_type , text = txt )
2005-10-18 11:07:52 +02:00
2005-08-01 17:02:46 +02:00
def handle_event_file_progress ( self , account , file_props ) :
2006-11-18 21:52:28 +01:00
if time . time ( ) - self . last_ftwindow_update > 0.5 :
# update ft window every 500ms
self . last_ftwindow_update = time . time ( )
2007-12-12 09:44:46 +01:00
self . instances [ ' file_transfers ' ] . set_progress ( file_props [ ' type ' ] ,
2006-11-18 21:52:28 +01:00
file_props [ ' sid ' ] , file_props [ ' received-len ' ] )
2006-09-13 18:47:58 +02:00
2005-07-30 16:14:10 +02:00
def handle_event_file_rcv_completed ( self , account , file_props ) :
2005-11-13 16:08:47 +01:00
ft = self . instances [ ' file_transfers ' ]
2005-08-01 17:02:46 +02:00
if file_props [ ' error ' ] == 0 :
2007-12-12 09:44:46 +01:00
ft . set_progress ( file_props [ ' type ' ] , file_props [ ' sid ' ] ,
2005-08-01 17:02:46 +02:00
file_props [ ' received-len ' ] )
else :
ft . set_status ( file_props [ ' type ' ] , file_props [ ' sid ' ] , ' stop ' )
2005-08-04 13:17:16 +02:00
if file_props . has_key ( ' stalled ' ) and file_props [ ' stalled ' ] or \
file_props . has_key ( ' paused ' ) and file_props [ ' paused ' ] :
2005-08-04 09:23:14 +02:00
return
2006-03-02 12:22:27 +01:00
if file_props [ ' type ' ] == ' r ' : # we receive a file
jid = unicode ( file_props [ ' sender ' ] )
else : # we send a file
jid = unicode ( file_props [ ' receiver ' ] )
2005-10-19 23:14:51 +02:00
2006-03-28 00:31:14 +02:00
if helpers . allow_popup_window ( account ) :
2005-08-04 13:17:16 +02:00
if file_props [ ' error ' ] == 0 :
2005-11-01 12:25:01 +01:00
if gajim . config . get ( ' notify_on_file_complete ' ) :
ft . show_completed ( jid , file_props )
2005-08-04 13:17:16 +02:00
elif file_props [ ' error ' ] == - 1 :
2005-10-19 23:14:51 +02:00
ft . show_stopped ( jid , file_props )
return
2005-11-01 12:25:01 +01:00
msg_type = ' '
2005-11-21 10:59:19 +01:00
event_type = ' '
2006-09-13 18:47:58 +02:00
if file_props [ ' error ' ] == 0 and gajim . config . get (
' notify_on_file_complete ' ) :
2005-10-19 23:14:51 +02:00
msg_type = ' file-completed '
event_type = _ ( ' File Transfer Completed ' )
elif file_props [ ' error ' ] == - 1 :
msg_type = ' file-stopped '
event_type = _ ( ' File Transfer Stopped ' )
2006-09-13 18:47:58 +02:00
2007-12-12 09:44:46 +01:00
if event_type == ' ' :
2005-12-01 19:03:05 +01:00
# FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs)
2005-11-21 10:59:19 +01:00
# this should never happen but it does. see process_result() in socks5.py
# who calls this func (sth is really wrong unless this func is also registered
# as progress_cb
return
2005-10-19 23:14:51 +02:00
2005-11-01 12:25:01 +01:00
if msg_type :
self . add_event ( account , jid , msg_type , file_props )
2006-09-13 18:47:58 +02:00
2006-01-20 18:40:45 +01:00
if file_props is not None :
if file_props [ ' type ' ] == ' r ' :
# get the name of the sender, as it is in the roster
sender = unicode ( file_props [ ' sender ' ] ) . split ( ' / ' ) [ 0 ]
name = gajim . contacts . get_first_contact_from_jid ( account ,
sender ) . get_shown_name ( )
filename = os . path . basename ( file_props [ ' file-name ' ] )
if event_type == _ ( ' File Transfer Completed ' ) :
txt = _ ( ' You successfully received %(filename)s from %(name)s . ' ) \
% { ' filename ' : filename , ' name ' : name }
img = ' ft_done.png '
else : # ft stopped
txt = _ ( ' File transfer of %(filename)s from %(name)s stopped. ' ) \
% { ' filename ' : filename , ' name ' : name }
img = ' ft_stopped.png '
else :
receiver = file_props [ ' receiver ' ]
if hasattr ( receiver , ' jid ' ) :
receiver = receiver . jid
receiver = receiver . split ( ' / ' ) [ 0 ]
# get the name of the contact, as it is in the roster
name = gajim . contacts . get_first_contact_from_jid ( account ,
receiver ) . get_shown_name ( )
filename = os . path . basename ( file_props [ ' file-name ' ] )
if event_type == _ ( ' File Transfer Completed ' ) :
txt = _ ( ' You successfully sent %(filename)s to %(name)s . ' ) \
% { ' filename ' : filename , ' name ' : name }
img = ' ft_done.png '
else : # ft stopped
txt = _ ( ' File transfer of %(filename)s to %(name)s stopped. ' ) \
% { ' filename ' : filename , ' name ' : name }
img = ' ft_stopped.png '
2006-02-08 01:55:16 +01:00
img = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' events ' , img )
2006-01-22 00:15:35 +01:00
path = gtkgui_helpers . get_path_to_generic_or_avatar ( img )
2006-01-20 18:40:45 +01:00
else :
txt = ' '
2005-10-19 23:14:51 +02:00
if gajim . config . get ( ' notify_on_file_complete ' ) and \
2005-11-08 17:53:33 +01:00
( gajim . config . get ( ' autopopupaway ' ) or \
gajim . connections [ account ] . connected in ( 2 , 3 ) ) :
# we want to be notified and we are online/chat or we don't mind
# bugged when away/na/busy
2006-05-10 22:25:51 +02:00
notify . popup ( event_type , jid , account , msg_type , path_to_image = path ,
2006-04-03 09:40:15 +02:00
title = event_type , text = txt )
2005-08-04 22:32:38 +02:00
def handle_event_stanza_arrived ( self , account , stanza ) :
2005-11-13 16:08:47 +01:00
if not self . instances . has_key ( account ) :
2005-08-10 13:52:37 +02:00
return
2005-11-13 16:08:47 +01:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' incoming ' )
2005-08-06 01:43:28 +02:00
def handle_event_stanza_sent ( self , account , stanza ) :
2005-11-13 16:08:47 +01:00
if not self . instances . has_key ( account ) :
2005-08-10 13:52:37 +02:00
return
2005-11-13 16:08:47 +01:00
if self . instances [ account ] . has_key ( ' xml_console ' ) :
self . instances [ account ] [ ' xml_console ' ] . print_stanza ( stanza , ' outgoing ' )
2005-08-04 22:32:38 +02:00
2005-09-10 11:25:06 +02:00
def handle_event_vcard_published ( self , account , array ) :
2006-11-18 21:52:28 +01:00
if self . instances [ account ] . has_key ( ' profile ' ) :
win = self . instances [ account ] [ ' profile ' ]
win . vcard_published ( )
2007-08-09 17:39:18 +02:00
for gc_control in self . msg_win_mgr . get_controls ( message_control . TYPE_GC ) + \
self . minimized_controls [ account ] . values ( ) :
2006-04-12 14:55:06 +02:00
if gc_control . account == account :
show = gajim . SHOW_LIST [ gajim . connections [ account ] . connected ]
status = gajim . connections [ account ] . status
gajim . connections [ account ] . send_gc_status ( gc_control . nick ,
gc_control . room_jid , show , status )
2005-09-10 11:25:06 +02:00
def handle_event_vcard_not_published ( self , account , array ) :
2006-11-18 21:52:28 +01:00
if self . instances [ account ] . has_key ( ' profile ' ) :
win = self . instances [ account ] [ ' profile ' ]
win . vcard_not_published ( )
2005-11-27 13:29:30 +01:00
2005-11-27 13:42:42 +01:00
def handle_event_signed_in ( self , account , empty ) :
2005-11-30 19:19:25 +01:00
''' SIGNED_IN event is emitted when we sign in, so handle it '''
2006-06-12 17:24:58 +02:00
# block signed in notifications for 30 seconds
2006-06-13 08:41:33 +02:00
gajim . block_signed_in_notifications [ account ] = True
2007-12-12 09:44:46 +01:00
self . roster . set_actions_menu_needs_rebuild ( )
2008-01-23 17:10:28 +01:00
self . roster . draw_account ( account )
2007-02-07 09:49:13 +01:00
if self . sleeper . getState ( ) != common . sleepy . STATE_UNKNOWN and \
2006-04-21 19:31:24 +02:00
gajim . connections [ account ] . connected in ( 2 , 3 ) :
# we go online or free for chat, so we activate auto status
2006-04-20 19:06:05 +02:00
gajim . sleeper_state [ account ] = ' online '
2006-04-20 19:12:15 +02:00
else :
2006-04-20 23:53:41 +02:00
gajim . sleeper_state [ account ] = ' off '
2006-03-29 16:31:05 +02:00
invisible_show = gajim . SHOW_LIST . index ( ' invisible ' )
# We cannot join rooms if we are invisible
if gajim . connections [ account ] . connected == invisible_show :
return
# join already open groupchats
2007-08-09 17:39:18 +02:00
for gc_control in self . msg_win_mgr . get_controls ( message_control . TYPE_GC ) + \
self . minimized_controls [ account ] . values ( ) :
2006-01-17 12:05:05 +01:00
if account != gc_control . account :
continue
2006-01-09 01:47:54 +01:00
room_jid = gc_control . room_jid
2006-01-10 02:47:24 +01:00
if gajim . gc_connected [ account ] . has_key ( room_jid ) and \
gajim . gc_connected [ account ] [ room_jid ] :
2005-11-30 18:45:34 +01:00
continue
2006-01-06 07:59:55 +01:00
nick = gc_control . nick
2005-11-30 18:45:34 +01:00
password = ' '
if gajim . gc_passwords . has_key ( room_jid ) :
password = gajim . gc_passwords [ room_jid ]
2006-11-18 21:52:28 +01:00
gajim . connections [ account ] . join_gc ( nick , room_jid , password )
2005-11-27 13:29:30 +01:00
2006-03-24 13:55:56 +01:00
def handle_event_metacontacts ( self , account , tags_list ) :
gajim . contacts . define_metacontacts ( account , tags_list )
2006-01-26 12:23:15 +01:00
2006-07-21 15:52:36 +02:00
def handle_atom_entry ( self , account , data ) :
atom_entry , = data
AtomWindow . newAtomEntry ( atom_entry )
2007-12-12 09:44:46 +01:00
def handle_event_failed_decrypt ( self , account , data ) :
2008-05-02 04:32:28 +02:00
jid , tim , session = data
2007-12-12 09:44:46 +01:00
2008-07-15 05:16:58 +02:00
details = _ ( ' Unable to decrypt message from '
2008-08-01 12:01:45 +02:00
' %s \n It may have been tampered with. ' ) % jid
2008-07-15 05:16:58 +02:00
2008-05-13 03:59:10 +02:00
if session . control :
2008-07-23 19:40:02 +02:00
session . control . print_conversation_line ( details ,
' status ' , ' ' , tim )
2007-12-12 09:44:46 +01:00
else :
2008-07-23 19:40:02 +02:00
dialogs . WarningDialog ( _ ( ' Unable to decrypt message ' ) ,
details )
2007-12-12 09:44:46 +01:00
2008-07-19 01:33:59 +02:00
# terminate the session
session . terminate_e2e ( )
session . conn . delete_session ( jid , session . thread_id )
# restart the session
2008-07-21 16:36:45 +02:00
session . negotiate_e2e ( False )
2008-07-19 01:33:59 +02:00
2006-07-17 21:30:53 +02:00
def handle_event_privacy_lists_received ( self , account , data ) :
# ('PRIVACY_LISTS_RECEIVED', account, list)
if not self . instances . has_key ( account ) :
return
if self . instances [ account ] . has_key ( ' privacy_lists ' ) :
self . instances [ account ] [ ' privacy_lists ' ] . privacy_lists_received ( data )
def handle_event_privacy_list_received ( self , account , data ) :
# ('PRIVACY_LISTS_RECEIVED', account, (name, rules))
if not self . instances . has_key ( account ) :
return
name = data [ 0 ]
rules = data [ 1 ]
if self . instances [ account ] . has_key ( ' privacy_list_ %s ' % name ) :
self . instances [ account ] [ ' privacy_list_ %s ' % name ] . \
privacy_list_received ( rules )
2007-06-03 12:04:20 +02:00
if name == ' block ' :
gajim . connections [ account ] . blocked_contacts = [ ]
gajim . connections [ account ] . blocked_groups = [ ]
gajim . connections [ account ] . blocked_list = [ ]
for rule in rules :
if rule [ ' type ' ] == ' jid ' and rule [ ' action ' ] == ' deny ' :
gajim . connections [ account ] . blocked_contacts . append ( rule [ ' value ' ] )
if rule [ ' type ' ] == ' group ' and rule [ ' action ' ] == ' deny ' :
gajim . connections [ account ] . blocked_groups . append ( rule [ ' value ' ] )
gajim . connections [ account ] . blocked_list . append ( rule )
#elif rule['type'] == "group" and action == "deny":
# text_item = _('%s group "%s"') % _(rule['action']), rule['value']
# self.store.append([text_item])
# self.global_rules.append(rule)
#else:
2007-12-12 09:44:46 +01:00
# self.global_rules_to_append.append(rule)
2007-06-03 12:04:20 +02:00
if self . instances [ account ] . has_key ( ' blocked_contacts ' ) :
self . instances [ account ] [ ' blocked_contacts ' ] . \
privacy_list_received ( rules )
2006-07-17 21:30:53 +02:00
def handle_event_privacy_lists_active_default ( self , account , data ) :
if not data :
return
# Send to all privacy_list_* windows as we can't know which one asked
for win in self . instances [ account ] :
if win . startswith ( ' privacy_list_ ' ) :
self . instances [ account ] [ win ] . check_active_default ( data )
2007-01-11 21:21:53 +01:00
def handle_event_privacy_list_removed ( self , account , name ) :
# ('PRIVACY_LISTS_REMOVED', account, name)
if not self . instances . has_key ( account ) :
return
if self . instances [ account ] . has_key ( ' privacy_lists ' ) :
self . instances [ account ] [ ' privacy_lists ' ] . privacy_list_removed ( name )
2006-11-18 21:52:28 +01:00
def handle_event_zc_name_conflict ( self , account , data ) :
2008-08-07 17:51:23 +02:00
def on_ok ( new_name ) :
2006-11-18 21:52:28 +01:00
gajim . config . set_per ( ' accounts ' , account , ' name ' , new_name )
status = gajim . connections [ account ] . status
gajim . connections [ account ] . username = new_name
gajim . connections [ account ] . change_status ( status , ' ' )
2008-08-07 17:51:23 +02:00
def on_cancel ( ) :
2006-11-18 21:52:28 +01:00
gajim . connections [ account ] . change_status ( ' offline ' , ' ' )
2008-08-07 17:51:23 +02:00
dlg = dialogs . InputDialog ( _ ( ' Username Conflict ' ) ,
_ ( ' Please type a new username for your local account ' ) , input_str = data ,
is_modal = True , ok_handler = on_ok , cancel_handler = on_cancel )
2007-06-03 12:04:20 +02:00
def handle_event_ping_sent ( self , account , contact ) :
2008-08-07 17:27:02 +02:00
if contact . jid == contact . get_full_jid ( ) :
# If contact is a groupchat user
jids = [ contact . jid ]
else :
jids = [ contact . jid , contact . get_full_jid ( ) ]
for jid in jids :
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( jid , account )
if ctrl :
ctrl . print_conversation ( _ ( ' Ping? ' ) , ' status ' )
2007-06-03 12:04:20 +02:00
def handle_event_ping_reply ( self , account , data ) :
contact = data [ 0 ]
seconds = data [ 1 ]
2008-08-07 17:27:02 +02:00
if contact . jid == contact . get_full_jid ( ) :
# If contact is a groupchat user
jids = [ contact . jid ]
else :
jids = [ contact . jid , contact . get_full_jid ( ) ]
for jid in jids :
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( jid , account )
if ctrl :
ctrl . print_conversation ( _ ( ' Pong! ( %s s.) ' ) % seconds , ' status ' )
2007-06-03 12:04:20 +02:00
def handle_event_ping_error ( self , account , contact ) :
2008-08-07 17:27:02 +02:00
if contact . jid == contact . get_full_jid ( ) :
# If contact is a groupchat user
jids = [ contact . jid ]
else :
jids = [ contact . jid , contact . get_full_jid ( ) ]
for jid in jids :
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( jid , account )
if ctrl :
ctrl . print_conversation ( _ ( ' Error. ' ) , ' status ' )
2007-06-03 12:04:20 +02:00
def handle_event_search_form ( self , account , data ) :
# ('SEARCH_FORM', account, (jid, dataform, is_dataform))
if not self . instances [ account ] [ ' search ' ] . has_key ( data [ 0 ] ) :
return
self . instances [ account ] [ ' search ' ] [ data [ 0 ] ] . on_form_arrived ( data [ 1 ] ,
data [ 2 ] )
def handle_event_search_result ( self , account , data ) :
# ('SEARCH_RESULT', account, (jid, dataform, is_dataform))
if not self . instances [ account ] [ ' search ' ] . has_key ( data [ 0 ] ) :
return
self . instances [ account ] [ ' search ' ] [ data [ 0 ] ] . on_result_arrived ( data [ 1 ] ,
data [ 2 ] )
def handle_event_resource_conflict ( self , account , data ) :
# ('RESOURCE_CONFLICT', account, ())
# First we go offline, but we don't overwrite status message
self . roster . send_status ( account , ' offline ' ,
gajim . connections [ account ] . status )
def on_ok ( new_resource ) :
gajim . config . set_per ( ' accounts ' , account , ' resource ' , new_resource )
self . roster . send_status ( account , gajim . connections [ account ] . old_show ,
gajim . connections [ account ] . status )
dlg = dialogs . InputDialog ( _ ( ' Resource Conflict ' ) ,
_ ( ' You are already connected to this account with the same resource. Please type a new one ' ) , input_str = gajim . connections [ account ] . server_resource ,
is_modal = False , ok_handler = on_ok )
2008-02-15 23:55:21 +01:00
def handle_event_pep_config ( self , account , data ) :
2008-03-03 00:56:39 +01:00
# ('PEP_CONFIG', account, (node, form))
2007-06-03 12:30:34 +02:00
if self . instances [ account ] . has_key ( ' pep_services ' ) :
2008-02-15 23:55:21 +01:00
self . instances [ account ] [ ' pep_services ' ] . config ( data [ 0 ] , data [ 1 ] )
2007-06-03 12:30:34 +02:00
2007-12-12 09:44:46 +01:00
def handle_event_unique_room_id_supported ( self , account , data ) :
''' Receive confirmation that unique_room_id are supported '''
# ('UNIQUE_ROOM_ID_SUPPORTED', server, instance, room_id)
instance = data [ 1 ]
instance . unique_room_id_supported ( data [ 0 ] , data [ 2 ] )
def handle_event_unique_room_id_unsupported ( self , account , data ) :
# ('UNIQUE_ROOM_ID_UNSUPPORTED', server, instance)
instance = data [ 1 ]
instance . unique_room_id_error ( data [ 0 ] )
def handle_event_ssl_error ( self , account , data ) :
2007-12-27 00:59:54 +01:00
# ('SSL_ERROR', account, (text, errnum, cert, sha1_fingerprint))
2007-12-12 09:44:46 +01:00
server = gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
2008-02-15 11:11:17 +01:00
def on_ok ( is_checked ) :
if is_checked [ 0 ] :
2007-12-27 00:59:54 +01:00
# Check if cert is already in file
certs = ' '
if os . path . isfile ( gajim . MY_CACERTS ) :
f = open ( gajim . MY_CACERTS )
certs = f . read ( )
f . close ( )
if data [ 2 ] in certs :
dialogs . ErrorDialog ( _ ( ' Certificate Already in File ' ) ,
_ ( ' This certificate is already in file %s , so it \' s not added again. ' ) % gajim . MY_CACERTS )
else :
f = open ( gajim . MY_CACERTS , ' a ' )
f . write ( server + ' \n ' )
f . write ( data [ 2 ] + ' \n \n ' )
f . close ( )
2007-12-12 09:44:46 +01:00
gajim . config . set_per ( ' accounts ' , account , ' ssl_fingerprint_sha1 ' ,
2007-12-27 00:59:54 +01:00
data [ 3 ] )
2008-02-15 11:11:17 +01:00
if is_checked [ 1 ] :
ignore_ssl_errors = gajim . config . get_per ( ' accounts ' , account ,
' ignore_ssl_errors ' ) . split ( )
ignore_ssl_errors . append ( str ( data [ 1 ] ) )
gajim . config . set_per ( ' accounts ' , account , ' ignore_ssl_errors ' ,
' ' . join ( ignore_ssl_errors ) )
2007-12-12 09:44:46 +01:00
gajim . connections [ account ] . ssl_certificate_accepted ( )
2008-02-15 11:11:17 +01:00
2007-12-12 09:44:46 +01:00
def on_cancel ( ) :
gajim . connections [ account ] . disconnect ( on_purpose = True )
self . handle_event_status ( account , ' offline ' )
2008-02-15 11:11:17 +01:00
2007-12-12 09:44:46 +01:00
pritext = _ ( ' Error verifying SSL certificate ' )
sectext = _ ( ' There was an error verifying the SSL certificate of your jabber server: %(error)s \n Do you still want to connect to this server? ' ) % { ' error ' : data [ 0 ] }
2007-12-27 00:59:54 +01:00
if data [ 1 ] in ( 18 , 27 ) :
2008-02-15 11:11:17 +01:00
checktext1 = _ ( ' Add this certificate to the list of trusted certificates. \n SHA1 fingerprint of the certificate: \n %s ' ) % data [ 3 ]
2007-12-27 00:59:54 +01:00
else :
2008-02-15 11:11:17 +01:00
checktext1 = ' '
checktext2 = _ ( ' Ignore this error for this certificate. ' )
dialogs . ConfirmationDialogDubbleCheck ( pritext , sectext , checktext1 ,
checktext2 , on_response_ok = on_ok , on_response_cancel = on_cancel )
2007-12-12 09:44:46 +01:00
def handle_event_fingerprint_error ( self , account , data ) :
2008-02-01 17:22:32 +01:00
# ('FINGERPRINT_ERROR', account, (new_fingerprint,))
2008-02-04 22:38:36 +01:00
def on_yes ( is_checked ) :
2007-12-12 09:44:46 +01:00
gajim . config . set_per ( ' accounts ' , account , ' ssl_fingerprint_sha1 ' ,
data [ 0 ] )
2008-02-15 11:11:17 +01:00
# Reset the ignored ssl errors
gajim . config . set_per ( ' accounts ' , account , ' ignore_ssl_errors ' , ' ' )
2007-12-12 09:44:46 +01:00
gajim . connections [ account ] . ssl_certificate_accepted ( )
2008-01-22 17:06:16 +01:00
def on_no ( ) :
2007-12-12 09:44:46 +01:00
gajim . connections [ account ] . disconnect ( on_purpose = True )
self . handle_event_status ( account , ' offline ' )
pritext = _ ( ' SSL certificate error ' )
2008-02-01 17:22:32 +01:00
sectext = _ ( ' It seems the SSL certificate has changed or your connection '
2008-08-01 11:30:36 +02:00
' is being hacked. \n Old fingerprint: %(old)s \n New fingerprint: %(new)s '
' \n \n Do you still want to connect and update the fingerprint of the '
' certificate? ' ) % { ' old ' : gajim . config . get_per ( ' accounts ' , account ,
' ssl_fingerprint_sha1 ' ) , ' new ' : data [ 0 ] }
2007-12-12 09:44:46 +01:00
dialog = dialogs . YesNoDialog ( pritext , sectext , on_response_yes = on_yes ,
on_response_no = on_no )
2008-02-04 22:38:36 +01:00
def handle_event_plain_connection ( self , account , data ) :
# ('PLAIN_CONNECTION', account, (connection))
server = gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
2008-07-05 20:07:32 +02:00
def on_ok ( is_checked ) :
if not is_checked [ 0 ] :
on_cancel ( )
return
if is_checked [ 1 ] :
2008-02-04 22:38:36 +01:00
gajim . config . set_per ( ' accounts ' , account ,
2008-07-05 20:07:32 +02:00
' warn_when_plaintext_connection ' , False )
2008-02-04 22:38:36 +01:00
gajim . connections [ account ] . connection_accepted ( data [ 0 ] , ' tcp ' )
2008-07-05 20:07:32 +02:00
def on_cancel ( ) :
2008-02-04 22:38:36 +01:00
gajim . connections [ account ] . disconnect ( on_purpose = True )
self . handle_event_status ( account , ' offline ' )
pritext = _ ( ' Insecure connection ' )
2008-07-05 20:07:32 +02:00
sectext = _ ( ' You are about to send your password on an unencrypted '
2008-03-22 09:52:46 +01:00
' connection. Are you sure you want to do that? ' )
2008-07-05 20:07:32 +02:00
checktext1 = _ ( ' Yes, I really want to connect insecurely ' )
checktext2 = _ ( ' Do _not ask me again ' )
dialog = dialogs . ConfirmationDialogDubbleCheck ( pritext , sectext ,
checktext1 , checktext2 , on_response_ok = on_ok ,
on_response_cancel = on_cancel , is_modal = False )
def handle_event_insecure_ssl_connection ( self , account , data ) :
# ('INSECURE_SSL_CONNECTION', account, (connection, connection_type))
server = gajim . config . get_per ( ' accounts ' , account , ' hostname ' )
def on_ok ( is_checked ) :
if not is_checked [ 0 ] :
on_cancel ( )
return
if is_checked [ 1 ] :
gajim . config . set_per ( ' accounts ' , account ,
' warn_when_insecure_ssl_connection ' , False )
2008-07-30 17:43:53 +02:00
if gajim . connections [ account ] . connected == 0 :
# We have been disconnecting (too long time since window is opened)
# re-connect with auto-accept
gajim . connections [ account ] . connection_auto_accepted = True
show , msg = gajim . connections [ account ] . continue_connect_info [ : 2 ]
self . roster . send_status ( account , show , msg )
return
2008-07-05 20:07:32 +02:00
gajim . connections [ account ] . connection_accepted ( data [ 0 ] , data [ 1 ] )
def on_cancel ( ) :
gajim . connections [ account ] . disconnect ( on_purpose = True )
self . handle_event_status ( account , ' offline ' )
pritext = _ ( ' Insecure connection ' )
sectext = _ ( ' You are about to send your password on an insecure '
' connection. You should install PyOpenSSL to prevent that. Are you sure you want to do that? ' )
checktext1 = _ ( ' Yes, I really want to connect insecurely ' )
checktext2 = _ ( ' Do _not ask me again ' )
dialog = dialogs . ConfirmationDialogDubbleCheck ( pritext , sectext ,
checktext1 , checktext2 , on_response_ok = on_ok ,
on_response_cancel = on_cancel , is_modal = False )
2008-02-04 22:38:36 +01:00
2008-03-03 00:56:39 +01:00
def handle_event_pubsub_node_removed ( self , account , data ) :
# ('PUBSUB_NODE_REMOVED', account, (jid, node))
if self . instances [ account ] . has_key ( ' pep_services ' ) :
if data [ 0 ] == gajim . get_jid_from_account ( account ) :
self . instances [ account ] [ ' pep_services ' ] . node_removed ( data [ 1 ] )
def handle_event_pubsub_node_not_removed ( self , account , data ) :
# ('PUBSUB_NODE_NOT_REMOVED', account, (jid, node, msg))
if data [ 0 ] == gajim . get_jid_from_account ( account ) :
dialogs . WarningDialog ( _ ( ' PEP node was not removed ' ) ,
2008-08-01 11:30:36 +02:00
_ ( ' PEP node %(node)s was not removed: %(message)s ' ) % {
' node ' : data [ 1 ] , ' message ' : data [ 2 ] } )
2008-03-03 00:56:39 +01:00
2008-04-20 20:14:04 +02:00
def register_handlers ( self ) :
self . handlers = {
' ROSTER ' : self . handle_event_roster ,
' WARNING ' : self . handle_event_warning ,
' ERROR ' : self . handle_event_error ,
' INFORMATION ' : self . handle_event_information ,
' ERROR_ANSWER ' : self . handle_event_error_answer ,
' STATUS ' : self . handle_event_status ,
' NOTIFY ' : self . handle_event_notify ,
' MSGERROR ' : self . handle_event_msgerror ,
' MSGSENT ' : self . handle_event_msgsent ,
' MSGNOTSENT ' : self . handle_event_msgnotsent ,
' SUBSCRIBED ' : self . handle_event_subscribed ,
' UNSUBSCRIBED ' : self . handle_event_unsubscribed ,
' SUBSCRIBE ' : self . handle_event_subscribe ,
' AGENT_ERROR_INFO ' : self . handle_event_agent_info_error ,
' AGENT_ERROR_ITEMS ' : self . handle_event_agent_items_error ,
' AGENT_REMOVED ' : self . handle_event_agent_removed ,
' REGISTER_AGENT_INFO ' : self . handle_event_register_agent_info ,
' AGENT_INFO_ITEMS ' : self . handle_event_agent_info_items ,
' AGENT_INFO_INFO ' : self . handle_event_agent_info_info ,
' QUIT ' : self . handle_event_quit ,
' NEW_ACC_CONNECTED ' : self . handle_event_new_acc_connected ,
' NEW_ACC_NOT_CONNECTED ' : self . handle_event_new_acc_not_connected ,
' ACC_OK ' : self . handle_event_acc_ok ,
' ACC_NOT_OK ' : self . handle_event_acc_not_ok ,
' MYVCARD ' : self . handle_event_myvcard ,
' VCARD ' : self . handle_event_vcard ,
' LAST_STATUS_TIME ' : self . handle_event_last_status_time ,
' OS_INFO ' : self . handle_event_os_info ,
' GC_NOTIFY ' : self . handle_event_gc_notify ,
' GC_MSG ' : self . handle_event_gc_msg ,
' GC_SUBJECT ' : self . handle_event_gc_subject ,
' GC_CONFIG ' : self . handle_event_gc_config ,
' GC_CONFIG_CHANGE ' : self . handle_event_gc_config_change ,
' GC_INVITATION ' : self . handle_event_gc_invitation ,
' GC_AFFILIATION ' : self . handle_event_gc_affiliation ,
' GC_PASSWORD_REQUIRED ' : self . handle_event_gc_password_required ,
' BAD_PASSPHRASE ' : self . handle_event_bad_passphrase ,
' ROSTER_INFO ' : self . handle_event_roster_info ,
' BOOKMARKS ' : self . handle_event_bookmarks ,
' CON_TYPE ' : self . handle_event_con_type ,
' CONNECTION_LOST ' : self . handle_event_connection_lost ,
' FILE_REQUEST ' : self . handle_event_file_request ,
' GMAIL_NOTIFY ' : self . handle_event_gmail_notify ,
' FILE_REQUEST_ERROR ' : self . handle_event_file_request_error ,
' FILE_SEND_ERROR ' : self . handle_event_file_send_error ,
' STANZA_ARRIVED ' : self . handle_event_stanza_arrived ,
' STANZA_SENT ' : self . handle_event_stanza_sent ,
' HTTP_AUTH ' : self . handle_event_http_auth ,
' VCARD_PUBLISHED ' : self . handle_event_vcard_published ,
' VCARD_NOT_PUBLISHED ' : self . handle_event_vcard_not_published ,
' ASK_NEW_NICK ' : self . handle_event_ask_new_nick ,
' SIGNED_IN ' : self . handle_event_signed_in ,
' METACONTACTS ' : self . handle_event_metacontacts ,
' ATOM_ENTRY ' : self . handle_atom_entry ,
' FAILED_DECRYPT ' : self . handle_event_failed_decrypt ,
' PRIVACY_LISTS_RECEIVED ' : self . handle_event_privacy_lists_received ,
' PRIVACY_LIST_RECEIVED ' : self . handle_event_privacy_list_received ,
' PRIVACY_LISTS_ACTIVE_DEFAULT ' : \
self . handle_event_privacy_lists_active_default ,
' PRIVACY_LIST_REMOVED ' : self . handle_event_privacy_list_removed ,
' ZC_NAME_CONFLICT ' : self . handle_event_zc_name_conflict ,
' PING_SENT ' : self . handle_event_ping_sent ,
' PING_REPLY ' : self . handle_event_ping_reply ,
' PING_ERROR ' : self . handle_event_ping_error ,
' SEARCH_FORM ' : self . handle_event_search_form ,
' SEARCH_RESULT ' : self . handle_event_search_result ,
' RESOURCE_CONFLICT ' : self . handle_event_resource_conflict ,
' PEP_CONFIG ' : self . handle_event_pep_config ,
' UNIQUE_ROOM_ID_UNSUPPORTED ' : \
self . handle_event_unique_room_id_unsupported ,
' UNIQUE_ROOM_ID_SUPPORTED ' : self . handle_event_unique_room_id_supported ,
' GPG_PASSWORD_REQUIRED ' : self . handle_event_gpg_password_required ,
' SSL_ERROR ' : self . handle_event_ssl_error ,
' FINGERPRINT_ERROR ' : self . handle_event_fingerprint_error ,
' PLAIN_CONNECTION ' : self . handle_event_plain_connection ,
2008-07-05 20:07:32 +02:00
' INSECURE_SSL_CONNECTION ' : self . handle_event_insecure_ssl_connection ,
2008-04-20 20:14:04 +02:00
' PUBSUB_NODE_REMOVED ' : self . handle_event_pubsub_node_removed ,
' PUBSUB_NODE_NOT_REMOVED ' : self . handle_event_pubsub_node_not_removed ,
}
gajim . handlers = self . handlers
2003-11-30 23:40:24 +01:00
2008-04-20 20:14:04 +02:00
################################################################################
### Methods dealing with gajim.events
################################################################################
def add_event ( self , account , jid , type_ , event_args ) :
''' add an event to the gajim.events var '''
# We add it to the gajim.events queue
# Do we have a queue?
jid = gajim . get_jid_without_resource ( jid )
no_queue = len ( gajim . events . get_events ( account , jid ) ) == 0
event_type = None
# type_ can be gc-invitation file-send-error file-error file-request-error
# file-request file-completed file-stopped
# event_type can be in advancedNotificationWindow.events_list
event_types = { ' file-request ' : ' ft_request ' ,
' file-completed ' : ' ft_finished ' }
if type_ in event_types :
event_type = event_types [ type_ ]
show_in_roster = notify . get_show_in_roster ( event_type , account , jid )
show_in_systray = notify . get_show_in_systray ( event_type , account , jid )
event = gajim . events . create_event ( type_ , event_args ,
show_in_roster = show_in_roster ,
show_in_systray = show_in_systray )
gajim . events . add_event ( account , jid , event )
self . roster . show_title ( )
if no_queue : # We didn't have a queue: we change icons
if not gajim . contacts . get_contact_with_highest_priority ( account , jid ) :
if type_ == ' gc-invitation ' :
2008-04-24 15:47:37 +02:00
self . roster . add_groupchat ( jid , account , status = ' offline ' )
2008-03-30 13:50:59 +02:00
else :
2008-04-20 20:14:04 +02:00
# add contact to roster ("Not In The Roster") if he is not
self . roster . add_to_not_in_the_roster ( account , jid )
2008-07-21 23:44:40 +02:00
else :
self . roster . draw_contact ( jid , account )
2004-12-01 21:47:37 +01:00
2008-05-19 22:00:41 +02:00
# Select the contact in roster, it's visible because it has events.
self . roster . select_contact ( jid , account )
2004-12-14 13:57:45 +01:00
2008-04-20 20:14:04 +02:00
def handle_event ( self , account , fjid , type_ ) :
w = None
2008-06-17 05:27:54 +02:00
ctrl = None
session = None
2008-04-20 20:14:04 +02:00
resource = gajim . get_resource_from_jid ( fjid )
jid = gajim . get_jid_without_resource ( fjid )
2008-06-17 05:27:54 +02:00
2008-04-20 20:14:04 +02:00
if type_ in ( ' printed_gc_msg ' , ' printed_marked_gc_msg ' , ' gc_msg ' ) :
w = self . msg_win_mgr . get_window ( jid , account )
2008-07-19 19:36:21 +02:00
if jid in self . minimized_controls [ account ] :
2008-04-20 20:14:04 +02:00
self . roster . on_groupchat_maximized ( None , jid , account )
2008-07-21 23:44:40 +02:00
return
else :
2008-05-13 03:59:10 +02:00
ctrl = self . msg_win_mgr . get_gc_control ( jid , account )
2008-04-20 20:14:04 +02:00
elif type_ in ( ' printed_chat ' , ' chat ' , ' ' ) :
# '' is for log in/out notifications
2008-05-13 03:59:10 +02:00
2008-07-15 01:21:08 +02:00
if type_ != ' ' :
event = gajim . events . get_first_event ( account , fjid , type_ )
if not event :
event = gajim . events . get_first_event ( account , jid , type_ )
if not event :
return
2008-05-13 03:59:10 +02:00
if type_ == ' printed_chat ' :
2008-06-14 18:49:48 +02:00
ctrl = event . parameters [ 0 ]
2008-05-13 03:59:10 +02:00
elif type_ == ' chat ' :
session = event . parameters [ 8 ]
ctrl = session . control
2008-06-21 21:12:58 +02:00
elif type_ == ' ' :
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( fjid , account )
2008-06-21 21:12:58 +02:00
if not ctrl :
2008-04-20 20:14:04 +02:00
highest_contact = gajim . contacts . get_contact_with_highest_priority (
account , jid )
# jid can have a window if this resource was lower when he sent
# message and is now higher because the other one is offline
if resource and highest_contact . resource == resource and \
not self . msg_win_mgr . has_window ( jid , account ) :
# remove resource of events too
gajim . events . change_jid ( account , fjid , jid )
resource = None
fjid = jid
contact = None
if resource :
contact = gajim . contacts . get_contact ( account , jid , resource )
if not contact :
contact = highest_contact
2008-05-13 03:59:10 +02:00
2008-07-04 01:19:44 +02:00
ctrl = self . new_chat ( contact , account , resource = resource , session = session )
2008-05-13 03:59:10 +02:00
2008-04-20 20:14:04 +02:00
gajim . last_message_time [ account ] [ jid ] = 0 # long time ago
2008-05-13 03:59:10 +02:00
w = ctrl . parent_win
2008-04-20 20:14:04 +02:00
elif type_ in ( ' printed_pm ' , ' pm ' ) :
2008-05-13 03:59:10 +02:00
# assume that the most recently updated control we have for this party
# is the one that this event was in
event = gajim . events . get_first_event ( account , fjid , type_ )
if not event :
event = gajim . events . get_first_event ( account , jid , type_ )
if type_ == ' printed_pm ' :
2008-06-18 06:11:11 +02:00
ctrl = event . parameters [ 0 ]
2008-05-13 03:59:10 +02:00
elif type_ == ' pm ' :
session = event . parameters [ 8 ]
if session and session . control :
ctrl = session . control
2008-06-18 06:11:11 +02:00
elif not ctrl :
2008-04-20 20:14:04 +02:00
room_jid = jid
nick = resource
gc_contact = gajim . contacts . get_gc_contact ( account , room_jid ,
nick )
if gc_contact :
show = gc_contact . show
else :
show = ' offline '
gc_contact = gajim . contacts . create_gc_contact (
room_jid = room_jid , name = nick , show = show )
2008-05-13 03:59:10 +02:00
if not session :
session = gajim . connections [ account ] . make_new_session ( fjid , None , type = ' pm ' )
self . new_private_chat ( gc_contact , account , session = session )
ctrl = session . control
w = ctrl . parent_win
2008-04-20 20:14:04 +02:00
elif type_ in ( ' normal ' , ' file-request ' , ' file-request-error ' ,
' file-send-error ' , ' file-error ' , ' file-stopped ' , ' file-completed ' ) :
# Get the first single message event
event = gajim . events . get_first_event ( account , fjid , type_ )
if not event :
# default to jid without resource
event = gajim . events . get_first_event ( account , jid , type_ )
if not event :
return
# Open the window
self . roster . open_event ( account , jid , event )
else :
# Open the window
self . roster . open_event ( account , fjid , event )
elif type_ == ' gmail ' :
url = gajim . connections [ account ] . gmail_url
if url :
helpers . launch_browser_mailer ( ' url ' , url )
elif type_ == ' gc-invitation ' :
event = gajim . events . get_first_event ( account , jid , type_ )
data = event . parameters
dialogs . InvitationReceivedDialog ( account , data [ 0 ] , jid , data [ 2 ] ,
data [ 1 ] , data [ 3 ] )
gajim . events . remove_events ( account , jid , event )
self . roster . draw_contact ( jid , account )
if w :
2008-05-13 03:59:10 +02:00
w . set_active_tab ( ctrl )
2008-04-20 20:14:04 +02:00
w . window . window . focus ( )
# Using isinstance here because we want to catch all derived types
if isinstance ( ctrl , ChatControlBase ) :
tv = ctrl . conv_textview
tv . scroll_to_end ( )
################################################################################
### Methods dealing with emoticons
################################################################################
2007-12-12 09:44:46 +01:00
2005-03-09 22:29:20 +01:00
def image_is_ok ( self , image ) :
if not os . path . exists ( image ) :
return False
img = gtk . Image ( )
try :
img . set_from_file ( image )
except :
2005-06-18 16:57:25 +02:00
return False
2005-06-18 17:57:06 +02:00
t = img . get_storage_type ( )
if t != gtk . IMAGE_PIXBUF and t != gtk . IMAGE_ANIMATION :
2005-03-09 22:29:20 +01:00
return False
return True
2007-12-12 09:44:46 +01:00
2005-03-13 18:04:57 +01:00
def make_regexps ( self ) :
2005-03-10 19:20:23 +01:00
# regexp meta characters are: . ^ $ * + ? { } [ ] \ | ( )
# one escapes the metachars with \
# \S matches anything but ' ' '\t' '\n' '\r' '\f' and '\v'
# \s matches any whitespace character
# \w any alphanumeric character
# \W any non-alphanumeric character
2005-03-10 23:53:40 +01:00
# \b means word boundary. This is a zero-width assertion that
# matches only at the beginning or end of a word.
2005-03-11 03:35:54 +01:00
# ^ matches at the beginning of lines
2005-03-10 23:53:40 +01:00
#
2005-03-10 19:20:23 +01:00
# * means 0 or more times
# + means 1 or more times
2005-03-10 23:53:40 +01:00
# ? means 0 or 1 time
2005-03-10 19:20:23 +01:00
# | means or
2008-04-17 16:17:14 +02:00
# [^*] anything but '*' (inside [] you don't have to escape metachars)
2005-03-10 19:20:23 +01:00
# [^\s*] anything but whitespaces and '*'
2005-03-11 17:24:04 +01:00
# (?<!\S) is a one char lookbehind assertion and asks for any leading whitespace
# and mathces beginning of lines so we have correct formatting detection
2005-03-29 18:16:42 +02:00
# even if the the text is just '*foo*'
2005-03-11 23:52:28 +01:00
# (?!\S) is the same thing but it's a lookahead assertion
2005-08-01 16:38:21 +02:00
# \S*[^\s\W] --> in the matching string don't match ? or ) etc.. if at the end
2005-03-29 23:28:58 +02:00
# so http://be) will match http://be and http://be)be) will match http://be)be
2005-11-01 00:31:18 +01:00
2008-07-08 20:49:51 +02:00
legacy_prefixes = r " ((?<= \ ()(www|ftp) \ .([A-Za-z0-9 \ . \ -_~:/ \ ?# \ [ \ ]@! \ $& ' \ ( \ ) \ * \ +,;=]| % [A-Fa-f0-9] {2} )+(?= \ ))) " \
r " |((www|ftp) \ .([A-Za-z0-9 \ . \ -_~:/ \ ?# \ [ \ ]@! \ $& ' \ ( \ ) \ * \ +,;=]| % [A-Fa-f0-9] {2} )+ " \
r " \ .([A-Za-z0-9 \ . \ -_~:/ \ ?# \ [ \ ]@! \ $& ' \ ( \ ) \ * \ +,;=]| % [A-Fa-f0-9] {2} )+) "
2005-11-01 00:33:33 +01:00
# NOTE: it's ok to catch www.gr such stuff exist!
2007-12-12 09:44:46 +01:00
2005-11-27 23:05:10 +01:00
#FIXME: recognize xmpp: and treat it specially
2008-06-27 12:50:09 +02:00
links = r " ((?<= \ ()[A-Za-z][A-Za-z0-9 \ + \ . \ -]*: " \
r " ([A-Za-z0-9 \ . \ -_~:/ \ ?# \ [ \ ]@! \ $& ' \ ( \ ) \ * \ +,;=]| % [A-Fa-f0-9] {2} )+ " \
r " (?= \ )))|([A-Za-z][A-Za-z0-9 \ + \ . \ -]*:([A-Za-z0-9 \ . \ -_~:/ \ ?# \ [ \ ]@! \ $& ' \ ( \ ) \ * \ +,;=]| % [A-Fa-f0-9] {2} )+) "
2007-12-12 09:44:46 +01:00
2005-03-10 19:20:23 +01:00
#2nd one: at_least_one_char@at_least_one_char.at_least_one_char
2006-03-18 13:20:59 +01:00
mail = r ' \ bmailto: \ S*[^ \ s \ W]| ' r ' \ b \ S+@ \ S+ \ . \ S*[^ \ s \ W] '
2005-03-10 19:20:23 +01:00
2005-11-13 22:46:04 +01:00
#detects eg. *b* *bold* *bold bold* test *bold* *bold*! (*bold*)
2005-03-11 13:55:38 +01:00
#doesn't detect (it's a feature :P) * bold* *bold * * bold * test*bold*
2006-03-18 13:20:59 +01:00
formatting = r ' |(?<! \ w) ' r ' \ *[^ \ s*] ' r ' ([^*]*[^ \ s*])? ' r ' \ *(?! \ w)| ' \
2005-11-14 22:26:20 +01:00
r ' (?<! \ w| \ <) ' r ' /[^ \ s/] ' r ' ([^/]*[^ \ s/])? ' r ' /(?! \ w)| ' \
2005-11-13 22:50:54 +01:00
r ' (?<! \ w) ' r ' _[^ \ s_] ' r ' ([^_]*[^ \ s_])? ' r ' _(?! \ w) '
2005-03-11 17:24:04 +01:00
2007-12-12 09:44:46 +01:00
latex = r ' | \ $ \ $[^$ \\ ]*?([ \ ] \ [0-9A-Za-z()|+*/-]|[ \\ ][ \ ] \ [0-9A-Za-z()| {} $])(.*?[^ \\ ])? \ $ \ $ '
2008-07-08 20:49:51 +02:00
basic_pattern = links + ' | ' + mail + ' | ' + legacy_prefixes
2007-12-12 09:44:46 +01:00
2007-06-03 12:04:20 +02:00
if gajim . config . get ( ' use_latex ' ) :
basic_pattern + = latex
2007-12-12 09:44:46 +01:00
2006-03-02 17:05:52 +01:00
if gajim . config . get ( ' ascii_formatting ' ) :
basic_pattern + = formatting
2006-11-19 00:21:59 +01:00
self . basic_pattern_re = re . compile ( basic_pattern , re . IGNORECASE )
2007-12-12 09:44:46 +01:00
2005-11-15 15:17:02 +01:00
emoticons_pattern = ' '
2006-03-17 12:11:45 +01:00
if gajim . config . get ( ' emoticons_theme ' ) :
2005-11-15 12:52:40 +01:00
# When an emoticon is bordered by an alpha-numeric character it is NOT
# expanded. e.g., foo:) NO, foo :) YES, (brb) NO, (:)) YES, etc.
2005-11-30 19:35:40 +01:00
# We still allow multiple emoticons side-by-side like :P:P:P
# sort keys by length so :qwe emot is checked before :q
2005-11-15 12:52:40 +01:00
keys = self . emoticons . keys ( )
keys . sort ( self . on_emoticon_sort )
2005-11-30 19:35:40 +01:00
emoticons_pattern_prematch = ' '
emoticons_pattern_postmatch = ' '
emoticon_length = 0
2005-11-15 12:52:40 +01:00
for emoticon in keys : # travel thru emoticons list
2007-12-12 09:44:46 +01:00
emoticon = emoticon . decode ( ' utf-8 ' )
2006-11-19 00:21:59 +01:00
emoticon_escaped = re . escape ( emoticon ) # espace regexp metachars
2005-11-15 12:52:40 +01:00
emoticons_pattern + = emoticon_escaped + ' | ' # | means or in regexp
2005-11-30 19:35:40 +01:00
if ( emoticon_length != len ( emoticon ) ) :
# Build up expressions to match emoticons next to other emoticons
emoticons_pattern_prematch = emoticons_pattern_prematch [ : - 1 ] + ' )|(?<= '
emoticons_pattern_postmatch = emoticons_pattern_postmatch [ : - 1 ] + ' )|(?= '
emoticon_length = len ( emoticon )
emoticons_pattern_prematch + = emoticon_escaped + ' | '
emoticons_pattern_postmatch + = emoticon_escaped + ' | '
# We match from our list of emoticons, but they must either have
2005-12-05 14:25:50 +01:00
# whitespace, or another emoticon next to it to match successfully
# [\w.] alphanumeric and dot (for not matching 8) in (2.8))
2005-11-30 19:35:40 +01:00
emoticons_pattern = ' | ' + \
2008-04-17 16:17:14 +02:00
' (?:(?<![ \ w.] ' + emoticons_pattern_prematch [ : - 1 ] + ' )) ' + \
' (?: ' + emoticons_pattern [ : - 1 ] + ' ) ' + \
2005-12-05 14:25:50 +01:00
' (?:(?![ \ w.] ' + emoticons_pattern_postmatch [ : - 1 ] + ' )) '
2007-12-12 09:44:46 +01:00
2005-11-13 22:46:04 +01:00
# because emoticons match later (in the string) they need to be after
# basic matches that may occur earlier
2005-11-30 19:35:40 +01:00
emot_and_basic_pattern = basic_pattern + emoticons_pattern
2007-12-12 09:44:46 +01:00
self . emot_and_basic_re = re . compile ( emot_and_basic_pattern ,
re . IGNORECASE + re . UNICODE )
2005-03-13 18:04:57 +01:00
# at least one character in 3 parts (before @, after @, after .)
2006-11-19 00:21:59 +01:00
self . sth_at_sth_dot_sth_re = re . compile ( r ' \ S+@ \ S+ \ . \ S*[^ \ s)?] ' )
2007-12-12 09:44:46 +01:00
2008-07-30 14:21:47 +02:00
# Invalid XML chars
2008-08-02 09:54:28 +02:00
# invalid_XML_chars = u'[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x19]|[\ud800-\udfff]|[\ufffe-\uffff]'
#FIXME: xgettext fails with \udfff char ... see #http://trac.gajim.org/ticket/4166
invalid_XML_chars = u ' [ \x00 - \x08 ]|[ \x0b - \x0c ]|[ \x0e - \x19 ]|[ \ufffe - \uffff ] '
2008-07-30 14:21:47 +02:00
self . invalid_XML_chars_re = re . compile ( invalid_XML_chars )
2006-11-19 00:21:59 +01:00
re . purge ( ) # clear the regular expression cache
2005-03-10 19:20:23 +01:00
2005-11-01 00:48:36 +01:00
def on_emoticon_sort ( self , emot1 , emot2 ) :
2005-09-08 13:25:47 +02:00
len1 = len ( emot1 )
len2 = len ( emot2 )
if len1 < len2 :
return 1
elif len1 > len2 :
return - 1
return 0
2006-04-17 23:59:04 +02:00
def popup_emoticons_under_button ( self , button , parent_win ) :
''' pops emoticons menu under button, located in parent_win '''
2007-12-12 09:44:46 +01:00
gtkgui_helpers . popup_emoticons_under_button ( self . emoticons_menu ,
2006-04-17 23:59:04 +02:00
button , parent_win )
2007-12-12 09:44:46 +01:00
2006-04-05 11:55:22 +02:00
def prepare_emoticons_menu ( self ) :
menu = gtk . Menu ( )
def emoticon_clicked ( w , str_ ) :
if self . emoticon_menuitem_clicked :
self . emoticon_menuitem_clicked ( str_ )
2006-04-17 23:59:04 +02:00
# don't keep reference to CB of object
# this will prevent making it uncollectable
self . emoticon_menuitem_clicked = None
def selection_done ( widget ) :
# remove reference to CB of object, which will
# make it uncollectable
self . emoticon_menuitem_clicked = None
2006-04-05 11:55:22 +02:00
counter = 0
# Calculate the side lenght of the popup to make it a square
2007-02-07 09:49:13 +01:00
size = int ( round ( math . sqrt ( len ( self . emoticons_images ) ) ) )
for image in self . emoticons_images :
2006-04-05 11:55:22 +02:00
item = gtk . MenuItem ( )
img = gtk . Image ( )
if type ( image [ 1 ] ) == gtk . gdk . PixbufAnimation :
img . set_from_animation ( image [ 1 ] )
else :
img . set_from_pixbuf ( image [ 1 ] )
item . add ( img )
item . connect ( ' activate ' , emoticon_clicked , image [ 0 ] )
#FIXME: add tooltip with ascii
menu . attach ( item , counter % size , counter % size + 1 ,
counter / size , counter / size + 1 )
counter + = 1
2006-04-17 23:59:04 +02:00
menu . connect ( ' selection-done ' , selection_done )
2006-04-05 11:55:22 +02:00
menu . show_all ( )
return menu
2008-04-16 00:04:39 +02:00
def _init_emoticons ( self , path , need_reload = False ) :
2005-11-15 12:52:40 +01:00
#initialize emoticons dictionary and unique images list
self . emoticons_images = list ( )
2005-04-06 20:51:54 +02:00
self . emoticons = dict ( )
2007-02-07 13:13:41 +01:00
self . emoticons_animations = dict ( )
2006-03-17 00:37:06 +01:00
sys . path . append ( path )
2006-11-18 21:52:28 +01:00
import emoticons
if need_reload :
# we need to reload else that doesn't work when changing emoticon set
2007-12-12 09:44:46 +01:00
reload ( emoticons )
2006-11-18 21:52:28 +01:00
emots = emoticons . emoticons
2008-03-11 00:26:04 +01:00
for emot_filename in emots :
emot_file = os . path . join ( path , emot_filename )
2005-04-06 20:51:54 +02:00
if not self . image_is_ok ( emot_file ) :
continue
2008-03-11 00:26:04 +01:00
for emot in emots [ emot_filename ] :
emot = emot . decode ( ' utf-8 ' )
# This avoids duplicated emoticons with the same image eg. :) and :-)
if not emot_file in self . emoticons . values ( ) :
if emot_file . endswith ( ' .gif ' ) :
pix = gtk . gdk . PixbufAnimation ( emot_file )
else :
pix = gtk . gdk . pixbuf_new_from_file ( emot_file )
self . emoticons_images . append ( ( emot , pix ) )
self . emoticons [ emot . upper ( ) ] = emot_file
2006-11-18 21:52:28 +01:00
del emoticons
2008-04-16 00:04:39 +02:00
sys . path . remove ( path )
def init_emoticons ( self , need_reload = False ) :
emot_theme = gajim . config . get ( ' emoticons_theme ' )
if not emot_theme :
return
path = os . path . join ( gajim . DATA_DIR , ' emoticons ' , emot_theme )
if not os . path . exists ( path ) :
# It's maybe a user theme
path = os . path . join ( gajim . MY_EMOTS_PATH , emot_theme )
if not os . path . exists ( path ) : # theme doesn't exist, disable emoticons
dialogs . WarningDialog ( _ ( ' Emoticons disabled ' ) ,
_ ( ' Your configured emoticons theme has not been found, so emoticons have been disabled. ' ) )
gajim . config . set ( ' emoticons_theme ' , ' ' )
return
self . _init_emoticons ( path , need_reload )
2008-03-14 13:37:02 +01:00
if len ( self . emoticons ) == 0 :
2008-04-16 00:04:39 +02:00
# maybe old format of emoticons file, try to convert it
try :
import pprint
import emoticons
emots = emoticons . emoticons
fd = open ( os . path . join ( path , ' emoticons.py ' ) , ' w ' )
fd . write ( ' emoticons = ' )
pprint . pprint ( dict ( [ ( file , [ i for i in emots . keys ( ) if emots [ i ] == \
file ] ) for file in set ( emots . values ( ) ) ] ) , fd )
fd . close ( )
del emoticons
self . _init_emoticons ( path , need_reload = True )
except :
pass
if len ( self . emoticons ) == 0 :
dialogs . WarningDialog ( _ ( ' Emoticons disabled ' ) ,
_ ( ' Your configured emoticons theme cannot been loaded. You maybe need to update the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons for more details. ' ) )
2006-04-05 11:55:22 +02:00
if self . emoticons_menu :
2006-04-07 13:09:11 +02:00
self . emoticons_menu . destroy ( )
2006-04-05 11:55:22 +02:00
self . emoticons_menu = self . prepare_emoticons_menu ( )
2007-12-12 09:44:46 +01:00
2008-06-21 21:12:58 +02:00
################################################################################
2008-04-20 20:14:04 +02:00
### Methods for opening new messages controls
################################################################################
def join_gc_room ( self , account , room_jid , nick , password , minimize = False ,
2008-07-19 19:36:21 +02:00
is_continued = False ) :
2008-04-20 20:14:04 +02:00
''' joins the room immediately '''
2008-06-01 10:44:03 +02:00
if not nick :
nick = gajim . nicks [ account ]
2008-07-19 19:36:21 +02:00
2008-04-20 20:14:04 +02:00
if self . msg_win_mgr . has_window ( room_jid , account ) and \
2008-07-19 19:36:21 +02:00
gajim . gc_connected [ account ] [ room_jid ] :
2008-05-13 03:59:10 +02:00
gc_ctrl = self . msg_win_mgr . get_gc_control ( room_jid , account )
win = gc_ctrl . parent_win
win . set_active_tab ( gc_ctrl )
2008-04-20 20:14:04 +02:00
dialogs . ErrorDialog ( _ ( ' You are already in group chat %s ' ) % room_jid )
return
2008-07-19 19:36:21 +02:00
2008-04-20 20:14:04 +02:00
invisible_show = gajim . SHOW_LIST . index ( ' invisible ' )
if gajim . connections [ account ] . connected == invisible_show :
dialogs . ErrorDialog (
_ ( ' You cannot join a group chat while you are invisible ' ) )
return
2008-07-19 19:36:21 +02:00
minimized_control_exists = False
if room_jid in gajim . interface . minimized_controls [ account ] :
minimized_control_exists = True
2008-04-20 20:14:04 +02:00
if not minimized_control_exists and \
2008-07-19 19:36:21 +02:00
not self . msg_win_mgr . has_window ( room_jid , account ) :
# Join new groupchat
if minimize :
contact = gajim . contacts . create_contact ( jid = room_jid , name = nick )
gc_control = GroupchatControl ( None , contact , account )
gajim . interface . minimized_controls [ account ] [ room_jid ] = gc_control
self . roster . add_groupchat ( room_jid , account )
else :
self . new_room ( room_jid , nick , account , is_continued = is_continued )
elif not minimized_control_exists :
# We are already in that groupchat
2008-05-13 03:59:10 +02:00
gc_control = self . msg_win_mgr . get_gc_control ( room_jid , account )
2008-07-19 19:36:21 +02:00
gc_control . parent_win . set_active_tab ( gc_control )
else :
# We are already in this groupchat and it is minimized
self . roster . add_groupchat ( room_jid , account )
# Connect
2008-04-20 20:14:04 +02:00
gajim . connections [ account ] . join_gc ( nick , room_jid , password )
if password :
gajim . gc_passwords [ room_jid ] = password
def new_room ( self , room_jid , nick , account , is_continued = False ) :
# Get target window, create a control, and associate it with the window
2008-07-05 21:04:27 +02:00
contact = gajim . contacts . create_contact ( jid = room_jid , name = nick )
2008-04-20 20:14:04 +02:00
mw = self . msg_win_mgr . get_window ( contact . jid , account )
if not mw :
mw = self . msg_win_mgr . create_window ( contact , account ,
GroupchatControl . TYPE_ID )
gc_control = GroupchatControl ( mw , contact , account ,
is_continued = is_continued )
mw . new_tab ( gc_control )
2008-08-12 10:17:02 +02:00
def new_private_chat ( self , gc_contact , account , session = None ) :
2008-04-20 20:14:04 +02:00
contact = gajim . contacts . contact_from_gc_contact ( gc_contact )
type_ = message_control . TYPE_PM
fjid = gc_contact . room_jid + ' / ' + gc_contact . name
2008-05-13 03:59:10 +02:00
conn = gajim . connections [ account ]
if not session and fjid in conn . sessions :
sessions = filter ( lambda s : isinstance ( s , ChatControlSession ) ,
conn . sessions [ fjid ] . values ( ) )
# look for an existing session with a chat control
for s in sessions :
if s . control :
session = s
break
if not session and not len ( sessions ) == 0 :
# there are no sessions with chat controls, just take the first one
session = sessions [ 0 ]
if not session :
# couldn't find an existing ChatControlSession, just make a new one
session = conn . make_new_session ( fjid , None , ' pm ' )
if not session . control :
mw = self . msg_win_mgr . get_window ( fjid , account )
if not mw :
mw = self . msg_win_mgr . create_window ( contact , account , type_ )
session . control = PrivateChatControl ( mw , gc_contact , contact , account ,
session )
mw . new_tab ( session . control )
2008-04-20 20:14:04 +02:00
if len ( gajim . events . get_events ( account , fjid ) ) :
# We call this here to avoid race conditions with widget validation
2008-05-13 03:59:10 +02:00
session . control . read_queue ( )
2008-04-20 20:14:04 +02:00
2008-06-14 10:43:20 +02:00
return session . control
2008-08-12 10:17:02 +02:00
def new_chat ( self , contact , account , resource = None , session = None ) :
2008-04-20 20:14:04 +02:00
# Get target window, create a control, and associate it with the window
type_ = message_control . TYPE_CHAT
fjid = contact . jid
if resource :
fjid + = ' / ' + resource
mw = self . msg_win_mgr . get_window ( fjid , account )
if not mw :
2008-08-12 10:53:09 +02:00
mw = self . msg_win_mgr . create_window ( contact , account , type_ , resource )
2008-04-20 20:14:04 +02:00
chat_control = ChatControl ( mw , contact , account , session , resource )
mw . new_tab ( chat_control )
2008-05-11 15:17:28 +02:00
if len ( gajim . events . get_events ( account , fjid ) ) :
# We call this here to avoid race conditions with widget validation
chat_control . read_queue ( )
2008-04-20 20:14:04 +02:00
2008-05-13 03:59:10 +02:00
return chat_control
2008-04-20 20:14:04 +02:00
def new_chat_from_jid ( self , account , fjid ) :
jid , resource = gajim . get_room_and_nick_from_fjid ( fjid )
contact = gajim . contacts . get_contact ( account , jid , resource )
added_to_roster = False
if not contact :
added_to_roster = True
contact = self . roster . add_to_not_in_the_roster ( account , jid ,
2008-05-13 03:59:10 +02:00
resource = resource )
2008-06-27 01:36:58 +02:00
ctrl = self . msg_win_mgr . get_control ( fjid , account )
if not ctrl :
2008-06-18 06:11:11 +02:00
ctrl = self . new_chat ( contact , account ,
resource = resource )
2008-05-13 03:59:10 +02:00
if len ( gajim . events . get_events ( account , fjid ) ) :
2008-06-18 06:11:11 +02:00
ctrl . read_queue ( )
2008-05-13 03:59:10 +02:00
2008-06-18 06:11:11 +02:00
mw = ctrl . parent_win
mw . set_active_tab ( ctrl )
2008-04-20 20:14:04 +02:00
# For JEP-0172
if added_to_roster :
2008-06-18 06:11:11 +02:00
ctrl . user_nick = gajim . nicks [ account ]
2008-05-13 03:59:10 +02:00
def on_open_chat_window ( self , widget , contact , account , resource = None ,
session = None ) :
2008-04-20 20:14:04 +02:00
# Get the window containing the chat
fjid = contact . jid
2008-05-13 03:59:10 +02:00
2008-04-20 20:14:04 +02:00
if resource :
fjid + = ' / ' + resource
2008-05-13 03:59:10 +02:00
2008-06-03 01:26:40 +02:00
ctrl = None
2008-05-13 03:59:10 +02:00
2008-06-03 01:26:40 +02:00
if session :
ctrl = session . control
2008-06-03 01:26:32 +02:00
else :
win = self . msg_win_mgr . get_window ( fjid , account )
2008-06-03 01:26:40 +02:00
if win :
2008-06-27 01:37:12 +02:00
ctrl = win . get_control ( fjid , account )
2008-06-03 01:26:40 +02:00
if not ctrl :
2008-08-12 10:17:02 +02:00
ctrl = self . new_chat ( contact , account , resource = resource ,
session = session )
2008-04-20 20:14:04 +02:00
# last message is long time ago
2008-06-03 01:26:32 +02:00
gajim . last_message_time [ account ] [ ctrl . get_full_jid ( ) ] = 0
2008-05-13 03:59:10 +02:00
2008-06-03 01:26:40 +02:00
win = ctrl . parent_win
2008-06-03 01:26:32 +02:00
win . set_active_tab ( ctrl )
2008-05-13 03:59:10 +02:00
2008-06-03 01:26:32 +02:00
if gajim . connections [ account ] . is_zeroconf and \
2008-06-27 01:37:12 +02:00
gajim . connections [ account ] . status in ( ' offline ' , ' invisible ' ) :
ctrl = win . get_control ( fjid , account )
if ctrl :
2008-05-13 03:59:10 +02:00
ctrl . got_disconnected ( )
2008-04-20 20:14:04 +02:00
################################################################################
### Other Methods
################################################################################
def read_sleepy ( self ) :
''' Check idle status and change that status if needed '''
if not self . sleeper . poll ( ) :
# idle detection is not supported in that OS
return False # stop looping in vain
state = self . sleeper . getState ( )
for account in gajim . connections :
if not gajim . sleeper_state . has_key ( account ) or \
not gajim . sleeper_state [ account ] :
continue
if state == common . sleepy . STATE_AWAKE and \
gajim . sleeper_state [ account ] in ( ' autoaway ' , ' autoxa ' ) :
# we go online
self . roster . send_status ( account , ' online ' ,
gajim . status_before_autoaway [ account ] )
gajim . status_before_autoaway [ account ] = ' '
gajim . sleeper_state [ account ] = ' online '
elif state == common . sleepy . STATE_AWAY and \
gajim . sleeper_state [ account ] == ' online ' and \
gajim . config . get ( ' autoaway ' ) :
# we save out online status
gajim . status_before_autoaway [ account ] = \
gajim . connections [ account ] . status
# we go away (no auto status) [we pass True to auto param]
auto_message = gajim . config . get ( ' autoaway_message ' )
if not auto_message :
auto_message = gajim . connections [ account ] . status
else :
auto_message = auto_message . replace ( ' $S ' , ' %(status)s ' )
auto_message = auto_message . replace ( ' $T ' , ' %(time)s ' )
auto_message = auto_message % {
' status ' : gajim . status_before_autoaway [ account ] ,
' time ' : gajim . config . get ( ' autoawaytime ' )
}
self . roster . send_status ( account , ' away ' , auto_message , auto = True )
gajim . sleeper_state [ account ] = ' autoaway '
elif state == common . sleepy . STATE_XA and ( \
gajim . sleeper_state [ account ] == ' autoaway ' or \
gajim . sleeper_state [ account ] == ' online ' ) and \
gajim . config . get ( ' autoxa ' ) :
# we go extended away [we pass True to auto param]
auto_message = gajim . config . get ( ' autoxa_message ' )
if not auto_message :
auto_message = gajim . connections [ account ] . status
else :
auto_message = auto_message . replace ( ' $S ' , ' %(status)s ' )
auto_message = auto_message . replace ( ' $T ' , ' %(time)s ' )
auto_message = auto_message % {
' status ' : gajim . status_before_autoaway [ account ] ,
' time ' : gajim . config . get ( ' autoxatime ' )
}
self . roster . send_status ( account , ' xa ' , auto_message , auto = True )
gajim . sleeper_state [ account ] = ' autoxa '
return True # renew timeout (loop for ever)
def autoconnect ( self ) :
''' auto connect at startup '''
# dict of account that want to connect sorted by status
2008-07-29 08:42:34 +02:00
shows = { }
2008-04-20 20:14:04 +02:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2008-07-29 08:42:34 +02:00
if gajim . config . get_per ( ' accounts ' , a , ' restore_last_status ' ) :
self . roster . send_status ( a , gajim . config . get_per ( ' accounts ' , a ,
' last_status ' ) , helpers . from_one_line ( gajim . config . get_per (
' accounts ' , a , ' last_status_msg ' ) ) )
continue
show = gajim . config . get_per ( ' accounts ' , a , ' autoconnect_as ' )
if not show in gajim . SHOW_LIST :
continue
if not show in shows :
shows [ show ] = [ a ]
2008-07-28 18:36:17 +02:00
else :
2008-07-29 08:42:34 +02:00
shows [ show ] . append ( a )
2008-08-04 15:48:36 +02:00
def on_message ( message ) :
2008-07-29 08:42:34 +02:00
if message is None :
2008-08-04 15:48:36 +02:00
return
2008-07-29 08:42:34 +02:00
for a in shows [ show ] :
self . roster . send_status ( a , show , message )
2008-08-04 15:48:36 +02:00
for show in shows :
message = self . roster . get_status_message ( show , on_message )
2008-04-20 20:14:04 +02:00
return False
def show_systray ( self ) :
self . systray_enabled = True
self . systray . show_icon ( )
def hide_systray ( self ) :
self . systray_enabled = False
self . systray . hide_icon ( )
def on_launch_browser_mailer ( self , widget , url , kind ) :
helpers . launch_browser_mailer ( kind , url )
2005-08-09 20:45:16 +02:00
2005-04-14 13:06:58 +02:00
def process_connections ( self ) :
2006-02-06 01:11:45 +01:00
''' called each foo (200) miliseconds. Check for idlequeue timeouts.
2006-02-03 13:17:34 +01:00
'''
2008-07-16 04:37:57 +02:00
try :
gajim . idlequeue . process ( )
except :
# Otherwise, an exception will stop our loop
if os . name == ' nt ' :
gobject . timeout_add ( 200 ,
self . process_connections )
else :
gobject . timeout_add_seconds ( 2 ,
self . process_connections )
raise
2005-12-01 19:03:05 +01:00
return True # renew timeout (loop for ever)
2005-04-14 13:06:58 +02:00
2005-04-16 19:03:21 +02:00
def save_config ( self ) :
2005-11-22 11:56:25 +01:00
err_str = parser . write ( )
if err_str is not None :
print >> sys . stderr , err_str
2005-08-23 11:32:44 +02:00
# it is good to notify the user
2005-11-12 15:17:27 +01:00
# in case he or she cannot see the output of the console
2005-11-22 11:56:25 +01:00
dialogs . ErrorDialog ( _ ( ' Could not save your settings and preferences ' ) ,
2006-04-02 18:11:21 +02:00
err_str )
2005-12-01 19:03:05 +01:00
sys . exit ( )
2005-04-16 19:03:21 +02:00
2008-04-20 20:14:04 +02:00
def save_avatar_files ( self , jid , photo , puny_nick = None , local = False ) :
''' Saves an avatar to a separate file, and generate files for dbus notifications. An avatar can be given as a pixmap directly or as an decoded image. '''
puny_jid = helpers . sanitize_filename ( jid )
path_to_file = os . path . join ( gajim . AVATAR_PATH , puny_jid )
if puny_nick :
path_to_file = os . path . join ( path_to_file , puny_nick )
# remove old avatars
for typ in ( ' jpeg ' , ' png ' ) :
if local :
path_to_original_file = path_to_file + ' _local ' + ' . ' + typ
2006-01-17 21:23:36 +01:00
else :
2008-04-20 20:14:04 +02:00
path_to_original_file = path_to_file + ' . ' + typ
if os . path . isfile ( path_to_original_file ) :
os . remove ( path_to_original_file )
if local and photo :
pixbuf = photo
type = ' png '
extension = ' _local.png ' # save local avatars as png file
else :
pixbuf , typ = gtkgui_helpers . get_pixbuf_from_data ( photo , want_type = True )
if pixbuf is None :
return
extension = ' . ' + typ
if typ not in ( ' jpeg ' , ' png ' ) :
gajim . log . debug ( ' gtkpixbuf cannot save other than jpeg and png formats. saving %s \' avatar as png file (originaly %s ) ' % ( jid , typ ) )
typ = ' png '
extension = ' .png '
path_to_original_file = path_to_file + extension
pixbuf . save ( path_to_original_file , typ )
# Generate and save the resized, color avatar
pixbuf = gtkgui_helpers . get_scaled_pixbuf ( pixbuf , ' notification ' )
if pixbuf :
path_to_normal_file = path_to_file + ' _notif_size_colored ' + extension
pixbuf . save ( path_to_normal_file , ' png ' )
# Generate and save the resized, black and white avatar
bwbuf = gtkgui_helpers . get_scaled_pixbuf (
gtkgui_helpers . make_pixbuf_grayscale ( pixbuf ) , ' notification ' )
if bwbuf :
path_to_bw_file = path_to_file + ' _notif_size_bw ' + extension
bwbuf . save ( path_to_bw_file , ' png ' )
def remove_avatar_files ( self , jid , puny_nick = None , local = False ) :
''' remove avatar files of a jid '''
puny_jid = helpers . sanitize_filename ( jid )
path_to_file = os . path . join ( gajim . AVATAR_PATH , puny_jid )
if puny_nick :
path_to_file = os . path . join ( path_to_file , puny_nick )
for ext in ( ' .jpeg ' , ' .png ' ) :
if local :
ext = ' _local ' + ext
path_to_original_file = path_to_file + ext
if os . path . isfile ( path_to_file + ext ) :
os . remove ( path_to_file + ext )
if os . path . isfile ( path_to_file + ' _notif_size_colored ' + ext ) :
os . remove ( path_to_file + ' _notif_size_colored ' + ext )
if os . path . isfile ( path_to_file + ' _notif_size_bw ' + ext ) :
os . remove ( path_to_file + ' _notif_size_bw ' + ext )
2005-12-11 11:31:42 +01:00
2008-04-20 21:45:09 +02:00
def auto_join_bookmarks ( self , account ) :
''' autojoin bookmarked GCs that have ' auto join ' on for this account '''
for bm in gajim . connections [ account ] . bookmarks :
if bm [ ' autojoin ' ] in ( ' 1 ' , ' true ' ) :
jid = bm [ ' jid ' ]
2008-05-30 12:26:33 +02:00
# Only join non-opened groupchats. Opened one are already
# auto-joined on re-connection
2008-07-19 19:36:21 +02:00
if not jid in gajim . gc_connected [ account ] :
2008-04-20 21:45:09 +02:00
# we are not already connected
minimize = bm [ ' minimize ' ] in ( ' 1 ' , ' true ' )
gajim . interface . join_gc_room ( account , jid , bm [ ' nick ' ] ,
bm [ ' password ' ] , minimize = minimize )
2008-07-19 19:36:21 +02:00
elif jid in self . minimized_controls [ account ] :
# more or less a hack:
# On disconnect the minimized gc contact instances
# were set to offline. Reconnect them to show up in the roster.
self . roster . add_groupchat ( jid , account )
2008-04-20 21:45:09 +02:00
def add_gc_bookmark ( self , account , name , jid , autojoin , minimize , password ,
nick ) :
''' add a bookmark for this account, sorted in bookmark list '''
bm = {
' name ' : name ,
' jid ' : jid ,
' autojoin ' : autojoin ,
' minimize ' : minimize ,
' password ' : password ,
' nick ' : nick
}
2008-05-13 03:59:10 +02:00
place_found = False
2008-04-20 21:45:09 +02:00
index = 0
# check for duplicate entry and respect alpha order
for bookmark in gajim . connections [ account ] . bookmarks :
if bookmark [ ' jid ' ] == bm [ ' jid ' ] :
dialogs . ErrorDialog (
_ ( ' Bookmark already set ' ) ,
_ ( ' Group Chat " %s " is already in your bookmarks. ' ) % bm [ ' jid ' ] )
return
if bookmark [ ' name ' ] > bm [ ' name ' ] :
place_found = True
break
index + = 1
if place_found :
gajim . connections [ account ] . bookmarks . insert ( index , bm )
else :
gajim . connections [ account ] . bookmarks . append ( bm )
gajim . connections [ account ] . store_bookmarks ( )
self . roster . set_actions_menu_needs_rebuild ( )
dialogs . InformationDialog (
_ ( ' Bookmark has been added successfully ' ) ,
_ ( ' You can manage your bookmarks via Actions menu in your roster. ' ) )
2008-05-13 03:59:10 +02:00
# does JID exist only within a groupchat?
def is_pm_contact ( self , fjid , account ) :
bare_jid = gajim . get_jid_without_resource ( fjid )
gc_ctrl = self . msg_win_mgr . get_gc_control ( bare_jid , account )
if not gc_ctrl and \
bare_jid in self . minimized_controls [ account ] :
gc_ctrl = self . minimized_controls [ account ] [ bare_jid ]
return gc_ctrl and gc_ctrl . type_id == message_control . TYPE_GC
2008-04-14 17:19:09 +02:00
def create_ipython_window ( self ) :
try :
from ipython_view import IPythonView
except ImportError :
print ' ipython_view not found '
return
import pango
if os . name == ' nt ' :
font = ' Lucida Console 9 '
else :
font = ' Luxi Mono 10 '
window = gtk . Window ( )
window . set_size_request ( 750 , 550 )
window . set_resizable ( True )
sw = gtk . ScrolledWindow ( )
sw . set_policy ( gtk . POLICY_AUTOMATIC , gtk . POLICY_AUTOMATIC )
view = IPythonView ( )
view . modify_font ( pango . FontDescription ( font ) )
view . set_wrap_mode ( gtk . WRAP_CHAR )
sw . add ( view )
window . add ( sw )
window . show_all ( )
2008-04-15 20:09:04 +02:00
def on_delete ( win , event ) :
win . hide ( )
2008-04-14 17:19:09 +02:00
return True
2008-04-15 20:09:04 +02:00
window . connect ( ' delete_event ' , on_delete )
2008-04-14 17:19:09 +02:00
view . updateNamespace ( { ' gajim ' : gajim } )
gajim . ipython_window = window
2005-04-12 23:09:06 +02:00
def __init__ ( self ) :
2005-10-20 13:17:17 +02:00
gajim . interface = self
2005-12-31 07:27:22 +01:00
# This is the manager and factory of message windows set by the module
self . msg_win_mgr = None
2008-04-17 16:17:14 +02:00
self . jabber_state_images = { ' 16 ' : { } , ' 32 ' : { } , ' opened ' : { } ,
' closed ' : { } }
2006-04-05 11:55:22 +02:00
self . emoticons_menu = None
# handler when an emoticon is clicked in emoticons_menu
self . emoticon_menuitem_clicked = None
2007-06-03 12:04:20 +02:00
self . minimized_controls = { }
2007-08-09 17:39:18 +02:00
self . status_sent_to_users = { }
self . status_sent_to_groups = { }
2007-12-12 09:44:46 +01:00
self . gpg_passphrase = { }
2007-12-28 11:20:41 +01:00
self . gpg_dialog = None
2007-02-11 03:35:02 +01:00
self . default_colors = {
2005-04-29 11:47:09 +02:00
' inmsgcolor ' : gajim . config . get ( ' inmsgcolor ' ) ,
' outmsgcolor ' : gajim . config . get ( ' outmsgcolor ' ) ,
' statusmsgcolor ' : gajim . config . get ( ' statusmsgcolor ' ) ,
2005-12-26 00:48:08 +01:00
' urlmsgcolor ' : gajim . config . get ( ' urlmsgcolor ' ) ,
2005-04-29 11:47:09 +02:00
}
2005-10-03 18:14:41 +02:00
2007-12-12 09:44:46 +01:00
cfg_was_read = parser . read ( )
2005-06-13 18:53:23 +02:00
# Do not set gajim.verbose to False if -v option was given
if gajim . config . get ( ' verbose ' ) :
gajim . verbose = True
2007-01-05 18:20:58 +01:00
# Is Gajim default app?
if os . name != ' nt ' and gajim . config . get ( ' check_if_gajim_is_default ' ) :
gtkgui_helpers . possibly_set_gajim_as_xmpp_handler ( )
2008-06-02 23:22:35 +02:00
for account in gajim . config . get_per ( ' accounts ' ) :
if gajim . config . get_per ( ' accounts ' , account , ' is_zeroconf ' ) :
gajim . ZEROCONF_ACC_NAME = account
break
2007-06-03 12:04:20 +02:00
# Is gnome configured to activate row on single click ?
try :
import gconf
client = gconf . client_get_default ( )
click_policy = client . get_string (
' /apps/nautilus/preferences/click_policy ' )
if click_policy == ' single ' :
gajim . single_click = True
except :
pass
# add default status messages if there is not in the config file
2005-06-01 22:03:37 +02:00
if len ( gajim . config . get_per ( ' statusmsg ' ) ) == 0 :
for msg in gajim . config . statusmsg_default :
gajim . config . add_per ( ' statusmsg ' , msg )
2007-12-12 09:44:46 +01:00
gajim . config . set_per ( ' statusmsg ' , msg , ' message ' ,
2005-12-01 19:03:05 +01:00
gajim . config . statusmsg_default [ msg ] )
2005-06-14 00:11:09 +02:00
#add default themes if there is not in the config file
2005-09-02 16:03:00 +02:00
theme = gajim . config . get ( ' roster_theme ' )
if not theme in gajim . config . get_per ( ' themes ' ) :
2007-08-09 17:39:18 +02:00
gajim . config . set ( ' roster_theme ' , _ ( ' default ' ) )
2005-06-14 00:11:09 +02:00
if len ( gajim . config . get_per ( ' themes ' ) ) == 0 :
2005-12-01 19:03:05 +01:00
d = [ ' accounttextcolor ' , ' accountbgcolor ' , ' accountfont ' ,
' accountfontattrs ' , ' grouptextcolor ' , ' groupbgcolor ' , ' groupfont ' ,
2007-12-12 09:44:46 +01:00
' groupfontattrs ' , ' contacttextcolor ' , ' contactbgcolor ' ,
2005-12-01 19:03:05 +01:00
' contactfont ' , ' contactfontattrs ' , ' bannertextcolor ' ,
' bannerbgcolor ' ]
2007-12-12 09:44:46 +01:00
2005-06-14 00:11:09 +02:00
default = gajim . config . themes_default
2005-08-12 02:08:04 +02:00
for theme_name in default :
gajim . config . add_per ( ' themes ' , theme_name )
theme = default [ theme_name ]
2005-06-14 00:11:09 +02:00
for o in d :
2005-08-12 02:08:04 +02:00
gajim . config . set_per ( ' themes ' , theme_name , o ,
theme [ d . index ( o ) ] )
2007-12-12 09:44:46 +01:00
if gajim . config . get ( ' autodetect_browser_mailer ' ) or not cfg_was_read :
2005-08-05 01:11:55 +02:00
gtkgui_helpers . autodetect_browser_mailer ( )
2005-07-25 16:38:21 +02:00
2005-05-28 20:20:27 +02:00
if gajim . verbose :
2005-05-18 11:17:41 +02:00
gajim . log . setLevel ( gajim . logging . DEBUG )
2005-05-18 09:38:47 +02:00
else :
gajim . log . setLevel ( None )
2007-12-12 09:44:46 +01:00
2007-01-17 00:26:38 +01:00
# pygtk2.8+ on win, breaks io_add_watch.
# We use good old select.select()
if os . name == ' nt ' :
2006-02-03 23:54:05 +01:00
gajim . idlequeue = idlequeue . SelectIdleQueue ( )
else :
# in a nongui implementation, just call:
# gajim.idlequeue = IdleQueue() , and
# gajim.idlequeue.process() each foo miliseconds
gajim . idlequeue = GlibIdleQueue ( )
2006-02-03 13:17:34 +01:00
# resolve and keep current record of resolved hosts
gajim . resolver = nslookup . Resolver ( gajim . idlequeue )
2006-02-06 01:11:45 +01:00
gajim . socks5queue = socks5 . SocksQueue ( gajim . idlequeue ,
2007-12-12 09:44:46 +01:00
self . handle_event_file_rcv_completed ,
2006-02-06 01:11:45 +01:00
self . handle_event_file_progress )
2006-03-19 21:43:30 +01:00
gajim . proxy65_manager = proxy65_manager . Proxy65Manager ( gajim . idlequeue )
2005-11-10 11:16:25 +01:00
self . register_handlers ( )
2006-11-18 21:52:28 +01:00
if gajim . config . get ( ' enable_zeroconf ' ) :
gajim . connections [ gajim . ZEROCONF_ACC_NAME ] = common . zeroconf . connection_zeroconf . ConnectionZeroconf ( gajim . ZEROCONF_ACC_NAME )
2005-04-29 11:47:09 +02:00
for account in gajim . config . get_per ( ' accounts ' ) :
2006-11-18 21:52:28 +01:00
if not gajim . config . get_per ( ' accounts ' , account , ' is_zeroconf ' ) :
gajim . connections [ account ] = common . connection . Connection ( account )
# gtk hooks
2005-09-11 15:56:38 +02:00
gtk . about_dialog_set_email_hook ( self . on_launch_browser_mailer , ' mail ' )
gtk . about_dialog_set_url_hook ( self . on_launch_browser_mailer , ' url ' )
2006-11-18 21:52:28 +01:00
if gtk . pygtk_version > = ( 2 , 10 , 0 ) and gtk . gtk_version > = ( 2 , 10 , 0 ) :
gtk . link_button_set_uri_hook ( self . on_launch_browser_mailer , ' url ' )
2007-12-12 09:44:46 +01:00
self . instances = { }
2005-04-12 23:09:06 +02:00
for a in gajim . connections :
2007-06-03 12:04:20 +02:00
self . instances [ a ] = { ' infos ' : { } , ' disco ' : { } , ' gc_config ' : { } ,
' search ' : { } }
2007-08-09 17:39:18 +02:00
self . minimized_controls [ a ] = { }
Merged in trunk updates, including meta_contacts
Merged revisions 4951,4962-4969 via svnmerge from
svn://svn.gajim.org/gajim/trunk
........
r4951 | nk | 2005-12-30 16:50:36 -0700 (Fri, 30 Dec 2005) | 1 line
fixes in greek transl
........
r4962 | asterix | 2006-01-01 11:41:04 -0700 (Sun, 01 Jan 2006) | 2 lines
merge meta_contacts branch with trunk. Meta contacts are not in gajim yet, but framework is here. We now use gajim.contacts.many_functions() to handle contacts and groupchat_contacts.
........
r4963 | asterix | 2006-01-01 11:43:24 -0700 (Sun, 01 Jan 2006) | 2 lines
correct contacts file
........
r4964 | asterix | 2006-01-01 11:47:26 -0700 (Sun, 01 Jan 2006) | 2 lines
dict.remove() doesn't exists, it's del dict[]
........
r4965 | asterix | 2006-01-01 11:50:15 -0700 (Sun, 01 Jan 2006) | 2 lines
some missing commits from branch
........
r4966 | asterix | 2006-01-01 11:53:30 -0700 (Sun, 01 Jan 2006) | 2 lines
end of gc_contact.nick -> gc_contact.name
........
r4967 | asterix | 2006-01-01 12:05:59 -0700 (Sun, 01 Jan 2006) | 2 lines
new ACE option: send_sha_in_gc_presence that allow to send sha info in groupchat presences
........
r4968 | asterix | 2006-01-01 12:12:36 -0700 (Sun, 01 Jan 2006) | 2 lines
0.9.1-2 in debian that solve the group bug (commit [4924])
........
r4969 | asterix | 2006-01-01 12:31:13 -0700 (Sun, 01 Jan 2006) | 2 lines
typo
........
2006-01-01 21:06:26 +01:00
gajim . contacts . add_account ( a )
2005-07-18 23:08:31 +02:00
gajim . groups [ a ] = { }
2005-08-03 11:23:36 +02:00
gajim . gc_connected [ a ] = { }
2006-09-13 18:47:58 +02:00
gajim . automatic_rooms [ a ] = { }
2005-07-18 23:08:31 +02:00
gajim . newly_added [ a ] = [ ]
gajim . to_be_removed [ a ] = [ ]
gajim . nicks [ a ] = gajim . config . get_per ( ' accounts ' , a , ' name ' )
2006-03-28 01:32:39 +02:00
gajim . block_signed_in_notifications [ a ] = True
2005-07-18 23:08:31 +02:00
gajim . sleeper_state [ a ] = 0
2005-07-02 13:06:02 +02:00
gajim . encrypted_chats [ a ] = [ ]
2005-07-03 17:27:41 +02:00
gajim . last_message_time [ a ] = { }
2005-07-22 23:27:04 +02:00
gajim . status_before_autoaway [ a ] = ' '
2007-01-02 12:43:57 +01:00
gajim . transport_avatar [ a ] = { }
2008-05-27 12:24:29 +02:00
gajim . gajim_optional_features [ a ] = [ ]
gajim . caps_hash [ a ] = ' '
2005-04-12 17:30:09 +02:00
2008-05-30 23:43:53 +02:00
helpers . update_optional_features ( )
2005-11-19 22:45:34 +01:00
if gajim . config . get ( ' remote_control ' ) :
2005-11-19 23:01:10 +01:00
try :
import remote_control
self . remote_ctrl = remote_control . Remote ( )
2005-12-10 13:28:56 +01:00
except :
2005-11-19 23:01:10 +01:00
self . remote_ctrl = None
2005-07-17 23:41:54 +02:00
else :
2005-11-19 23:01:10 +01:00
self . remote_ctrl = None
2005-07-21 10:05:10 +02:00
2006-11-18 21:52:28 +01:00
if gajim . config . get ( ' networkmanager_support ' ) and dbus_support . supported :
2007-08-09 17:39:18 +02:00
import network_manager_listener
if not network_manager_listener . supported :
2006-11-18 21:52:28 +01:00
print >> sys . stderr , _ ( ' Network Manager support not available ' )
2007-08-09 17:39:18 +02:00
# Handle gnome screensaver
if dbus_support . supported :
def gnome_screensaver_ActiveChanged_cb ( active ) :
if not active :
return
2008-04-10 16:47:12 +02:00
if not gajim . config . get ( ' autoaway ' ) :
# Don't go auto away if user disabled the option
return
2007-08-09 17:39:18 +02:00
for account in gajim . connections :
if not gajim . sleeper_state . has_key ( account ) or \
not gajim . sleeper_state [ account ] :
continue
if gajim . sleeper_state [ account ] == ' online ' :
# we save out online status
gajim . status_before_autoaway [ account ] = \
gajim . connections [ account ] . status
# we go away (no auto status) [we pass True to auto param]
auto_message = gajim . config . get ( ' autoaway_message ' )
if not auto_message :
auto_message = gajim . connections [ account ] . status
self . roster . send_status ( account , ' away ' , auto_message ,
auto = True )
gajim . sleeper_state [ account ] = ' autoaway '
2007-12-12 09:44:46 +01:00
try :
bus = dbus . SessionBus ( )
bus . add_signal_receiver ( gnome_screensaver_ActiveChanged_cb ,
' ActiveChanged ' , ' org.gnome.ScreenSaver ' )
except :
pass
2007-08-09 17:39:18 +02:00
2005-11-07 16:43:47 +01:00
self . show_vcard_when_connect = [ ]
2005-06-03 19:35:48 +02:00
self . sleeper = common . sleepy . Sleepy (
2005-09-11 01:44:53 +02:00
gajim . config . get ( ' autoawaytime ' ) * 60 , # make minutes to seconds
2005-04-22 01:20:18 +02:00
gajim . config . get ( ' autoxatime ' ) * 60 )
2005-08-11 15:20:46 +02:00
2008-04-17 16:17:14 +02:00
gtkgui_helpers . make_jabber_state_images ( )
2005-03-28 03:20:47 +02:00
self . systray_enabled = False
2005-08-11 15:20:46 +02:00
self . systray_capabilities = False
2007-12-12 09:44:46 +01:00
if ( ( ( os . name == ' nt ' ) or ( sys . platform == ' darwin ' ) ) and
( gtk . pygtk_version > = ( 2 , 10 , 0 ) ) and
( gtk . gtk_version > = ( 2 , 10 , 0 ) ) ) :
import statusicon
self . systray = statusicon . StatusIcon ( )
2006-11-18 21:52:28 +01:00
self . systray_capabilities = True
else : # use ours, not GTK+ one
# [FIXME: remove this when we migrate to 2.10 and we can do
# cool tooltips somehow and (not dying to keep) animation]
import systray
2006-03-24 19:48:26 +01:00
self . systray_capabilities = systray . HAS_SYSTRAY_CAPABILITIES
if self . systray_capabilities :
2006-11-18 21:52:28 +01:00
self . systray = systray . Systray ( )
2005-08-11 15:20:46 +02:00
2005-06-06 01:17:59 +02:00
if self . systray_capabilities and gajim . config . get ( ' trayicon ' ) :
2004-12-14 13:57:45 +01:00
self . show_systray ( )
2005-04-17 01:15:03 +02:00
2008-04-17 08:34:32 +02:00
path_to_file = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' gajim.png ' )
pix = gtk . gdk . pixbuf_new_from_file ( path_to_file )
2008-04-18 11:43:26 +02:00
# set the icon to all windows
2008-04-17 08:34:32 +02:00
gtk . window_set_default_icon ( pix )
2008-04-18 11:43:26 +02:00
self . roster = roster_window . RosterWindow ( )
2008-04-17 08:34:32 +02:00
2005-11-15 12:52:40 +01:00
self . init_emoticons ( )
self . make_regexps ( )
2007-12-12 09:44:46 +01:00
2005-03-26 22:09:49 +01:00
# get instances for windows/dialogs that will show_all()/hide()
2005-11-13 16:08:47 +01:00
self . instances [ ' file_transfers ' ] = dialogs . FileTransfersWindow ( )
2005-03-10 19:29:03 +01:00
2006-09-13 18:47:58 +02:00
# get transports type from DB
gajim . transport_type = gajim . logger . get_transports_type ( )
# test is dictionnary is present for speller
if gajim . config . get ( ' use_speller ' ) :
lang = gajim . config . get ( ' speller_language ' )
if not lang :
lang = gajim . LANG
tv = gtk . TextView ( )
try :
import gtkspell
spell = gtkspell . Spell ( tv , lang )
except :
2007-06-03 12:04:20 +02:00
dialogs . AspellDictError ( lang )
2008-07-11 08:29:40 +02:00
if gajim . config . get ( ' soundplayer ' ) == ' ' :
# only on first time Gajim starts
commands = ( ' aplay ' , ' play ' , ' esdplay ' , ' artsplay ' )
for command in commands :
if helpers . is_in_path ( command ) :
if command == ' aplay ' :
command + = ' -q '
gajim . config . set ( ' soundplayer ' , command )
break
2006-11-18 21:52:28 +01:00
self . last_ftwindow_update = 0
2005-03-15 11:20:10 +01:00
gobject . timeout_add ( 100 , self . autoconnect )
2007-08-09 17:39:18 +02:00
if os . name == ' nt ' :
gobject . timeout_add ( 200 , self . process_connections )
else :
2008-02-14 20:18:07 +01:00
gobject . timeout_add_seconds ( 2 , self . process_connections )
2008-04-15 11:35:36 +02:00
gobject . timeout_add_seconds ( gajim . config . get (
' check_idle_every_foo_seconds ' ) , self . read_sleepy )
2003-11-30 23:40:24 +01:00
2005-04-12 23:09:06 +02:00
if __name__ == ' __main__ ' :
2006-05-26 15:32:52 +02:00
def sigint_cb ( num , stack ) :
sys . exit ( 5 )
# ^C exits the application normally to delete pid file
signal . signal ( signal . SIGINT , sigint_cb )
2005-04-18 16:05:30 +02:00
2006-12-20 21:40:08 +01:00
if gajim . verbose :
print >> sys . stderr , " Encodings: d: %s , fs: %s , p: %s " % \
( sys . getdefaultencoding ( ) , sys . getfilesystemencoding ( ) , locale . getpreferredencoding ( ) )
2007-12-12 09:44:46 +01:00
if ( ( os . name != ' nt ' ) and ( sys . platform != ' darwin ' ) ) :
2005-10-10 15:15:32 +02:00
# Session Management support
2005-10-10 15:12:28 +02:00
try :
import gnome . ui
except ImportError :
print >> sys . stderr , _ ( ' Session Management support not available (missing gnome.ui module) ' )
else :
def die_cb ( cli ) :
2007-12-15 10:04:10 +01:00
gajim . interface . roster . quit_gtkgui_interface ( )
2005-10-10 15:12:28 +02:00
gnome . program_init ( ' gajim ' , gajim . version )
cli = gnome . ui . master_client ( )
cli . connect ( ' die ' , die_cb )
2007-12-12 09:44:46 +01:00
2006-11-18 21:52:28 +01:00
path_to_gajim_script = gtkgui_helpers . get_abspath_for_script (
' gajim ' )
2007-12-12 09:44:46 +01:00
2005-09-07 23:12:30 +02:00
if path_to_gajim_script :
2005-10-10 15:12:28 +02:00
argv = [ path_to_gajim_script ]
# FIXME: remove this typeerror catch when gnome python is old and
# not bad patched by distro men [2.12.0 + should not need all that
# NORMALLY]
try :
cli . set_restart_command ( argv )
2007-02-12 20:59:40 +01:00
except AttributeError :
2005-10-10 15:12:28 +02:00
cli . set_restart_command ( len ( argv ) , argv )
2007-12-12 09:44:46 +01:00
2006-09-13 18:47:58 +02:00
check_paths . check_and_possibly_create_paths ( )
2006-11-18 21:52:28 +01:00
2007-12-12 09:44:46 +01:00
if sys . platform == ' darwin ' :
2008-06-07 22:42:15 +02:00
try :
import osx
osx . init ( )
2008-06-08 12:19:26 +02:00
except ImportError :
2008-06-07 22:42:15 +02:00
pass
2007-12-12 09:44:46 +01:00
2006-09-13 18:47:58 +02:00
Interface ( )
2008-04-14 17:19:09 +02:00
2007-12-27 02:30:40 +01:00
try :
gtk . main ( )
except KeyboardInterrupt :
print >> sys . stderr , ' KeyboardInterrupt '
2008-07-29 21:49:31 +02:00
2008-07-30 14:21:47 +02:00
# vim: se ts=3: