Modified account functions.
authorRagner Magalhaes <ragner.magalhaes@openbossa.org>
Tue, 2 Dec 2008 20:47:37 +0000 (20:47 +0000)
committerAnderson Briglia <anderson.briglia@openbossa.org>
Sat, 28 Feb 2009 21:11:13 +0000 (17:11 -0400)
Modifications:
 - Fixed account funcions.
 - Manage intern account dict.
 - Gets accounts of xml.
 - Added c_funcions: purple_accounts_find, purple_accounts_get_all and purple_accounts_add.

Signed-off-by: Dinorah Monteiro <dinorah.monteiro@indt.org.br>
Signed-off-by: Anderson Briglia <anderson.briglia@indt.org.br>

git-svn-id: https://garage.maemo.org/svn/carman/branches/carman-0.7-beta2/python-purple@1351 596f6dd7-e928-0410-a184-9e12fd12cf7e

account.pyx
libpurple/account.pxd
nullclient-ecore.py
purple.pyx

index e569c52..d3dbdbf 100644 (file)
@@ -33,17 +33,25 @@ cdef class Account:
 
     def __init__(self, char *username, char *protocol_id):
         cdef proxy.PurpleProxyInfo *c_proxyinfo
-        self.c_account = account.c_purple_account_new(username, protocol_id)
-        self.c_plugin = plugin.c_purple_plugins_find_with_id(protocol_id)
-        self.c_prpl_info = plugin.c_PURPLE_PLUGIN_PROTOCOL_INFO(self.c_plugin)
+        cdef account.PurpleAccount *acc = NULL
 
-        c_proxyinfo = account.c_purple_account_get_proxy_info(self.c_account)
-        if c_proxyinfo == NULL:
-            c_proxyinfo = proxy.c_purple_proxy_info_new()
-            proxy.c_purple_proxy_info_set_type(c_proxyinfo, proxy.PURPLE_PROXY_NONE)
-        account.c_purple_account_set_proxy_info(self.c_account, c_proxyinfo)
+        acc = account.c_purple_accounts_find(username, protocol_id)
+        if acc:
+            self.c_account = acc
+            c_proxyinfo = account.c_purple_account_get_proxy_info(self.c_account)
+        else:
+            self.c_account = account.c_purple_account_new(username, protocol_id)
+            c_proxyinfo = account.c_purple_account_get_proxy_info(self.c_account)
+            if c_proxyinfo == NULL:
+                c_proxyinfo = proxy.c_purple_proxy_info_new()
+                proxy.c_purple_proxy_info_set_type(c_proxyinfo, proxy.PURPLE_PROXY_NONE)
+                account.c_purple_account_set_proxy_info(self.c_account, c_proxyinfo)
         self.__proxy = ProxyInfo()
         self.__proxy.c_proxyinfo = c_proxyinfo
+        acc = NULL
+
+        self.c_plugin = plugin.c_purple_plugins_find_with_id(protocol_id)
+        self.c_prpl_info = plugin.c_PURPLE_PLUGIN_PROTOCOL_INFO(self.c_plugin)
 
     def __get_username(self):
         if self.c_account:
@@ -190,3 +198,6 @@ cdef class Account:
                     str_value = account.c_purple_account_get_string(self.c_account, setting, str_value)
 
             iter = iter.next
+
+    def save_into_xml(self):
+        account.c_purple_accounts_add(self.c_account)
index d72b8de..f0ca879 100644 (file)
@@ -152,3 +152,7 @@ cdef extern from "libpurple/account.h":
             (PurpleAccount *account, char *name, char *value)
     void c_purple_account_set_bool "purple_account_set_bool" \
             (PurpleAccount *account, char *name, glib.gboolean value)
+    PurpleAccount *c_purple_accounts_find "purple_accounts_find" \
+            (char *name, char *protocol)
+    glib.GList *c_purple_accounts_get_all "purple_accounts_get_all" ()
+    void c_purple_accounts_add "purple_accounts_add" (PurpleAccount *account)
index d2df7ff..fdaadd0 100644 (file)
@@ -108,6 +108,7 @@ class MainWindow:
         global conv_cbs
         global signal_cbs
         self.bt_cbs = {}
+        self.new_acc_bt_cbs = {}
         self.send_cbs = {}
         self.quit_cb = quit_cb
         conv_cbs["write_im"] = self._write_im_cb
