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