Mercurial > ~mikael > mcabber > hg
diff 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 |
line wrap: on
line diff
--- a/mcabber/src/buddies.c Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/buddies.c Mon Apr 04 19:13:58 2005 +0000 @@ -8,9 +8,9 @@ #include "lang.h" #include "utils.h" -#include "server.h" #include "list.h" -#include "harddefines.h" + +#define STR_EMPTY(s) ((s)[0] == '\0') /* global vars for BUDDIES.C */ int buddySelected = 1; /* Hold the selected Buddy */ @@ -22,17 +22,18 @@ #define buddy_entry(n) list_entry(n, buddy_entry_t, list) -void bud_SetBuddyStatus(char *jidfrom, int status) +void bud_SetBuddyStatus(char *jidfrom, enum imstatus status) { struct list_head *pos, *n; buddy_entry_t *tmp; + enum imstatus oldstatus; int changed = 0; - char *buffer = (char *) malloc(4096); list_for_each_safe(pos, n, &buddy_list) { tmp = buddy_entry(pos); if (!strcmp(tmp->jid, jidfrom)) { if (tmp->flags != status) { + oldstatus = tmp->flags; tmp->flags = status; changed = 1; } @@ -41,18 +42,9 @@ } if (changed) { bud_DrawRoster(scr_GetRosterWindow()); - switch (status) { - case FLAG_BUDDY_DISCONNECTED: - sprintf(buffer, "--> %s %s!", jidfrom, i18n("disconected")); - break; - - case FLAG_BUDDY_CONNECTED: - sprintf(buffer, "--> %s %s!", jidfrom, i18n("connected")); - break; - } - scr_LogPrint("%s", buffer); + scr_LogPrint("<%s> status has changed: %c -> %c", jidfrom, + imstatus2char[oldstatus], imstatus2char[status]); } - free(buffer); } int compara(buddy_entry_t * t1, buddy_entry_t * t2) @@ -86,91 +78,8 @@ list_move_tail(&indice->list, &sorted_buddies); } list_splice(&sorted_buddies, &buddy_list); -} -void bud_ParseBuddies(char *roster) -{ - buddy_entry_t *tmp = NULL; - char *aux; - char *p, *str; - - ut_WriteLog("[roster]: %s\n\n", roster); - - while ((aux = ut_strrstr(roster, "<item")) != NULL) { - char *jid = getattr(aux, "jid='"); - char *name = getattr(aux, "name='"); - char *group = gettag(aux, "group='"); - - *aux = '\0'; - - tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t)); - - tmp->flags = FLAG_BUDDY_DISCONNECTED; - - if (strncmp(jid, "UNK", 3)) { - char *res = strstr(jid, "/"); - if (res) - *res = '\0'; - - tmp->jid = (char *) malloc(strlen(jid) + 1); - strcpy(tmp->jid, jid); - free(jid); - } - - if (strncmp(name, "UNK", 3)) { - tmp->name = (char *) calloc(1, strlen(name) + 1); - strcpy(tmp->name, name); - free(name); - } else { - tmp->name = (char *) calloc(1, strlen(tmp->jid) + 1); - str = strdup(tmp->jid); - p = strstr(str, "@"); - if (p) { - *p = '\0'; - } - strncpy(tmp->name, str, 18); - free(str); - } - - if (strncmp(group, "UNK", 3)) { - tmp->group = (char *) malloc(strlen(group) + 1); - strcpy(tmp->group, group); - free(group); - } - - if (!strncmp(tmp->jid, "msn.", 4)) { - sprintf(tmp->name, "%c MSN %c", 254, 254); - } - - if (!STR_EMPTY(tmp->jid)) { - list_add_tail(&tmp->list, &buddy_list); - } else { - if (tmp->jid) - free(tmp->jid); - if (tmp->name) - free(tmp->name); - if (tmp->group) - free(tmp->group); - free(tmp); - } - } - free(roster); - - bud_SortRoster(); -} - -/* Desc: Initialize buddy list - * - * In : none - * Out: none - * - * Note: none - */ -void bud_InitBuddies(int sock) -{ - char *roster; - roster = srv_getroster(sock); - bud_ParseBuddies(roster); + update_roster = TRUE; } /* Desc: Destroy (and free) buddy list @@ -245,13 +154,15 @@ pending = '#'; } - if ((tmp->flags && FLAG_BUDDY_CONNECTED) == 1) { - status = 'o'; + if (tmp->flags >= 0 && tmp->flags < imstatus_size) { + status = imstatus2char[tmp->flags]; + } + /*{ if (i == (buddySelected - buddyOffset)) wattrset(win, COLOR_PAIR(COLOR_BD_CONSEL)); else wattrset(win, COLOR_PAIR(COLOR_BD_CON)); - } else { + } else*/ { if (i == (buddySelected - buddyOffset)) wattrset(win, COLOR_PAIR(COLOR_BD_DESSEL)); else @@ -334,43 +245,33 @@ return NULL; } -void bud_AddBuddy(int sock) +buddy_entry_t *bud_AddBuddy(const char *bjid, const char *bname) { - char *buffer = (char *) calloc(1, 1024); - char *buffer2 = (char *) calloc(1, 1024); char *p, *str; buddy_entry_t *tmp; - ut_CenterMessage(i18n("write jid here"), 60, buffer2); - scr_CreatePopup(i18n("Add jid"), buffer2, 60, 1, buffer); - - if (!STR_EMPTY(buffer)) { - tmp = (buddy_entry_t *) calloc(1, sizeof(buddy_entry_t)); - tmp->jid = (char *) malloc(strlen(buffer) + 1); - strcpy(tmp->jid, buffer); - tmp->name = (char *) malloc(strlen(buffer) + 1); + tmp = calloc(1, sizeof(buddy_entry_t)); + tmp->jid = strdup(bjid); - str = strdup(buffer); - p = strstr(str, "@"); - if (p) { - *p = '\0'; - } - strcpy(tmp->name, str); + if (bname) { + tmp->name = strdup(bname); + } else { + str = strdup(bjid); + p = strstr(str, "/"); + if (p) *p = '\0'; + tmp->name = strdup(str); free(str); + } - list_add_tail(&tmp->list, &buddy_list); - buddySelected = 1; - bud_DrawRoster(scr_GetRosterWindow()); - srv_AddBuddy(sock, tmp->jid); - } - free(buffer); + list_add_tail(&tmp->list, &buddy_list); + bud_DrawRoster(scr_GetRosterWindow()); + + return tmp; } -void bud_DeleteBuddy(int sock) +void bud_DeleteBuddy(buddy_entry_t *buddy) { - buddy_entry_t *tmp = bud_SelectedInfo(); - srv_DelBuddy(sock, tmp->jid); - list_del(&tmp->list); + list_del(&buddy->list); buddySelected = 1; bud_DrawRoster(scr_GetRosterWindow()); }