@@ -122,13 +123,24 @@ class MainWindow:
         hbox_cmd.append(self.lcmd, etk.HBox.START, etk.HBox.START, 0)
         hbox_cmd.append(self.cmd_entry, etk.HBox.START, etk.HBox.EXPAND_FILL, 0)
 
+        vbox_accs = etk.VBox()
+        self.accslistmodel = etk.ListModel()
+        self.accslist = etk.List(model=self.accslistmodel,\
+                columns=[(10, etk.TextRenderer(slot=0),\
+                False)], selectable=True,\
+                animated_changes=True)
+        vbox_accs.append(self.accslist, etk.VBox.START, etk.VBox.EXPAND_FILL, 0)
+
         hbox_buttons = etk.HBox(homogeneous=False)
         send_bt = etk.Button(label="Send")
         send_bt.on_clicked(self._send_bt_cb)
         conn_bt = etk.Button(label="Connect")
-        conn_bt.on_clicked(self._conn_bt_cb)
+        conn_bt.on_clicked(self.login_window)
+        new_account_bt = etk.Button(label="New Account")
+        new_account_bt.on_clicked(self._new_account)
         hbox_buttons.append(send_bt, etk.HBox.START, etk.HBox.NONE, 0)
         hbox_buttons.append(conn_bt, etk.HBox.START, etk.HBox.NONE, 0)
+        hbox_buttons.append(new_account_bt, etk.HBox.START, etk.HBox.NONE, 0)
 
         hbox_panel = etk.HBox()
 
@@ -147,6 +159,7 @@ class MainWindow:
 
         hbox_panel.append(vbox_txt_area, etk.HBox.START, etk.HBox.EXPAND_FILL, 0)
         hbox_panel.append(vbox_buddies, etk.HBox.END, etk.HBox.EXPAND_FILL, 0)
+        hbox_panel.append(vbox_accs, etk.HBox.END, etk.HBox.EXPAND_FILL, 0)
 
         self.lstatus = etk.Label(text="Connection status")
 
@@ -160,6 +173,17 @@ class MainWindow:
         self.set_global_callbacks()
         self._window.show_all()
 
+    def login_window(self, pointer):
+        self.login_password = etk.Entry()
+        confirm_login_bt = etk.Button(label="Ok")
+        confirm_login_bt.on_clicked(self._conn_bt_cb)
+        vbox_login =  etk.VBox()
+        vbox_login.append(self.login_password, etk.VBox.START, etk.VBox.FILL, 0)
+        vbox_login.append(confirm_login_bt, etk.VBox.END, etk.VBox.NONE, 0)
+        self.login_win = etk.Window(title="Password", size_request=(190, 80),
+                child=vbox_login)
+        self.login_win.show_all()
+
     def set_global_callbacks(self):
         global cbs
         cbs["connection"]["connect_progress"] = self._purple_conn_status_cb
@@ -168,7 +192,8 @@ class MainWindow:
 
     def _conn_bt_cb(self, pointer):
         if self.bt_cbs.has_key("on_clicked"):
-            self.bt_cbs["on_clicked"]()
+            self.bt_cbs["on_clicked"](self.login_password.text)
+            self.login_win.destroy()
 
     def _send_bt_cb(self, pointer):
         bname = self.blist.selected_rows[0][0]
@@ -180,6 +205,20 @@ class MainWindow:
             print "Buddy not selected!"
         self.cmd_entry.text = ""
 
+    def selected_accs(self):
+        try:
+            acc = self.accslist.selected_rows[0][0]
+            if acc:
+                return acc
+            else:
+                return "None"
+        except:
+            return "None"
+
+    def _new_account(self, pointer):
+        if self.new_acc_bt_cbs.has_key("on_clicked"):
+            self.new_acc_bt_cbs["on_clicked"]()
+
     def _purple_conn_status_cb(self, txt, step, step_count):
             self.lstatus.text = txt
 
@@ -193,6 +232,10 @@ class MainWindow:
     def remove_buddy(self, bname):
         self.blistmodel.remove([bname])
 
+    def new_account(self, a):
+        if [a] not in self.accslistmodel.elements:
+            self.accslistmodel.append([a])
+
     def _purple_disconnected_status_cb(self):
         self.lstatus.text = "Disconnected"
 
