Cosmetics.
[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 cdef extern from "libpurple/purple.h":
21     pass
22
23 cimport glib
24
25 cimport account
26 cimport buddyicon
27 cimport blist
28 cimport connection
29 cimport conversation
30 cimport core
31 cimport debug
32 cimport eventloop
33 cimport ft
34 cimport idle
35 cimport notify
36 cimport plugin
37 cimport pounce
38 cimport prefs
39 cimport proxy
40 cimport request
41 cimport roomlist
42 cimport signals
43 cimport status
44 cimport savedstatuses
45 cimport util
46
47 cdef extern from "c_purple.h":
48     void connect_to_signals_for_demonstration_purposes_only ()
49     glib.guint glib_input_add(glib.gint fd, eventloop.PurpleInputCondition condition, eventloop.PurpleInputFunction function, glib.gpointer data)
50
51 import ecore
52
53 __DEFAULT_PATH__ = "/tmp"
54 __APP_NAME__ = "carman-purple-python"
55 __APP_VERSION__ = "0.1"
56
57 cdef class Purple:
58     """ Purple class.
59
60     @parm debug_enabled: Toggle debug messages.
61     @parm app_name: Set application name.
62     @parm default_path: Full path for libpurple user files.
63     """
64
65     cdef core.PurpleCoreUiOps c_core_ui_ops
66     cdef eventloop.PurpleEventLoopUiOps c_eventloop_ui_ops
67     cdef glib.GHashTable *c_ui_info
68
69     def __init__(self, debug_enabled=True, app_name=__APP_NAME__, default_path=__DEFAULT_PATH__):
70         self.c_ui_info = NULL
71
72         if app_name is not __APP_NAME__:
73             __APP_NAME__ = app_name
74
75         if default_path is not __DEFAULT_PATH__:
76             __DEFAULT_PATH__ = default_path
77
78         debug.c_purple_debug_set_enabled(debug_enabled)
79         util.c_purple_util_set_user_dir(default_path)
80         plugin.c_purple_plugins_add_search_path(default_path)
81
82         # adds glib iteration inside ecore main loop
83         ecore.idler_add(self.__glib_iteration_when_idle)
84
85     def __del__(self):
86         core.c_purple_core_quit()
87
88     cdef void __core_ui_ops_ui_prefs_init(self):
89         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_prefs_init\n")
90         prefs.c_purple_prefs_load()
91
92         prefs.c_purple_prefs_add_none("/carman")
93
94     cdef void __core_ui_ops_debug_init(self):
95         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "debug_ui_init\n")
96
97     cdef void __core_ui_ops_ui_init(self):
98         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "ui_init\n")
99
100         # FIXME: Add core ui initialization here
101
102     cdef void __core_ui_ops_quit(self):
103         debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "core_ui_ops", "quit\n")
104
105         account.c_purple_accounts_set_ui_ops(NULL)
106         connection.c_purple_connections_set_ui_ops(NULL)
107         blist.c_purple_blist_set_ui_ops(NULL)
108         conversation.c_purple_conversations_set_ui_ops(NULL)
109         notify.c_purple_notify_set_ui_ops(NULL)
110         request.c_purple_request_set_ui_ops(NULL)
111         ft.c_purple_xfers_set_ui_ops(NULL)
112         roomlist.c_purple_roomlist_set_ui_ops(NULL)
113
114         if self.c_ui_info:
115             glib.g_hash_table_destroy(self.c_ui_info)
116
117     cdef glib.GHashTable *__core_ui_ops_get_ui_info(self):
118         if self.c_ui_info == NULL:
119             self.c_ui_info = glib.g_hash_table_new(glib.g_str_hash, glib.g_str_equal)
120
121             glib.g_hash_table_insert(self.c_ui_info, "name", <glib.gpointer> __APP_NAME__)
122             glib.g_hash_table_insert(self.c_ui_info, "version", <glib.gpointer> __APP_VERSION__)
123         return self.c_ui_info
124
125     def __glib_iteration_when_idle(self):
126         glib.g_main_context_iteration(NULL, False)
127         return True
128
129     def purple_init(self):
130         """ Initializes libpurple """
131         # initialize c_core_ui_ops structure
132         self.c_core_ui_ops.ui_prefs_init = <void (*)()> self.__core_ui_ops_ui_prefs_init
133         self.c_core_ui_ops.debug_ui_init = <void (*)()> self.__core_ui_ops_debug_init
134         self.c_core_ui_ops.ui_init = <void (*)()> self.__core_ui_ops_ui_init
135         self.c_core_ui_ops.quit = <void (*)()> self.__core_ui_ops_quit
136         self.c_core_ui_ops.get_ui_info = <glib.GHashTable* (*)()> self.__core_ui_ops_get_ui_info
137
138         core.c_purple_core_set_ui_ops(&self.c_core_ui_ops)
139
140         # initialize c_eventloop_ui_ops structure
141         self.c_eventloop_ui_ops.timeout_add = glib.g_timeout_add
142         self.c_eventloop_ui_ops.timeout_remove = glib.g_source_remove
143         self.c_eventloop_ui_ops.input_add = glib_input_add
144         self.c_eventloop_ui_ops.input_remove = glib.g_source_remove
145         self.c_eventloop_ui_ops.input_get_error = NULL
146         self.c_eventloop_ui_ops.timeout_add_seconds = glib.g_timeout_add_seconds
147
148         eventloop.c_purple_eventloop_set_ui_ops(&self.c_eventloop_ui_ops)
149
150         # initialize purple core
151         ret = core.c_purple_core_init(__APP_NAME__)
152         if ret is False:
153             debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because libpurple initialization failed.\n")
154             return False
155
156         # check if there is another instance of libpurple running
157         if core.c_purple_core_ensure_single_instance() == False:
158             debug.c_purple_debug(debug.PURPLE_DEBUG_INFO, "main", "Exiting because another instance of libpurple is already running.\n")
159             core.c_purple_core_quit()
160             return False
161
162         # create and load the buddy list
163         blist.c_purple_set_blist(blist.c_purple_blist_new())
164         blist.c_purple_blist_load()
165
166         # load pounces
167         pounce.c_purple_pounces_load()
168
169         return ret
170
171     def get_protocols(self):
172         cdef glib.GList *iter
173         cdef plugin.PurplePlugin *__plugin
174         protocols = []
175         iter = plugin.c_purple_plugins_get_protocols()
176         while iter:
177             __plugin = <plugin.PurplePlugin*> iter.data
178             if __plugin.info and __plugin.info.name:
179                 protocols += [(__plugin.info.id, __plugin.info.name)]
180             iter = iter.next
181         return protocols
182
183     def connect(self):
184         conn = Connection()
185         conn.connect()
186
187 include "account.pyx"
188 include "buddy.pyx"
189 include "connection.pyx"
190 include "conversation.pyx"