first pass at stripping out the one-tab-per-session code

This commit is contained in:
Brendan Taylor 2008-06-26 23:36:58 +00:00
parent 59b9e86fbb
commit e3613be1fa
10 changed files with 87 additions and 227 deletions

View File

@ -958,24 +958,20 @@ def get_chat_control(account, contact):
full_jid_with_resource += '/' + contact.resource full_jid_with_resource += '/' + contact.resource
highest_contact = gajim.contacts.get_contact_with_highest_priority( highest_contact = gajim.contacts.get_contact_with_highest_priority(
account, contact.jid) account, contact.jid)
# Look for a chat control that has the given resource, or default to # Look for a chat control that has the given resource, or default to
# one without resource # one without resource
ctrls = gajim.interface.msg_win_mgr.get_chat_controls(full_jid_with_resource, ctrl = gajim.interface.msg_win_mgr.get_control(full_jid_with_resource,
account) account)
if ctrls:
return ctrls[0]
elif not highest_contact or not highest_contact.resource:
# unknow contact or offline message
pass # fall through, handle this at the end
elif highest_contact and contact.resource != \
highest_contact.resource:
return None
ctrls = gajim.interface.msg_win_mgr.get_chat_controls(contact.jid, account) if ctrl:
if ctrls: return ctrl
return ctrls[0] elif highest_contact and highest_contact.resource and \
else: contact.resource != highest_contact.resource:
return None return None
else:
# unknown contact or offline message
return gajim.interface.msg_win_mgr.get_control(contact.jid, account)
def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): def reduce_chars_newlines(text, max_chars = 0, max_lines = 0):
'''Cut the chars after 'max_chars' on each line '''Cut the chars after 'max_chars' on each line

View File

@ -245,7 +245,9 @@ def user_nickname(items, name, jid):
for contact in gajim.contacts.get_contacts(name, user): for contact in gajim.contacts.get_contacts(name, user):
contact.contact_name = nick contact.contact_name = nick
gajim.interface.roster.draw_contact(user, name) gajim.interface.roster.draw_contact(user, name)
for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(user, name):
ctrl = gajim.interface.msg_win_mgr.get_control(user, name)
if ctrl:
ctrl.update_ui() ctrl.update_ui()
win = ctrl.parent_win win = ctrl.parent_win
win.redraw_tab(ctrl) win.redraw_tab(ctrl)

View File

