Add class ProxyInfo
[python-purple] / purple.pyx
1 #
2 #  Copyright (c) 2008 INdT - Instituto Nokia de Tecnologia
3 #
4 #  This file is part of python-purple.
5 #
6 #  python-purple is free software: you can redistribute it and/or modify
7 #  it under the terms of the GNU General Public License as published by
8 #  the Free Software Foundation, either version 3 of the License, or
9 #  (at your option) any later version.
10 #
11 #  python-purple is distributed in the hope that it will be useful,
12 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #  GNU General Public License for more details.
15 #
16 #  You should have received a copy of the GNU General Public License
17 #  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #
19
20 cimport purple
21
22 cdef extern from "c_purple.h":
23     glib.guint glib_input_add(glib.gint fd, eventloop.PurpleInputCondition condition, eventloop.PurpleInputFunction function, glib.gpointer data)
24
25 import ecore
26
27 __DEFAULT_PATH__ = "/tmp"
28 __APP_NAME__ = "carman-purple-python"
29 __APP_VERSION__ = "0.1"
30
31 cdef class Purple:
32     """ Purple class.
33
34     @parm debug_enabled: Toggle debug messages.
35     @parm app_name: Set application name.
36     @parm default_path: Full path for libpurple user files.
37     """
38
39     cdef core.PurpleCoreUiOps c_core_ui_ops
40     cdef eventloop.PurpleEventLoopUiOps c_eventloop_ui_ops
41     cdef glib.GHashTable *c_ui_info
42
43     def __init__(self, debug_enabled=True, app_name=__APP_NAME__, default_path=__DEFAULT_PATH__):
44         self.c_ui_info = NULL
45
46         if app_name is not __APP_NAME__:
47             __APP_NAME__ = app_name
48
49         if default_path is not __DEFAULT_PATH__:
50             __DEFAULT_PATH__ = default_path
51
52         debug.c_purple_debug_set_enabled(debug_enabled)
53         util.c_purple_util_set_user_dir(default_path)
54         plugin.c_purple_plugins_add_search_path(default_path)
55
56         # adds glib iteration inside ecore main loop
57         ecore.idler_add(self.__glib_iteration_when_idle)
58
59     def __del__(self):
60         core.c_purple_core_quit()
61
62     cdef void __core_ui_ops_ui_prefs_init(self):
63         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_prefs_init\n")
64         prefs.c_purple_prefs_load()
65
66         prefs.c_purple_prefs_add_none("/carman")
67
68     cdef void __core_ui_ops_debug_init(self):
69         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "debug_ui_init\n")
70
71     cdef void __core_ui_ops_ui_init(self):
72         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_init\n")
73
74         # FIXME: Add core ui initialization here
75
76     cdef void __core_ui_ops_quit(self):
77         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "quit\n")
78
79         account.c_purple_accounts_set_ui_ops(NULL)
80         connection.c_purple_connections_set_ui_ops(NULL)
81         blist.c_purple_blist_set_ui_ops(NULL)
82         conversation.c_purple_conversations_set_ui_ops(NULL)
83         notify.c_purple_notify_set_ui_ops(NULL)
84         request.c_purple_request_set_ui_ops(NULL)
85         ft.c_purple_xfers_set_ui_ops(NULL)
86         roomlist.c_purple_roomlist_set_ui_ops(NULL)
87
88         if self.c_ui_info:
89             glib.g_hash_table_destroy(self.c_ui_info)
90
91     cdef glib.GHashTable *__core_ui_ops_get_ui_info(self):
92         if self.c_ui_info == NULL:
93             self.c_ui_info = glib.g_hash_table_new(glib.g_str_hash, glib.g_str_equal)
94
95             glib.g_hash_table_insert(self.c_ui_info, "name", <glib.gpointer> __APP_NAME__)
96             glib.g_hash_table_insert(self.c_ui_info, "version", <glib.gpointer> __APP_VERSION__)
97         return self.c_ui_info
98
99     def __glib_iteration_when_idle(self):
100         glib.g_main_context_iteration(NULL, False)
101         return True
102
103     def purple_init(self):
104         """ Initializes libpurple """
105         # initialize c_core_ui_ops structure
106         self.c_core_ui_ops.ui_prefs_init = <void (*)()> self.__core_ui_ops_ui_prefs_init
107         self.c_core_ui_ops.debug_ui_init = <void (*)()> self.__core_ui_ops_debug_init
108         self.c_core_ui_ops.ui_init = <void (*)()> self.__core_ui_ops_ui_init
109         self.c_core_ui_ops.quit = <void (*)()> self.__core_ui_ops_quit
110         self.c_core_ui_ops.get_ui_info = <glib.GHashTable* (*)()> self.__core_ui_ops_get_ui_info
111
112         core.c_purple_core_set_ui_ops(&self.c_core_ui_ops)
113
114         # initialize c_eventloop_ui_ops structure
115         self.c_eventloop_ui_ops.timeout_add = glib.g_timeout_add
116         self.c_eventloop_ui_ops.timeout_remove = glib.g_source_remove
117         self.c_eventloop_ui_ops.input_add = glib_input_add
118         self.c_eventloop_ui_ops.input_remove = glib.g_source_remove
119         self.c_eventloop_ui_ops.input_get_error = NULL
120         self.c_eventloop_ui_ops.timeout_add_seconds = glib.g_timeout_add_seconds
121
122         eventloop.c_purple_eventloop_set_ui_ops(&self.c_eventloop_ui_ops)
123
124         # initialize purple core
125         ret = core.c_purple_core_init(__APP_NAME__)
126         if ret is False:
127             debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because libpurple initialization failed.\n")
128             return False
129
130         # check if there is another instance of libpurple running
131         if core.c_purple_core_ensure_single_instance() == False:
132             debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because another instance of libpurple is already running.\n")
133             core.c_purple_core_quit()
134             return False
135
136         # create and load the buddy list
137         blist.c_purple_set_blist(blist.c_purple_blist_new())
138         blist.c_purple_blist_load()
139
140         # load pounces
141         pounce.c_purple_pounces_load()
142
143         return ret
144
145     def get_protocols(self):
146         cdef glib.GList *iter
147         cdef plugin.PurplePlugin *__plugin
148         protocols = []
149         iter = plugin.c_purple_plugins_get_protocols()
150         while iter:
151             __plugin = <plugin.PurplePlugin*> iter.data
152             if __plugin.info and __plugin.info.name:
153                 protocols += [(__plugin.info.id, __plugin.info.name)]
154             iter = iter.next
155         return protocols
156
157     def connect(self):
158         conn = Connection()
159         conn.connect()
160
161 include "proxy.pyx"
162 include "account.pyx"
163 include "buddy.pyx"
164 include "connection.pyx"
165 include "conversation.pyx"