Changeset 9614
- Timestamp:
- 05/11/08 03:19:59 (3 months ago)
- Files:
-
- trunk/src/chat_control.py (modified) (56 diffs)
- trunk/src/common/connection_handlers.py (modified) (19 diffs)
- trunk/src/common/events.py (modified) (2 diffs)
- trunk/src/common/gajim.py (modified) (2 diffs)
- trunk/src/common/stanza_session.py (modified) (8 diffs)
- trunk/src/common/zeroconf/connection_handlers_zeroconf.py (modified) (2 diffs)
- trunk/src/gajim.py (modified) (21 diffs)
- trunk/src/groupchat_control.py (modified) (14 diffs)
- trunk/src/message_control.py (modified) (4 diffs)
- trunk/src/message_window.py (modified) (12 diffs)
- trunk/src/notify.py (modified) (2 diffs)
- trunk/src/roster_window.py (modified) (20 diffs)
- trunk/src/session.py (added)
- trunk/src/tictactoe.py (added)
- trunk/src/vcard.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/chat_control.py
r9607 r9614 7 7 ## Copyright (C) 2007 Lukas Petrovicky <lukas@petrovicky.net> 8 8 ## Julien Pivotto <roidelapluie@gmail.com> 9 ## Stephan Erb <steve-e@h3c.de> 9 ## Stephan Erb <steve-e@h3c.de> 10 10 ## 11 11 ## This file is part of Gajim. … … 105 105 106 106 def draw_banner(self): 107 '''Draw the fat line at the top of the window that 108 houses the icon, jid, ... 107 '''Draw the fat line at the top of the window that 108 houses the icon, jid, ... 109 109 ''' 110 110 self.draw_banner_text() … … 134 134 helpers.launch_browser_mailer('url', url) 135 135 136 def __init__(self, type_id, parent_win, widget_name, contact, acct, 136 def __init__(self, type_id, parent_win, widget_name, contact, acct, 137 137 resource = None): 138 138 MessageControl.__init__(self, type_id, parent_win, widget_name, … … 239 239 gtk.DEST_DEFAULT_HIGHLIGHT, 240 240 self.dnd_list, gtk.gdk.ACTION_COPY) 241 241 242 242 self.update_font() 243 243 … … 267 267 # iterating on a copy 268 268 for lang in dict(langs): 269 try: 269 try: 270 270 spell.set_language(langs[lang]) 271 271 except: … … 331 331 menu.show_all() 332 332 333 # moved from ChatControl 333 # moved from ChatControl 334 334 def _on_banner_eventbox_button_press_event(self, widget, event): 335 335 '''If right-clicked, show popup''' … … 363 363 self.disconnect_style_event(self.banner_status_label) 364 364 if bgcolor: 365 banner_eventbox.modify_bg(gtk.STATE_NORMAL, 365 banner_eventbox.modify_bg(gtk.STATE_NORMAL, 366 366 gtk.gdk.color_parse(bgcolor)) 367 367 default_bg = False … … 392 392 widget.disconnect(id) 393 393 del self.handlers[id] 394 394 395 395 def connect_style_event(self, widget, set_fg = False, set_bg = False): 396 396 self.disconnect_style_event(widget) … … 399 399 400 400 def _on_style_set_event(self, widget, style, *opts): 401 '''set style of widget from style class *.Frame.Eventbox 401 '''set style of widget from style class *.Frame.Eventbox 402 402 opts[0] == True -> set fg color 403 403 opts[1] == True -> set bg color''' … … 565 565 else: # ENTER 566 566 send_message = True 567 567 568 568 if gajim.connections[self.account].connected < 2: # we are not connected 569 569 dialogs.ErrorDialog(_('A connection is not available'), … … 645 645 max_size = gajim.config.get('key_up_lines') 646 646 if size >= max_size: 647 for i in xrange(0, size - 1): 647 for i in xrange(0, size - 1): 648 648 self.sent_history[i] = self.sent_history[i + 1] 649 649 self.sent_history[max_size - 1] = message … … 694 694 # we want to have save this message in events list 695 695 # other_tags_for_text == ['marked'] --> highlighted gc message 696 type_ = 'printed_' + self.type_id697 event = 'message_received'698 696 if gc_message: 699 697 if 'marked' in other_tags_for_text: … … 702 700 type_ = 'printed_gc_msg' 703 701 event = 'gc_message_received' 702 else: 703 type_ = 'printed_' + self.type_id 704 event = 'message_received' 704 705 show_in_roster = notify.get_show_in_roster(event, 705 self.account, self.contact )706 self.account, self.contact, self.session) 706 707 show_in_systray = notify.get_show_in_systray(event, 707 708 self.account, self.contact, type_) 709 708 710 event = gajim.events.create_event(type_, None, 709 711 show_in_roster = show_in_roster, … … 723 725 kind in ('incoming', 'incoming_queue'): 724 726 self.parent_win.redraw_tab(self) 725 ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account)726 727 if not self.parent_win.is_active(): 727 self.parent_win.show_title(True, ctrl) # Enabled Urgent hint728 self.parent_win.show_title(True, self) # Enabled Urgent hint 728 729 else: 729 self.parent_win.show_title(False, ctrl) # Disabled Urgent hint730 self.parent_win.show_title(False, self) # Disabled Urgent hint 730 731 731 732 def toggle_emoticons(self): … … 857 858 # we don't want to always resize in height the message_textview 858 859 # so we have minimum on conversation_textview's scrolled window 859 # but we also want to avoid window resizing so if we reach that 860 # but we also want to avoid window resizing so if we reach that 860 861 # minimum for conversation_textview and maximum for message_textview 861 862 # we set to automatic the scrollbar policy … … 868 869 # scroll only when scrollbar appear 869 870 if policy != gtk.POLICY_AUTOMATIC: 870 self.msg_scrolledwindow.set_property('vscrollbar-policy', 871 self.msg_scrolledwindow.set_property('vscrollbar-policy', 871 872 gtk.POLICY_AUTOMATIC) 872 self.msg_scrolledwindow.set_property('height-request', 873 self.msg_scrolledwindow.set_property('height-request', 873 874 message_height + conversation_height - min_height) 874 875 self.bring_scroll_to_end(msg_textview) 875 876 else: 876 self.msg_scrolledwindow.set_property('vscrollbar-policy', 877 self.msg_scrolledwindow.set_property('vscrollbar-policy', 877 878 gtk.POLICY_NEVER) 878 879 self.msg_scrolledwindow.set_property('height-request', -1) … … 884 885 # if message we have in message_textview is too big 885 886 if requisition.width > message_width: 886 self.msg_scrolledwindow.set_property('hscrollbar-policy', 887 self.msg_scrolledwindow.set_property('hscrollbar-policy', 887 888 gtk.POLICY_AUTOMATIC) 888 889 else: 889 self.msg_scrolledwindow.set_property('hscrollbar-policy', 890 self.msg_scrolledwindow.set_property('hscrollbar-policy', 890 891 gtk.POLICY_NEVER) 891 892 … … 917 918 918 919 if not len(gajim.events.get_events(self.account, jid, types_list)): 919 return 920 return 920 921 if not self.parent_win: 921 922 return … … 924 925 self.parent_win.window.is_active(): 925 926 # we are at the end 926 if not gajim.events.remove_events(self.account, self.get_full_jid(), 927 types = types_list): 927 if not self.session.remove_events(types_list): 928 928 # There were events to remove 929 929 self.redraw_after_event_removed(jid) 930 930 931 931 def redraw_after_event_removed(self, jid): 932 ''' We just removed a 'printed_*' event, redraw contact in roster or 932 ''' We just removed a 'printed_*' event, redraw contact in roster or 933 933 gc_roster and titles in roster and msg_win ''' 934 934 self.parent_win.redraw_tab(self) … … 937 937 if self.type_id == message_control.TYPE_PM: 938 938 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) 939 groupchat_control = gajim.interface.msg_win_mgr.get_ control(939 groupchat_control = gajim.interface.msg_win_mgr.get_gc_control( 940 940 room_jid, self.account) 941 941 if room_jid in gajim.interface.minimized_controls[self.account]: … … 948 948 gajim.interface.roster.draw_contact(room_jid, self.account) 949 949 groupchat_control.draw_contact(nick) 950 mw = gajim.interface.msg_win_mgr.get_window(room_jid, self.account) 951 if mw: 952 mw.redraw_tab(groupchat_control) 950 if groupchat_control.parent_win: 951 groupchat_control.parent_win.redraw_tab(groupchat_control) 953 952 else: 954 953 gajim.interface.roster.draw_contact(jid, self.account) … … 956 955 957 956 def sent_messages_scroll(self, direction, conv_buf): 958 size = len(self.sent_history) 957 size = len(self.sent_history) 959 958 if self.orig_msg is None: 960 959 # user was typing something and then went into history, so save … … 1054 1053 self.widget_set_visible(self.xml.get_widget('banner_eventbox'), 1055 1054 gajim.config.get('hide_chat_banner')) 1056 1055 1057 1056 # Add lock image to show chat encryption 1058 1057 self.lock_image = self.xml.get_widget('lock_image') … … 1081 1080 gajim.connections[self.account].is_zeroconf: 1082 1081 convert_to_gc_button.set_sensitive(False) 1083 1082 1084 1083 # keep timeout id and window obj for possible big avatar 1085 1084 # it is on enter-notify and leave-notify so no need to be per jid … … 1127 1126 msg = _('GPG encryption enabled') 1128 1127 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1129 1128 1130 1129 if self.session: 1131 1130 self.session.loggable = gajim.config.get('log_encrypted_sessions') 1132 1131 self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ 1133 1132 self.session.is_loggable()) 1134 1133 1135 1134 self.status_tooltip = gtk.Tooltips() 1136 1135 … … 1155 1154 avatar_w = avatar_pixbuf.get_width() 1156 1155 avatar_h = avatar_pixbuf.get_height() 1157 1156 1158 1157 scaled_buf = self.xml.get_widget('avatar_image').get_pixbuf() 1159 1158 scaled_buf_w = scaled_buf.get_width() 1160 1159 scaled_buf_h = scaled_buf.get_height() 1161 1160 1162 1161 # do we have something bigger to show? 1163 1162 if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: … … 1165 1164 self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, 1166 1165 self.show_bigger_avatar, widget) 1167 1166 1168 1167 def on_avatar_eventbox_leave_notify_event(self, widget, event): 1169 1168 '''we left the eventbox area that holds the avatar img''' … … 1177 1176 menu = gtk.Menu() 1178 1177 menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) 1179 id = menuitem.connect('activate', 1178 id = menuitem.connect('activate', 1180 1179 gtkgui_helpers.on_avatar_save_as_menuitem_activate, 1181 1180 self.contact.jid, self.account, self.contact.get_shown_name() + \ … … 1184 1183 menu.append(menuitem) 1185 1184 menu.show_all() 1186 menu.connect('selection-done', lambda w:w.destroy()) 1185 menu.connect('selection-done', lambda w:w.destroy()) 1187 1186 # show the menu 1188 1187 menu.show_all() … … 1269 1268 1270 1269 def draw_banner_text(self): 1271 '''Draw the text in the fat line at the top of the window that 1272 houses the name, jid. 1270 '''Draw the text in the fat line at the top of the window that 1271 houses the name, jid. 1273 1272 ''' 1274 1273 contact = self.contact … … 1277 1276 banner_name_label = self.xml.get_widget('banner_name_label') 1278 1277 banner_eventbox = self.xml.get_widget('banner_eventbox') 1279 1278 1280 1279 name = contact.get_shown_name() 1281 1280 if self.resource: … … 1364 1363 self.gpg_is_active = False 1365 1364 msg = _('GPG encryption disabled') 1366 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1365 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1367 1366 if self.session: 1368 1367 self.session.loggable = True … … 1389 1388 gajim.config.set_per('contacts', self.contact.jid, 'gpg_enabled', 1390 1389 self.gpg_is_active) 1391 1390 1392 1391 self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ 1393 1392 self.session.is_loggable()) 1394 1393 1395 1394 def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, chat_logged = False): 1396 '''Set lock icon visibiity and create tooltip''' 1395 '''Set lock icon visibiity and create tooltip''' 1397 1396 status_string = enc_enabled and 'is' or 'is NOT' 1398 1397 logged_string = chat_logged and 'will' or 'will NOT' … … 1550 1549 # True refresh 30 seconds vars too or else it's 30 - 5 = 25 seconds! 1551 1550 self.reset_kbd_mouse_timeout_vars() 1552 return True # loop forever 1551 return True # loop forever 1553 1552 1554 1553 def check_for_possible_inactive_chatstate(self, arg): … … 1602 1601 ChatControlBase.print_conversation_line(self, msg, 'status', '', None) 1603 1602 self._show_lock_image(e2e_is_active, 'E2E', e2e_is_active, self.session and \ 1604 self.session.is_loggable()) 1603 self.session.is_loggable()) 1605 1604 1606 1605 def print_conversation(self, text, frm='', tim=None, encrypted=False, … … 1626 1625 if not encrypted: 1627 1626 msg = _('The following message was NOT encrypted') 1628 ChatControlBase.print_conversation_line(self, msg, 1627 ChatControlBase.print_conversation_line(self, msg, 1629 1628 'status', '', tim) 1630 1629 else: … … 1632 1631 if encrypted and not self.gpg_is_active: 1633 1632 msg = _('The following message was encrypted') 1634 ChatControlBase.print_conversation_line(self, msg, 1633 ChatControlBase.print_conversation_line(self, msg, 1635 1634 'status', '', tim) 1636 1635 self._toggle_gpg() … … 1673 1672 unread = '[' + unicode(num_unread) + ']' 1674 1673 1675 # Draw tab label using chatstate 1674 # Draw tab label using chatstate 1676 1675 theme = gajim.config.get('roster_theme') 1677 1676 color = None … … 1701 1700 else: # active or not chatstate, get color from gtk 1702 1701 color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] 1703 1702 1704 1703 1705 1704 name = self.contact.get_shown_name() … … 1720 1719 # Set tab image (always 16x16); unread messages show the 'event' image 1721 1720 tab_img = None 1722 1721 1723 1722 if num_unread and gajim.config.get('show_unread_tab_icon'): 1724 1723 img_16 = gajim.interface.roster.get_appropriate_state_images( … … 1761 1760 muc_icon = gtkgui_helpers.load_icon('muc_active') 1762 1761 if muc_icon: 1763 convert_to_gc_menuitem.set_image(muc_icon) 1762 convert_to_gc_menuitem.set_image(muc_icon) 1764 1763 1765 1764 ag = gtk.accel_groups_from_object(self.parent_win.window)[0] … … 1775 1774 contact = self.parent_win.get_active_contact() 1776 1775 jid = contact.jid 1777 1776 1778 1777 # check if we support and use gpg 1779 1778 if not gajim.config.get_per('accounts', self.account, 'keyid') or\ … … 1815 1814 1816 1815 # connect signals 1817 id = history_menuitem.connect('activate', 1816 id = history_menuitem.connect('activate', 1818 1817 self._on_history_menuitem_activate) 1819 1818 self.handlers[id] = history_menuitem 1820 id = send_file_menuitem.connect('activate', 1819 id = send_file_menuitem.connect('activate', 1821 1820 self._on_send_file_menuitem_activate) 1822 self.handlers[id] = send_file_menuitem 1821 self.handlers[id] = send_file_menuitem 1823 1822 id = add_to_roster_menuitem.connect('activate', 1824 1823 self._on_add_to_roster_menuitem_activate) … … 1827 1826 self._on_toggle_gpg_menuitem_activate) 1828 1827 self.handlers[id] = toggle_gpg_menuitem 1829 id = toggle_e2e_menuitem.connect('activate', 1828 id = toggle_e2e_menuitem.connect('activate', 1830 1829 self._on_toggle_e2e_menuitem_activate) 1831 self.handlers[id] = toggle_e2e_menuitem 1832 id = information_menuitem.connect('activate', 1830 self.handlers[id] = toggle_e2e_menuitem 1831 id = information_menuitem.connect('activate', 1833 1832 self._on_contact_information_menuitem_activate) 1834 1833 self.handlers[id] = information_menuitem … … 1886 1885 # this function checks for that and just returns so it's safe to call it 1887 1886 # with same state. 1888 1887 1889 1888 # This functions also checks for violation in state transitions 1890 1889 # and raises RuntimeException with appropriate message … … 1915 1914 return 1916 1915 1917 # if the new state we wanna send (state) equals 1916 # if the new state we wanna send (state) equals 1918 1917 # the current state (contact.our_chatstate) then return 1919 1918 if contact.our_chatstate == state: … … 1927 1926 # for that procedure so return to make sure we send only once 1928 1927 # 'active' until we know peer supports jep85 1929 return 1928 return 1930 1929 1931 1930 if contact.our_chatstate == 'ask': … … 1947 1946 contact.our_chatstate = 'active' 1948 1947 self.reset_kbd_mouse_timeout_vars() 1949 1948 1950 1949 # if we're inactive prevent composing (JEP violation) 1951 1950 elif contact.our_chatstate == 'inactive' and state == 'composing': … … 1964 1963 # destroy banner tooltip - bug #pygtk for that! 1965 1964 self.status_tooltip.destroy() 1965 1966 1966 # Send 'gone' chatstate 1967 1967 self.send_chatstate('gone', self.contact) 1968 1968 self.contact.chatstate = None 1969 1969 self.contact.our_chatstate = None 1970 1971 # terminate session 1972 self.session.control = None 1973 1970 1974 # Disconnect timer callbacks 1971 1975 gobject.source_remove(self.possible_paused_timeout_id) … … 1987 1991 1988 1992 def allow_shutdown(self, method): 1993 print repr(self.get_full_jid()) 1994 print repr(gajim.last_message_time[self.account]) 1989 1995 if time.time() - gajim.last_message_time[self.account]\ 1990 1996 [self.get_full_jid()] < 2: … … 2174 2180 self.print_esession_details() 2175 2181 2176 # Is it a pm ?2177 is_pm = False2178 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid)2179 control = gajim.interface.msg_win_mgr.get_control(room_jid, self.account)2180 if control and control.type_id == message_control.TYPE_GC:2181 is_pm = True2182 2182 # list of message ids which should be marked as read 2183 2183 message_ids = [] … … 2204 2204 2205 2205 typ = 'chat' # Is it a normal chat or a pm ? 2206 2206 2207 # reset to status image in gc if it is a pm 2207 if is_pm: 2208 # Is it a pm ? 2209 room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) 2210 control = gajim.interface.msg_win_mgr.get_gc_control(room_jid, 2211 self.account) 2212 if control and control.type_id == message_control.TYPE_GC: 2208 2213 control.update_ui() 2209 2214 control.parent_win.show_title() … … 2266 2271 if gtk.gtk_version >= (2, 10, 0) and gtk.pygtk_version >= (2, 10, 0): 2267 2272 window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) 2268 2273 2269 2274 window.realize() 2270 2275 window.window.set_back_pixmap(pixmap, False) # make it transparent 2271 2276 window.window.shape_combine_mask(mask, 0, 0) 2272 2277 2273 # make the bigger avatar window show up centered 2278 # make the bigger avatar window show up centered 2274 2279 x0, y0 = small_avatar.window.get_origin() 2275 2280 x0 += small_avatar.allocation.x … … 2277 2282 center_x= x0 + (small_avatar.allocation.width / 2) 2278 2283 center_y = y0 + (small_avatar.allocation.height / 2) 2279 pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) 2284 pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) 2280 2285 window.move(pos_x, pos_y) 2281 2286 # make the cursor invisible so we can see the image … … 2308 2313 else: 2309 2314 c = self.contact 2310 gajim.interface.instances['file_transfers'].show_file_send_request( 2315 gajim.interface.instances['file_transfers'].show_file_send_request( 2311 2316 self.account, c) 2312 2317 … … 2318 2323 2319 2324 def _on_toggle_gpg_menuitem_activate(self, widget): 2320 self._toggle_gpg() 2325 self._toggle_gpg() 2321 2326 2322 2327 def _on_convert_to_gc_menuitem_activate(self, widget): trunk/src/common/connection_handlers.py
r9607 r9614 50 50 from music_track_listener import MusicTrackListener 51 51 52 from common.stanza_session import EncryptedStanzaSession 52 from session import ChatControlSession 53 import tictactoe 53 54 54 55 STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', … … 995 996 996 997 self.awaiting_answers[id] = (VCARD_PUBLISHED, iq2) 997 998 998 999 def _IqCB(self, con, iq_obj): 999 1000 id = iq_obj.getID() … … 1047 1048 if iq_obj.getType() == 'error' and jid == our_jid: 1048 1049 # our server doesn't support vcard 1050 gajim.log.debug('xxx error xxx') 1049 1051 self.vcard_supported = False 1050 1052 if not iq_obj.getTag('vCard') or iq_obj.getType() == 'error': … … 1262 1264 1263 1265 con.send(reply) 1264 1266 1265 1267 raise common.xmpp.NodeProcessed 1266 1268 … … 1292 1294 errcode = iq_obj.getErrorCode() 1293 1295 self.dispatch('ERROR_ANSWER', (id, jid_from, errmsg, errcode)) 1294 1296 1295 1297 def _PrivateCB(self, con, iq_obj): 1296 1298 ''' … … 1500 1502 def _messageCB(self, con, msg): 1501 1503 '''Called when we receive a message''' 1504 gajim.log.debug('MessageCB') 1505 1502 1506 frm = helpers.get_full_jid_from_iq(msg) 1503 1507 mtype = msg.getType() … … 1507 1511 mtype = 'normal' 1508 1512 1509 if not mtype == 'groupchat': 1510 session = self.get_session(frm, thread_id, mtype) 1513 game_invite = msg.getTag('invite', namespace='http://jabber.org/protocol/games') 1514 if game_invite: 1515 game = game_invite.getTag('game') 1516 1517 if game.getAttr('var') == \ 1518 'http://jabber.org/protocol/games/tictactoe': 1519 klass = tictactoe.TicTacToeSession 1520 1521 # this assumes that the invitation came with a thread_id we haven't 1522 # seen 1523 session = self.make_new_session(frm, thread_id, klass=klass) 1524 1525 session.invited(msg) 1526 1527 return 1528 elif mtype != 'groupchat': 1529 session = self.get_or_create_session(frm, thread_id) 1511 1530 1512 1531 if thread_id and not session.received_thread_id: … … 1517 1536 self._pubsubEventCB(con, msg) 1518 1537 return 1519 # check if the message is a xep70-confirmation-request 1520 if msg.getTag('confirm') and msg.getTag('confirm').namespace == \1521 common.xmpp.NS_HTTP_AUTH:1538 1539 # check if the message is a XEP-0070 confirmation request 1540 if msg.getTag('confirm', namespace=common.xmpp.NS_HTTP_AUTH): 1522 1541 self._HttpAuthCB(con, msg) 1523 1542 return 1524 if msg.getTag('feature') and msg.getTag('feature').namespace == \ 1525 common.xmpp.NS_FEATURE: 1543 1544 # check if the message is a XEP-0020 feature negotiation request 1545 if msg.getTag('feature', namespace=common.xmpp.NS_FEATURE): 1526 1546 if gajim.HAVE_PYCRYPTO: 1527 1547 self._FeatureNegCB(con, msg, session) 1528 1548 return 1529 if msg.getTag('init') and msg.getTag('init').namespace == \ 1530 common.xmpp.NS_ESESSION_INIT: 1549 if msg.getTag('init', namespace=common.xmpp.NS_ESESSION_INIT): 1531 1550 self._InitE2ECB(con, msg, session) 1532 1551 1533 1552 encrypted = False 1534 1553 tim = msg.getTimestamp() … … 1536 1555 tim = localtime(timegm(tim)) 1537 1556 1538 e2e_tag = msg.getTag('c', namespace = common.xmpp.NS_STANZA_CRYPTO) 1539 if e2e_tag: 1557 if msg.getTag('c', namespace=common.xmpp.NS_STANZA_CRYPTO): 1540 1558 encrypted = True 1541 1559 … … 1543 1561 msg = session.decrypt_stanza(msg) 1544 1562 except: 1545 self.dispatch('FAILED_DECRYPT', (frm, tim ))1563 self.dispatch('FAILED_DECRYPT', (frm, tim, session)) 1546 1564 1547 1565 msgtxt = msg.getBody() 1548 msghtml = msg.getXHTML()1549 1566 subject = msg.getSubject() # if not there, it's None 1550 tim = msg.getTimestamp() 1551 tim = helpers.datetime_tuple(tim) 1552 tim = localtime(timegm(tim)) 1567 1553 1568 frm = helpers.get_full_jid_from_iq(msg) 1554 1569 jid = helpers.get_jid_from_iq(msg) 1570 1555 1571 addressTag = msg.getTag('addresses', namespace = common.xmpp.NS_ADDRESS) 1572 1556 1573 # Be sure it comes from one of our resource, else ignore address element 1557 1574 if addressTag and jid == gajim.get_jid_from_account(self.name): … … 1560 1577 frm = address.getAttr('jid') 1561 1578 jid = gajim.get_jid_without_resource(frm) 1562 no_log_for = gajim.config.get_per('accounts', self.name, 1563 'no_log_for') 1564 if not no_log_for: 1565 no_log_for = '' 1566 no_log_for = no_log_for.split() 1567 chatstate = None 1568 encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) 1569 decmsg = '' 1579 1570 1580 # invitations 1571 1581 invite = None 1582 encTag = msg.getTag('x', namespace=common.xmpp.NS_ENCRYPTED) 1583 1572 1584 if not encTag: 1573 1585 invite = msg.getTag('x', namespace = common.xmpp.NS_MUC_USER) 1574 1586 if invite and not invite.getTag('invite'): 1575 1587 invite = None 1576 delayed = msg.getTag('x', namespace = common.xmpp.NS_DELAY) is not None 1577 msg_id = None 1578 composing_xep = None 1588 1579 1589 # FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) do NOT RECOMMENDED 1580 1590 # invitation … … 1590 1600 is_continued)) 1591 1601 return 1592 form_node = None1593 for xtag in xtags:1594 if xtag.getNamespace() == common.xmpp.NS_DATA:1595 form_node = xtag1596 break1597 # chatstates - look for chatstate tags in a message if not delayed1598 if not delayed:1599 composing_xep = False1600 children = msg.getChildren()1601 for child in children:1602 if child.getNamespace() == 'http://jabber.org/protocol/chatstates':1603 chatstate = child.getName()1604 composing_xep = 'XEP-0085'1605 break1606 # No XEP-0085 support, fallback to XEP-00221607 if not chatstate:1608 chatstate_child = msg.getTag('x', namespace = common.xmpp.NS_EVENT)1609 if chatstate_child:1610 chatstate = 'active'1611 composing_xep = 'XEP-0022'1612 if not msgtxt and chatstate_child.getTag('composing'):1613 chatstate = 'composing'1614 # XEP-0172 User Nickname1615 user_nick = msg.getTagData('nick')1616 if not user_nick:1617 user_nick = ''1618 1602 1619 1603 if encTag and self.USE_GPG: 1620 #decrypt1621 1604 encmsg = encTag.getData() 1622 1605 … … 1625 1608 decmsg = self.gpg.decrypt(encmsg, keyID) 1626 1609 # \x00 chars are not allowed in C (so in GTK) 1627 decmsg = decmsg.replace('\x00', '') 1628 if decmsg: 1629 msgtxt = decmsg 1630 encrypted = True 1610 msgtxt = decmsg.replace('\x00', '') 1611 encrypted = True 1631 1612 if mtype == 'error': 1632 error_msg = msg.getErrorMsg() 1633 if not error_msg: 1634 error_msg = msgtxt 1635 msgtxt = None 1636 if session.is_loggable(): 1637 try: 1638 gajim.logger.write('error', frm, error_msg, tim = tim, 1639 subject = subject) 1640 except exceptions.PysqliteOperationalError, e: 1641 self.dispatch('ERROR', (_('Disk Write Error'), str(e))) 1642 self.dispatch('MSGERROR', (frm, msg.getErrorCode(), error_msg, msgtxt, 1643 tim)) 1644 return 1613 self.dispatch_error_message(msg, msgtxt, session, frm, tim, subject) 1645 1614 elif mtype == 'groupchat': 1646 has_timestamp = False 1647 if msg.timestamp: 1648 has_timestamp = True 1649 if subject is not None: 1650 self.dispatch('GC_SUBJECT', (frm, subject, msgtxt, has_timestamp)) 1615 self.dispatch_gc_message(msg, subject, frm, msgtxt, jid, tim) 1616 &
