2 * Thrasher Bird - XMPP transport via libpurple
3 * Copyright (C) 2008 Barracuda Networks, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with Thrasher Bird; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
27 %include libpurple
/conversation
.h
33 #include "thconnection.h"
39 Define a typemap that goes from perl hash to a
40 string -> string g_hash_table (that C subsequently owns)
42 Note that contrary to what I'd expect, this is actually keyed
43 off of the C variable name in the incoming function.
46 %typemap(in
) GHashTable
* hash_args
50 croak("$input is not a reference.");
53 if (SvTYPE(SvRV($input
)) != SVt_PVHV
)
55 croak("$input is not a hashref.");
58 $
1 = g_hash_table_new_full(g_str_hash
, g_str_equal
,
61 HV
*hv
= (HV
*)SvRV($input
);
69 while (elt
= hv_iternextsv(hv
, &key
, &len
) )
71 new_value
= SvPV(elt
, strlen
);
72 char *new_key
= g_strdup(key
);
73 new_value
= g_strdup(SvPV(elt
, strlen
));
75 g_hash_table_insert($
1, new_key
, new_value
);
79 /* Map GList of char* to a Perl string list. */
80 %typemap(out
) GList_String
* {
81 /* Push new Perl strings onto the Perl argument stack. */
87 ST(argvi
) = sv_newmortal();
89 (char *) c_list
->data
);
90 c_list
= g_list_next(c_list
);
106 #include <sys/types.h>
107 #include <sys/stat.h>
120 #include "eventloop.h"
122 /* We can't use the Glib macros because they're int-based */
123 #define LONG_TO_PTR(a) (void*) a
124 #define PTR_TO_LONG(a) (long) a
129 typedef struct _perl_callbacks
{
135 SV
*subscription_add
;
136 SV
*legacy_user_add_user
;
137 SV
*connection_error
;
139 SV
*incoming_chatstate
;
142 typedef struct _perl_ft_callbacks
{
143 SV
*ft_recv_request_cb
;
144 SV
*ft_recv_accept_cb
;
145 SV
*ft_recv_start_cb
;
146 SV
*ft_recv_cancel_cb
;
147 SV
*ft_recv_complete_cb
;
148 SV
*ft_send_accept_cb
;
149 SV
*ft_send_start_cb
;
150 SV
*ft_send_cancel_cb
;
151 SV
*ft_send_complete_cb
;
154 SV
*ft_data_not_sent_cb
;
162 typedef struct _hash_record
{
166 /* These values pertain only to type == INPUT_ADD */
167 PurpleInputCondition cond
;
171 typedef GList GList_String
;
173 /* Push the internal init through */
174 extern void thrasher_init();
176 void thrasher_blist_init();
177 void thrasher_connection_init();
180 int thrasher_action_login (GHashTable
*hash_args
);
181 int thrasher_action_logout (char *jid
);
182 void thrasher_action_debug_logged_in(void);
183 int thrasher_action_outgoing_msg (char *jid
, char *recipient
, char *message
);
184 void thrasher_action_outgoing_chatstate(char *jid
, char *recipient
, PurpleTypingState chatstate
);
185 int thrasher_action_presence (char *jid
, int status
, char *message
);
186 int thrasher_action_buddy_add (char *jid
, char *buddy_name
);
187 int thrasher_action_buddy_remove (char *jid
, char *buddy_name
);
188 void thrasher_action_buddy_authorize(char *jid
, char *legacy_username
);
189 void thrasher_action_buddy_deauthorize(char *jid
, char *legacy_username
);
190 GList_String
* thrasher_action_get_logged_in_jids();
192 void thrasher_perl_init(void);
193 void thrasher_purple_debug (int tf
);
196 void thrasher_action_ft_ui_ready(size_t id
);
197 void thrasher_action_ft_recv_request_respond(size_t id
, unsigned int accept
);
198 void thrasher_action_ft_cancel_local(size_t id
);
200 /* Perl-end Wrappers */
202 %varargs(1, SV
*cb_arg
= NULL
) thrasher_wrapper_init
;
204 void thrasher_wrapper_init (SV
*timeout_add_cb
,
206 SV
*source_remove_cb
,
209 SV
*subscription_add_cb
,
210 SV
*legacy_user_add_user_cb
,
211 SV
*connection_error_cb
,
215 void thrasher_wrapper_ft_init(SV
*ft_recv_request_cb
,
216 SV
*ft_recv_accept_cb
,
217 SV
*ft_recv_start_cb
,
218 SV
*ft_recv_cancel_cb
,
219 SV
*ft_recv_complete_cb
,
220 SV
*ft_send_accept_cb
,
221 SV
*ft_send_start_cb
,
222 SV
*ft_send_cancel_cb
,
223 SV
*ft_send_complete_cb
,
226 SV
*ft_data_not_sent_cb
);
228 int thrasher_wrapper_legacy_user_add_user(const char *jid
,
231 int thrasher_wrapper_subscription_add(const char *jid
,
235 int thrasher_wrapper_incoming_msg (const char *jid
,
239 PurpleMessageFlags flags
);
241 int thrasher_wrapper_connection (const char *jid
);
243 /* Would have to swig PurpleStatusPrimitive if Perl were to ever call this. */
244 int thrasher_wrapper_presence_in(const char *jid
,
248 const PurpleStatusPrimitive status
,
249 const char * message
);
251 int thrasher_wrapper_connection_error(const char *jid
,
252 const guint error_code
,
253 const char *message
);
255 int thrasher_wrapper_trigger_timeout_func(long key
);
256 int thrasher_wrapper_trigger_input_func(long fd
, SV
*cond
, long key
);
257 void thrasher_wrapper_destructor ();
259 void thrasher_wrapper_incoming_chatstate(PurpleAccount
* pa
, const char* who
, PurpleTypingState state
);
262 int thrasher_wrapper_call_source_remove (long key
);
263 long thrasher_wrapper_set_timeout_add (guint interval
, GSourceFunc function
, gpointer data
);
264 long thrasher_wrapper_set_input_add (guint fd
, PurpleInputCondition cond
, PurpleInputFunction func
, gpointer user_data
);
266 /* File transfer wrappers */
267 size_t thrasher_wrapper_send_file(const char *jid
, const char *who
, char *filename
, size_t size
, char *desc
);
268 int thrasher_wrapper_ft_send_start(guint id
);
269 void thrasher_wrapper_ft_send_cancel(guint id
);
270 void thrasher_wrapper_ft_send_complete(guint id
);
271 gssize
thrasher_wrapper_ft_read(guint id
, guchar
**buffer
, gssize size
);
272 void thrasher_wrapper_ft_data_not_sent(guint id
, const char *buffer
, gsize size
);
273 void thrasher_wrapper_ft_recv_request(PurpleXfer
*xfer
, const char* remote_filename
);
274 gssize
thrasher_wrapper_ft_write(guint id
, const char *buffer
, gssize size
);
275 void thrasher_wrapper_ft_recv_cancel(guint id
);
276 void thrasher_wrapper_ft_recv_complete(guint id
);
279 long thrasher_wrapper_trigger_timeout_add ();
280 long thrasher_wrapper_trigger_timeout_add2 ();
281 long thrasher_wrapper_trigger_timeout_add3 ();
282 int thrasher_wrapper_trigger_timeout_remove (long key
);
283 #endif /* TH_DEBUG */
285 #endif /* THPERL_H */