@ -538,9 +538,9 @@ class Interface:
conn.disconnect_transfer(file_props) conn.disconnect_transfer(file_props)
return return
for ctrl in self.msg_win_mgr.get_chat_controls(jid_from, account): ctrl = self.msg_win_mgr.get_control(jid_from, account)
if ctrl.type_id == message_control.TYPE_GC: if ctrl and ctrl.type_id == message_control.TYPE_GC:
ctrl.print_conversation('Error %s: %s' % (array[2], array[1])) ctrl.print_conversation('Error %s: %s' % (array[2], array[1]))
def handle_event_con_type(self, account, con_type): def handle_event_con_type(self, account, con_type):
# ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp' # ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp'
@ -661,7 +661,8 @@ class Interface:
# disconnect sessions from this contact's chat controls so we # disconnect sessions from this contact's chat controls so we
# don't have to open a new tab if a new session comes in # don't have to open a new tab if a new session comes in
for ctrl in self.msg_win_mgr.get_chat_controls(jid, account): ctrl = self.msg_win_mgr.get_control(jid, account)
if ctrl:
ctrl.set_session(None) ctrl.set_session(None)
if contact1: if contact1:
@ -812,14 +813,10 @@ class Interface:
if len(jids) > 1: # it's a pm if len(jids) > 1: # it's a pm
nick = jids[1] nick = jids[1]
ctrl = None
if session: if session:
ctrl = session.control ctrl = session.control
else:
if not ctrl: ctrl = self.msg_win_mgr.get_control(full_jid_with_resource, account)
ctrls = self.msg_win_mgr.get_chat_controls(full_jid_with_resource, account)
if ctrls:
ctrl = ctrls[0]
if not ctrl: if not ctrl:
tv = gc_control.list_treeview tv = gc_control.list_treeview
@ -1124,8 +1121,9 @@ class Interface:
if contact: if contact:
self.roster.draw_contact(room_jid, account) self.roster.draw_contact(room_jid, account)
# print status in chat windows and update status/GPG image # print status in chat window and update status/GPG image
for ctrl in self.msg_win_mgr.get_chat_controls(fjid, account): ctrl = self.msg_win_mgr.get_control(fjid, account)
if ctrl:
statusCode = array[9] statusCode = array[9]
if '303' in statusCode: if '303' in statusCode:
new_nick = array[10] new_nick = array[10]
@ -1817,24 +1815,25 @@ class Interface:
gajim.connections[account].change_status('offline','') gajim.connections[account].change_status('offline','')
def handle_event_ping_sent(self, account, contact): def handle_event_ping_sent(self, account, contact):
for ctrl in self.msg_win_mgr.get_chat_controls(contact.jid, account): for jid in [contact.jid, contact.get_full_jid()]:
ctrl.print_conversation(_('Ping?'), 'status') ctrl = self.msg_win_mgr.get_control(jid, account)
for ctrl in self.msg_win_mgr.get_chat_controls(contact.get_full_jid(), account): if ctrl:
ctrl.print_conversation(_('Ping?'), 'status') ctrl.print_conversation(_('Ping?'), 'status')
def handle_event_ping_reply(self, account, data): def handle_event_ping_reply(self, account, data):
contact = data[0] contact = data[0]
seconds = data[1] seconds = data[1]
for ctrl in self.msg_win_mgr.get_chat_controls(contact.jid, account):
ctrl.print_conversation(_('Pong! (%s s.)') % seconds, 'status') for jid in [contact.jid, contact.get_full_jid()]:
for ctrl in self.msg_win_mgr.get_chat_controls(contact.get_full_jid(), account): ctrl = self.msg_win_mgr.get_control(jid, account)
ctrl.print_conversation(_('Pong! (%s s.)') % seconds, 'status') if ctrl:
ctrl.print_conversation(_('Pong! (%s s.)') % seconds, 'status')
def handle_event_ping_error(self, account, contact): def handle_event_ping_error(self, account, contact):
for ctrl in self.msg_win_mgr.get_chat_controls(contact.jid, account): for jid in [contact.jid, contact.get_full_jid()]:
ctrl.print_conversation(_('Error.'), 'status') ctrl = self.msg_win_mgr.get_control(jid, account)
for ctrl in self.msg_win_mgr.get_chat_controls(contact.get_full_jid(), account): if ctrl:
ctrl.print_conversation(_('Error.'), 'status') ctrl.print_conversation(_('Error.'), 'status')
def handle_event_search_form(self, account, data): def handle_event_search_form(self, account, data):
# ('SEARCH_FORM', account, (jid, dataform, is_dataform)) # ('SEARCH_FORM', account, (jid, dataform, is_dataform))
@ -2126,10 +2125,7 @@ class Interface:
session = event.parameters[8] session = event.parameters[8]
ctrl = session.control ctrl = session.control
elif type_ == '': elif type_ == '':
ctrls = self.msg_win_mgr.get_chat_controls(fjid, account) ctrl = self.msg_win_mgr.get_control(fjid, account)
if ctrls:
ctrl = ctrls[0]
if not ctrl: if not ctrl:
highest_contact = gajim.contacts.get_contact_with_highest_priority( highest_contact = gajim.contacts.get_contact_with_highest_priority(
@ -2578,10 +2574,9 @@ class Interface:
contact = self.roster.add_to_not_in_the_roster(account, jid, contact = self.roster.add_to_not_in_the_roster(account, jid,
resource=resource) resource=resource)
ctrls = self.msg_win_mgr.get_chat_controls(fjid, account) ctrl = self.msg_win_mgr.get_control(fjid, account)
if ctrls:
ctrl = ctrls[0] if not ctrl:
else:
ctrl = self.new_chat(contact, account, ctrl = self.new_chat(contact, account,
resource=resource) resource=resource)
if len(gajim.events.get_events(account, fjid)): if len(gajim.events.get_events(account, fjid)):

View File

@ -907,12 +907,15 @@ class GroupchatControl(ChatControlBase):
fjid = self.room_jid + '/' + nick fjid = self.room_jid + '/' + nick
gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid,
nick) nick)
for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(fjid, self.account):
ctrl = gajim.interface.msg_win_mgr.get_control(fjid, self.account)
if ctrl:
gc_contact.show = 'offline' gc_contact.show = 'offline'
gc_contact.status = '' gc_contact.status = ''
ctrl.update_ui() ctrl.update_ui()
if ctrl.parent_win: if ctrl.parent_win:
ctrl.parent_win.redraw_tab(ctrl) ctrl.parent_win.redraw_tab(ctrl)
gajim.contacts.remove_gc_contact(self.account, gc_contact) gajim.contacts.remove_gc_contact(self.account, gc_contact)
gajim.gc_connected[self.account][self.room_jid] = False gajim.gc_connected[self.account][self.room_jid] = False
ChatControlBase.got_disconnected(self) ChatControlBase.got_disconnected(self)
@ -1620,7 +1623,7 @@ class GroupchatControl(ChatControlBase):
# Minimize it # Minimize it
win = gajim.interface.msg_win_mgr.get_window(self.contact.jid, win = gajim.interface.msg_win_mgr.get_window(self.contact.jid,
self.account) self.account)
ctrl = win.get_gc_control(self.contact.jid, self.account) ctrl = win.get_control(self.contact.jid, self.account)
ctrl_page = win.notebook.page_num(ctrl.widget) ctrl_page = win.notebook.page_num(ctrl.widget)
control = win.notebook.get_nth_page(ctrl_page) control = win.notebook.get_nth_page(ctrl_page)

