1 /*
2 ** TleenX2 (Tlen.pl Client)
3 ** Copyright (c) 2002-2003 Hubert Soko�owski <who_ami@tlen.pl>
4 ** Pawe� Bili�ski <rael@fr.pl>
5 **
6 ** This code is free software; you can redistribute it and/or
7 ** modify it under the terms of the GNU General Public License.
8 **
9 */
10
11 #include "main.h"
12 #include "jabby.h"
13 #include "utils.h"
14 #include "conffile.h"
15 #include "lista.h"
16 #include "users.h"
17 #include "chat.h"
18 #include "messages.h"
19 #include "jabber.h"
20 #include "windows.h"
21 #include "xmms-info.h"
22
23 static jabby_session *ses;
24 static gint jtimerid;
25
26 static gboolean gg_present;
27
jabber_presence(gint type,gchar * message,gchar * to)28 void jabber_presence(gint type, gchar *message, gchar *to)
29 {
30 jabby_presence(ses, type, message, to);
31 }
32
jabber_agent(gchar * jid,gchar * message)33 void jabber_agent(gchar *jid, gchar *message)
34 {
35 jabber_message(jid, message, JABBY_MESSAGE_CHAT);
36 }
37
jabber_gg_agent(gchar * message)38 void jabber_gg_agent(gchar *message)
39 {
40 jabber_message(profile->ggserver, message, JABBY_MESSAGE_CHAT);
41 }
42
jabber_gg_message(gchar * to,gchar * message)43 void jabber_gg_message(gchar *to, gchar *message)
44 {
45 gchar *jid;
46
47 if(!strchr(to, '@'))
48 jid = g_strdup_printf("%s@%s", to, profile->ggserver);
49 else
50 jid = g_strdup(to);
51 jabber_message(jid, message, JABBY_MESSAGE_CHAT);
52 g_free(jid);
53 }
54
jabber_register_gg()55 void jabber_register_gg()
56 {
57 jabby_register_to(ses, profile->ggserver, profile->ggnumber,
58 profile->ggpassword);
59 }
60
jabber_register_sms()61 void jabber_register_sms()
62 {
63 jabby_register_to(ses, profile->sms, profile->smsid,
64 profile->smspassword);
65 }
66
jabber_unregister_gg()67 void jabber_unregister_gg()
68 {
69 jabby_register_to(ses, profile->ggserver, "","");
70 }
71
jabber_registered_to_sms()72 gboolean jabber_registered_to_sms()
73 {
74 gchar *jid;
75 struct user *u;
76
77 jid = g_strdup_printf("%s/registered", profile->sms);
78 u = get_user(jid);
79 g_free(jid);
80 if(!u)
81 return FALSE;
82 if(strcmp(u->subscription, "both"))
83 return FALSE;
84 return TRUE;
85 }
86
jabber_registered_to_gg()87 gboolean jabber_registered_to_gg()
88 {
89 gchar *jid;
90 struct user *u;
91
92 jid = g_strdup_printf("%s/registered", profile->ggserver);
93 u = get_user(jid);
94 g_free(jid);
95 if(!u)
96 return FALSE;
97 if(strcmp(u->subscription, "both"))
98 return FALSE;
99 return TRUE;
100 }
101
102 //gboolean jabber_gg_set()
103 //{
104 // if(strlen(profile->ggnumber) && strlen(profile->ggpassword))
105 // return TRUE;
106 // return FALSE;
107 //}
108
jabber_get_agents()109 void jabber_get_agents()
110 {
111 gg_present = FALSE;
112 jabby_get_agents(ses);
113 }
114
jabber_subscribe_accept(gchar * jid)115 void jabber_subscribe_accept(gchar *jid)
116 {
117 jabby_subscribe_accept(ses, jid);
118 }
119
jabber_subscribe_deny(gchar * jid)120 void jabber_subscribe_deny(gchar *jid)
121 {
122 jabby_subscribe_deny(ses, jid);
123 }
124
jabber_subscribe_ask(gchar * jid)125 void jabber_subscribe_ask(gchar *jid)
126 {
127 jabby_subscribe_ask(ses, jid, NULL);
128 }
129
jabber_message(gchar * to,gchar * message,gint type)130 void jabber_message(gchar *to, gchar *message, gint type)
131 {
132 gchar *s = utf(message);
133
134 jabby_message(ses, to, NULL, s, NULL, type);
135 g_free(s);
136 }
137
jabber_contact_delete(struct user * user)138 void jabber_contact_delete(struct user *user)
139 {
140 jabby_contact_remove(ses, user->jid);
141 if(subscription_to(user))
142 jabby_unsubscribe(ses, user->jid);
143 if(subscription_from(user))
144 jabby_subscribe_deny(ses, user->jid);
145 }
146
jabber_contact_add(gchar * name,gchar * jid,gchar * group)147 void jabber_contact_add(gchar *name, gchar *jid, gchar *group)
148 {
149 jabby_contact_add(ses, name, jid, group);
150 }
151
jabber_logged()152 gboolean jabber_logged()
153 {
154 if(ses)
155 if(ses->state == JABBY_NET_ON)
156 return TRUE;
157 return FALSE;
158 }
159
jabber_created()160 gboolean jabber_created()
161 {
162 return ses ? TRUE : FALSE;
163 }
164
jabber_new()165 void jabber_new()
166 {
167 gchar *id;
168
169 id = "asd";
170 id = g_strdup_printf("%s@%s/%s", profile->jlogin, profile->jserver,
171 profile->jresource);
172 ses = jabby_session_new(id, profile->jpassword);
173 g_free(id);
174 }
175
jabber_timer(gpointer g)176 static gint jabber_timer(gpointer g)
177 {
178 jabby_event *event;
179 struct user *user;
180 gchar *ask, *name, *group;
181 gint type;
182
183 event = jabby_event_next(ses);
184 if(!event)
185 return TRUE;
186
187 switch(event->type)
188 {
189 case JABBY_EVENT_UNAUTHORIZED:
190 info("B��d podczas logowania do serwera Jabber.");
191 jabby_disconnect(ses);
192 jabby_session_free(ses);
193 ses = NULL;
194 return FALSE;
195 break;
196 case JABBY_EVENT_CONNECTION_FAILED:
197 info("Nie mo�na po��czy� si� z serwerem Jabbera");
198 jabby_disconnect(ses);
199 jabby_session_free(ses);
200 status_jabber_button_set(JABBY_PRESENCE_UNAVAILABLE);
201 status_gg_button_set(JABBY_PRESENCE_UNAVAILABLE);
202 ses = NULL;
203 return FALSE;
204 break;
205 case JABBY_EVENT_ROSTER_ITEM:
206 ask = event->event.roster->ask;
207 name = event->event.roster->name;
208 group = event->event.roster->group;
209 type = get_type(event->event.roster->jid);
210 g_print("got user %s ask: %s group: %s\n",event->event.roster->jid,
211 event->event.roster->ask, group );
212 // if(type == USER_AGENT)
213 // break;
214 name = fromutf(name);
215 group = fromutf(group);
216 if(!get_user(event->event.roster->jid))
217 add_user(name?name:"",
218 event->event.roster->jid,
219 group?group:"",
220 event->event.roster->subscription,
221 "",
222 ask?ask:"",
223 JABBY_PRESENCE_UNAVAILABLE + 2, type);
224 g_free(name);
225 g_free(group);
226 break;
227 case JABBY_EVENT_ROSTER_END:
228 jabby_presence(ses, t_status_map[status], "", NULL);
229 status_jabber_button_set(t_status_map[status]);
230 refresh_gui();
231 // xmms_info_check();
232 if(profile->ggnumber && profile->ggpassword)
233 jabber_get_agents();
234 break;
235 case JABBY_EVENT_MESSAGE:
236 {
237 gint type;
238
239 type = event->event.message->type;
240 g_print("message from %s: %s\n",event->event.message->from,
241 event->event.message->body);
242 message_show(
243 event->event.message->from,
244 event->event.message->body,
245 event->event.message->delay,
246 (type==JABBY_MESSAGE_NORMAL)?TLEN_MESSAGE:TLEN_CHAT);
247 }
248 break;
249 case JABBY_EVENT_PRESENCE:
250 g_print("presence from %s with type %d and message %s\n",
251 event->event.presence->from,
252 event->event.presence->type,
253 event->event.presence->message);
254 if(profile->ggserver)
255 if(!strcmp(profile->ggserver, event->event.presence->from))
256 {
257 // if(event->event.presence->type == JABBY_PRESENCE_UNAVAILABLE)
258 // {
259 // info("Zerwano po��czenie z serwerem Gadu-Gadu");
260 // }
261 status_gg_button_set(event->event.presence->type);
262 break;
263 }
264 // if(get_type(event->event.presence->from) == USER_AGENT)
265 // break;
266 user = get_user(event->event.presence->from);
267 if(user)
268 {
269 gchar *message;
270 gint type;
271
272 message = event->event.presence->message;
273 type = get_type(event->event.presence->from);
274 add_user(NULL,
275 event->event.presence->from,
276 NULL,
277 NULL,
278 message?message:"",
279 NULL,
280 event->event.presence->type + 2, type);
281 window_talk_update_on_presence(user->jid);
282 refresh_gui_on_presence(user);
283 }
284 break;
285 case JABBY_EVENT_SUBSCRIBE:
286 {
287 struct user *u=get_user(event->event.subscribe->from);
288 gint type;
289
290 type = get_type(event->event.subscribe->from);
291 if(!u)
292 {
293 g_print("no such user\n");
294 jabby_subscribe_accept(ses, event->event.subscribe->from);
295 jabby_contact_add(ses,"", event->event.subscribe->from, "");
296 add_user("",event->event.subscribe->from,"","from","","",
297 JABBY_PRESENCE_UNAVAILABLE+2, type);
298 }
299 else
300 {
301 if(!strcmp(u->subscription,"none"))
302 {
303 jabby_subscribe_accept(ses, event->event.subscribe->from);
304 add_user(NULL, event->event.subscribe->from,NULL,"from","",NULL,
305 JABBY_PRESENCE_UNAVAILABLE+2, -1);
306 }
307 else
308 add_user(NULL, event->event.subscribe->from,NULL,"both",NULL,NULL,
309 -1, -1);
310 }
311 if(preferences & PREF_BEEPONA)
312 play_sound(SOUNDA);
313 my_create_window_authorize(event->event.subscribe->from);
314 break;
315 }
316 case JABBY_EVENT_SUBSCRIBED:
317 {
318 struct user *user;
319
320 user = get_user(event->event.subscribed->from);
321 if(user)
322 {
323 if(!strcmp(user->subscription, "from"))
324 add_user(NULL,event->event.subscribed->from,NULL,"both",NULL,"",-1,
325 -1);
326 else
327 add_user(NULL,event->event.subscribed->from,NULL,"to",NULL,"",-1,
328 -1);
329 refresh_gui();
330 }
331 break;
332 }
333 case JABBY_EVENT_UNSUBSCRIBE:
334 {
335 // jabby_tlen_accept_unsubscribe(ses,event->event.unsubscribe->from);
336 if(get_user(event->event.unsubscribe->from))
337 {
338 add_user(NULL,event->event.unsubscribe->from,"","none","","",
339 JABBY_PRESENCE_UNAVAILABLE+2, -1);
340 refresh_gui();
341 jabby_unsubscribe(ses,event->event.unsubscribe->from);
342 }
343 break;
344 }
345 // jabby_unsubscribe(ses, event->event.unsubscribe->from);
346 case JABBY_EVENT_UNSUBSCRIBED:
347 add_user(NULL,event->event.unsubscribed->from,"","none","","",
348 JABBY_PRESENCE_UNAVAILABLE+2, -1);
349 refresh_gui();
350 // jabby_contact_remove(ses, event->event.unsubscribed->from);
351 break;
352 case JABBY_EVENT_AGENT:
353 if(!strcmp(event->event.agent->service, "x-gadugadu"))
354 {
355 if(!gg_present)
356 {
357 gg_present = TRUE;
358 profile->ggserver = g_strdup(event->event.agent->jid);
359 status_gg_button_set(JABBY_PRESENCE_AVAILABLE);
360 }
361 }
362 if(!strcmp(event->event.agent->service, "sms"))
363 {
364 // sms_present = TRUE;
365 profile->sms = g_strdup(event->event.agent->jid);
366 // status_gg_button_set(JABBY_PRESENCE_AVAILABLE);
367 }
368 break;
369 case JABBY_EVENT_AGENTS_END:
370 if(gg_present != FALSE)
371 {
372 refresh_gui();
373 // info("gg ok");
374 // if(jabber_registered_to_gg() == FALSE)
375 // jabber_register_gg();
376 // if(jabber_registered_to_gg())
377 // {
378 // jabber_unregister_gg();
379 // }
380 // jabber_register_gg();
381 }
382 break;
383 case JABBY_EVENT_SEARCH_ITEM:
384 case JABBY_EVENT_SEARCH_END:
385 case JABBY_EVENT_REGISTERED:
386 break;
387 case JABBY_EVENT_ERROR:
388 if(preferences & PREF_DEBUGON)
389 {
390 g_print("jabber: error event\n");
391 }
392 break;
393 case JABBY_EVENT_UNKNOWN:
394 if(preferences & PREF_DEBUGON)
395 g_print("jabber: unknown event\n");
396 break;
397 default:
398 break;
399 }
400 jabby_event_free(event);
401 return TRUE;
402 }
403
jabber_connect(gpointer g)404 static gpointer jabber_connect(gpointer g)
405 {
406 jabby_connect(ses);
407 jtimerid = gtk_timeout_add (100, jabber_timer , NULL);
408 return NULL;
409 }
410
jabber_login()411 void jabber_login()
412 {
413 GError *er;
414
415 g_thread_create(jabber_connect, NULL, FALSE, &er);
416 }
417
jabber_logout()418 void jabber_logout()
419 {
420 jabby_disconnect(ses);
421 }
422
jabber_free()423 void jabber_free()
424 {
425 jabby_session_free(ses);
426 ses = NULL;
427 }
428
429