# HG changeset patch # User Goffi # Date 1281590302 -28800 # Node ID ec6611445a5be1f928386917dbcaf8fb03e74cdc # Parent 726786e914c3a89220bf078352e20ec12fd7afb9 Primitivus: added Gateways support diff -r 726786e914c3 -r ec6611445a5b frontends/primitivus/gateways.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frontends/primitivus/gateways.py Thu Aug 12 13:18:22 2010 +0800 @@ -0,0 +1,86 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +Primitivus: a SAT frontend +Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) + +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, either version 3 of the License, or +(at your option) any later version. + +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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +import urwid +import custom_widgets +from tools.jid import JID +from quick_frontend.quick_gateways import QuickGatewaysManager + + +class GatewaysManager(urwid.WidgetWrap, QuickGatewaysManager): + + def __init__(self, host, gateways, title=_("Gateways manager"), server=None): + QuickGatewaysManager.__init__(self, host, gateways, server) + widget_list = urwid.SimpleListWalker([]) + widget_list.append(urwid.Text(self.WARNING_MSG)) + widget_list.append(urwid.Divider('-')) + for gateway in gateways: + self.addGateway(widget_list,gateway, gateways[gateway]) + widget_list.append(urwid.Divider()) + self.ext_serv = custom_widgets.AdvancedEdit(_("Use external XMPP server: ")) + go_button = custom_widgets.CustomButton( _("GO !"),self.browseExternalServer) + ext_serv_col = urwid.Columns([self.ext_serv,('fixed',go_button.getSize(),go_button)]) + widget_list.append(ext_serv_col) + list_wid = urwid.ListBox(widget_list) + decorated = custom_widgets.LabelLine(list_wid, custom_widgets.SurroundedText(title)) + urwid.WidgetWrap.__init__(self, decorated) + + def browseExternalServer(self, button): + """Open the gateway manager on given server""" + server = self.ext_serv.get_edit_text() + if not server: + popup = custom_widgets.Alert(_("Error"), _("You must enter an external server JID"), ok_cb=self.host.removePopUp) + self.host.showPopUp(popup) + return + id = self.host.bridge.findGateways(server, self.host.profile) + self.host.current_action_ids.add(id) + self.host.current_action_ids_cb[id] = self.host.onGatewaysFound + self.host.removeWindow() + + def addGateway(self, widget_list, gateway, param): + + widget_col = [] + widget_col.append(('weight',4,urwid.Text(unicode(param['name'])))) #FIXME: unicode to be remove when DBus bridge will not give dbus.String anymore + + #Then the transport type message + widget_col.append(('weight',6,urwid.Text(self.getGatewayDesc(param['type'])))) + + #The buttons + + reg_button = custom_widgets.CustomButton( _("Register"), self.onRegister) + reg_button.gateway_jid = JID(gateway) + widget_col.append(('fixed',reg_button.getSize(),reg_button)) + unreg_button = custom_widgets.CustomButton( _("Unregister"), self.onUnregister) + unreg_button.gateway_jid = JID(gateway) + widget_col.append(('fixed',unreg_button.getSize(),unreg_button)) + widget_list.append(urwid.Columns(widget_col,1)) + + def onRegister(self, button): + """Called when register button is clicked""" + gateway_jid = button.gateway_jid + id = self.host.bridge.in_band_register(gateway_jid, self.host.profile) + self.host.current_action_ids.add(id) + + def onUnregister(self, button): + """Called when unregister button is clicked""" + gateway_jid = button.gateway_jid + id = self.host.bridge.gatewayRegister("CANCEL",gateway_jid, None, self.host.profile) + self.host.current_action_ids.add(id) diff -r 726786e914c3 -r ec6611445a5b frontends/primitivus/primitivus --- a/frontends/primitivus/primitivus Thu Aug 12 13:18:11 2010 +0800 +++ b/frontends/primitivus/primitivus Thu Aug 12 13:18:22 2010 +0800 @@ -28,6 +28,7 @@ from profile_manager import ProfileManager from contact_list import ContactList from chat import Chat +from gateways import GatewaysManager import custom_widgets import pdb import logging @@ -191,6 +192,7 @@ menu.addMenu(contact, _("Remove contact"), self.onRemoveContactRequest) communication = _("Communication") menu.addMenu(communication, _("Join room"), self.onJoinRoomRequest, 'meta j') + menu.addMenu(communication, _("Find Gateways"), self.onFindGatewaysRequest, 'meta g') #additionals menus #FIXME: do this in a more generic way (in quickapp) add_menus = self.bridge.getMenus() @@ -316,12 +318,30 @@ misc = {} #FIXME FIXME FIXME: must clean all this crap ! title = _('Form') - if data['type'] == _('registration'): + if data['type'] == 'registration': title = _('Registration') misc['target'] = data['target'] misc['action_back'] = self.bridge.gatewayRegister ui = XMLUI(self, title=title, xml_data = data['xml'], misc = misc) - self.addWindow(ui) + if data['type'] == 'registration': + ui.show('popup') + else: + ui.show('window') + elif type == "ERROR": + self.current_action_ids.remove(id) + self.showPopUp(custom_widgets.Alert(_("Error"), unicode(data["message"]), ok_cb=self.removePopUp)) #FIXME: remove unicode here when DBus Bridge will no return dbus.String anymore + elif type == "RESULT": + self.current_action_ids.remove(id) + if self.current_action_ids_cb.has_key(id): + callback = self.current_action_ids_cb[id] + del self.current_action_ids_cb[id] + callback(data) + elif type == "DICT_DICT": + self.current_action_ids.remove(id) + if self.current_action_ids_cb.has_key(id): + callback = self.current_action_ids_cb[id] + del self.current_action_ids_cb[id] + callback(data) else: error (_("FIXME FIXME FIXME: type [%s] not implemented") % type) raise NotImplementedError @@ -335,7 +355,7 @@ else: message = _("'%s' is an invalid JID !") % room_jid error (message) - custom_widgets.Alert(_("Error"), message, ok_cb=self.removePopUp) + self.showPopUp(custom_widgets.Alert(_("Error"), message, ok_cb=self.removePopUp)) def onAddContact(self, button, edit): self.removePopUp() @@ -345,14 +365,14 @@ else: message = _("'%s' is an invalid JID !") % jid error (message) - custom_widgets.Alert(_("Error"), message, ok_cb=self.removePopUp) + self.showPopUp(custom_widgets.Alert(_("Error"), message, ok_cb=self.removePopUp)) def onRemoveContact(self, button): self.removePopUp() info(_("Unsubscribing %s presence"),self.contactList.get_contact()) self.bridge.delContact(self.contactList.get_contact(), profile_key=self.profile) - #Menu events# + #MENU EVENTS# def onConnectRequest(self, menu): self.bridge.connect(self.profile) @@ -371,6 +391,12 @@ pop_up_widget = custom_widgets.InputDialog(_("Entering a MUC room"), _("Please enter MUC's JID"), default_txt = 'test@conference.necton2.int', cancel_cb=self.removePopUp, ok_cb=self.onJoinRoom) self.showPopUp(pop_up_widget) + def onFindGatewaysRequest(self, e): + debug(_("Find Gateways request")) + id = self.bridge.findGateways(self.profiles[self.profile]['whoami'].domain, self.profile) + self.current_action_ids.add(id) + self.current_action_ids_cb[id] = self.onGatewaysFound + def onAddContactRequest(self, menu): pop_up_widget = custom_widgets.InputDialog(_("Adding a contact"), _("Please enter new contact JID"), default_txt = 'name@server.tld', cancel_cb=self.removePopUp, ok_cb=self.onAddContact) self.showPopUp(pop_up_widget) @@ -385,7 +411,15 @@ def onAboutRequest(self, menu): self.showPopUp(custom_widgets.Alert(_("About"), const_APP_NAME + " v" + self.bridge.getVersion(), ok_cb=self.removePopUp)) - + + #MISC CALLBACKS# + + def onGatewaysFound(self, data): + """Called when SàT has found the server gateways""" + target = data['__private__']['target'] + del data['__private__'] + gatewayManager = GatewaysManager(self, data, server=target) + self.addWindow(gatewayManager) sat = PrimitivusApp() sat.start() diff -r 726786e914c3 -r ec6611445a5b frontends/primitivus/profile_manager.py --- a/frontends/primitivus/profile_manager.py Thu Aug 12 13:18:11 2010 +0800 +++ b/frontends/primitivus/profile_manager.py Thu Aug 12 13:18:22 2010 +0800 @@ -38,8 +38,6 @@ self.list_profile = List(profiles, style=['single'], align='center', on_click=self.onProfileChange) - #toto = urwid.Padding(urwid.Text('toto'), align='center') - #new & delete buttons buttons = [urwid.Button(_("New"), self.onNewProfile), urwid.Button(_("Delete"), self.onDeleteProfile)] diff -r 726786e914c3 -r ec6611445a5b frontends/quick_frontend/quick_gateways.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/frontends/quick_frontend/quick_gateways.py Thu Aug 12 13:18:22 2010 +0800 @@ -0,0 +1,57 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +""" +helper class for making a SAT frontend +Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) + +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, either version 3 of the License, or +(at your option) any later version. + +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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + + + + +class QuickGatewaysManager(): + + + def __init__(self, host, gateways, title=_("Gateways manager"), server=None): + self.WARNING_MSG = _(u"""Be careful ! Gateways allow you to use an external IM (legacy IM), so you can see your contact as jabber contacts. +But when you do this, all your messages go throught the external legacy IM server, it is a huge privacy issue (i.e.: all your messages throught the gateway can be monitored, recorded, analyzed by the external server, most of time a private company).""") + self.host = host + + def getGatewayDesc(self, gat_type): + """Return a human readable description of gateway type + @param gat_type: type of gateway, as given by SàT""" + desc = _('Unknown IM') + + if gat_type == 'irc': + desc = "Internet Relay Chat" + elif gat_type == 'xmpp': + desc = "XMPP" + elif gat_type == 'qq': + desc = "Tencent QQ" + elif gat_type == 'simple': + desc = "SIP/SIMPLE" + elif gat_type == 'icq': + desc = "ICQ" + elif gat_type == 'yahoo': + desc = "Yahoo! Messenger" + elif gat_type == 'gadu-gadu': + desc = "Gadu-Gadu" + elif gat_type == 'aim': + desc = "AOL Instant Messenger" + elif gat_type == 'msn': + desc = 'Windows Live Messenger' + + return desc diff -r 726786e914c3 -r ec6611445a5b frontends/wix/gateways.py --- a/frontends/wix/gateways.py Thu Aug 12 13:18:11 2010 +0800 +++ b/frontends/wix/gateways.py Thu Aug 12 13:18:22 2010 +0800 @@ -26,15 +26,14 @@ from xml.dom import minidom from logging import debug, info, error from tools.jid import JID +from quick_frontend.quick_gateways import QuickGatewaysManager -WARNING_MSG = _(u"""Be careful ! Gateways allow you to use an external IM (legacy IM), so you can see your contact as jabber contacts. -But when you do this, all your messages go throught the external legacy IM server, it is a huge privacy issue (i.e.: all your messages throught the gateway can be monitored, recorded, analyzed by the external server, most of time a private company).""") +class GatewaysManager(wx.Frame,QuickGatewaysManager): -class GatewaysManager(wx.Frame): def __init__(self, host, gateways, title=_("Gateways manager"), server=None): - super(GatewaysManager, self).__init__(None, title=title) + wx.Frame.__init__(self, None, title=title) + QuickGatewaysManager.__init__(self, host, gateways, server) - self.host = host if server: self.SetTitle(title+" (%s)" % server) @@ -49,7 +48,7 @@ self.ctl_list = {} # usefull to access ctrl, key = (name, category) self.sizer = wx.BoxSizer(wx.VERTICAL) - warning = wx.TextCtrl(self, -1, value=WARNING_MSG, style = wx.TE_MULTILINE | + warning = wx.TextCtrl(self, -1, value=self.WARNING_MSG, style = wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_LEFT) warning.SetFont(self.bold_font) @@ -113,8 +112,6 @@ def addGateway(self, gateway, param): - - #First The icon isz = (16,16) @@ -126,29 +123,7 @@ label.SetFont(self.normal_font) #Then the transport type message - - type_label_txt = _('Unknown IM') - - if param['type'] == 'irc': - type_label_txt = "Internet Relay Chat" - elif param['type'] == 'xmpp': - type_label_txt = "XMPP" - elif param['type'] == 'qq': - type_label_txt = "Tencent QQ" - elif param['type'] == 'simple': - type_label_txt = "SIP/SIMPLE" - elif param['type'] == 'icq': - type_label_txt = "ICQ" - elif param['type'] == 'yahoo': - type_label_txt = "Yahoo! Messenger" - elif param['type'] == 'gadu-gadu': - type_label_txt = "Gadu-Gadu" - elif param['type'] == 'aim': - type_label_txt = "AOL Instant Messenger" - elif param['type'] == 'msn': - type_label_txt = 'Windows Live Messenger' - - type_label_txt = type_label_txt + type_label_txt = self.getGatewayDesc(param['type']) type_label = wx.StaticText(self.panel, -1, type_label_txt) type_label.SetFont(self.italic_font)