View File

@ -140,13 +140,8 @@ class MessageControl:
if self.resource: if self.resource:
jid += '/' + self.resource jid += '/' + self.resource
self.parent_win.change_thread_key(jid, self.account,
oldsession.thread_id, new_key)
if oldsession.enable_encryption: if oldsession.enable_encryption:
self.print_esession_details() self.print_esession_details()
elif session:
self.parent_win.move_from_sessionless(self)
def send_message(self, message, keyID = '', type = 'chat', def send_message(self, message, keyID = '', type = 'chat',
chatstate = None, msg_id = None, composing_xep = None, resource = None, chatstate = None, msg_id = None, composing_xep = None, resource = None,

View File

@ -54,15 +54,10 @@ class MessageWindow(object):
) = range(5) ) = range(5)
def __init__(self, acct, type, parent_window=None, parent_paned=None): def __init__(self, acct, type, parent_window=None, parent_paned=None):
# A dictionary of dictionaries of dictionaries # A dictionary of dictionaries
# where _contacts[account][jid][thread_id] == A MessageControl # where _contacts[account][jid] == A MessageControl
self._controls = {} self._controls = {}
# a dictionary of dictionaries where
# sessionless_ctrls[account][jid] = a list of MessageControls that don't have
# sessions attached
self.sessionless_ctrls = {}
# If None, the window is not tied to any specific account # If None, the window is not tied to any specific account
self.account = acct self.account = acct
# If None, the window is not tied to any specific type # If None, the window is not tied to any specific type
@ -154,10 +149,6 @@ class MessageWindow(object):
self._controls[new_name] = self._controls[old_name] self._controls[new_name] = self._controls[old_name]
del self._controls[old_name] del self._controls[old_name]
if self.sessionless_ctrls.has_key(old_name):
self.sessionless_ctrls[new_name] = self.sessionless_ctrls[old_name]
del self.sessionless_ctrls[old_name]
for ctrl in self.controls(): for ctrl in self.controls():
if ctrl.account == old_name: if ctrl.account == old_name:
ctrl.account = new_name ctrl.account = new_name
@ -166,14 +157,8 @@ class MessageWindow(object):
def get_num_controls(self): def get_num_controls(self):
n = 0 n = 0
for jid_dict in self._controls.values(): for dict in self._controls.values():
for dict in jid_dict.values(): n += len(dict)
n += len(dict)
for jid_dict in self.sessionless_ctrls.values():
for ctrls in jid_dict.values():
n += len(ctrls)
return n return n
def resize(self, width, height): def resize(self, width, height):
@ -214,7 +199,6 @@ class MessageWindow(object):
for ctrl in self.controls(): for ctrl in self.controls():
ctrl.shutdown() ctrl.shutdown()
self._controls.clear() self._controls.clear()
self.sessionless_ctrls.clear()
# Clean up handlers connected to the parent window, this is important since # Clean up handlers connected to the parent window, this is important since
# self.window may be the RosterWindow # self.window may be the RosterWindow
for i in self.handlers.keys(): for i in self.handlers.keys():
@ -226,22 +210,10 @@ class MessageWindow(object):
def new_tab(self, control): def new_tab(self, control):
fjid = control.get_full_jid() fjid = control.get_full_jid()
if control.session: if not self._controls.has_key(control.account):
if not self._controls.has_key(control.account): self._controls[control.account] = {}
self._controls[control.account] = {}
if not self._controls[control.account].has_key(fjid): self._controls[control.account][fjid] = control
self._controls[control.account][fjid] = {}
self._controls[control.account][fjid][control.session.thread_id] = control
else:
if not self.sessionless_ctrls.has_key(control.account):
self.sessionless_ctrls[control.account] = {}
if not self.sessionless_ctrls[control.account].has_key(fjid):
self.sessionless_ctrls[control.account][fjid] = []
self.sessionless_ctrls[control.account][fjid].append(control)
if self.get_num_controls() == 2: if self.get_num_controls() == 2:
# is first conversation_textview scrolled down ? # is first conversation_textview scrolled down ?
@ -486,20 +458,10 @@ class MessageWindow(object):
self.notebook.remove_page(self.notebook.page_num(ctrl.widget)) self.notebook.remove_page(self.notebook.page_num(ctrl.widget))
if ctrl.session: del self._controls[ctrl.account][fjid]
dict = self._controls
idx = ctrl.session.thread_id
else:
dict = self.sessionless_ctrls
idx = dict[ctrl.account][fjid].index(ctrl)
del dict[ctrl.account][fjid][idx] if len(self._controls[ctrl.account]) == 0:
del self._controls[ctrl.account]
if len(dict[ctrl.account][fjid]) == 0:
del dict[ctrl.account][fjid]
if len(dict[ctrl.account]) == 0:
del dict[ctrl.account]
self.check_tabs() self.check_tabs()
self.show_title() self.show_title()
@ -601,16 +563,16 @@ class MessageWindow(object):
for ctrl in self.controls(): for ctrl in self.controls():
ctrl.update_tags() ctrl.update_tags()
def get_control(self, key, acct, thread_id): def get_control(self, key, acct):
'''Return the MessageControl for jid or n, where n is a notebook page index. '''Return the MessageControl for jid or n, where n is a notebook page index.
When key is an int index acct and thread_id may be None''' When key is an int index acct may be None'''
if isinstance(key, str): if isinstance(key, str):
key = unicode(key, 'utf-8') key = unicode(key, 'utf-8')
if isinstance(key, unicode): if isinstance(key, unicode):
jid = key jid = key
try: try:
return self._controls[acct][jid][thread_id] return self._controls[acct][jid]
except: except:
return None return None
else: else:
@ -622,26 +584,11 @@ class MessageWindow(object):
return self._widget_to_control(nth_child) return self._widget_to_control(nth_child)
def has_control(self, jid, acct): def has_control(self, jid, acct):
sessioned = (acct in self._controls and jid in self._controls[acct] \ return (acct in self._controls and jid in self._controls[acct])
and self._controls[acct][jid])
return sessioned or self.sessionless_controls(acct, jid)
def get_gc_control(self, jid, acct):
return self.get_control(jid, acct, 'gc')
def get_controls(self, jid, acct): def get_controls(self, jid, acct):
try: try:
sessioned = self._controls[acct][jid].values() return self._controls[acct][jid]
except KeyError:
sessioned = []
sessionless = self.sessionless_controls(acct, jid)
return sessioned + sessionless
def sessionless_controls(self, acct, jid):
try:
return self.sessionless_ctrls[acct][jid]
except KeyError: except KeyError:
return [] return []
@ -649,78 +596,22 @@ class MessageWindow(object):
'''Change the JID key of a control''' '''Change the JID key of a control'''
try: try:
# Check if controls exists # Check if controls exists
ctrls = self._controls[acct][old_jid] ctrl = self._controls[acct][old_jid]
except KeyError: except KeyError:
return return
self._controls[acct][new_jid] = ctrls
self._controls[acct][new_jid] = ctrl
del self._controls[acct][old_jid] del self._controls[acct][old_jid]
try:
ctrls = self.sessionless_ctrls[acct][old_jid]
except KeyError:
return
self.sessionless_ctrls[acct][new_jid] = ctrls
del self.sessionless_ctrls[acct][new_jid]
if old_jid in gajim.last_message_time[acct]: if old_jid in gajim.last_message_time[acct]:
gajim.last_message_time[acct][new_jid] = \ gajim.last_message_time[acct][new_jid] = \
gajim.last_message_time[acct][old_jid] gajim.last_message_time[acct][old_jid]
del gajim.last_message_time[acct][old_jid] del gajim.last_message_time[acct][old_jid]
def change_thread_key(self, jid, acct, old_thread_id, new_thread_id):
'''Change the thread_id key of a control'''
if jid in self._controls[acct]:
ctrl = self._controls[acct][jid][old_thread_id]
else:
jid = gajim.get_jid_without_resource(jid)
ctrl = self._controls[acct][jid][old_thread_id]
del self._controls[acct][jid][old_thread_id]
if new_thread_id:
self._controls[acct][jid][new_thread_id] = ctrl
else:
if acct not in self.sessionless_ctrls:
self.sessionless_ctrls[acct] = {}
if jid not in self.sessionless_ctrls[acct]:
self.sessionless_ctrls[acct][jid] = []
self.sessionless_ctrls[acct][jid].append(ctrl)
def move_from_sessionless(self, ctrl):
'''a control just got a session, move it to the proper holding cell'''
acct = ctrl.account
jid = ctrl.get_full_jid()
idx = self.sessionless_ctrls[acct][jid].index(ctrl)
del self.sessionless_ctrls[acct][jid][idx]
if len(self.sessionless_ctrls[acct][jid]) == 0:
del self.sessionless_ctrls[acct][jid]
if not self._controls.has_key(acct):
self._controls[acct] = {}
if not self._controls[acct].has_key(jid):
self._controls[acct][jid] = {}
thread_id = ctrl.session.thread_id
self._controls[acct][jid][thread_id] = ctrl
def controls(self): def controls(self):
for jid_dict in self._controls.values(): for jid_dict in self._controls.values():
for ctrl_dict in jid_dict.values(): for ctrl in jid_dict.values():
for ctrl in ctrl_dict.values(): yield ctrl
yield ctrl
for jid_dict in self.sessionless_ctrls.values():
for ctrl_dict in jid_dict.values():
for ctrl in ctrl_dict:
yield ctrl
def move_to_next_unread_tab(self, forward): def move_to_next_unread_tab(self, forward):
ind = self.notebook.get_current_page() ind = self.notebook.get_current_page()
@ -935,25 +826,6 @@ class MessageWindowMgr(gobject.GObject):
return None return None
def get_gc_control(self, jid, acct):
win = self.get_window(jid, acct)
if win:
return win.get_gc_control(jid, acct)
return None
def get_sessionless_ctrl(self, acct, jid):
'''returns a ChatControl associated with jid, that doesn't have a
session attached'''
mw = self.get_window(jid, acct)
if mw:
ctrls = mw.sessionless_controls(acct, jid)
if len(ctrls):
return ctrls[0]
def has_window(self, jid, acct): def has_window(self, jid, acct):
return self.get_window(jid, acct) is not None return self.get_window(jid, acct) is not None
@ -1084,13 +956,18 @@ class MessageWindowMgr(gobject.GObject):
del self._windows[k] del self._windows[k]
return return
def get_control(self, jid, acct, session): def get_control(self, jid, acct):
'''Amongst all windows, return the MessageControl for jid''' '''Amongst all windows, return the MessageControl for jid'''
win = self.get_window(jid, acct) win = self.get_window(jid, acct)
if win: if win:
return win.get_control(jid, acct, session) return win.get_control(jid, acct)
return None return None
def get_gc_control(self, jid, acct):
'''Same as get_control. Was briefly required, is not any more.
May be useful some day in the future?'''
return self.get_control(jid, acct)
def get_controls(self, type = None, acct = None): def get_controls(self, type = None, acct = None):
ctrls = [] ctrls = []
for c in self.controls(): for c in self.controls():
@ -1100,14 +977,6 @@ class MessageWindowMgr(gobject.GObject):
ctrls.append(c) ctrls.append(c)
return ctrls return ctrls
def get_chat_controls(self, jid, acct):
win = self.get_window(jid, acct)
if win:
return win.get_controls(jid, acct)
else:
return []
def windows(self): def windows(self):
for w in self._windows.values(): for w in self._windows.values():
yield w yield w

