[/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}
--- 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
--- 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());
}
--- 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 <ncurses.h>
+#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
--- 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
--- 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<string>::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;
--- 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__ */
--- 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();
--- 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;
--- 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 <arpa/inet.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/poll.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/select.h>
-
-#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, "<?xml version='1.0' encoding='UTF-8' ?>");
- strcat(stringtosend, "<stream:stream to='");
- strcat(stringtosend, server);
- strcat(stringtosend, "' xmlns='jabber:client' xmlns:stream='");
- strcat(stringtosend, "http://etherx.jabber.org/streams'>\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, "<iq type='set' id='1000'>");
- strcat(stringtosend, "<query xmlns='jabber:iq:auth'>");
- strcat(stringtosend, "<username>");
- strcat(stringtosend, user);
- strcat(stringtosend, "</username><password>");
- strcat(stringtosend, pass);
- strcat(stringtosend, "</password><resource>");
- strcat(stringtosend, resource);
- strcat(stringtosend, "</resource></query></iq>\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, "<iq type='set' id='reg' to='");
- strcat(stringtosend, server);
- strcat(stringtosend, "'>");
- strcat(stringtosend, "<query xmlns='jabber:iq:register'>");
- strcat(stringtosend, "<username>");
- strcat(stringtosend, user);
- strcat(stringtosend, "</username><password>");
- strcat(stringtosend, pass);
- strcat(stringtosend, "</password>");
- strcat(stringtosend, "</query></iq>\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, "<presence><status>%.512s</status></presence>", 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, "<iq type='get' id='1001'><query xmlns='");
- strcat(str, "jabber:iq:roster'/></iq>\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,
- "<message from='%s' to='%s' type='chat'><body>%.1536s</body></message>",
- 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, "<message", 8)) { /* manage messages */
- msg->m = SM_MESSAGE;
- } else if (!strncmp(buffer, "<presence", 9)) { /* manage presences */
- msg->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, "<iq type='set'>");
- strcat(buffer, " <query xmlns='jabber:iq:roster'>");
- strcat(buffer, " <item");
- strcat(buffer, " jid='");
- strcat(buffer, jidname);
- strcat(buffer, "' name='");
-
- str = strdup(jidname);
- p = strstr(str, "@");
- if (p)
- *p = '\0';
- strcat(buffer, str);
- strcat(buffer, "'/></query></iq>");
- 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, "<presence to='");
- strcat(buffer, jidname);
- strcat(buffer, "' type='subscribe'>");
- strcat(buffer, "<status>I would like to add you!</status></presence>");
- 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, "<presence to='");
- strcat(buffer, jidname);
- strcat(buffer, "' type='subscribed'/>");
- 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, "<iq type='set'><query xmlns='jabber:iq:roster'>");
- strcat(buffer, "<item jid='");
- strcat(buffer, jidname);
- strcat(buffer, "' subscription='remove'/></query></iq>");
-
- sk_send(sock, buffer);
- free(buffer);
-
- buffer = sk_recv(sock);
- ut_WriteLog("[SubscriptionRemove]: %s\n", buffer);
- free(buffer);
-}
--- 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
--- 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <unistd.h>
-#include <signal.h>
-
-#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;
-}
--- 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 <sys/socket.h>
-
-int sk_conn(struct sockaddr *name);
-int sk_send(int sock, char *buffer);
-char *sk_recv(int sock);
-
-#endif