Added glib iteration inside ecore main loop, fixed wrong function definition.
[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 include "glib.pxd"
21
22 import ecore
23
24 cdef extern from *:
25     ctypedef char* const_char_ptr "const char *"
26
27 cdef extern from "time.h":
28     ctypedef long int time_t
29
30 cdef extern from "libpurple/blist.h":
31     ctypedef struct PurpleBuddyList:
32         pass
33
34     void c_purple_set_blist "purple_set_blist" (PurpleBuddyList *list)
35     void c_purple_blist_load "purple_blist_load" ()
36     PurpleBuddyList* c_purple_blist_new "purple_blist_new" ()
37
38 cdef extern from "libpurple/core.h":
39     ctypedef struct PurpleCoreUiOps:
40         void (*ui_prefs_init) ()
41         void (*debug_ui_init) ()
42         void (*ui_init) ()
43         void (*quit) ()
44         GHashTable* (*get_ui_info) ()
45
46     gboolean c_purple_core_init "purple_core_init" (const_char_ptr ui_name)
47     void c_purple_core_quit "purple_core_quit" ()
48     void c_purple_core_set_ui_ops "purple_core_set_ui_ops" (PurpleCoreUiOps *ops)
49     gboolean c_purple_core_ensure_single_instance "purple_core_ensure_single_instance" ()
50
51 cdef extern from "libpurple/debug.h":
52     ctypedef enum PurpleDebugLevel:
53         PURPLE_DEBUG_ALL
54         PURPLE_DEBUG_MISC
55         PURPLE_DEBUG_INFO
56         PURPLE_DEBUG_WARNING
57         PURPLE_DEBUG_ERROR
58         PURPLE_DEBUG_FATAL
59
60     void c_purple_debug "purple_debug" (PurpleDebugLevel level, const_char_ptr category, const_char_ptr format)
61     void c_purple_debug_set_enabled "purple_debug_set_enabled" (gboolean debug_enabled)
62
63 cdef extern from "libpurple/eventloop.h":
64     ctypedef enum PurpleInputCondition:
65         PURPLE_INPUT_READ
66         PURPLE_INPUT_WRITE
67
68     ctypedef void (*PurpleInputFunction) (gpointer , gint, PurpleInputCondition)
69
70     ctypedef struct PurpleEventLoopUiOps:
71         guint (*timeout_add) (guint interval, GSourceFunc function, gpointer data)
72         gboolean (*timeout_remove) (guint handle)
73         guint (*input_add) (int fd, PurpleInputCondition cond, PurpleInputFunction func, gpointer user_data)
74         gboolean (*input_remove) (guint handle)
75         int (*input_get_error) (int fd, int *error)
76         guint (*timeout_add_seconds)(guint interval, GSourceFunc function, gpointer data)
77
78     void c_purple_eventloop_set_ui_ops "purple_eventloop_set_ui_ops" (PurpleEventLoopUiOps *ops)
79
80 cdef extern from "libpurple/plugin.h":
81     void c_purple_plugins_add_search_path "purple_plugins_add_search_path" (const_char_ptr path)
82
83 cdef extern from "libpurple/pounce.h":
84     gboolean c_purple_pounces_load "purple_pounces_load" ()
85
86 cdef extern from "libpurple/prefs.h":
87     void c_purple_prefs_add_none "purple_prefs_add_none" (const_char_ptr name)
88     void c_purple_prefs_rename "purple_prefs_rename" (const_char_ptr oldname, const_char_ptr newname)
89     const_char_ptr c_purple_prefs_get_string "purple_prefs_get_string" (const_char_ptr name)
90     gboolean c_purple_prefs_load "purple_prefs_load" ()
91
92 cdef extern from "libpurple/util.h":
93     void c_purple_util_set_user_dir "purple_util_set_user_dir" (char *dir)
94
95 cdef extern from "c_purple.h":
96      guint glib_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function, gpointer data)
97
98 __DEFAULT_PATH__ = "/home/user/MyDocs/Carman"
99 __APP_NAME__ = "carman-purple-python"
100 __APP_VERSION__ = "0.1"
101
102 global __DEFAULT_PATH__
103 global __APP_NAME__
104 global __APP_VERSION__
105
106 cdef class Purple:
107     """ Purple class """
108     cdef PurpleCoreUiOps c_core_ui_ops
109     cdef PurpleEventLoopUiOps c_eventloop_ui_ops
110     cdef GHashTable *c_ui_info
111
112     def __cinit__(self, debug_enabled=True, app_name=__APP_NAME__, default_path=__DEFAULT_PATH__):
113         self.c_ui_info = NULL
114
115         if app_name is not __APP_NAME__:
116             __APP_NAME__ = app_name
117
118         if default_path is not __DEFAULT_PATH__:
119             __DEFAULT_PATH__ = default_path
120
121         c_purple_debug_set_enabled(debug_enabled)
122         c_purple_util_set_user_dir(default_path)
123         c_purple_plugins_add_search_path(default_path)
124
125         # adds glib iteration inside ecore main loop
126         ecore.idler_add(self.__glib_iteration_when_idle)
127      # __cinit__
128
129     def __del__(self):
130         c_purple_core_quit()
131     # __del__
132
133     cdef void __core_ui_ops_ui_prefs_init(self):
134         c_purple_debug(PURPLE_DEBUG_INFO, "core_ui_ops", "ui_prefs_init\n")
135         c_purple_prefs_load()
136
137         c_purple_prefs_add_none("/carman")
138         c_purple_prefs_add_none("/carman/plugins")
139     # __core_ui_ops_ui_prefs_init
140
141     cdef void __core_ui_ops_debug_init(self):
142         c_purple_debug(PURPLE_DEBUG_INFO, "core_ui_ops", "debug_ui_init\n")
143     # __core_ui_ops_debug_init
144
145     cdef void __core_ui_ops_ui_init(self):
146         c_purple_debug(PURPLE_DEBUG_INFO, "core_ui_ops", "ui_init\n")
147     # __core_ui_ops_ui_init
148
149     cdef void __core_ui_ops_quit(self):
150         c_purple_debug(PURPLE_DEBUG_INFO, "core_ui_ops", "quit\n")
151     # __core_ui_ops_quit
152
153     cdef GHashTable *__core_ui_ops_get_ui_info(self):
154         if self.c_ui_info == NULL:
155             self.c_ui_info = g_hash_table_new(g_str_hash, g_str_equal)
156
157             g_hash_table_insert(self.c_ui_info, "name", <gpointer> __APP_NAME__)
158             g_hash_table_insert(self.c_ui_info, "version", <gpointer> __APP_VERSION__)
159         return self.c_ui_info
160     # __core_ui_ops_get_ui_info
161
162     def __glib_iteration_when_idle(self):
163         g_main_context_iteration(NULL, False)
164         return True
165     # __glib_iteration_when_idle
166
167     def purple_init(self):
168         """ Initializes libpurple """
169         # initialize c_core_ui_ops structure
170         self.c_core_ui_ops.ui_prefs_init = <void (*)()> self.__core_ui_ops_ui_prefs_init
171         self.c_core_ui_ops.debug_ui_init = <void (*)()> self.__core_ui_ops_debug_init
172         self.c_core_ui_ops.ui_init = <void (*)()> self.__core_ui_ops_ui_init
173         self.c_core_ui_ops.quit = <void (*)()> self.__core_ui_ops_quit
174         self.c_core_ui_ops.get_ui_info = <GHashTable* (*)()> self.__core_ui_ops_get_ui_info
175
176         c_purple_core_set_ui_ops(&self.c_core_ui_ops)
177
178         # initialize c_eventloop_ui_ops structure
179         self.c_eventloop_ui_ops.timeout_add = g_timeout_add
180         self.c_eventloop_ui_ops.timeout_remove = g_source_remove
181         self.c_eventloop_ui_ops.input_add = glib_input_add
182         self.c_eventloop_ui_ops.input_remove = g_source_remove
183         self.c_eventloop_ui_ops.input_get_error = NULL
184         self.c_eventloop_ui_ops.timeout_add_seconds = g_timeout_add_seconds
185
186         c_purple_eventloop_set_ui_ops(&self.c_eventloop_ui_ops)
187
188         # initialize purple core
189         ret = c_purple_core_init(__APP_NAME__)
190         if ret is False:
191             c_purple_debug(PURPLE_DEBUG_INFO, "main", "Exiting because libpurple initialization failed.\n")
192             return False
193
194         # check if there is another instance of libpurple running
195         if c_purple_core_ensure_single_instance() == False:
196             c_purple_debug(PURPLE_DEBUG_INFO, "main", "Exiting because another instance of libpurple is already running.\n")
197             c_purple_core_quit()
198             return False
199
200         # create and load the buddy list
201         c_purple_set_blist(c_purple_blist_new())
202         c_purple_blist_load()
203
204         # load pounces
205         c_purple_pounces_load()
206
207         return ret
208     # core_init
209
210 # Purple
211
212 include "core/account.pxd"
213 include "core/buddy.pxd"
214 #include "core/connection.pxd"
215 #include "core/core.pxd"
216 #include "core/idle.pxd"