View File

@ -1517,8 +1517,8 @@ class RosterWindow:
# If we already have chat windows opened, update them with new contact # If we already have chat windows opened, update them with new contact
# instance # instance
for chat_control in gajim.interface.msg_win_mgr.get_chat_controls(ji, chat_control = gajim.interface.msg_win_mgr.get_control(ji, account)
account): if chat_control:
chat_control.contact = contact1 chat_control.contact = contact1
def _change_awn_icon_status(self, status): def _change_awn_icon_status(self, status):
@ -2581,9 +2581,10 @@ class RosterWindow:
keyID = keyID[0] keyID = keyID[0]
keys[contact.jid] = keyID keys[contact.jid] = keyID
for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(contact.jid, ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account)
account): if ctrl:
ctrl.update_ui() ctrl.update_ui()
keys_str = '' keys_str = ''
for jid in keys: for jid in keys:
keys_str += jid + ' ' + keys[jid] + ' ' keys_str += jid + ' ' + keys[jid] + ' '
@ -3939,11 +3940,10 @@ class RosterWindow:
# Update roster # Update roster
self.draw_avatar(jid, account) self.draw_avatar(jid, account)
# Update chat window # Update chat window
if gajim.interface.msg_win_mgr.has_window(jid, account):
win = gajim.interface.msg_win_mgr.get_window(jid, account) ctrl = gajim.interface.msg_win_mgr.get_control(jid, account)
for ctrl in win.get_chat_controls(jid, account): if ctrl and ctrl.type_id != message_control.TYPE_GC:
if win and ctrl.type_id != message_control.TYPE_GC: ctrl.show_avatar()
ctrl.show_avatar()
def on_roster_treeview_style_set(self, treeview, style): def on_roster_treeview_style_set(self, treeview, style):
'''When style (theme) changes, redraw all contacts''' '''When style (theme) changes, redraw all contacts'''

