Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/buddies.c @ 35:a8ceaa3005fd
[/trunk] Changeset 51 by mikael
Work on libjabber integration. This is a big patch...
* Remove socket.[ch] server.[ch]
We have now fully switched to libjabber.
* Roster is fetched, and buddies are added to the buddylist
* Can send/receive messages using libjabber
* Presence messages are handled. I have added statuses, as there only were
online / offline statuses.
* Use halfdelay to have a non-blocking getch().
And use a timeout in jb_main().
* Use utf8_{encode,decode}
author | mikael |
---|---|
date | Mon, 04 Apr 2005 19:13:58 +0000 |
parents | 4ea2df449381 |
children | 416fd026d76d |
comparison
equal
deleted
inserted
replaced
34:f78ffe7ce43d | 35:a8ceaa3005fd |
---|---|
6 #include "screen.h" | 6 #include "screen.h" |
7 #include "buddies.h" | 7 #include "buddies.h" |
8 | 8 |
9 #include "lang.h" | 9 #include "lang.h" |
10 #include "utils.h" | 10 #include "utils.h" |
11 #include "server.h" | |
12 #include "list.h" | 11 #include "list.h" |
13 #include "harddefines.h" | 12 |
13 #define STR_EMPTY(s) ((s)[0] == '\0') | |
14 | 14 |
15 /* global vars for BUDDIES.C */ | 15 /* global vars for BUDDIES.C */ |
16 int buddySelected = 1; /* Hold the selected Buddy */ | 16 int buddySelected = 1; /* Hold the selected Buddy */ |
17 int buddyOffset = 0; /* Hold the roster offset */ | 17 int buddyOffset = 0; /* Hold the roster offset */ |
18 | 18 |
20 static LIST_HEAD(sorted_buddies); | 20 static LIST_HEAD(sorted_buddies); |
21 | 21 |
22 #define buddy_entry(n) list_entry(n, buddy_entry_t, list) | 22 #define buddy_entry(n) list_entry(n, buddy_entry_t, list) |
23 | 23 |
24 | 24 |
25 void bud_SetBuddyStatus(char *jidfrom, int status) | 25 void bud_SetBuddyStatus(char *jidfrom, enum imstatus status) |
26 { | 26 { |
27 struct list_head *pos, *n; | 27 struct list_head *pos, *n; |
28 buddy_entry_t *tmp; | 28 buddy_entry_t *tmp; |
29 enum imstatus oldstatus; | |
29 int changed = 0; | 30 int changed = 0; |
30 char *buffer = (char *) malloc(4096); | |
31 | 31 |
32 list_for_each_safe(pos, n, &buddy_list) { | 32 list_for_each_safe(pos, n, &buddy_list) { |
33 tmp = buddy_entry(pos); | 33 tmp = buddy_entry(pos); |
34 if (!strcmp(tmp->jid, jidfrom)) { | 34 if (!strcmp(tmp->jid, jidfrom)) { |
35 if (tmp->flags != status) { | 35 if (tmp->flags != status) { |
36 oldstatus = tmp->flags; | |
36 tmp->flags = status; | 37 tmp->flags = status; |
37 changed = 1; | 38 changed = 1; |
38 } | 39 } |
39 break; | 40 break; |
40 } | 41 } |
41 } | 42 } |
42 if (changed) { | 43 if (changed) { |
43 bud_DrawRoster(scr_GetRosterWindow()); | 44 bud_DrawRoster(scr_GetRosterWindow()); |
44 switch (status) { | 45 scr_LogPrint("<%s> status has changed: %c -> %c", jidfrom, |
45 case FLAG_BUDDY_DISCONNECTED: | 46 imstatus2char[oldstatus], imstatus2char[status]); |
46 sprintf(buffer, "--> %s %s!", jidfrom, i18n("disconected")); | 47 } |
47 break; | |
48 | |
49 case FLAG_BUDDY_CONNECTED: | |
50 sprintf(buffer, "--> %s %s!", jidfrom, i18n("connected")); | |
51 break; | |
52 } | |
53 scr_LogPrint("%s", buffer); | |
54 } | |
55 free(buffer); | |
56 } | 48 } |
57 | 49 |
58 int compara(buddy_entry_t * t1, buddy_entry_t * t2) | 50 int compara(buddy_entry_t * t1, buddy_entry_t * t2) |
59 { | 51 { |
60 const char *s1 = | 52 const char *s1 = |
84 } | 76 } |
85 } | 77 } |
86 list_move_tail(&indice->list, &sorted_buddies); | 78 list_move_tail(&indice->list, &sorted_buddies); |
87 } | 79 } |
88 list_splice(&sorted_buddies, &buddy_list); | 80 list_splice(&sorted_buddies, &buddy_list); |
89 } | 81 |
90 | 82 update_roster = TRUE; |
91 void bud_ParseBuddies(char *roster) | |
92 { | |
93 buddy_entry_t *tmp = NULL; | |
94 char *aux; | |
95 char *p, *str; | |
96 | |
97 ut_WriteLog("[roster]: %s\n\n", roster); | |
98 | |
99 while ((aux = ut_strrstr(roster, "<item")) != NULL) { | |
100 char *jid = getattr(aux, "jid='"); | |
101 char *name = getattr(aux, "name='"); | |
102 char *group = gettag(aux, "group='"); | |
103 | |
104 *aux = '\0'; | |
105 | |
106 tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t)); | |
107 | |
108 tmp->flags = FLAG_BUDDY_DISCONNECTED; | |
109 | |
110 if (strncmp(jid, "UNK", 3)) { | |
111 char *res = strstr(jid, "/"); | |
112 if (res) | |
113 *res = '\0'; | |
114 | |
115 tmp->jid = (char *) malloc(strlen(jid) + 1); | |
116 strcpy(tmp->jid, jid); | |
117 free(jid); | |
118 } | |
119 | |
120 if (strncmp(name, "UNK", 3)) { | |
121 tmp->name = (char *) calloc(1, strlen(name) + 1); | |
122 strcpy(tmp->name, name); | |
123 free(name); | |
124 } else { | |
125 tmp->name = (char *) calloc(1, strlen(tmp->jid) + 1); | |
126 str = strdup(tmp->jid); | |
127 p = strstr(str, "@"); | |
128 if (p) { | |
129 *p = '\0'; | |
130 } | |
131 strncpy(tmp->name, str, 18); | |
132 free(str); | |
133 } | |
134 | |
135 if (strncmp(group, "UNK", 3)) { | |
136 tmp->group = (char *) malloc(strlen(group) + 1); | |
137 strcpy(tmp->group, group); | |
138 free(group); | |
139 } | |
140 | |
141 if (!strncmp(tmp->jid, "msn.", 4)) { | |
142 sprintf(tmp->name, "%c MSN %c", 254, 254); | |
143 } | |
144 | |
145 if (!STR_EMPTY(tmp->jid)) { | |
146 list_add_tail(&tmp->list, &buddy_list); | |
147 } else { | |
148 if (tmp->jid) | |
149 free(tmp->jid); | |
150 if (tmp->name) | |
151 free(tmp->name); | |
152 if (tmp->group) | |
153 free(tmp->group); | |
154 free(tmp); | |
155 } | |
156 } | |
157 free(roster); | |
158 | |
159 bud_SortRoster(); | |
160 } | |
161 | |
162 /* Desc: Initialize buddy list | |
163 * | |
164 * In : none | |
165 * Out: none | |
166 * | |
167 * Note: none | |
168 */ | |
169 void bud_InitBuddies(int sock) | |
170 { | |
171 char *roster; | |
172 roster = srv_getroster(sock); | |
173 bud_ParseBuddies(roster); | |
174 } | 83 } |
175 | 84 |
176 /* Desc: Destroy (and free) buddy list | 85 /* Desc: Destroy (and free) buddy list |
177 * | 86 * |
178 * In : none | 87 * In : none |
243 tmp = buddy_entry(pos); | 152 tmp = buddy_entry(pos); |
244 if (scr_IsHiddenMessage(tmp->jid)) { | 153 if (scr_IsHiddenMessage(tmp->jid)) { |
245 pending = '#'; | 154 pending = '#'; |
246 } | 155 } |
247 | 156 |
248 if ((tmp->flags && FLAG_BUDDY_CONNECTED) == 1) { | 157 if (tmp->flags >= 0 && tmp->flags < imstatus_size) { |
249 status = 'o'; | 158 status = imstatus2char[tmp->flags]; |
159 } | |
160 /*{ | |
250 if (i == (buddySelected - buddyOffset)) | 161 if (i == (buddySelected - buddyOffset)) |
251 wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL)); | 162 wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL)); |
252 else | 163 else |
253 wattrset(win, COLOR_PAIR(COLOR_BD_CON)); | 164 wattrset(win, COLOR_PAIR(COLOR_BD_CON)); |
254 } else { | 165 } else*/ { |
255 if (i == (buddySelected - buddyOffset)) | 166 if (i == (buddySelected - buddyOffset)) |
256 wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL)); | 167 wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL)); |
257 else | 168 else |
258 wattrset(win, COLOR_PAIR(COLOR_BD_DES)); | 169 wattrset(win, COLOR_PAIR(COLOR_BD_DES)); |
259 } | 170 } |
332 i++; | 243 i++; |
333 } | 244 } |
334 return NULL; | 245 return NULL; |
335 } | 246 } |
336 | 247 |
337 void bud_AddBuddy(int sock) | 248 buddy_entry_t *bud_AddBuddy(const char *bjid, const char *bname) |
338 { | 249 { |
339 char *buffer = (char *) calloc(1, 1024); | |
340 char *buffer2 = (char *) calloc(1, 1024); | |
341 char *p, *str; | 250 char *p, *str; |
342 buddy_entry_t *tmp; | 251 buddy_entry_t *tmp; |
343 | 252 |
344 ut_CenterMessage(i18n("write jid here"), 60, buffer2); | 253 tmp = calloc(1, sizeof(buddy_entry_t)); |
345 scr_CreatePopup(i18n("Add jid"), buffer2, 60, 1, buffer); | 254 tmp->jid = strdup(bjid); |
346 | 255 |
347 if (!STR_EMPTY(buffer)) { | 256 if (bname) { |
348 tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t)); | 257 tmp->name = strdup(bname); |
349 tmp->jid = (char *) malloc(strlen(buffer) + 1); | 258 } else { |
350 strcpy(tmp->jid, buffer); | 259 str = strdup(bjid); |
351 tmp->name = (char *) malloc(strlen(buffer) + 1); | 260 p = strstr(str, "/"); |
352 | 261 if (p) *p = '\0'; |
353 str = strdup(buffer); | 262 tmp->name = strdup(str); |
354 p = strstr(str, "@"); | |
355 if (p) { | |
356 *p = '\0'; | |
357 } | |
358 strcpy(tmp->name, str); | |
359 free(str); | 263 free(str); |
360 | 264 } |
361 list_add_tail(&tmp->list, &buddy_list); | 265 |
362 buddySelected = 1; | 266 list_add_tail(&tmp->list, &buddy_list); |
363 bud_DrawRoster(scr_GetRosterWindow()); | 267 bud_DrawRoster(scr_GetRosterWindow()); |
364 srv_AddBuddy(sock, tmp->jid); | 268 |
365 } | 269 return tmp; |
366 free(buffer); | 270 } |
367 } | 271 |
368 | 272 void bud_DeleteBuddy(buddy_entry_t *buddy) |
369 void bud_DeleteBuddy(int sock) | 273 { |
370 { | 274 list_del(&buddy->list); |
371 buddy_entry_t *tmp = bud_SelectedInfo(); | |
372 srv_DelBuddy(sock, tmp->jid); | |
373 list_del(&tmp->list); | |
374 buddySelected = 1; | 275 buddySelected = 1; |
375 bud_DrawRoster(scr_GetRosterWindow()); | 276 bud_DrawRoster(scr_GetRosterWindow()); |
376 } | 277 } |