@@ -203,6 +246,10 @@ class MainWindow:
         if callable(cb):
             self.bt_cbs["on_clicked"] = cb
 
+    def add_account_cb(self, cb):
+        if callable(cb):
+            self.new_acc_bt_cbs["on_clicked"] = cb
+
     def add_send_cb(self, cb):
         if callable(cb):
             self.send_cbs["on_clicked"] = cb
@@ -226,18 +273,18 @@ class NullClientPurple:
         self.window = MainWindow(self.quit)
         self.buddies = {} #all buddies
         self.conversations = {}
-        self.account = None
         self.protocol_id = "prpl-jabber"
-        self.username = "carmanplugintest@gmail.com"
-        self.password = "abc123def"
+        self.accs = None
 
         global cbs
         cbs["blist"]["update"] = self._purple_update_blist_cb
         self.p.purple_init(cbs)
+        self.p.accounts_init()
 
         #Initializing UI
         self.window.add_bt_conn_cb(self.connect)
         self.window.add_send_cb(self.send_msg)
+        self.window.add_account_cb(self.add_account)
         self.window.init_window()
 
     def _purple_update_blist_cb(self, type, name=None, alias=None, totalsize=None,\
@@ -264,20 +311,24 @@ class NullClientPurple:
             conv.initialize(self.account, "IM", bname)
             self.conversations[bname] = conv
 
-    def connect(self):
-        self.account = purple.Account(self.username, self.protocol_id)
-        self.account.password = self.password
-
-        self.account.proxy.set_type(purple.ProxyInfoType().HTTP)
-        self.account.proxy.set_host("172.18.216.211")
-        self.account.proxy.set_port(8080)
-
+    def connect(self, password):
+        username_acc = self.window.selected_accs()
+        self.account = self.p.account_verify(username_acc)
         self.account.get_protocol_options()
-
         self.account.set_enabled("carman-purple-python", True)
+        self.account.password = password
         self.p.connect()
         self.p.signal_connect("buddy-signed-off", self._purple_signal_sign_off_cb)
 
+    def add_account(self):
+        username = "carmanplugintest@gmail.com"
+        host = "172.18.216.211"
+        port = 8080
+        self.p.account_add(username, self.protocol_id, host, port)
+        self.accs = self.p.accounts_get_dict()
+        for acc in self.accs.keys():
+            self.window.new_account(acc)
+
     def send_msg(self, name, msg):
         if not self.conversations.has_key(name):
             conv = purple.Conversation()
index b3ab8b1..00ce7fc 100644 (file)
@@ -62,7 +62,11 @@ cdef class Purple:
     @parm app_name: Set application name.
     @parm default_path: Full path for libpurple user files.
     """
+
+    cdef object accounts
+
     def __init__(self, debug_enabled=True, app_name=__APP_NAME__, default_path=__DEFAULT_PATH__):
+        self.accounts = {}
         if app_name is not __APP_NAME__:
             __APP_NAME__ = app_name
 
@@ -285,6 +289,41 @@ cdef class Purple:
         acc = Account(username, protocol_id)
         return acc
 
+    def accounts_init(self):
+        cdef glib.GList *iter
+        cdef account.PurpleAccount *acc
+        iter = account.c_purple_accounts_get_all()
+        while iter:
+            acc = <account.PurpleAccount *> iter.data
+            if <account.PurpleAccount *>acc:
+                self.account_add(acc.username.split("/")[0], acc.protocol_id, "172.18.216.211", 8080)
+            iter = iter.next
+
+    def account_add(self, username, protocol_id, host, port):
+        if not self.account_verify(username):
+            acc = purple.Account(username, protocol_id)
+            self.accounts_add_dict(username, acc)
+            if not account.c_purple_accounts_find(username, protocol_id):
+                acc.proxy.set_type(purple.ProxyInfoType().HTTP)
+                acc.proxy.set_host(host)
+                acc.proxy.set_port(port)
+                acc.save_into_xml()
+        else:
+            print "Exists account"
+
+    def account_verify(self, acc_username):
+        if self.accounts:
+            for username in self.accounts.keys():
+                if acc_username == username:
+                    return self.accounts[username]
+        return None
+
+    def accounts_add_dict(self, username, acc):
+        self.accounts[username] = acc
+
+    def accounts_get_dict(self):
+        return self.accounts
+
 include "proxy.pyx"
 include "account.pyx"
 include "buddy.pyx"