diff --git a/data/glade/zeroconf_information_window.glade b/data/glade/zeroconf_information_window.glade new file mode 100644 index 000000000..8cdf7e891 --- /dev/null +++ b/data/glade/zeroconf_information_window.glade @@ -0,0 +1,666 @@ + + + + + + + 12 + Contact Information + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + + + + + + True + False + 12 + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + True + GTK_POS_TOP + False + False + + + + 12 + True + False + 12 + + + + True + 4 + 2 + False + 6 + 12 + + + + True + Local jid: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + Resource: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + Status: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + + + + + + + True + False + False + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 1 + 2 + 1 + 2 + + + + + + + True + True + False + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 1 + 2 + 2 + 3 + fill + fill + + + + + + True + True + _Log conversation history + True + GTK_RELIEF_NORMAL + True + True + False + True + + + 0 + 2 + 3 + 4 + fill + + + + + + 0 + True + True + + + + + + True + False + 0 + + + + True + False + False + + + + + True + 0.5 + 0 + 0 + 0 + + + + + 0 + False + False + + + + + + + + + 0 + True + True + + + + + False + True + + + + + + True + Contact + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 16 + True + 4 + 2 + False + 6 + 12 + + + + True + Jabber ID: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + E-Mail: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + True + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + Last Name: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + First Name: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + expand + + + + + + True + True + + False + False + GTK_JUSTIFY_LEFT + False + True + 0 + 0 + 5 + 5 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + True + True + + + + + + True + Personal + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 0 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + True + True + + + + + + + diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 51a94a64a..96b6b1653 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -73,7 +73,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): #we don't need a password, but must be non-empty self.password = 'zeroconf' - #XXX use that somewhere self.autoconnect = False self.sync_with_global_status = True self.no_log_for = False @@ -86,10 +85,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): else: gajim.config.set('usegpg', False) - self.on_connect_success = None - self.on_connect_failure = None - self.retrycount = 0 - self.jids_for_auto_auth = [] # list of jid to auto-authorize self.get_config_values_or_default() self.zeroconf = zeroconf.Zeroconf(self._on_new_service, self._on_remove_service, self._on_name_conflictCB, @@ -148,9 +143,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): gajim.log.debug('reconnect') signed = self.get_signed_msg(self.status) - + self.reconnect() + def quit(self, kill_core): - if kill_core and self.connected > 1: self.disconnect() @@ -445,19 +440,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def request_last_status_time(self, jid, resource): gajim.log.debug('This should not happen (request_last_status_time)') - + def request_os_info(self, jid, resource): - ''' - if not self.connection: - return - to_whom_jid = jid - if resource: - to_whom_jid += '/' + resource - iq = common.xmpp.Iq(to = to_whom_jid, typ = 'get', queryNS =\ - common.xmpp.NS_VERSION) - self.connection.send(iq) - ''' - pass + gajim.log.debug('This should not happen (request_os_info)') def get_settings(self): gajim.log.debug('This should not happen (get_settings)') @@ -474,39 +459,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def send_agent_status(self, agent, ptype): gajim.log.debug('This should not happen (send_agent_status)') - def join_gc(self, nick, room, server, password): - gajim.log.debug('This should not happen (join_gc)') - - def send_gc_message(self, jid, msg): - gajim.log.debug('This should not happen (send_gc_message)') - - def send_gc_subject(self, jid, subject): - gajim.log.debug('This should not happen (send_gc_subject)') - - def request_gc_config(self, room_jid): - gajim.log.debug('This should not happen (request_gc_config)') - - def change_gc_nick(self, room_jid, nick): - gajim.log.debug('This should not happen (change_gc_nick)') - - def send_gc_status(self, nick, jid, show, status): - gajim.log.debug('This should not happen (send_gc_status)') - - def gc_set_role(self, room_jid, nick, role, reason = ''): - gajim.log.debug('This should not happen (gc_set_role)') - - def gc_set_affiliation(self, room_jid, jid, affiliation, reason = ''): - gajim.log.debug('This should not happen (gc_set_affiliation)') - - def send_gc_affiliation_list(self, room_jid, list): - gajim.log.debug('This should not happen (send_gc_affiliation_list)') - - def get_affiliation_list(self, room_jid, affiliation): - gajim.log.debug('This should not happen (get_affiliation_list)') - - def send_gc_config(self, room_jid, config): - gajim.log.debug('This should not happen (send_gc_config)') - def gpg_passphrase(self, passphrase): if USE_GPG: use_gpg_agent = gajim.config.get('use_gpg_agent') @@ -527,30 +479,6 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): return keys return None - def change_password(self, password): - if not self.connection: - return - ''' - hostname = gajim.config.get_per('accounts', self.name, 'hostname') - username = gajim.config.get_per('accounts', self.name, 'name') - iq = common.xmpp.Iq(typ = 'set', to = hostname) - q = iq.setTag(common.xmpp.NS_REGISTER + ' query') - q.setTagData('username',username) - q.setTagData('password',password) - self.connection.send(iq) - ''' - pass - - def unregister_account(self, on_remove_success): - gajim.log.debug('This should not happen (unregister_account)') - - def send_invite(self, room, to, reason=''): - gajim.log.debug('This should not happen (send_invite)') - - def send_keepalive(self): - # nothing received for the last foo seconds (60 secs by default) - pass - def _event_dispatcher(self, realm, event, data): if realm == '': if event == common.xmpp.transports.DATA_RECEIVED: diff --git a/src/roster_window.py b/src/roster_window.py index a1acc6701..8a385e8a5 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1116,6 +1116,14 @@ class RosterWindow: else: info[contact.jid] = vcard.VcardWindow(contact, account) + def on_info_zeroconf(self, widget, contact, account): + info = gajim.interface.instances[account]['infos'] + if info.has_key(contact.jid): + info[contact.jid].window.present() + else: + info[contact.jid] = vcard.ZeroconfVcardWindow(contact, account) + + def show_tooltip(self, contact): pointer = self.tree.get_pointer() props = self.tree.get_path_at_pos(pointer[0], pointer[1]) @@ -1424,7 +1432,7 @@ class RosterWindow: send_file_menuitem.set_no_show_all(True) rename_menuitem.connect('activate', self.on_rename, iter, tree_path) - information_menuitem.connect('activate', self.on_info, contact, + information_menuitem.connect('activate', self.on_info_zeroconf, contact, account) history_menuitem.connect('activate', self.on_history, contact, account) @@ -1471,6 +1479,7 @@ class RosterWindow: event.time) return + # normal account xml = gtkgui_helpers.get_glade('roster_contact_context_menu.glade') roster_contact_context_menu = xml.get_widget( diff --git a/src/vcard.py b/src/vcard.py index 975d39a74..50346775c 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -315,6 +315,153 @@ class VcardWindow: self.fill_status_label() gajim.connections[self.account].request_vcard(self.contact.jid, self.is_fake) + + def on_close_button_clicked(self, widget): + self.window.destroy() + + +class ZeroconfVcardWindow: + def __init__(self, contact, account, is_fake = False): + # the contact variable is the jid if vcard is true + self.xml = gtkgui_helpers.get_glade('zeroconf_information_window.glade') + self.window = self.xml.get_widget('zeroconf_information_window') + + self.contact = contact + self.account = account + self.is_fake = is_fake + + # self.avatar_mime_type = None + # self.avatar_encoded = None + + self.fill_contact_page() + self.fill_personal_page() + + self.xml.signal_autoconnect(self) + self.window.show_all() + + def on_zeroconf_information_window_destroy(self, widget): + del gajim.interface.instances[self.account]['infos'][self.contact.jid] + + def on_zeroconf_information_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: + self.window.destroy() + + def on_log_history_checkbutton_toggled(self, widget): + #log conversation history? + oldlog = True + no_log_for = gajim.config.get_per('accounts', self.account, + 'no_log_for').split() + if self.contact.jid in no_log_for: + oldlog = False + log = widget.get_active() + if not log and not self.contact.jid in no_log_for: + no_log_for.append(self.contact.jid) + if log and self.contact.jid in no_log_for: + no_log_for.remove(self.contact.jid) + if oldlog != log: + gajim.config.set_per('accounts', self.account, 'no_log_for', + ' '.join(no_log_for)) + + def on_PHOTO_eventbox_button_press_event(self, widget, event): + '''If right-clicked, show popup''' + if event.button == 3: # right click + menu = gtk.Menu() + menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menuitem.connect('activate', + gtkgui_helpers.on_avatar_save_as_menuitem_activate, + self.contact.jid, self.account, self.contact.name + '.jpeg') + menu.append(menuitem) + menu.connect('selection-done', lambda w:w.destroy()) + # show the menu + menu.show_all() + menu.popup(None, None, None, event.button, event.time) + + def set_value(self, entry_name, value): + try: + if value and entry_name == 'URL_label': + if gtk.pygtk_version >= (2, 10, 0) and gtk.gtk_version >= (2, 10, 0): + widget = gtk.LinkButton(value, value) + else: + widget = gtk.Label(value) + table = self.xml.get_widget('personal_info_table') + table.attach(widget, 1, 4, 3, 4, yoptions = 0) + else: + self.xml.get_widget(entry_name).set_text(value) + except AttributeError: + pass + + def fill_status_label(self): + if self.xml.get_widget('information_notebook').get_n_pages() < 2: + return + contact_list = gajim.contacts.get_contact(self.account, self.contact.jid) + # stats holds show and status message + stats = '' + one = True # Are we adding the first line ? + if contact_list: + for c in contact_list: + if not one: + stats += '\n' + stats += helpers.get_uf_show(c.show) + if c.status: + stats += ': ' + c.status + if c.last_status_time: + stats += '\n' + _('since %s') % time.strftime('%c', + c.last_status_time).decode(locale.getpreferredencoding()) + one = False + else: # Maybe gc_vcard ? + stats = helpers.get_uf_show(self.contact.show) + if self.contact.status: + stats += ': ' + self.contact.status + status_label = self.xml.get_widget('status_label') + status_label.set_max_width_chars(15) + status_label.set_text(stats) + + tip = gtk.Tooltips() + status_label_eventbox = self.xml.get_widget('status_label_eventbox') + tip.set_tip(status_label_eventbox, stats) + + def fill_contact_page(self): + tooltips = gtk.Tooltips() + self.xml.get_widget('nickname_label').set_markup( + '' + + self.contact.get_shown_name() + + '') + self.xml.get_widget('local_jid_label').set_text(self.contact.jid) + + log = True + if self.contact.jid in gajim.config.get_per('accounts', self.account, + 'no_log_for').split(' '): + log = False + checkbutton = self.xml.get_widget('log_history_checkbutton') + checkbutton.set_active(log) + checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) + + resources = '%s (%s)' % (self.contact.resource, unicode( + self.contact.priority)) + uf_resources = self.contact.resource + _(' resource with priority ')\ + + unicode(self.contact.priority) + if not self.contact.status: + self.contact.status = '' + + # Request list time status + # gajim.connections[self.account].request_last_status_time(self.contact.jid, + # self.contact.resource) + + self.xml.get_widget('resource_prio_label').set_text(resources) + resource_prio_label_eventbox = self.xml.get_widget( + 'resource_prio_label_eventbox') + tooltips.set_tip(resource_prio_label_eventbox, uf_resources) + + self.fill_status_label() + + # gajim.connections[self.account].request_vcard(self.contact.jid, self.is_fake) + + def fill_personal_page(self): + contact = gajim.connections[gajim.ZEROCONF_ACC_NAME].roster.getItem(self.contact.jid) + self.xml.get_widget('first_name_label').set_text(contact['txt_dict']['1st']) + self.xml.get_widget('last_name_label').set_text(contact['txt_dict']['last']) + self.xml.get_widget('jabber_id_label').set_text(contact['txt_dict']['jid']) + self.xml.get_widget('email_label').set_text(contact['txt_dict']['email']) def on_close_button_clicked(self, widget): self.window.destroy()