View File

@ -179,7 +179,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession):
if not self.control: if not self.control:
# look for an existing chat control without a session # look for an existing chat control without a session
ctrl = gajim.interface.msg_win_mgr.get_sessionless_ctrl(self.conn.name, jid) ctrl = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name)
if ctrl: if ctrl:
self.control = ctrl self.control = ctrl
self.control.set_session(self) self.control.set_session(self)

View File

@ -123,9 +123,9 @@ class VcardWindow:
# Update roster # Update roster
gajim.interface.roster.draw_avatar(jid, self.account) gajim.interface.roster.draw_avatar(jid, self.account)
# Update chat windows # Update chat windows
for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(jid, self.account): ctrl = gajim.interface.msg_win_mgr.get_control(jid, self.account)
if ctrl.type_id != message_control.TYPE_GC: if ctrl and ctrl.type_id != message_control.TYPE_GC:
ctrl.show_avatar() ctrl.show_avatar()
def on_vcard_information_window_destroy(self, widget): def on_vcard_information_window_destroy(self, widget):
if self.update_progressbar_timeout_id is not None: if self.update_progressbar_timeout_id is not None:

View File

@ -177,9 +177,9 @@ class TestChatControlSession(unittest.TestCase):
msgtxt = 'testing one two three' msgtxt = 'testing one two three'
ctrl = MockChatControl() ctrl = MockChatControl()
gajim.interface.msg_win_mgr = Mock({'get_sessionless_ctrl': ctrl}) gajim.interface.msg_win_mgr = Mock({'get_control': ctrl})
gajim.interface.msg_win_mgr.mockSetExpectation('get_sessionless_ctrl', gajim.interface.msg_win_mgr.mockSetExpectation('get_control',
expectParams(account_name, jid)) expectParams(jid, account_name))
self.receive_chat_msg(fjid, msgtxt) self.receive_chat_msg(fjid, msgtxt)