2006-11-18 21:52:28 +01:00
#!/usr/bin/env python
2005-04-18 10:54:47 +02:00
## gajim.py
2003-11-30 23:40:24 +01:00
##
##
2006-11-18 21:52:28 +01:00
## Copyright (C) 2003-2006 Yann Le Boulanger <asterix@lagaule.org>
## Copyright (C) 2005-2006 Nikos Kouremenos <kourem@gmail.com>
## Copyright (C) 2005-2006 Dimitur Kirov <dkirov@gmail.com>
## Copyright (C) 2005 Travis Shirk <travis@pobox.com>
2007-08-09 17:39:18 +02:00
## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net>
## Copyright (C) 2007 Julien Pivotto <roidelapluie@gmail.com>
2003-11-30 23:40:24 +01:00
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 2 only.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
2005-11-13 15:55:52 +01:00
2005-05-30 14:53:48 +02:00
import sys
2005-08-16 13:55:29 +02:00
import os
2006-04-25 21:56:27 +02:00
import urllib
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 )
raise ValueError ( _ ( " %s is not a valid loglevel " ) , repr ( arg ) )
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 ' ) :
print ' gajim [--help] [--quiet] [--verbose] [--loglevel subsystem=level[,subsystem=level[...]]] [--profile name] '
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
2006-01-06 04:36:07 +01:00
import message_control
2006-01-06 07:59:55 +01:00
from chat_control import ChatControlBase
2006-07-21 15:52:36 +02:00
from atom_window import AtomWindow
2006-01-06 07:59:55 +01:00
2005-12-01 18:17:20 +01:00
from common import exceptions
2006-11-18 21:52:28 +01:00
from common . zeroconf import connection_zeroconf
from common import dbus_support
2007-08-09 17:39:18 +02:00
if dbus_support . supported :
import dbus
2005-09-21 16:42:29 +02:00
2006-09-13 18:47:58 +02:00
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
2005-05-30 14:53:48 +02:00
try :
import gtk
except RuntimeError , msg :
if str ( msg ) == ' could not open display ' :
2007-01-02 13:17:51 +01:00
print >> sys . stderr , _ ( ' Gajim needs X server to run. Quiting... ' )
2005-05-30 16:19:14 +02:00
sys . exit ( )
2005-12-01 18:17:20 +01:00
pritext = ' '
2007-01-17 00:26:38 +01:00
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-09-11 16:20:20 +02:00
2005-09-22 18:30:46 +02: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 ' :
2005-10-17 17:57:03 +02:00
sectext = _ ( ' Please remove your current GTK+ runtime and install the latest stable version from %s ' ) % ' http://gladewin32.sourceforge.net '
2005-09-22 18:30:46 +02:00
else :
2005-12-27 22:03:02 +01:00
sectext = _ ( ' Please make sure that GTK+ and PyGTK have libglade support in your system. ' )
2005-12-01 18:17:20 +01:00
try :
from common import check_paths
except exceptions . PysqliteNotAvailable , e :
2005-12-01 18:56:31 +01:00
pritext = _ ( ' Gajim needs PySQLite2 to run ' )
2005-12-01 18:17:20 +01:00
sectext = str ( e )
2006-09-13 18:47:58 +02:00
if os . name == ' nt ' :
try :
import winsound # windows-only built-in module for playing wav
2006-12-02 02:26:45 +01:00
import win32api # do NOT remove. we req this module
2006-09-13 18:47:58 +02:00
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 '
2005-12-01 18:17:20 +01:00
if pritext :
2005-09-22 18:30:46 +02: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
2005-11-12 22:24:54 +01:00
path = os . getcwd ( )
2005-12-01 18:56:31 +01:00
if ' .svn ' in os . listdir ( path ) or ' _svn ' in os . listdir ( path ) :
2005-11-12 22:24:54 +01:00
# import gtkexcepthook only for those that run svn
# those than run with --verbose run from terminal so no need to care
# about those
import gtkexcepthook
del path
2005-02-28 19:15:48 +01:00
import gobject
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-05-14 00:38:48 +02:00
import getopt
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
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
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-05-21 18:01:52 +02:00
from common import gajim
2005-08-10 00:46:13 +02:00
from common import helpers
2005-04-17 00:12:41 +02:00
from common import optparser
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 )
2006-11-22 21:56:25 +01:00
except :
# 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
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 :
f = open ( ' /proc/ %d /cmdline ' % pid )
except IOError , e :
if e . errno == errno . ENOENT :
return False # file/pid does not exist
raise
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 )
if dialog . get_response ( ) != gtk . RESPONSE_YES :
sys . exit ( 3 )
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 )
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 ) :
'''
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-01-17 00:26:38 +01:00
# time() is already called in glib, we just get the last value
# overrides IdleQueue.current_time()
self . current_time = lambda : gobject . get_current_time ( )
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
'''
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
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 ] )
def process ( self ) :
self . check_time_events ( )
2005-04-18 16:05:30 +02:00
class Interface :
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)
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 ] )
2005-09-27 00:29:52 +02: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 ]
2006-03-15 09:40:19 +01:00
gc_control = self . msg_win_mgr . get_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))
2006-04-02 18:11:21 +02:00
def response ( widget , account , iq_obj , answer ) :
self . dialog . destroy ( )
gajim . connections [ account ] . build_http_auth_answer ( iq_obj , answer )
2007-06-03 12:04:20 +02:00
sec_msg = _ ( ' Do you accept this request? ' )
if data [ 4 ] :
sec_msg = data [ 4 ] + ' \n ' + sec_msg
2006-04-02 18:11:21 +02:00
self . dialog = dialogs . YesNoDialog ( _ ( ' HTTP ( %s ) Authorization for %s (id: %s ) ' ) \
2007-06-03 12:04:20 +02:00
% ( data [ 0 ] , data [ 1 ] , data [ 2 ] ) , sec_msg ,
2006-04-02 18:11:21 +02:00
on_response_yes = ( response , account , data [ 3 ] , ' yes ' ) ,
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
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 ]
self . handle_event_file_send_error ( account ,
( jid_from , file_props ) )
conn . disconnect_transfer ( file_props )
return
2006-03-15 09:40:19 +01:00
ctrl = self . msg_win_mgr . get_control ( jid_from , account )
2006-01-12 00:21:00 +01:00
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
gobject . timeout_add ( 30000 , 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 ) )
2004-06-20 23:58:12 +02: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 ) :
2006-04-01 11:35:07 +02:00
# 'NOTIFY' (account, (jid, status, status message, resource, priority,
2007-06-03 12:04:20 +02:00
# keyID, timestamp, contact_nickname))
2005-07-21 19:00:05 +02:00
# if we're here it means contact changed show
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 ]
2005-05-29 23:34:01 +02:00
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 ]
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
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
2005-11-01 16:28:19 +01:00
if contact1 :
if contact1 . show in statuss :
old_show = statuss . index ( contact1 . show )
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 )
2006-04-01 11:35:07 +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 :
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
contact1 = gajim . contacts . get_first_contact_from_jid ( account , ji )
2006-07-19 13:01:09 +02:00
if not contact1 :
2006-09-13 18:47:58 +02:00
# presence of another resource of our jid
if resource == gajim . connections [ account ] . server_resource :
return
2006-07-19 13:01:09 +02:00
contact1 = gajim . contacts . create_contact ( jid = ji ,
name = gajim . nicks [ account ] , groups = [ ] ,
show = array [ 1 ] , status = status_message , sub = ' both ' ,
ask = ' none ' , priority = priority , keyID = keyID ,
resource = resource )
old_show = 0
gajim . contacts . add_contact ( account , contact1 )
lcontact . append ( contact1 )
self . roster . add_self_contact ( account )
elif contact1 . show in statuss :
2005-11-01 16:28:19 +01:00
old_show = statuss . index ( contact1 . show )
if ( resources != [ ' ' ] and ( len ( lcontact ) != 1 or
2006-11-18 21:52:28 +01:00
lcontact [ 0 ] . show != ' offline ' ) ) and jid . find ( ' @ ' ) > 0 :
2005-02-15 00:48:32 +01:00
old_show = 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
contact1 = gajim . contacts . copy_contact ( contact1 )
2005-11-01 16:28:19 +01:00
lcontact . append ( contact1 )
contact1 . resource = resource
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 :
2005-11-01 16:28:19 +01: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 ( 5000 , self . roster . remove_newly_added ,
contact1 . jid , account )
2006-02-27 00:29:49 +01:00
elif old_show > 1 and new_show == 0 and gajim . connections [ account ] . \
2005-04-14 09:20:14 +02:00
connected > 1 :
2005-11-01 16:28:19 +01:00
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 )
2006-04-05 19:25:02 +02:00
gobject . timeout_add ( 5000 , self . roster . really_remove_contact ,
contact1 , 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
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 :
2005-10-11 00:46:28 +02:00
# Update existing iter
2005-04-23 02:37:51 +02:00
self . roster . draw_contact ( ji , account )
2006-11-18 21:52:28 +01:00
self . roster . draw_group ( _ ( ' Transports ' ) , account )
2007-01-02 12:43:57 +01:00
if new_show > 1 and ji in gajim . transport_avatar [ account ] :
# transport just signed in. request avatars
for jid_ in gajim . transport_avatar [ account ] [ ji ] :
gajim . connections [ account ] . request_vcard ( jid_ )
2006-06-12 17:24:58 +02:00
# transport just signed in/out, don't show popup notifications
# for 30s
account_ji = account + ' / ' + ji
gajim . block_signed_in_notifications [ account_ji ] = True
gobject . timeout_add ( 30000 , 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 :
location [ ' add_contact ' ] . transport_signed_in ( jid )
break
elif old_show > 1 and new_show == 0 :
location [ ' add_contact ' ] . transport_signed_out ( jid )
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
2006-03-22 00:43:26 +01:00
gajim . connections [ account ] . remove_transfers_for_contact ( contact1 )
2006-04-01 11:35:07 +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 :
2006-05-10 22:25:51 +02:00
notify . notify ( ' contact_connected ' , jid , account , status_message )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactPresence ' ,
2005-08-08 16:43:50 +02:00
( 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 :
2006-05-10 22:25:51 +02:00
notify . notify ( ' contact_disconnected ' , jid , account , status_message )
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' ContactAbsence ' , ( account , array ) )
# FIXME: stop non active file transfers
2006-05-10 22:25:51 +02:00
elif new_show > 1 : # Status change (not connected/disconnected or error (<1))
2006-07-17 21:30:53 +02:00
notify . notify ( ' status_change ' , jid , account , [ new_show ,
status_message ] )
2005-10-04 13:33:57 +02:00
else :
2005-10-04 14:26:09 +02:00
# FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) doesn't follow the JEP
# remove in 2007
# It's maybe a GC_NOTIFY (specialy for MSN gc)
2006-04-01 11:35:07 +02:00
self . handle_event_gc_notify ( account , ( jid , array [ 1 ] , status_message ,
2007-06-03 12:04:20 +02:00
array [ 3 ] , None , None , None , None , None , None , None , None ) )
2005-10-04 13:33:57 +02:00
2004-06-21 02:12:25 +02:00
2004-06-20 23:58:12 +02:00
def handle_event_msg ( self , account , array ) :
2006-04-01 11:17:15 +02:00
# 'MSG' (account, (jid, msg, time, encrypted, msg_type, subject,
2007-08-09 17:39:18 +02:00
# chatstate, msg_id, composing_xep, user_nick, xhtml))
2006-11-18 21:52:28 +01:00
# user_nick is JEP-0172
2006-03-28 00:02:56 +02:00
2006-04-01 11:17:15 +02:00
full_jid_with_resource = array [ 0 ]
jid = gajim . get_jid_without_resource ( full_jid_with_resource )
resource = gajim . get_resource_from_jid ( full_jid_with_resource )
2006-04-01 19:03:36 +02:00
2006-04-01 11:17:15 +02:00
message = array [ 1 ]
2006-11-18 21:52:28 +01:00
encrypted = array [ 3 ]
2005-07-16 11:33:43 +02:00
msg_type = array [ 4 ]
2006-09-13 18:47:58 +02:00
subject = array [ 5 ]
2005-07-21 16:56:39 +02:00
chatstate = array [ 6 ]
2006-03-01 19:16:54 +01:00
msg_id = array [ 7 ]
2007-08-09 17:39:18 +02:00
composing_xep = array [ 8 ]
2006-11-18 21:52:28 +01:00
xhtml = array [ 10 ]
if gajim . config . get ( ' ignore_incoming_xhtml ' ) :
xhtml = None
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-03-28 01:06:26 +02:00
2006-04-01 20:55:53 +02:00
groupchat_control = self . msg_win_mgr . get_control ( jid , account )
2007-06-03 12:04:20 +02:00
if not groupchat_control and \
2007-08-09 17:39:18 +02:00
jid in self . minimized_controls [ account ] :
groupchat_control = self . minimized_controls [ account ] [ jid ]
2006-04-01 20:55:53 +02:00
pm = False
if groupchat_control and groupchat_control . type_id == \
message_control . TYPE_GC :
# It's a Private message
pm = True
2006-11-18 21:52:28 +01:00
msg_type = ' pm '
2006-04-01 20:55:53 +02:00
2006-04-01 22:30:37 +02:00
chat_control = None
jid_of_control = full_jid_with_resource
2006-04-01 19:03:36 +02:00
highest_contact = gajim . contacts . get_contact_with_highest_priority (
account , jid )
# Look for a chat control that has the given resource, or default to one
# without resource
ctrl = self . msg_win_mgr . get_control ( full_jid_with_resource , account )
if ctrl :
chat_control = ctrl
2006-04-01 20:55:53 +02:00
elif not pm and ( not highest_contact or not highest_contact . resource ) :
2006-04-01 19:03:36 +02:00
# unknow contact or offline message
jid_of_control = jid
chat_control = self . msg_win_mgr . get_control ( jid , account )
2006-11-18 21:52:28 +01:00
elif highest_contact and resource != highest_contact . resource and \
highest_contact . show != ' offline ' :
2006-04-01 19:03:36 +02:00
jid_of_control = full_jid_with_resource
chat_control = None
2006-04-01 20:55:53 +02:00
elif not pm :
2006-04-01 19:03:36 +02:00
jid_of_control = jid
chat_control = self . msg_win_mgr . get_control ( jid , account )
2006-03-28 01:06:26 +02:00
# Handle chat states
2006-04-01 19:03:36 +02:00
contact = gajim . contacts . get_contact ( account , jid , resource )
2006-03-28 01:06:26 +02:00
if contact :
2007-08-09 17:39:18 +02:00
if contact . composing_xep != ' XEP-0085 ' : # We cache xep85 support
contact . composing_xep = composing_xep
2006-04-04 19:51:52 +02:00
if chat_control and chat_control . type_id == message_control . TYPE_CHAT :
if chatstate is not None :
# other peer sent us reply, so he supports jep85 or jep22
contact . chatstate = chatstate
if contact . our_chatstate == ' ask ' : # we were jep85 disco?
contact . our_chatstate = ' active ' # no more
chat_control . handle_incoming_chatstate ( )
elif contact . chatstate != ' active ' :
# got no valid jep85 answer, peer does not support it
contact . chatstate = False
elif chatstate == ' active ' :
# Brand new message, incoming.
contact . our_chatstate = chatstate
2006-03-28 01:06:26 +02:00
contact . chatstate = chatstate
2006-04-04 19:51:52 +02:00
if msg_id : # Do not overwrite an existing msg_id with None
contact . msg_id = msg_id
2006-03-28 01:06:26 +02:00
# THIS MUST BE AFTER chatstates handling
2006-11-18 21:52:28 +01:00
# AND BEFORE playsound (else we ear sounding on chatstates!)
2006-04-01 11:17:15 +02:00
if not message : # empty message text
2006-03-28 01:06:26 +02:00
return
2006-05-21 21:46:36 +02:00
if gajim . config . get ( ' ignore_unknown_contacts ' ) and \
2007-08-09 17:39:18 +02:00
not gajim . contacts . get_contacts ( account , jid ) and not pm :
2006-05-21 21:46:36 +02:00
return
2006-11-18 21:52:28 +01:00
if not contact :
# contact is not in the roster, create a fake one to display
# notification
contact = common . contacts . Contact ( jid = jid , resource = resource )
2006-09-13 18:47:58 +02:00
advanced_notif_num = notify . get_advanced_notification ( ' message_received ' ,
account , contact )
2006-05-22 22:14:54 +02:00
# Is it a first or next message received ?
2006-04-01 19:03:36 +02:00
first = False
2006-11-18 21:52:28 +01:00
if msg_type == ' normal ' :
if not gajim . events . get_events ( account , jid , [ ' normal ' ] ) :
first = True
elif not chat_control and not gajim . events . get_events ( account ,
jid_of_control , [ msg_type ] ) : # msg_type can be chat or pm
2006-04-01 19:03:36 +02:00
first = True
2006-03-28 12:27:58 +02:00
if pm :
2006-05-22 22:14:54 +02:00
nickname = resource
2006-11-18 21:52:28 +01:00
groupchat_control . on_private_message ( nickname , message , array [ 2 ] ,
2007-08-09 17:39:18 +02:00
xhtml , msg_id )
2006-05-22 22:14:54 +02:00
else :
# array: (jid, msg, time, encrypted, msg_type, subject)
2006-11-18 21:52:28 +01:00
if encrypted :
self . roster . on_message ( jid , message , array [ 2 ] , account , array [ 3 ] ,
msg_type , subject , resource , msg_id , array [ 9 ] ,
advanced_notif_num )
else :
# xhtml in last element
self . roster . on_message ( jid , message , array [ 2 ] , account , array [ 3 ] ,
msg_type , subject , resource , msg_id , array [ 9 ] ,
advanced_notif_num , xhtml = xhtml )
2006-05-22 22:14:54 +02:00
nickname = gajim . get_name_from_jid ( account , jid )
# Check and do wanted notifications
2006-09-13 18:47:58 +02:00
msg = message
if subject :
msg = _ ( ' Subject: %s ' ) % subject + ' \n ' + msg
2006-11-18 21:52:28 +01:00
notify . notify ( ' new_message ' , jid_of_control , account , [ msg_type ,
first , nickname , msg ] , advanced_notif_num )
2006-05-22 22:14:54 +02:00
2005-11-19 23:01:10 +01:00
if self . remote_ctrl :
self . remote_ctrl . raise_signal ( ' NewMessage ' , ( account , array ) )
2005-07-19 21:10:03 +02:00
2004-07-08 21:46:24 +02:00
def handle_event_msgerror ( self , account , array ) :
2006-04-01 11:17:15 +02:00
#'MSGERROR' (account, (jid, error_code, error_msg, msg, time))
full_jid_with_resource = array [ 0 ]
jids = full_jid_with_resource . split ( ' / ' , 1 )
2005-06-13 00:45:41 +02:00
jid = jids [ 0 ]
2006-11-18 21:52:28 +01:00
gc_control = self . msg_win_mgr . get_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 ]
if not self . msg_win_mgr . get_control ( full_jid_with_resource ,
account ) :
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 )
2007-06-03 12:04:20 +02:00
self . roster . new_private_chat ( gc_c , account )
2006-11-18 21:52:28 +01:00
ctrl = self . msg_win_mgr . get_control ( full_jid_with_resource , account )
ctrl . print_conversation ( ' Error %s : %s ' % ( array [ 1 ] , array [ 2 ] ) ,
' status ' )
2005-06-13 00:45:41 +02:00
return
2006-01-06 07:59:55 +01:00
2006-11-18 21:52:28 +01:00
gc_control . print_conversation ( ' Error %s : %s ' % ( array [ 1 ] , array [ 2 ] ) )
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 ] :
msg = _ ( ' error while sending %s ( %s ) ' ) % ( array [ 3 ] , msg )
self . roster . on_message ( jid , msg , array [ 4 ] , account , \
2005-09-15 19:33:02 +02:00
msg_type = ' error ' )
2004-07-08 21:46:24 +02: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 ) :
#('MSGNOTSENT', account, (jid, ierror_msg, msg, time))
msg = _ ( ' error while sending %s ( %s ) ' ) % ( array [ 2 ] , array [ 1 ] )
self . roster . on_message ( array [ 0 ] , msg , array [ 3 ] , account ,
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 ]
self . roster . remove_contact ( c , account )
2006-01-19 22:55:01 +01:00
if _ ( ' Not in Roster ' ) in c . groups :
c . groups . remove ( _ ( ' Not in Roster ' ) )
2005-07-22 02:01:05 +02:00
self . roster . add_contact_to_roster ( c . jid , account )
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 ]
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
contact1 = gajim . contacts . create_contact ( jid = jid , name = name ,
2006-02-07 20:24:19 +01:00
groups = [ ] , show = ' online ' , status = ' online ' ,
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
ask = ' to ' , resource = array [ 1 ] , keyID = keyID )
gajim . contacts . add_contact ( account , contact1 )
2005-07-07 18:38:36 +02:00
self . roster . add_contact_to_roster ( 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-11-18 21:52:28 +01:00
dialogs . InformationDialog ( _ ( ' Contact " %s " removed subscription from you ' ) \
% jid , _ ( ' You will always see him or her as offline. ' ) )
2006-01-13 06:07:09 +01:00
# FIXME: Per RFC 3921, we can "deny" ack as well, but the GUI does not show deny
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 ) )
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
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 )
gajim . contacts . remove_jid ( account , c . jid )
self . roster . remove_contact ( c , account )
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 ) :
#('NEW_ACC_CONNECTED', account, (infos, is_form))
if self . instances . has_key ( ' account_creation_wizard ' ) :
self . instances [ ' account_creation_wizard ' ] . new_acc_connected ( array [ 0 ] ,
array [ 1 ] )
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 ' ]
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 ]
2005-11-28 17:26:19 +01:00
elif resource and self . instances [ account ] [ ' infos ' ] . has_key (
jid + ' / ' + resource ) :
2005-11-13 16:08:47 +01:00
win = self . instances [ account ] [ ' infos ' ] [ jid + ' / ' + resource ]
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
2005-07-20 15:13:52 +02:00
win = None
2006-01-12 00:21:00 +01:00
ctrl = None
2006-03-15 09:40:19 +01:00
if resource and self . msg_win_mgr . has_window (
2006-03-09 19:41:57 +01:00
jid + ' / ' + resource , account ) :
2006-03-15 09:40:19 +01:00
win = self . msg_win_mgr . get_window ( jid + ' / ' + resource ,
2006-03-09 19:41:57 +01:00
account )
ctrl = win . get_control ( jid + ' / ' + resource , 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 )
2006-01-25 03:43:55 +01:00
ctrl = win . get_control ( jid , account )
2006-01-12 00:21:00 +01:00
if win 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
2006-03-15 09:40:19 +01:00
gc_ctrl = self . msg_win_mgr . get_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))
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
c . last_status_time = time . localtime ( time . time ( ) - array [ 2 ] )
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
2006-03-15 09:40:19 +01:00
control = self . msg_win_mgr . get_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 ]
2006-11-21 22:30:15 +01:00
if control and control . type_id != message_control . TYPE_GC :
2006-11-21 21:55:56 +01:00
return
2006-01-09 00:14:50 +01:00
if control :
2006-11-18 21:52:28 +01:00
control . chg_contact_status ( nick , show , status , array [ 4 ] , array [ 5 ] ,
2007-06-03 12:04:20 +02:00
array [ 6 ] , array [ 7 ] , array [ 8 ] , array [ 9 ] , array [ 10 ] , array [ 11 ] )
2007-08-09 17:39:18 +02:00
contact = gajim . contacts . \
get_contact_with_highest_priority ( account , room_jid )
if contact :
self . roster . draw_contact ( room_jid , account )
2007-06-03 12:04:20 +02:00
ctrl = self . msg_win_mgr . get_control ( fjid , account )
2005-09-19 18:13:45 +02:00
2006-05-11 23:46:55 +02:00
# print status in chat window and update status/GPG image
2007-06-03 12:04:20 +02:00
if ctrl :
2006-05-11 23:46:55 +02:00
contact = ctrl . contact
contact . show = show
contact . status = status
uf_show = helpers . get_uf_show ( show )
2006-12-27 12:32:01 +01:00
if status :
ctrl . print_conversation ( _ ( ' %s is now %s ( %s ) ' ) % ( nick , uf_show ,
status ) , ' status ' )
else :
ctrl . print_conversation ( _ ( ' %s is now %s ' ) % ( nick , uf_show ) ,
' status ' )
2006-05-18 20:07:53 +02:00
ctrl . parent_win . redraw_tab ( ctrl )
2007-06-03 12:04:20 +02:00
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 ) :
2006-11-18 21:52:28 +01:00
# ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg))
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
2006-03-15 09:40:19 +01:00
gc_control = self . msg_win_mgr . get_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
2006-11-18 21:52:28 +01:00
gc_control . on_message ( nick , array [ 1 ] , array [ 2 ] , array [ 3 ] , xhtml )
2007-06-03 12:04:20 +02:00
contact = gajim . contacts . \
get_contact_with_highest_priority ( account , room_jid )
if contact :
2007-08-09 17:39:18 +02:00
self . roster . draw_contact ( room_jid , account )
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
2006-03-15 09:40:19 +01:00
gc_control = self . msg_win_mgr . get_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 ] )
# 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
# "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 ] :
# use default configuration
gajim . connections [ account ] . send_gc_config ( room_jid , array [ 1 ] )
# invite contacts
if gajim . automatic_rooms [ account ] [ room_jid ] . has_key ( ' invities ' ) :
for jid in gajim . automatic_rooms [ account ] [ room_jid ] [ ' invities ' ] :
gajim . connections [ account ] . send_invite ( room_jid , jid )
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 ]
gc_control = self . msg_win_mgr . get_control ( jid , account )
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 :
# Can be a presence (see chg_contact_status in groupchat_contol.py)
changes . append ( _ ( ' Any occupant is allowed to see your full JID ' ) )
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 :
changes . append ( \
_ ( ' A non-privacy-related room configuration change has occurred ' ) )
if ' 170 ' in statusCode :
# Can be a presence (see chg_contact_status in groupchat_contol.py)
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 ' ) )
if ' 173 ' in statusCode :
changes . append ( _ ( ' Room is now semi-anonymous ' ) )
if ' 174 ' in statusCode :
changes . append ( _ ( ' Room is now fully-anonymous ' ) )
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 ) :
#('GC_AFFILIATION', account, (room_jid, affiliation, list)) list is list
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 ] . \
affiliation_list_received ( array [ 1 ] , array [ 2 ] )
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 )
ctrl = win . get_control ( room_jid , account )
win . remove_tab ( ctrl , 3 )
dlg = dialogs . InputDialog ( _ ( ' Password Required ' ) ,
_ ( ' A Password is required to join the room %s . Please type it ' ) % \
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 ) :
2005-10-04 12:59:11 +02:00
#('GC_INVITATION', (room_jid, jid_from, reason, password))
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 ] ,
array [ 2 ] )
return
self . add_event ( account , jid , ' gc-invitation ' , ( room_jid , array [ 2 ] ,
array [ 3 ] ) )
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
2004-10-10 20:44:38 +02:00
def handle_event_bad_passphrase ( self , account , array ) :
2005-08-30 23:10:14 +02:00
use_gpg_agent = gajim . config . get ( ' use_gpg_agent ' )
if use_gpg_agent :
2007-02-04 14:01:04 +01:00
return
2005-06-18 19:00:54 +02:00
keyID = gajim . config . get_per ( ' accounts ' , account , ' keyid ' )
self . roster . forget_gpg_passphrase ( keyID )
2005-08-02 00:48:58 +02:00
dialogs . WarningDialog ( _ ( ' Your passphrase is incorrect ' ) ,
2006-04-02 18:11:21 +02:00
_ ( ' You are currently connected without your OpenPGP key. ' ) )
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-30 20:48:24 +02:00
# contact removes us.
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 :
2006-03-30 20:48:24 +02:00
if contacts :
2006-04-26 23:43:58 +02:00
c = contacts [ 0 ]
self . roster . remove_contact ( c , account )
2006-03-30 20:48:24 +02:00
gajim . contacts . remove_jid ( account , jid )
2006-12-26 14:30:35 +01:00
self . roster . draw_account ( account )
2006-09-13 18:47:58 +02:00
if gajim . events . get_events ( account , c . jid ) :
2006-04-26 23:43:58 +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 ]
contact = gajim . contacts . create_contact ( jid = c . jid ,
name = ' ' , groups = [ _ ( ' Not in Roster ' ) ] ,
show = ' not in roster ' , status = ' ' , sub = ' none ' ,
keyID = keyID )
gajim . contacts . add_contact ( account , contact )
self . roster . add_contact_to_roster ( contact . jid , account )
2006-03-30 20:48:24 +02:00
#FIXME if it was the only one in its group, remove the group
return
elif not contacts :
2006-04-06 18:58:20 +02:00
if sub == ' remove ' :
return
2006-03-30 20:48:24 +02:00
# Add it to roster
contact = gajim . contacts . create_contact ( jid = jid , name = name ,
2006-11-18 21:52:28 +01:00
groups = groups , show = ' offline ' , sub = sub , ask = ask )
2006-03-30 20:48:24 +02:00
gajim . contacts . add_contact ( account , contact )
self . roster . add_contact_to_roster ( jid , account )
else :
2006-04-19 12:07:47 +02:00
re_add = False
# if sub changed: remove and re-add, maybe observer status changed
if contacts [ 0 ] . sub != sub :
self . roster . remove_contact ( contacts [ 0 ] , account )
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
if groups :
contact . groups = groups
2006-04-19 12:07:47 +02:00
if re_add :
self . roster . add_contact_to_roster ( jid , account )
2005-04-23 02:37:51 +02:00
self . roster . draw_contact ( jid , 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
2005-11-16 11:35:11 +01:00
2006-02-19 22:28:41 +01:00
self . roster . actions_menu_needs_rebuild = True
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
2005-11-27 13:29:30 +01:00
# join autojoinable rooms
2005-11-27 10:41:48 +01:00
for bm in bms :
2007-08-09 17:39:18 +02:00
minimize = bm [ ' minimize ' ] in ( ' 1 ' , ' true ' )
2005-11-27 10:41:48 +01:00
if bm [ ' autojoin ' ] in ( ' 1 ' , ' true ' ) :
self . roster . join_gc_room ( account , bm [ ' jid ' ] , bm [ ' nick ' ] ,
2007-08-09 17:39:18 +02:00
bm [ ' password ' ] , minimize = minimize )
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 )
2006-07-17 21:30:53 +02:00
if gajim . config . get ( ' notify_on_new_gmail_email_extra ' ) :
for gmessage in gmail_messages_list :
2006-11-18 21:52:28 +01:00
#FIXME: emulate Gtalk client popups. find out what they parse and how
#they decide what to show
2006-07-17 21:30:53 +02:00
# each message has a 'From', 'Subject' and 'Snippet' field
text + = _ ( ' \n From: %(from_address)s ' ) % \
{ ' from_address ' : gmessage [ ' From ' ] }
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 ' ,
2006-04-03 09:40:15 +02:00
path_to_image = path , title = title , 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 ) )
2006-03-13 14:25:51 +01:00
def save_avatar_files ( self , jid , photo_decoded , puny_nick = None ) :
2006-01-17 10:01:59 +01:00
''' Save the decoded avatar to a separate file, and generate files for dbus notifications '''
2006-03-26 13:46:04 +02:00
puny_jid = helpers . sanitize_filename ( jid )
2006-03-10 19:58:28 +01:00
path_to_file = os . path . join ( gajim . AVATAR_PATH , puny_jid )
2006-03-13 14:25:51 +01:00
if puny_nick :
path_to_file = os . path . join ( path_to_file , puny_nick )
2006-02-06 17:04:55 +01:00
# remove old avatars
for typ in ( ' jpeg ' , ' png ' ) :
path_to_original_file = path_to_file + ' . ' + typ
if os . path . isfile ( path_to_original_file ) :
os . remove ( path_to_original_file )
2006-01-17 10:01:59 +01:00
pixbuf , typ = gtkgui_helpers . get_pixbuf_from_data ( photo_decoded ,
want_type = True )
2006-02-17 22:52:22 +01:00
if pixbuf is None :
return
2006-02-06 15:04:25 +01:00
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 '
path_to_original_file = path_to_file + ' . ' + typ
pixbuf . save ( path_to_original_file , typ )
2006-01-17 10:01:59 +01:00
# Generate and save the resized, color avatar
pixbuf = gtkgui_helpers . get_scaled_pixbuf (
gtkgui_helpers . get_pixbuf_from_data ( photo_decoded ) , ' notification ' )
2006-04-06 18:20:59 +02:00
if pixbuf :
path_to_normal_file = path_to_file + ' _notif_size_colored.png '
pixbuf . save ( path_to_normal_file , ' png ' )
2006-04-10 12:50:32 +02:00
# 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.png '
bwbuf . save ( path_to_bw_file , ' png ' )
2006-01-17 10:01:59 +01:00
2006-11-28 17:41:31 +01:00
def remove_avatar_files ( self , jid , puny_nick = None ) :
2006-11-28 16:40:08 +01:00
''' remove avatar files of a jid '''
puny_jid = helpers . sanitize_filename ( jid )
path_to_file = os . path . join ( gajim . AVATAR_PATH , puny_jid )
2006-11-28 17:41:31 +01:00
if puny_nick :
path_to_file = os . path . join ( path_to_file , puny_nick )
2006-11-28 16:40:08 +01:00
for ext in ( ' .jpeg ' , ' .png ' , ' _notif_size_colored.png ' ,
' _notif_size_bw.png ' ) :
path_to_original_file = path_to_file + ext
if os . path . isfile ( path_to_original_file ) :
os . remove ( path_to_original_file )
2006-11-21 19:46:33 +01:00
def add_event ( self , account , jid , type_ , event_args ) :
2006-09-13 18:47:58 +02:00
''' add an event to the gajim.events var '''
# We add it to the gajim.events queue
2005-10-18 22:30:26 +02:00
# Do we have a queue?
2006-02-27 12:27:53 +01:00
jid = gajim . get_jid_without_resource ( jid )
2006-09-13 18:47:58 +02:00
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 )
2006-11-21 19:46:33 +01:00
event = gajim . events . create_event ( type_ , event_args ,
2006-09-13 18:47:58 +02:00
show_in_roster = show_in_roster ,
show_in_systray = show_in_systray )
gajim . events . add_event ( account , jid , event )
2005-10-18 22:30:26 +02:00
self . roster . show_title ( )
if no_queue : # We didn't have a queue: we change icons
2006-11-18 21:52:28 +01:00
if not gajim . contacts . get_contact_with_highest_priority ( account , jid ) :
# add contact to roster ("Not In The Roster") if he is not
self . roster . add_to_not_in_the_roster ( account , jid )
2005-10-18 22:30:26 +02:00
self . roster . draw_contact ( jid , account )
2006-11-18 21:52:28 +01:00
# Show contact in roster (if he is invisible for example) and select line
path = self . roster . get_path ( jid , account )
self . roster . show_and_select_path ( path , jid , account )
2006-09-13 18:47:58 +02:00
def remove_first_event ( self , account , jid , type_ = None ) :
event = gajim . events . get_first_event ( account , jid , type_ )
self . remove_event ( account , jid , event )
2006-03-02 12:14:45 +01:00
def remove_event ( self , account , jid , event ) :
2006-09-13 18:47:58 +02:00
if gajim . events . remove_events ( account , jid , event ) :
# No such event found
2006-03-02 12:14:45 +01:00
return
2006-09-13 18:47:58 +02:00
# no other event?
if not len ( gajim . events . get_events ( account , jid ) ) :
2006-11-18 21:52:28 +01:00
contact = gajim . contacts . get_contact_with_highest_priority ( account ,
jid )
show_transport = gajim . config . get ( ' show_transports_group ' )
if contact and ( contact . show in ( ' error ' , ' offline ' ) and \
not gajim . config . get ( ' showoffline ' ) or (
gajim . jid_is_transport ( jid ) and not show_transport ) ) :
self . roster . really_remove_contact ( contact , account )
2006-09-13 18:47:58 +02:00
self . roster . show_title ( )
self . roster . draw_contact ( jid , account )
2005-10-18 22:30:26 +02:00
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 ) :
2005-07-30 12:20:46 +02:00
return
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 ( )
self . instances [ ' file_transfers ' ] . set_progress ( file_props [ ' type ' ] ,
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 :
ft . set_progress ( file_props [ ' type ' ] , file_props [ ' sid ' ] ,
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
2005-12-01 19:03:05 +01:00
if event_type == ' ' :
# 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
2006-02-19 22:28:41 +01:00
self . roster . actions_menu_needs_rebuild = True
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 )
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:
# self.global_rules_to_append.append(rule)
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 ) :
dlg = dialogs . InputDialog ( _ ( ' Username Conflict ' ) ,
_ ( ' Please type a new username for your local account ' ) ,
is_modal = True )
dlg . input_entry . set_text ( data )
response = dlg . get_response ( )
if response == gtk . RESPONSE_OK :
new_name = dlg . input_entry . get_text ( )
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 , ' ' )
else :
gajim . connections [ account ] . change_status ( ' offline ' , ' ' )
2007-06-03 12:04:20 +02:00
def handle_event_ping_sent ( self , account , contact ) :
ctrl = self . msg_win_mgr . get_control ( contact . get_full_jid ( ) , account )
if ctrl == None :
ctrl = self . msg_win_mgr . get_control ( contact . jid , account )
ctrl . print_conversation ( _ ( ' Ping? ' ) , ' status ' )
def handle_event_ping_reply ( self , account , data ) :
contact = data [ 0 ]
seconds = data [ 1 ]
ctrl = self . msg_win_mgr . get_control ( contact . get_full_jid ( ) , account )
if ctrl == None :
ctrl = self . msg_win_mgr . get_control ( contact . jid , account )
ctrl . print_conversation ( _ ( ' Pong! ( %s s.) ' ) % seconds , ' status ' )
def handle_event_ping_error ( self , account , contact ) :
ctrl = self . msg_win_mgr . get_control ( contact . get_full_jid ( ) , account )
if ctrl == None :
ctrl = self . msg_win_mgr . get_control ( contact . jid , account )
ctrl . print_conversation ( _ ( ' Error. ' ) , ' status ' )
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 )
2007-06-03 12:30:34 +02:00
def handle_event_pep_access_model ( self , account , data ) :
# ('PEP_ACCESS_MODEL', account, (node, model))
if self . instances [ account ] . has_key ( ' pep_services ' ) :
self . instances [ account ] [ ' pep_services ' ] . new_service ( data [ 0 ] , data [ 1 ] )
2007-01-24 21:54:22 +01:00
def read_sleepy ( self ) :
2005-07-22 13:07:06 +02:00
''' Check idle status and change that status if needed '''
2004-10-21 00:53:15 +02:00
if not self . sleeper . poll ( ) :
2005-09-11 01:44:53 +02:00
# idle detection is not supported in that OS
return False # stop looping in vain
2004-05-29 06:05:06 +02:00
state = self . sleeper . getState ( )
2005-04-14 09:05:10 +02:00
for account in gajim . connections :
2005-07-19 00:39:59 +02:00
if not gajim . sleeper_state . has_key ( account ) or \
not gajim . sleeper_state [ account ] :
2004-05-29 06:05:06 +02:00
continue
if state == common . sleepy . STATE_AWAKE and \
2005-07-23 13:52:53 +02:00
gajim . sleeper_state [ account ] in ( ' autoaway ' , ' autoxa ' ) :
2007-01-31 21:39:44 +01:00
# we go online
2005-07-22 23:27:04 +02:00
self . roster . send_status ( account , ' online ' ,
2005-09-14 02:02:32 +02:00
gajim . status_before_autoaway [ account ] )
2007-01-31 21:39:44 +01:00
gajim . status_before_autoaway [ account ] = ' '
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' online '
2004-05-29 06:05:06 +02:00
elif state == common . sleepy . STATE_AWAY and \
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] == ' online ' and \
2005-04-14 09:05:10 +02:00
gajim . config . get ( ' autoaway ' ) :
2007-01-31 21:39:44 +01:00
# we save out online status
2005-07-22 23:27:04 +02:00
gajim . status_before_autoaway [ account ] = \
gajim . connections [ account ] . status
2007-01-31 21:39:44 +01:00
# we go away (no auto status) [we pass True to auto param]
2007-03-07 17:52:08 +01:00
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 )
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' autoaway '
2005-09-11 01:44:53 +02:00
elif state == common . sleepy . STATE_XA and ( \
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] == ' autoaway ' or \
gajim . sleeper_state [ account ] == ' online ' ) and \
2005-04-14 09:05:10 +02:00
gajim . config . get ( ' autoxa ' ) :
2007-01-31 21:39:44 +01:00
# we go extended away [we pass True to auto param]
2007-03-07 17:52:08 +01:00
auto_message = gajim . config . get ( ' autoxa_message ' )
if not auto_message :
auto_message = gajim . connections [ account ] . status
self . roster . send_status ( account , ' xa ' , auto_message , auto = True )
2005-07-22 13:07:06 +02:00
gajim . sleeper_state [ account ] = ' autoxa '
2005-04-18 16:05:30 +02:00
return True # renew timeout (loop for ever)
2003-11-30 23:40:24 +01:00
2004-12-01 21:47:37 +01:00
def autoconnect ( self ) :
2005-04-18 16:05:30 +02:00
''' auto connect at startup '''
2005-07-22 13:07:52 +02:00
ask_message = False
2005-04-14 09:05:10 +02:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-07-22 13:07:52 +02:00
ask_message = True
2005-04-14 09:05:10 +02:00
break
2005-03-15 21:01:04 +01:00
if ask_message :
2005-05-12 02:22:36 +02:00
message = self . roster . get_status_message ( ' online ' )
2006-01-25 17:27:09 +01:00
if message == None :
2005-03-15 21:01:04 +01:00
return
2005-04-14 09:05:10 +02:00
for a in gajim . connections :
if gajim . config . get_per ( ' accounts ' , a , ' autoconnect ' ) :
2005-05-12 02:22:36 +02:00
self . roster . send_status ( a , ' online ' , message )
2005-04-18 16:05:30 +02:00
return False
2004-12-01 21:47:37 +01:00
2004-12-14 13:57:45 +01:00
def show_systray ( self ) :
2005-03-28 03:20:47 +02:00
self . systray_enabled = True
2006-09-13 18:47:58 +02:00
self . systray . show_icon ( )
2004-12-14 13:57:45 +01:00
def hide_systray ( self ) :
2005-03-28 03:20:47 +02:00
self . systray_enabled = False
2006-09-13 18:47:58 +02:00
self . systray . hide_icon ( )
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
2005-03-10 19:20:23 +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
# [^*] anything but '*' (inside [] you don't have to escape metachars)
# [^\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
2007-06-03 12:04:20 +02:00
prefixes = ' | ' . join ( ( r ' http:// ' , r ' https:// ' , r ' gopher:// ' , r ' news:// ' ,
r ' ftp:// ' , r ' ed2k:// ' , r ' irc:// ' , r ' magnet: ' , r ' sip: ' , r ' www \ . ' ,
r ' ftp \ . ' ) )
2005-11-01 00:33:33 +01:00
# NOTE: it's ok to catch www.gr such stuff exist!
2005-11-01 00:31:18 +01:00
2005-11-27 23:05:10 +01:00
#FIXME: recognize xmpp: and treat it specially
2007-06-03 12:04:20 +02:00
links = r ' \ b( %s ) \ S*[ \ w \ / \ =]| ' % prefixes
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-06-03 12:04:20 +02:00
latex = r ' | \ $ \ $.* \ $ \ $ '
2006-03-02 17:05:52 +01:00
basic_pattern = links + mail
2007-06-03 12:04:20 +02:00
if gajim . config . get ( ' use_latex ' ) :
basic_pattern + = latex
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 )
2005-03-13 18:04:57 +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
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 = ' | ' + \
2005-12-05 14:25:50 +01:00
' (?:(?<![ \ w.] ' + emoticons_pattern_prematch [ : - 1 ] + ' )) ' + \
2005-11-30 19:35:40 +01:00
' (?: ' + emoticons_pattern [ : - 1 ] + ' ) ' + \
2005-12-05 14:25:50 +01:00
' (?:(?![ \ w.] ' + emoticons_pattern_postmatch [ : - 1 ] + ' )) '
2005-11-30 19:35:40 +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
2006-11-19 00:21:59 +01:00
self . emot_and_basic_re = re . compile ( emot_and_basic_pattern , re . IGNORECASE )
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)?] ' )
2005-11-27 22:57:41 +01:00
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
2005-03-13 00:43:17 +01:00
def on_launch_browser_mailer ( self , widget , url , kind ) :
2005-08-27 16:26:08 +02:00
helpers . launch_browser_mailer ( kind , url )
2004-12-14 13:57:45 +01:00
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 '''
gtkgui_helpers . popup_emoticons_under_button ( self . emoticons_menu ,
button , parent_win )
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
2006-11-18 21:52:28 +01:00
def init_emoticons ( self , need_reload = False ) :
emot_theme = gajim . config . get ( ' emoticons_theme ' )
if not emot_theme :
2005-11-15 12:52:40 +01:00
return
2006-03-17 00:37:06 +01:00
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
path = os . path . join ( gajim . DATA_DIR , ' emoticons ' , emot_theme )
2006-03-17 15:24:58 +01:00
if not os . path . exists ( path ) :
# It's maybe a user theme
path = os . path . join ( gajim . MY_EMOTS_PATH , emot_theme )
2006-11-18 21:52:28 +01:00
if not os . path . exists ( path ) : # theme doesn't exist, disable emoticons
gajim . config . set ( ' emoticons_theme ' , ' ' )
2006-03-17 15:24:58 +01:00
return
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
reload ( emoticons )
emots = emoticons . emoticons
2005-04-16 16:50:26 +02:00
for emot in emots :
2006-03-17 00:37:06 +01:00
emot_file = os . path . join ( path , emots [ emot ] )
2005-04-06 20:51:54 +02:00
if not self . image_is_ok ( emot_file ) :
continue
2005-11-15 15:31:27 +01:00
# This avoids duplicated emoticons with the same image eg. :) and :-)
2005-11-15 12:52:40 +01:00
if not emot_file in self . emoticons . values ( ) :
if emot_file . endswith ( ' .gif ' ) :
pix = gtk . gdk . PixbufAnimation ( emot_file )
2006-03-17 00:37:06 +01:00
else :
pix = gtk . gdk . pixbuf_new_from_file ( emot_file )
2005-11-15 12:52:40 +01:00
self . emoticons_images . append ( ( emot , pix ) )
2005-09-08 12:11:30 +02:00
self . emoticons [ emot . upper ( ) ] = emot_file
2006-03-17 00:37:06 +01:00
sys . path . remove ( path )
2006-11-18 21:52:28 +01:00
del emoticons
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 ( )
2005-11-15 12:52:40 +01:00
2005-11-10 11:16:25 +01:00
def register_handlers ( self ) :
2005-08-09 19:21:35 +02:00
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 ,
' MSG ' : self . handle_event_msg ,
' MSGERROR ' : self . handle_event_msgerror ,
' MSGSENT ' : self . handle_event_msgsent ,
2006-12-06 17:19:47 +01:00
' MSGNOTSENT ' : self . handle_event_msgnotsent ,
2005-08-09 19:21:35 +02:00
' SUBSCRIBED ' : self . handle_event_subscribed ,
' UNSUBSCRIBED ' : self . handle_event_unsubscribed ,
' SUBSCRIBE ' : self . handle_event_subscribe ,
2005-10-30 10:58:13 +01:00
' AGENT_ERROR_INFO ' : self . handle_event_agent_info_error ,
' AGENT_ERROR_ITEMS ' : self . handle_event_agent_items_error ,
2006-05-01 20:29:12 +02:00
' AGENT_REMOVED ' : self . handle_event_agent_removed ,
2005-08-09 19:21:35 +02:00
' 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 ,
2007-06-03 12:04:20 +02:00
' NEW_ACC_CONNECTED ' : self . handle_event_new_acc_connected ,
' NEW_ACC_NOT_CONNECTED ' : self . handle_event_new_acc_not_connected ,
2005-08-09 19:21:35 +02:00
' ACC_OK ' : self . handle_event_acc_ok ,
2005-11-04 22:27:14 +01:00
' ACC_NOT_OK ' : self . handle_event_acc_not_ok ,
2005-08-09 19:21:35 +02:00
' MYVCARD ' : self . handle_event_myvcard ,
' VCARD ' : self . handle_event_vcard ,
2006-02-22 15:31:01 +01:00
' LAST_STATUS_TIME ' : self . handle_event_last_status_time ,
2005-08-09 19:21:35 +02:00
' OS_INFO ' : self . handle_event_os_info ,
2005-09-19 18:13:45 +02:00
' GC_NOTIFY ' : self . handle_event_gc_notify ,
2005-08-09 19:21:35 +02:00
' GC_MSG ' : self . handle_event_gc_msg ,
' GC_SUBJECT ' : self . handle_event_gc_subject ,
' GC_CONFIG ' : self . handle_event_gc_config ,
2007-08-09 17:39:18 +02:00
' GC_CONFIG_CHANGE ' : self . handle_event_gc_config_change ,
2005-09-11 17:02:22 +02:00
' GC_INVITATION ' : self . handle_event_gc_invitation ,
2006-01-16 12:16:06 +01:00
' GC_AFFILIATION ' : self . handle_event_gc_affiliation ,
2007-08-09 17:39:18 +02:00
' GC_PASSWORD_REQUIRED ' : self . handle_event_gc_password_required ,
2005-08-09 19:21:35 +02:00
' 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 ,
2006-09-13 18:47:58 +02:00
' CONNECTION_LOST ' : self . handle_event_connection_lost ,
2005-08-09 19:21:35 +02:00
' FILE_REQUEST ' : self . handle_event_file_request ,
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
' GMAIL_NOTIFY ' : self . handle_event_gmail_notify ,
2005-08-09 19:21:35 +02:00
' 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 ,
2005-09-10 11:25:06 +02:00
' VCARD_PUBLISHED ' : self . handle_event_vcard_published ,
' VCARD_NOT_PUBLISHED ' : self . handle_event_vcard_not_published ,
2005-09-27 00:29:52 +02:00
' ASK_NEW_NICK ' : self . handle_event_ask_new_nick ,
2005-11-27 13:42:42 +01:00
' SIGNED_IN ' : self . handle_event_signed_in ,
2006-03-24 13:55:56 +01:00
' METACONTACTS ' : self . handle_event_metacontacts ,
2006-07-21 15:52:36 +02:00
' ATOM_ENTRY ' : self . handle_atom_entry ,
2006-07-17 21:30:53 +02:00
' 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 ,
2007-01-11 21:21:53 +01:00
' PRIVACY_LIST_REMOVED ' : self . handle_event_privacy_list_removed ,
2006-11-18 21:52:28 +01:00
' ZC_NAME_CONFLICT ' : self . handle_event_zc_name_conflict ,
2007-06-03 12:04:20 +02:00
' 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 ,
2007-06-03 12:30:34 +02:00
' PEP_ACCESS_MODEL ' : self . handle_event_pep_access_model ,
2005-08-09 19:21:35 +02:00
}
2006-02-03 13:17:34 +01:00
gajim . handlers = self . handlers
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
'''
gajim . idlequeue . process ( )
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
2006-11-18 21:52:28 +01:00
def handle_event ( self , account , fjid , type_ ) :
2005-12-11 11:31:42 +01:00
w = None
2006-11-18 21:52:28 +01:00
resource = gajim . get_resource_from_jid ( fjid )
jid = gajim . get_jid_without_resource ( fjid )
2007-06-03 12:04:20 +02:00
if type_ in ( ' printed_gc_msg ' , ' printed_marked_gc_msg ' , ' gc_msg ' ) :
2006-03-15 09:40:19 +01:00
w = self . msg_win_mgr . get_window ( jid , account )
2007-08-09 17:39:18 +02:00
if self . minimized_controls [ account ] . has_key ( jid ) :
if not w :
ctrl = self . minimized_controls [ account ] [ jid ]
w = self . msg_win_mgr . create_window ( ctrl . contact , \
ctrl . account , ctrl . type_id )
self . roster . on_groupchat_maximized ( None , jid , account )
2006-11-18 21:52:28 +01:00
elif type_ in ( ' printed_chat ' , ' chat ' , ' ' ) :
# '' is for log in/out notifications
2006-03-25 18:05:54 +01:00
if self . msg_win_mgr . has_window ( fjid , account ) :
w = self . msg_win_mgr . get_window ( fjid , account )
2005-12-11 11:31:42 +01:00
else :
2006-11-18 21:52:28 +01: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 ) :
2006-11-21 21:26:44 +01:00
# remove resource of events too
gajim . events . change_jid ( account , fjid , jid )
2006-11-18 21:52:28 +01:00
resource = None
fjid = jid
2007-08-09 17:39:18 +02:00
contact = None
if resource :
contact = gajim . contacts . get_contact ( account , jid , resource )
if not contact :
2006-11-18 21:52:28 +01:00
contact = highest_contact
2006-03-25 18:05:54 +01:00
self . roster . new_chat ( contact , account , resource = resource )
w = self . msg_win_mgr . get_window ( fjid , account )
2006-03-14 18:13:34 +01:00
gajim . last_message_time [ account ] [ jid ] = 0 # long time ago
2006-09-13 18:47:58 +02:00
elif type_ in ( ' printed_pm ' , ' pm ' ) :
2006-03-27 23:35:24 +02:00
if self . msg_win_mgr . has_window ( fjid , account ) :
w = self . msg_win_mgr . get_window ( fjid , account )
2005-12-11 11:31:42 +01:00
else :
2006-03-27 23:35:24 +02:00
room_jid = jid
nick = resource
2006-01-02 02:23:40 +01:00
gc_contact = gajim . contacts . get_gc_contact ( account , room_jid ,
2006-09-13 18:47:58 +02:00
nick )
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 gc_contact :
show = gc_contact . show
2005-12-13 22:26:31 +01:00
else :
2005-12-13 22:28:02 +01:00
show = ' offline '
2006-09-13 18:47:58 +02:00
gc_contact = gajim . contacts . create_gc_contact (
room_jid = room_jid , name = nick , show = show )
2007-08-09 17:39:18 +02:00
self . roster . new_private_chat ( gc_contact , account )
2006-03-27 23:35:24 +02:00
w = self . msg_win_mgr . get_window ( fjid , account )
2006-09-13 18:47:58 +02:00
elif type_ in ( ' normal ' , ' file-request ' , ' file-request-error ' ,
' file-send-error ' , ' file-error ' , ' file-stopped ' , ' file-completed ' ) :
2005-12-11 11:31:42 +01:00
# Get the first single message event
2006-11-18 21:52:28 +01:00
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_ )
2007-08-09 17:39:18 +02:00
if not event :
return
2006-11-18 21:52:28 +01:00
# Open the window
self . roster . open_event ( account , jid , event )
2006-01-17 21:23:36 +01:00
else :
2006-11-18 21:52:28 +01:00
# Open the window
self . roster . open_event ( account , fjid , event )
elif type_ == ' gmail ' :
2007-08-09 17:39:18 +02:00
url = gajim . connections [ account ] . gmail_url
if url :
helpers . launch_browser_mailer ( ' url ' , url )
2006-09-13 18:47:58 +02:00
elif type_ == ' gc-invitation ' :
event = gajim . events . get_first_event ( account , jid , type_ )
data = event . parameters
2006-03-18 12:53:30 +01:00
dialogs . InvitationReceivedDialog ( account , data [ 0 ] , jid , data [ 2 ] ,
data [ 1 ] )
2006-09-13 18:47:58 +02:00
gajim . events . remove_events ( account , jid , event )
2006-11-18 21:52:28 +01:00
self . roster . draw_contact ( jid , account )
2005-12-11 11:31:42 +01:00
if w :
2006-03-25 18:05:54 +01:00
w . set_active_tab ( fjid , account )
2005-12-11 11:31:42 +01:00
w . window . present ( )
w . window . window . focus ( )
2006-03-25 18:05:54 +01:00
ctrl = w . get_control ( fjid , account )
2006-01-06 07:59:55 +01:00
# Using isinstance here because we want to catch all derived types
2006-01-12 00:21:00 +01:00
if isinstance ( ctrl , ChatControlBase ) :
tv = ctrl . conv_textview
2006-01-06 07:59:55 +01:00
tv . scroll_to_end ( )
2005-12-11 11:31:42 +01:00
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
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-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
2005-04-29 11:47:09 +02:00
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 ( )
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 )
2005-12-01 19:03:05 +01:00
gajim . config . set_per ( ' statusmsg ' , msg , ' message ' ,
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 ' ,
' groupfontattrs ' , ' contacttextcolor ' , ' contactbgcolor ' ,
' contactfont ' , ' contactfontattrs ' , ' bannertextcolor ' ,
' bannerbgcolor ' ]
2005-11-15 12:52:40 +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 ) ] )
2005-07-25 16:38:21 +02:00
if gajim . config . get ( ' autodetect_browser_mailer ' ) :
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 )
2006-02-03 23:54:05 +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 ,
self . handle_event_file_rcv_completed ,
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 ' )
2005-10-03 18:14:41 +02:00
2005-11-13 16:08:47 +01:00
self . instances = { ' logs ' : { } }
2005-10-03 18:14:41 +02:00
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 ] = { }
2005-04-12 17:30:09 +02:00
2005-10-20 13:17:17 +02:00
self . roster = roster_window . RosterWindow ( )
2005-11-19 23:01:10 +01:00
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
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 '
bus = dbus . SessionBus ( )
bus . add_signal_receiver ( gnome_screensaver_ActiveChanged_cb ,
' ActiveChanged ' , ' org.gnome.ScreenSaver ' )
2005-11-07 16:43:47 +01:00
self . show_vcard_when_connect = [ ]
2006-11-19 20:45:43 +01:00
path_to_file = os . path . join ( gajim . DATA_DIR , ' pixmaps ' , ' gajim.png ' )
2005-06-03 19:35:48 +02:00
pix = gtk . gdk . pixbuf_new_from_file ( path_to_file )
2006-11-19 20:45:43 +01:00
# set the icon to all newly opened windows
gtk . window_set_default_icon ( pix )
2005-06-03 19:35:48 +02:00
self . roster . window . set_icon_from_file ( path_to_file ) # and to roster window
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
2005-03-28 03:20:47 +02:00
self . systray_enabled = False
2005-08-11 15:20:46 +02:00
self . systray_capabilities = False
2006-11-18 21:52:28 +01:00
if os . name == ' nt ' and gtk . pygtk_version > = ( 2 , 10 , 0 ) and \
gtk . gtk_version > = ( 2 , 10 , 0 ) :
import statusicon
self . systray = statusicon . StatusIcon ( )
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
2005-11-15 12:52:40 +01:00
self . init_emoticons ( )
self . make_regexps ( )
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 )
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 :
gobject . timeout_add ( 2000 , self . process_connections )
gobject . timeout_add ( 10000 , 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 ( ) )
2005-10-10 15:12:28 +02:00
if os . name != ' nt ' :
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 ) :
gtk . main_quit ( )
gnome . program_init ( ' gajim ' , gajim . version )
cli = gnome . ui . master_client ( )
cli . connect ( ' die ' , die_cb )
2006-11-18 21:52:28 +01:00
path_to_gajim_script = gtkgui_helpers . get_abspath_for_script (
' gajim ' )
2005-10-10 15:12:28 +02: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 )
2005-10-13 21:44:33 +02:00
2006-09-13 18:47:58 +02:00
check_paths . check_and_possibly_create_paths ( )
2006-11-18 21:52:28 +01:00
2006-09-13 18:47:58 +02:00
Interface ( )
2006-04-08 03:11:11 +02:00
gtk . main ( )