# HG changeset patch # User mikael # Date 1112642038 0 # Node ID a8ceaa3005fd8f2b379be35b3247b0f751a314b1 # Parent f78ffe7ce43d7f502afa88b42c1434494230ddf0 [/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} diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/Makefile --- a/mcabber/src/Makefile Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/Makefile Mon Apr 04 19:13:58 2005 +0000 @@ -33,7 +33,7 @@ endif CFLAGS = -Wall -W -pedantic LD = $(CC) -LDLIBS = -lncurses -lpanel -L../libjabber -L../connwrap -llibjabber -lconnwrap -lssl +LDLIBS = -lncurses -lpanel -lssl -L../libjabber -L../connwrap -llibjabber -lconnwrap ifeq ($(DEBUG),1) CFLAGS += -O0 -g -DDEBUG=1 @@ -55,8 +55,6 @@ buddies.c \ parsecfg.c \ jabglue.c \ - server.c \ - socket.c \ lang.c \ utf8.c diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/buddies.c --- 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, "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()); } diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/buddies.h --- a/mcabber/src/buddies.h Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/buddies.h Mon Apr 04 19:13:58 2005 +0000 @@ -2,6 +2,7 @@ #define __BUDDIES_H__ 1 #include +#include "jabglue.h" #include "list.h" /* Definición de tipos */ @@ -17,13 +18,12 @@ void bud_DrawRoster(WINDOW * win); void bud_RosterDown(void); void bud_RosterUp(void); -void bud_InitBuddies(int sock); void bud_TerminateBuddies(void); -int bud_BuddyCount(void); -void bud_SetBuddyStatus(char *jidfrom, int status); -void bud_ParseBuddies(char *roster); -void bud_AddBuddy(int sock); -void bud_DeleteBuddy(int sock); +int bud_BuddyCount(void); +void bud_SetBuddyStatus(char *jidfrom, enum imstatus status); buddy_entry_t *bud_SelectedInfo(void); +buddy_entry_t *bud_AddBuddy(const char *bjid, const char *bname); +void bud_DeleteBuddy(buddy_entry_t *buddy); + #endif diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/harddefines.h --- a/mcabber/src/harddefines.h Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/harddefines.h Mon Apr 04 19:13:58 2005 +0000 @@ -4,12 +4,4 @@ #define VERSION "MCabber v0.6.0-dev -- based on http://cabber.sourceforge.net" #define EMAIL "Email: bmikael [at] lists [dot] lilotux [dot] net" -#define STR_EMPTY(s) ((s)[0] == '\0') - -#define FLAG_BUDDY_DISCONNECTED 0x00 -#define FLAG_BUDDY_CONNECTED 0x01 -#define FLAG_BUDDY_AWAY 0x02 -#define FLAG_BUDDY_XAWAY 0x04 -#define FLAG_BUDDY_HASMESSAGE 0x08 - #endif diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/jabglue.c Mon Apr 04 19:13:58 2005 +0000 @@ -92,9 +92,7 @@ return alias; } -jconn jb_connect(const char *servername, unsigned int port, int ssl, - const char *jid, const char *pass, - const char *resource) +jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass) { if (!port) { if (ssl) @@ -106,16 +104,14 @@ if (jc) free(jc); - //jc = jab_new(jid, pass, port, ssl); - jc = jab_new("mctest@lilotux.net/mcabber", (char*)pass, (int)port, ssl); + jc = jab_new(jid, pass, port, ssl); - jab_logger(jc, big_logger); + jab_logger(jc, file_logger); jab_packet_handler(jc, &packethandler); jab_state_handler(jc, &statehandler); if (jc->user) { //fonline = TRUE; - scr_LogPrint("+ State_Connecting"); jstate = STATE_CONNECTING; statehandler(0, -1); jab_start(jc); @@ -215,7 +211,7 @@ */ if (!msg || !*msg) { - msg = "unknownStatus"; + msg = "unknownStatus"; // FIXME //msg = imstatus2str(st); } @@ -230,6 +226,13 @@ // XXX logger.putourstatus(proto, getstatus(), ourstatus = st); } +void jb_send_msg(const char *jid, const char *text) +{ + xmlnode x = jutil_msgnew(TMSG_CHAT, jid, 0, text); + jab_send(jc, x); + xmlnode_free(x); +} + void postlogin() { //int i; @@ -239,6 +242,7 @@ //setautostatus(jhook.manualstatus); + setjabberstatus(1, "I'm here!"); /* for (i = 0; i < clist.count; i++) { c = (icqcontact *) clist.at(i); @@ -309,14 +313,20 @@ if (z) group = xmlnode_get_data(z); if (alias) { - char *buddyname = jidtodisp(alias); - if (buddyname) { - scr_LogPrint("New buddy: %s", buddyname); + char *buddyname; + if (name) + buddyname = name; + else + buddyname = jidtodisp(alias); + + //scr_LogPrint("New buddy: %s", buddyname); + bud_AddBuddy(alias, buddyname); + if (!name) free(buddyname); - } } } + bud_SortRoster(); postlogin(); } @@ -326,20 +336,25 @@ char *u, *h, *r; jidsplit(from, &u, &h, &r); - if (*r) - scr_LogPrint("There is an extra part in message: %s", *r); - scr_WriteIncomingMessage(from, body); + /* + // Maybe we should remember the resource? + if (r) + scr_LogPrint("There is an extra part in message (resource?): %s", r); + */ + + scr_LogPrint("Msg from <%s>, type=%s", jidtodisp(from), type); + scr_WriteIncomingMessage(jidtodisp(from), body); } void statehandler(jconn conn, int state) { static int previous_state = -1; - scr_LogPrint("StateHandler called (%d).\n", state); - ut_WriteLog("StateHandler called (%d).\n", state); + ut_WriteLog("StateHandler called (state=%d).\n", state); switch(state) { case JCONN_STATE_OFF: + scr_LogPrint("+ JCONN_STATE_OFF"); /* jhook.flogged = jhook.fonline = FALSE; @@ -348,22 +363,27 @@ jhook.log(logDisconnected); jhook.roster.clear(); jhook.agents.clear(); - clist.setoffline(jhook.proto); - face.update(); } */ break; case JCONN_STATE_CONNECTED: + scr_LogPrint("+ JCONN_STATE_CONNECTED"); break; case JCONN_STATE_AUTH: + scr_LogPrint("+ JCONN_STATE_AUTH"); break; case JCONN_STATE_ON: + scr_LogPrint("+ JCONN_STATE_ON"); // if (regmode) jhook.fonline = TRUE; break; + case JCONN_STATE_CONNECTING: + scr_LogPrint("+ JCONN_STATE_CONNECTING"); + break; + default: break; } @@ -378,13 +398,10 @@ char *from=NULL, *type=NULL, *body=NULL, *enc=NULL; char *ns=NULL; char *id=NULL; - // imstatus ust; + enum imstatus ust; // int npos; // bool isagent; - scr_LogPrint("Received a packet"); - ut_WriteLog("Received a packet\n"); - jpacket_reset(packet); p = xmlnode_get_attrib(packet->x, "from"); if (p) from = p; @@ -417,19 +434,13 @@ } } - // FIXME: if (body) { - scr_LogPrint("Message received"); - scr_LogPrint("Type: %s", type); gotmessage(type, from, body, enc); } - break; case JPACKET_IQ: if (!strcmp(type, "result")) { - scr_LogPrint("Received a result packet"); - ut_WriteLog("Received a result packet\n"); if (p = xmlnode_get_attrib(packet->x, "id")) { int iid = atoi(p); @@ -588,68 +599,30 @@ case JPACKET_PRESENCE: x = xmlnode_get_tag(packet->x, "show"); - //ust = available; + ust = available; if (x) { p = xmlnode_get_data(x); if (p) ns = p; if (ns) { - scr_LogPrint("New status: %s", ns); - /* - if (ns == "away") ust = away; else - if (ns == "dnd") ust = dontdisturb; else - if (ns == "xa") ust = notavail; else - if (ns == "chat") ust = freeforchat; - */ + scr_LogPrint("New status: %s (%s)", ns, from); + if (!strcmp(ns, "away")) ust = away; + else if (!strcmp(ns, "dnd")) ust = dontdisturb; + else if (!strcmp(ns, "xa")) ust = notavail; + else if (!strcmp(ns, "chat")) ust = freeforchat; } } - if (!strcmp(type, "unavailable")) { + if (type && !strcmp(type, "unavailable")) { scr_LogPrint("New status: unavailable/offline"); - // XXX - // ust = offline; + ust = offline; } + bud_SetBuddyStatus(jidtodisp(from), ust); /* - jidsplit(from, u, h, s); - id = u + "@" + h; - - if (clist.get(imcontact((string) "#" + id, jhook.proto))) { - if (ust == offline) { - vector::iterator im = find(jhook.chatmembers[id].begin(), jhook.chatmembers[id].end(), s); - if (im != jhook.chatmembers[id].end()) - jhook.chatmembers[id].erase(im); - - } else { - jhook.chatmembers[id].push_back(s); - - } - - } else { - icqcontact *c = clist.get(ic); - - if (c) - if (c->getstatus() != ust) { - if (c->getstatus() == offline) - jhook.awaymsgs[ic.nickname] = ""; - - logger.putonline(c, c->getstatus(), ust); - c->setstatus(ust); - - if (x = xmlnode_get_tag(packet->x, "status")) - if (p = xmlnode_get_data(x)) - jhook.awaymsgs[ic.nickname] = p; - -#ifdef HAVE_GPGME - if (x = xmlnode_get_tag(packet->x, "x")) - if (p = xmlnode_get_attrib(x, "xmlns")) - if ((string) p == "jabber:x:signed") - if (p = xmlnode_get_data(x)) - c->setpgpkey(pgp.verify(p, jhook.awaymsgs[ic.nickname])); -#endif - - } - } + if (x = xmlnode_get_tag(packet->x, "status")) + if (p = xmlnode_get_data(x)) + scr_LogPrint("Away msg: %s", p); */ break; diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/jabglue.h --- a/mcabber/src/jabglue.h Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/jabglue.h Mon Apr 04 19:13:58 2005 +0000 @@ -21,12 +21,10 @@ '_', 'o', 'i', 'f', 'd', 'c', 'n', 'a' }; -jconn jb_connect(const char *servername, unsigned int port, int ssl, - const char *jid, const char *pass, - const char *resource); +jconn jb_connect(const char *jid, unsigned int port, int ssl, const char *pass); void jb_disconnect(void); void jb_keepalive(); void jb_main(); -//int jb_status(); +void jb_send_msg(const char *, const char *); #endif /* __JABGLUE_H__ */ diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/main.c --- a/mcabber/src/main.c Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/main.c Mon Apr 04 19:13:58 2005 +0000 @@ -11,9 +11,7 @@ #include "buddies.h" #include "parsecfg.h" #include "lang.h" -#include "server.h" #include "harddefines.h" -#include "socket.h" #include "jabglue.h" //int sock; @@ -28,8 +26,7 @@ case SIGTERM: bud_TerminateBuddies(); scr_TerminateCurses(); - // TODO srv_setpresence(sock, "unavailable"); - // TODO close(sock); + jb_disconnect(); printf("Killed by SIGTERM\nBye!\n"); exit(EXIT_SUCCESS); break; @@ -60,6 +57,18 @@ return (ssize_t)nread; } +char *compose_jid(const char *username, const char *servername, + const char *resource) +{ + char *jid = malloc(strlen(username)+strlen(servername)+strlen(resource)+3); + strcpy(jid, username); + strcat(jid, "@"); + strcat(jid, servername); + strcat(jid, "/"); + strcat(jid, resource); + return jid; +} + void credits(void) { printf(VERSION "\n"); @@ -71,7 +80,7 @@ char configFile[4096]; char *username, *password, *resource; char *servername; - //char *idsession; + char *jid; char *portstring; int key; unsigned int port; @@ -148,13 +157,16 @@ ut_WriteLog("Drawing main window...\n"); scr_DrawMainWindow(); - /* Connect to server */ portstring = cfg_read("port"); port = (portstring != NULL) ? (unsigned int) atoi(portstring) : -1U; + /* Connect to server */ ut_WriteLog("Connecting to server: %s:%d\n", servername, port); scr_LogPrint("Connecting to server: %s:%d", servername, port); - jc = jb_connect(servername, port, 0, username, password, resource); + + jid = compose_jid(username, servername, resource); + jc = jb_connect(jid, port, 0, password); + free(jid); if (!jc) { ut_WriteLog("\terror!!!\n"); fprintf(stderr, "Error connecting to (%s)\n", servername); @@ -178,70 +190,20 @@ ut_WriteLog("Entering into main loop...\n\n"); ut_WriteLog("Ready to send/receive messages...\n"); - sleep(1); - jb_main(); - sleep(1); - jb_main(); - sleep(2); - jb_disconnect(); - sleep(1); - jb_main(); - scr_TerminateCurses(); exit(0); // XXX while (ret != 255) { - int x; alarm(ping); - //x = check_io(sock, 0); - x = check_io(0, 0); // FIXME - /* - if ((x & 1) == 1) { - srv_msg *incoming = readserver(sock); - - switch (incoming->m) { - case SM_PRESENCE: - bud_SetBuddyStatus(incoming->from, incoming->connected); - break; - - case SM_MESSAGE: - scr_WriteIncomingMessage(incoming->from, incoming->body); - free(incoming->body); - free(incoming->from); - break; - - case SM_UNHANDLED: - break; - } - free(incoming); - } - if ((x & 2) == 2) { - */ - if (x) { - keypad(scr_GetInputWindow(), TRUE); - key = scr_Getch(); + keypad(scr_GetInputWindow(), TRUE); + key = scr_Getch(); + if (key != ERR) ret = process_key(key); - /* - switch (key) { - case KEY_IC: - bud_AddBuddy(sock); - break; - case KEY_DC: - bud_DeleteBuddy(sock); - break; - - case KEY_RESIZE: - endwin(); - printf("\nRedimensionado no implementado\n"); - printf("Reinicie Cabber.\n\n\n"); - exit(EXIT_FAILURE); - break; - } - */ - } + jb_main(); if (update_roster) { // scr_LogPrint("Update roster"); bud_DrawRoster(scr_GetRosterWindow()); } } + jb_disconnect(); bud_TerminateBuddies(); scr_TerminateCurses(); diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/screen.c --- a/mcabber/src/screen.c Mon Apr 04 18:00:51 2005 +0000 +++ b/mcabber/src/screen.c Mon Apr 04 19:13:58 2005 +0000 @@ -12,7 +12,6 @@ #include "buddies.h" #include "parsecfg.h" #include "lang.h" -#include "server.h" #include "list.h" #define window_entry(n) list_entry(n, window_entry_t, list) @@ -456,7 +455,7 @@ initscr(); noecho(); raw(); - //cbreak(); + halfdelay(5); start_color(); use_default_colors(); @@ -466,7 +465,7 @@ inputLine[0] = 0; ptr_inputline = inputLine; - //setlocale(LC_CTYPE, ""); + setlocale(LC_CTYPE, ""); return; } @@ -500,7 +499,6 @@ logPanel = new_panel(logWnd); wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL)); //wattrset(logWnd, COLOR_PAIR(COLOR_GENERAL)); - scr_LogPrint("Start up."); scrollok(logWnd,TRUE); //idlok(logWnd,TRUE); // XXX Necessary? @@ -529,7 +527,7 @@ int n, i; char *buffer = (char *) malloc(5 + strlen(text)); - sprintf(buffer, "<== %s", text); + sprintf(buffer, "<== %s", utf8_decode(text)); submsgs = ut_SplitMessage(buffer, &n, maxX - scr_WindowHeight(rosterWnd) - 20); @@ -642,7 +640,7 @@ refresh(); sprintf(buffer2, "%s@%s/%s", cfg_read("username"), cfg_read("server"), cfg_read("resource")); - // FIXME srv_sendtext(sock, tmp->jid, msg, buffer2); + jb_send_msg(tmp->jid, utf8_encode(msg)); free(buffer); free(buffer2); @@ -652,7 +650,7 @@ int process_line(char *line) { if (*line != '/') { - // FIXME send_message(sock, line); + send_message(line); return 0; } if (!strcasecmp(line, "/quit")) { @@ -660,7 +658,7 @@ } // Commands handling // TODO - // say... + // say, send_raw... scr_LogPrint("Unrecognised command, sorry."); return 0; diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/server.c --- a/mcabber/src/server.c Mon Apr 04 18:00:51 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,479 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "list.h" -#include "parsecfg.h" -#include "screen.h" -#include "socket.h" -#include "utf8.h" -#include "server.h" -#include "harddefines.h" -#include "utils.h" -#include "buddies.h" - -#define JABBERPORT 5222 - -/* Desc: poll data from server - * - * In : socket - * Out : pending buffer (or NULL if no incoming data) - * - * Note: it is up to the caller to free the returned string - */ -char *srv_poll(int sock) -{ - struct pollfd sock_p; - sock_p.fd = sock; - sock_p.events = (short int) (POLLIN | POLLPRI); - sock_p.revents = 0; - poll(&sock_p, 1, 0); - - if (sock_p.revents) { - return sk_recv(sock); - } - - return NULL; -} - - -/* Desc: resolve host - * - * In : hostname - * Out : 32bit address (or 0 if error) - * - * Note: - - */ -static u_long srv_resolve(const char *host) -{ - in_addr_t i; - struct hostent *he; - - if ((i = inet_addr(host)) == INADDR_NONE) { - if (!(he = gethostbyname(host))) - return 0; - else - return (*(u_long *) he->h_addr); // XXX Memory leak - } - - return (u_long) i; -} - - -/* Desc: connect to jabber server - * - * In : config - * Out : socket (or -1 on error) - * - * Note: if port is -1, the default Jabber port will be used - */ -int srv_connect(const char *server, unsigned int port) -{ - struct sockaddr_in name; - int sock; - - if (server == NULL) { - fprintf(stderr, "You must supply a server name\n\r"); - return -1; - } - - if (port == -1U) { - port = JABBERPORT; - } - - name.sin_family = AF_INET; - name.sin_port = htons(port); - - if (!(name.sin_addr.s_addr = srv_resolve(server))) { - fprintf(stderr, "Cant resolve \"%s\"\n", server); - return -1; - } - - if ((sock = sk_conn((struct sockaddr *) &name)) < 0) { - fprintf(stderr, "Can't connect to \"%s:%u\"\n", server, port); - return -1; - } - - return sock; -} - - -/* Desc: login into jabber server - * - * In : socket, servername, user, password, resource - * Out : idsession - * - * Note: it is up to the caller to free the returned string - */ -char *srv_login(int sock, const char *server, const char *user, - const char *pass, const char *resource) -{ - char *stringtosend = malloc(2048); - char *response, *aux; - char *idsession = calloc(64, sizeof(char)); - int pos = 0; - - memset(stringtosend, 0, 2048); - strcpy(stringtosend, ""); - strcat(stringtosend, "\n"); - - if (!sk_send(sock, stringtosend)) { - perror("senddata (server.c:132)"); - free(stringtosend); - free(idsession); - return NULL; - } - response = sk_recv(sock); - if (strstr(response, "error")) { - /* fprintf(stderr, "Response not valid:\n%s\n\n", response); */ - scr_CreatePopup("Error", - "Bad answer from the server", 60, 0, NULL); - free(response); - free(idsession); - free(stringtosend); - return NULL; - } - aux = response; - while (strncmp(aux, "id", 2)) - aux++; - pos = 0; - aux += 4; - while (strncmp(aux, "'", 1)) { - aux++; - pos++; - } - aux -= pos; - if (pos > 64-1) { - ut_WriteLog("Bad session ID!\n"); - free(response); - free(idsession); - free(stringtosend); - return NULL; - } - strncpy(idsession, aux, (size_t)pos); - - free(response); - - strcpy(stringtosend, ""); - strcat(stringtosend, ""); - strcat(stringtosend, ""); - strcat(stringtosend, user); - strcat(stringtosend, ""); - strcat(stringtosend, pass); - strcat(stringtosend, ""); - strcat(stringtosend, resource); - strcat(stringtosend, "\n"); - if (!sk_send(sock, stringtosend)) { - perror("senddata (server.c:167)"); - return NULL; - } - response = sk_recv(sock); - if (strstr(response, "error")) { -/* fprintf(stderr, "Response not valid:\n%s\n\n", response);*/ - scr_CreatePopup("Error", - "Account doesn't exist, or bad password", 60, 0, - NULL); - - /* - scr_CreatePopup("Info", "Trying to create the account...", 60, 0, NULL); - - strcpy(stringtosend, ""); - strcat(stringtosend, ""); - strcat(stringtosend, ""); - strcat(stringtosend, user); - strcat(stringtosend, ""); - strcat(stringtosend, pass); - strcat(stringtosend, ""); - strcat(stringtosend, "\n"); - if (!sk_send(sock, stringtosend)) { - perror("senddata (server.c:167)"); - return NULL; - } - - response = sk_recv(sock); - */ - scr_TerminateCurses(); - /* printf("Reinicie cabber!\n\n"); */ - free(idsession); - free(stringtosend); - return NULL; - } - free(response); - free(stringtosend); - - return idsession; -} - - -/* Desc: broadcast presence - * - * In : socket, presence string - * Out : ? - * - * Note: see `sk_send' for output values - */ -int srv_setpresence(int sock, const char *type) -{ - int rv; - char *str = malloc(1024); - - sprintf(str, "%.512s", type); - if (!(rv = sk_send(sock, str))) { - perror("senddata (server.c:199)"); - } - free(str); - - return rv; -} - - -/* Desc: request roster - * - * In : socket - * Out : roster string - * - * Note: it is up to the caller to free the returned string - */ -char *srv_getroster(int sock) -{ - char *str = malloc(1024); - - strcpy(str, "\n"); - if (!sk_send(sock, str)) { - perror("senddata (server.c:222)"); - free(str); - return NULL; - } - free(str); - - return sk_recv(sock); -} - - -/* Desc: send text to buddy - * - * In : socket, destination jid, text, source jid - * Out : 0 = ok - * - * Note: - - */ -int -srv_sendtext(int sock, const char *to, const char *text, const char *from) -{ - char *stringtosend = malloc(2048); - char *utf8inputline = utf8_encode(text); - - sprintf(stringtosend, - "%.1536s", - from, to, utf8inputline); - if (!sk_send(sock, stringtosend)) { - perror("senddata (server.c:247)"); - free(stringtosend); - free(utf8inputline); - return -1; - } - - free(stringtosend); - free(utf8inputline); - return 0; -} - -int check_io(int fd1, int fd2) -{ - int n = 0, i; - fd_set fds; - int io_pending = 0; - - i = fd1; - if (fd2 > fd1) - i = fd2; - - FD_ZERO(&fds); - if (fd1 >= 0) - FD_SET(fd1, &fds); - else - fd1 = 0; - if (fd2 >= 0) - FD_SET(fd2, &fds); - else - fd2 = 0; - - if (fd2 == 0 && io_pending) - n = 2; - else if (select(i + 1, &fds, NULL, NULL, NULL) > 0) - n = 1 * (FD_ISSET(fd1, &fds) > 0) + 2 * (FD_ISSET(fd2, &fds) > 0); - - return (n); -} - -/* Desc: read data from server - * - * In : socket - * Out : ptr to newly allocated srv_msg struct - * - * Note: returns NULL if no input from server - */ -srv_msg *readserver(int sock) -{ - char *buffer = sk_recv(sock); - - if (buffer != NULL) { - srv_msg *msg = calloc(1, sizeof(srv_msg)); - char *to = getattr(buffer, "to='"); - char *from = getattr(buffer, "from='"); - char *id = getattr(buffer, "id='"); - char *type = getattr(buffer, "type='"); - char *body = gettag(buffer, "body"); - char *status = gettag(buffer, "status"); - char *show = gettag(buffer, "show"); - char *line = (char *) malloc(1024); - memset(line, 0, 1024); - - /* scan for buffer */ - if (!strncmp(buffer, "m = SM_MESSAGE; - } else if (!strncmp(buffer, "m = SM_PRESENCE; - if (!strncmp(type, "UNK", 3)) { /* assume online */ - msg->connected = FLAG_BUDDY_CONNECTED; - } else if (!strncmp(type, "unavailable", 11)) { /* offline */ - msg->connected = 0; - } - } else { - msg->m = SM_UNHANDLED; - } - - /* write the parsed buffer */ - switch (msg->m) { - case SM_MESSAGE: - { - char *aux = strstr(from, "/"); - if (aux) - *aux = '\0'; - msg->from = from; - msg->body = utf8_decode(body); - ut_WriteLog("+OK [%s]\n", buffer); - } - break; - - case SM_PRESENCE: - { - char *aux = strstr(from, "/"); - if (aux) - *aux = '\0'; - msg->from = from; - } - break; - - case SM_UNHANDLED: - ut_WriteLog("BAD [%s]\n", buffer); - break; - - } - free(line); - if (strncmp(to, "UNK", 3)) - free(to); - if (strncmp(from, "UNK", 3) && (msg->m != SM_MESSAGE) - && (msg->m != SM_PRESENCE)) - free(from); - if (strncmp(id, "UNK", 3)) - free(id); - if (strncmp(type, "UNK", 3)) - free(type); - if (strncmp(body, "UNK", 3)) - free(body); - if (strncmp(status, "UNK", 3)) - free(status); - if (strncmp(show, "UNK", 3)) - free(show); - free(buffer); - - return msg; - } - - return NULL; -} - -void srv_AddBuddy(int sock, char *jidname) -{ - char *buffer = (char *) malloc(1024); - char *p, *str; - int i; - - memset(buffer, 0, 1024); - strcpy(buffer, ""); - strcat(buffer, " "); - strcat(buffer, " "); - sk_send(sock, buffer); - free(buffer); - - for (i = 0; i < 2; i++) { - buffer = sk_recv(sock); - ut_WriteLog("[Subscription]: %s\n", buffer); - free(buffer); - } - - buffer = (char *) malloc(1024); - memset(buffer, 0, 1024); - strcpy(buffer, ""); - strcat(buffer, "I would like to add you!"); - sk_send(sock, buffer); - free(buffer); - - buffer = sk_recv(sock); - ut_WriteLog("[Subscription]: %s\n", buffer); - free(buffer); - - buffer = (char *) malloc(1024); - memset(buffer, 0, 1024); - strcpy(buffer, ""); - sk_send(sock, buffer); - free(buffer); - - buffer = sk_recv(sock); - ut_WriteLog("[Subscription]: %s\n", buffer); - free(buffer); -} - -void srv_DelBuddy(int sock, char *jidname) -{ - char *buffer = (char *) malloc(1024); - - strcpy(buffer, ""); - strcat(buffer, ""); - - sk_send(sock, buffer); - free(buffer); - - buffer = sk_recv(sock); - ut_WriteLog("[SubscriptionRemove]: %s\n", buffer); - free(buffer); -} diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/server.h --- a/mcabber/src/server.h Mon Apr 04 18:00:51 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -#ifndef __SERVER_H__ -#define __SERVER_H__ 1 - -typedef enum { - SM_MESSAGE, - SM_PRESENCE, - SM_UNHANDLED -} SRV_MSGTYPE; - -typedef struct { - SRV_MSGTYPE m; /* message type: see above! */ - int connected; /* meaningful only with SM_PRESENCE */ - char *from; /* sender */ - char *body; /* meaningful only with SM_MESSAGE */ -} srv_msg; - -char *srv_poll(int sock); -int srv_connect(const char *server, unsigned int port); -char *srv_login(int sock, const char *server, const char *user, - const char *pass, const char *resource); -int srv_setpresence(int sock, const char *type); -char *srv_getroster(int sock); -int srv_sendtext(int sock, const char *to, const char *text, - const char *from); -int check_io(int fd1, int fd2); -srv_msg *readserver(int sock); -void srv_DelBuddy(int sock, char *jidname); -void srv_AddBuddy(int sock, char *jidname); -#endif diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/socket.c --- a/mcabber/src/socket.c Mon Apr 04 18:00:51 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "utils.h" -#include "socket.h" -#include "screen.h" - -/* Desc: create socket connection - * - * In : servername, port - * Out : socket (or -1 on error) - * - * Note: - - */ -int sk_conn(struct sockaddr *name) -{ - int sock; - - if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { - perror("socket (socket.c:23)"); - return -1; - } - - if (connect(sock, (struct sockaddr *) name, sizeof(struct sockaddr)) < 0) { - perror("connect (socket.c:29)"); - return -1; - } - - return sock; -} - - -/* Desc: send data through socket - * - * In : socket, buffer to send - * Out : 0 = fail, 1 = pass - * - * Note: - - */ -int sk_send(int sock, char *buffer) -{ - //ut_WriteLog("Sending:%s\n", buffer); - if ((send(sock, buffer, strlen(buffer), 0)) == -1) - return 0; - else - return 1; -} - -/* Desc: receive data through socket - * - * In : socket - * Out : received buffer - * - * Note: it is up to the caller to free the returned string - */ -char *sk_recv(int sock) -{ - int i = 1; - int tambuffer = 128; - char mtag[16]; // For tag name - - char *buffer = calloc(1, tambuffer); - char *retval = calloc(1, tambuffer + 1); - - while (1) { - char *p1; - int n = recv(sock, buffer, tambuffer, 0); - if (n == -1) { - // Error - free(buffer); - retval[0] = 0; - return retval; - } - - if (i == 1) { - char *p2; - strncpy(retval, buffer, tambuffer); - p1 = retval+1; - p2 = mtag; - while (('a' <= *p1) && (*p1 <= 'z') && (p2-mtag < 14)) - *p2++ = *p1++; - *p2++ = '>'; *p2++ = 0; - //fprintf(stderr, "TAG=\"%s\"\n", mtag); - } else { - char *old_retval = retval; - scr_LogPrint("Realloc %d [%d]", i-1, n); - if (!n) - break; - retval = realloc(retval, (tambuffer * i) + 1); - if (!retval) { - scr_LogPrint("Memory allocation failure!!"); - ut_WriteLog("Memory allocation failure in sk_recv()\n", retval); - free(buffer); - return old_retval; - } - strncat(retval, buffer, tambuffer); - } - i++; - p1 = retval + strlen(retval) - strlen(mtag); - //fprintf(stderr, "buffer:[%s]\n", buffer); - //fprintf(stderr, "End RET=[%s]\n", p1); - if (!strcmp(p1, mtag)) - break; - for (p1 = retval; *p1 && (*p1 != '>'); p1++); - if ((*p1 == '>') && (*(p1-1) == '/')) - break; - memset(buffer, 0, tambuffer); - } - free(buffer); - ut_WriteLog("Received:%s\n", retval); - return retval; -} diff -r f78ffe7ce43d -r a8ceaa3005fd mcabber/src/socket.h --- a/mcabber/src/socket.h Mon Apr 04 18:00:51 2005 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -#ifndef __SOCKET_H__ -#define __SOCKET_H__ 1 - -#include - -int sk_conn(struct sockaddr *name); -int sk_send(int sock, char *buffer); -char *sk_recv(int sock); - -#endif