]> code.citadel.org Git - citadel.git/blobdiff - citadel/serv_icq.c
* Get/save arbitrary configs
[citadel.git] / citadel / serv_icq.c
index 6195f31ef8bb6c028e8b777346dae373b3f2686f..0af084e111e5f597f10964e651e1c25737e4fb30 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
 
 #include <time.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <limits.h>
 #include "sysdep.h"
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
 #include "citadel.h"
 #include "server.h"
 #include "dynloader.h"
 #include "tools.h"
 #include "citserver.h"
+#include "locate_host.h"
 #include "msgbase.h"
 #include "sysdep_decls.h"
 #include "support.h"
@@ -53,16 +52,12 @@ struct CtdlICQ_CL {
        DWORD uin;
        char name[32];
        DWORD status;
+       char host[26];
 };
 
 
 /* <ig> */
 
-/* ICQROOM is the name of the room in which each user's ICQ configuration
- * and contact lists will be stored.  (It's a personal room.)
- */
-#define ICQROOM                "My ICQ Config"
-
 /* MIME types to use for storing ICQ stuff */
 #define ICQMIME                "application/x-citadel-icq"     /* configuration */
 #define ICQCLMIME      "application/x-citadel-icq-cl"  /* contact list */
@@ -1793,7 +1788,7 @@ void CtdlICQ_Read_Config(void) {
        char icq_rm[ROOMNAMELEN];
        
        strcpy(hold_rm, CC->quickroom.QRname);
-       MailboxName(icq_rm, &CC->usersupp, ICQROOM);
+       MailboxName(icq_rm, &CC->usersupp, USERCONFIGROOM);
        strcpy(ThisICQ->icq_config, "");
 
        if (getroom(&CC->quickroom, icq_rm) != 0) {
@@ -1804,7 +1799,8 @@ void CtdlICQ_Read_Config(void) {
        /* We want the last (and probably only) config in this room */
        lprintf(9, "We're in <%s> looking for config\n", 
                CC->quickroom.QRname);
-       CtdlForEachMessage(MSGS_LAST, 1, ICQMIME, CtdlICQ_Read_Config_Backend);
+       CtdlForEachMessage(MSGS_LAST, 1, ICQMIME, NULL,
+               CtdlICQ_Read_Config_Backend);
        getroom(&CC->quickroom, hold_rm);
        return;
 }
@@ -1826,7 +1822,7 @@ void CtdlICQ_Write_Config(void) {
        fclose(fp);
 
        /* this handy API function does all the work for us */
-       CtdlWriteObject(ICQROOM, ICQMIME, temp, 1, 0, 1);
+       CtdlWriteObject(USERCONFIGROOM, ICQMIME, temp, &CC->usersupp, 0, 1, 0);
 
        unlink(temp);
 }
@@ -1856,7 +1852,7 @@ void CtdlICQ_Write_CL(void) {
        fclose(fp);
 
        /* this handy API function does all the work for us */
-       CtdlWriteObject(ICQROOM, ICQCLMIME, temp, 1, 0, 1);
+       CtdlWriteObject(USERCONFIGROOM, ICQCLMIME, temp, &CC->usersupp, 0, 1, 0);
 
        unlink(temp);
 }
@@ -1917,7 +1913,7 @@ void CtdlICQ_Read_CL(void) {
        char icq_rm[ROOMNAMELEN];
        
        strcpy(hold_rm, CC->quickroom.QRname);
-       MailboxName(icq_rm, &CC->usersupp, ICQROOM);
+       MailboxName(icq_rm, &CC->usersupp, USERCONFIGROOM);
        strcpy(ThisICQ->icq_config, "");
 
        if (getroom(&CC->quickroom, icq_rm) != 0) {
@@ -1932,7 +1928,8 @@ void CtdlICQ_Read_CL(void) {
        }
 
        /* We want the last (and probably only) list in this room */
-       CtdlForEachMessage(MSGS_LAST, 1, ICQCLMIME, CtdlICQ_Read_CL_Backend);
+       CtdlForEachMessage(MSGS_LAST, 1, ICQCLMIME, NULL,
+               CtdlICQ_Read_CL_Backend);
        getroom(&CC->quickroom, hold_rm);
 }
 
@@ -1968,6 +1965,7 @@ void CtdlICQ_Refresh_Contact_List(void) {
        if (ThisICQ->icq_Sok < 0) return;
        icq_ContClear();
 
+       CtdlICQ_Read_CL();
        if (ThisICQ->icq_numcl) for (i=0; i<ThisICQ->icq_numcl; ++i) {
                if (ThisICQ->icq_cl[i].uin > 0L) {
                        icq_ContAddUser(ThisICQ->icq_cl[i].uin);
@@ -1976,6 +1974,7 @@ void CtdlICQ_Refresh_Contact_List(void) {
        }
 
        icq_SendContactList();
+
 }
 
 
@@ -2008,13 +2007,10 @@ void CtdlICQ_Login_If_Possible(void) {
        uin = extract_long(ThisICQ->icq_config, 0);
        extract(pass, ThisICQ->icq_config, 1);
 
-       lprintf(9, "Here's my config: %s\n", ThisICQ->icq_config);
-
        if ( (uin > 0L) && (strlen(pass)>0) ) {
                icq_Init(uin, pass);
                if (icq_Connect("icq1.mirabilis.com", 4000) >= 0) {
                        icq_Login(STATUS_ONLINE);
-                       CtdlICQ_Refresh_Contact_List();
                }
        }
 }
@@ -2058,7 +2054,7 @@ void CtdlICQ_session_stopdown_hook(void) {
 void CtdlICQ_after_cmd_hook(void)
 {
        if (ThisICQ->icq_Sok >= 0) {
-               if ( (time(NULL) - ThisICQ->icq_LastKeepAlive) > 90 ) {
+               if ( (time(NULL) - ThisICQ->icq_LastKeepAlive) > 60 ) {
                        icq_KeepAlive();
                        ThisICQ->icq_LastKeepAlive = time(NULL);
                }
@@ -2107,8 +2103,18 @@ void CtdlICQ_Incoming_Message(DWORD uin, BYTE hour, BYTE minute,
        
        char from[256];
        int num_delivered;
+       int i;
 
+       /* Default sender is 'uin@icq' syntax */
        sprintf(from, "%ld@icq", uin);
+
+       /* Use the sender's name if we have it  inthe contact list */
+       if (ThisICQ->icq_numcl) for (i=0; i<ThisICQ->icq_numcl; ++i) {
+               if (uin == ThisICQ->icq_cl[i].uin) {
+                       safestrncpy(from, ThisICQ->icq_cl[i].name, 256);
+               }
+       }
+
        num_delivered = PerformXmsgHooks(from, CC->curr_user, (char *)msg);
        lprintf(9, "Delivered to %d users\n", num_delivered);
 }
@@ -2121,6 +2127,7 @@ void CtdlICQ_InfoReply(unsigned long uin, const char *nick,
 
        struct CtdlICQ_CL *ptr;
        
+       CtdlICQ_Read_CL();
        ptr = CtdlICQ_CLent(uin);
        safestrncpy(ptr->name, nick, 32);
        ptr->status = STATUS_OFFLINE;
@@ -2234,7 +2241,6 @@ void cmd_cicq(char *argbuf) {
                        uin = extract_long(buf, 0);
                        if (uin > 0L) {
                                CtdlICQ_CLent(uin);
-                               icq_SendInfoReq(uin);
                        }
                }
                CtdlICQ_Write_CL();
@@ -2268,7 +2274,7 @@ void CtdlICQ_rwho(void) {
                        0,      /* no session ID */
                        ThisICQ->icq_cl[i].name,
                        icq_ConvertStatus2Str(ThisICQ->icq_cl[i].status),
-                       " ",    /* FIX add host */
+                       ThisICQ->icq_cl[i].host,
                        " ",    /* no client */
                        time(NULL),     /* now? */
                        " ",    /* no last command */
@@ -2287,7 +2293,6 @@ void CtdlICQ_Status_Update(DWORD uin, DWORD status) {
 
 
 void CtdlICQ_Logged(void) {
-       CtdlICQ_Read_CL();
        CtdlICQ_Refresh_Contact_List();
 }
 
@@ -2295,7 +2300,11 @@ void CtdlICQ_Logged(void) {
 void CtdlICQ_UserOnline(DWORD uin, DWORD status, DWORD ip,
                        DWORD port, DWORD realip) {
 
+       DWORD decoded_ip;
+       
        CtdlICQ_Status_Update(uin, status);
+       decoded_ip = ntohl(ip);
+       locate_host(CtdlICQ_CLent(uin)->host, (struct in_addr *)&decoded_ip);
 }