diff src/oscar.c @ 1:2846a03bda67

[gaim-migrate @ 10] The other missing files :) committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Thu, 23 Mar 2000 03:13:54 +0000
parents
children 34db9f242899
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/oscar.c	Thu Mar 23 03:13:54 2000 +0000
@@ -0,0 +1,399 @@
+/*
+ * gaim
+ *
+ * Some code copyright (C) 1998-1999, Mark Spencer <markster@marko.net>
+ * libfaim code copyright 1998, 1999 Adam Fritzler <afritz@auk.cx>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifdef USE_OSCAR
+
+#include <netdb.h>
+#include <gtk/gtk.h>
+#include <unistd.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include "gaim.h"
+#include <aim.h>
+#include "gnome_applet_mgr.h"
+
+struct aim_conn_t *gaim_conn = NULL;
+static int inpa = -1;
+
+int gaim_auth_failure(struct command_rx_struct *command, ...);
+int gaim_auth_success(struct command_rx_struct *command, ...);
+int gaim_serverready_handle(struct command_rx_struct *command, ...);
+int gaim_redirect_handle(struct command_rx_struct *command, ...);
+int gaim_im_handle(struct command_rx_struct *command, ...);
+
+rxcallback_t gaim_callbacks[] = {
+        gaim_im_handle,                 /* incoming IM */
+        NULL,/*gaim_buddy_coming,               oncoming buddy */
+        NULL,/*gaim_buddy_going,                offgoing buddy */
+        NULL,                           /* last IM was missed 1 */
+        NULL,                           /* last IM was missed 2 */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        gaim_serverready_handle,        /* server ready */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        NULL,                   /* UNUSED */
+        gaim_redirect_handle,           /* redirect */
+        NULL,                           /* last command bad */
+        NULL,                           /* missed some messages */
+        NULL,                           /* completely unknown command */
+        NULL, /*gaim_userinfo_handler,           User Info Response */
+        NULL,                           /* Address search response */
+        NULL,                           /* Name search response */
+        NULL,                           /* User Search fail */
+        gaim_auth_failure,              /* auth error */
+        gaim_auth_success,              /* auth success */
+        NULL,                           /* auth server ready */
+        NULL,                           /* ? */
+        NULL,                           /* password change done */
+        gaim_serverready_handle,        /* server ready */
+        0x00
+};
+
+struct client_info_s cinfo;
+
+
+void oscar_close()
+{
+#ifdef USE_APPLET
+	setUserState(offline);
+#endif /* USE_APPLET */
+        set_state(STATE_OFFLINE);
+        aim_conn_close(gaim_conn);
+        if (inpa > 0)
+                gdk_input_remove(inpa);
+	inpa=-1;
+}
+
+
+void oscar_callback(gpointer data, gint source, GdkInputCondition condition)
+{
+        if (aim_get_command() < 0) {
+                signoff();
+                hide_login_progress("Connection Closed");
+                return;
+        } else
+                aim_rxdispatch();
+
+}
+
+int oscar_login(char *username, char *password)
+{
+        char buf[256];
+        struct timeval timeout;
+        time_t lastcycle=0;
+        
+        aim_connrst();
+        aim_register_callbacks(gaim_callbacks);
+
+        aim_conn_getnext()->fd = STDIN_FILENO;
+
+        set_login_progress(1, "Looking up " login_host);
+
+        gaim_conn = aim_newconn(AIM_CONN_TYPE_AUTH, login_host);
+
+        if (!gaim_conn) {
+#ifdef USE_APPLET
+                setUserState(offline);
+#endif /* USE_APPLET */
+                set_state(STATE_OFFLINE);
+                hide_login_progress("Unable to login to AIM");
+                return -1;
+        } else if (gaim_conn->fd == -1) {
+#ifdef USE_APPLET
+                setUserState(offline);
+#endif /* USE_APPLET */
+                set_state(STATE_OFFLINE);
+                
+                if (gaim_conn->status & AIM_CONN_STATUS_RESOLVERR) {
+                        hide_login_progress("Unable to lookup " login_host);
+                } else if (gaim_conn->status & AIM_CONN_STATUS_CONNERR) {
+                        hide_login_progress("Unable to connect to " login_host);
+                }
+                return -1;
+        }
+
+        g_snprintf(buf, sizeof(buf), "Signon: %s",username);
+	
+        set_login_progress(2, buf);
+
+        strcpy(cinfo.clientstring, "libfaim/GAIM, jimduchek@ou.edu, see at http://www.marko.net/gaim");
+        cinfo.major = 0;
+        cinfo.minor = 9;
+        cinfo.build = 7;
+        strcpy(cinfo.country, "us");
+        strcpy(cinfo.lang, "en");
+
+        aim_send_login(gaim_conn, username, password, &cinfo);
+
+        if (!current_user) {
+                current_user = g_new0(struct aim_user, 1);
+                g_snprintf(current_user->username, sizeof(current_user->username), DEFAULT_INFO);
+                aim_users = g_list_append(aim_users, current_user);
+        }
+
+        g_snprintf(current_user->username, sizeof(current_user->username), "%s", username);
+        g_snprintf(current_user->password, sizeof(current_user->password), "%s", password);
+
+        save_prefs();
+
+        inpa = gdk_input_add(gaim_conn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, oscar_callback, NULL);
+
+        return 0;
+}
+
+int gaim_auth_success(struct command_rx_struct *command, ...)
+{
+        va_list ap;
+        struct login_phase1_struct *logininfo;
+        struct aim_conn_t *bosconn = NULL;
+        char buf[128];
+
+        va_start(ap, command);
+        logininfo = va_arg(ap, struct login_phase1_struct *);
+        va_end(ap);
+
+        g_snprintf(buf, sizeof(buf), "Auth successful, logging in to %s:", logininfo->BOSIP);
+        set_login_progress(3, buf);
+        
+        printf("          Screen name: %s\n", logininfo->screen_name);
+        printf("       Email addresss: %s\n", logininfo->email);
+        printf("  Registration status: %02i\n", logininfo->regstatus);
+        printf("Connecting to %s, closing auth connection.\n",
+                logininfo->BOSIP);
+
+        aim_conn_close(command->conn);
+
+        gdk_input_remove(inpa);
+
+        if ((bosconn = aim_newconn(AIM_CONN_TYPE_BOS, logininfo->BOSIP))
+            == NULL) {
+#ifdef USE_APPLET
+                setUserState(offline);
+#endif /* USE_APPLET */
+                set_state(STATE_OFFLINE);
+
+                hide_login_progress("Could not connect to BOS: internal error");
+                return(-1);
+        } else if (bosconn->status != 0) {
+#ifdef USE_APPLET
+                setUserState(offline);
+#endif /* USE_APPLET */
+                set_state(STATE_OFFLINE);
+
+                hide_login_progress("Could not connect to BOS");
+                return(-1);
+        } else {
+                aim_auth_sendcookie(bosconn, logininfo->cookie);
+                inpa = gdk_input_add(bosconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, oscar_callback, NULL);
+                set_login_progress(4, "BOS connection established, cookie sent.");
+                return(1);
+        }
+}
+
+int gaim_auth_failure(struct command_rx_struct *command, ...)
+{
+        va_list ap;
+        struct login_phase1_struct      *logininfo;
+        char    *errorurl;
+        short   errorcode;
+
+        va_start(ap, command);
+        logininfo = va_arg(ap, struct login_phase1_struct *);
+        printf("Screen name: %s\n", logininfo->screen_name);
+        errorurl = va_arg(ap, char *);
+        printf("Error URL: %s\n", errorurl);
+        errorcode = va_arg(ap, short);
+        printf("Error code: 0x%02x\n", errorcode);
+        va_end(ap);
+#ifdef USE_APPLET
+        setUserState(offline);
+#endif /* USE_APPLET */
+        set_state(STATE_OFFLINE);
+        hide_login_progress("Authentication Failed");
+
+        aim_conn_close(aim_getconn_type(AIM_CONN_TYPE_AUTH));
+
+        return 1;
+}
+
+int gaim_serverready_handle(struct command_rx_struct *command, ...)
+{
+        switch (command->conn->type) {
+        case AIM_CONN_TYPE_BOS:
+                aim_bos_reqrate(command->conn);
+                aim_bos_ackrateresp(command->conn);
+                aim_bos_setprivacyflags(command->conn, 0x00000003);
+                aim_bos_reqservice(command->conn, AIM_CONN_TYPE_ADS);
+                aim_bos_setgroupperm(NULL, 0x1f);
+                break;
+        case AIM_CONN_TYPE_CHATNAV:
+		break;
+        default:
+		printf("Unknown connection type on serverready\n");
+		break;
+        }
+        return(1);
+
+}
+
+int gaim_redirect_handle(struct command_rx_struct *command, ...)
+{
+        va_list ap;
+        int     serviceid;
+        char    *ip, *cookie;
+
+        va_start(ap, command);
+        serviceid = va_arg(ap, int);
+        ip = va_arg(ap, char *);
+        cookie = va_arg(ap, char *);
+        va_end(ap);
+
+        switch(serviceid) {
+        case 0x0005: {
+                char *buf;
+                char *buf2;
+                char *first = g_malloc(64);
+                char file[1024];
+                FILE *f;
+
+                g_snprintf(file, sizeof(file), "%s/.gaimbuddy", getenv("HOME"));
+        
+                if (!(f = fopen(file,"r"))) {
+                } else {
+                        buf = g_malloc(BUF_LONG);
+                        fread(buf, BUF_LONG, 1, f);
+
+                        parse_toc_buddy_list(buf);
+
+                        build_edit_tree();
+                        build_permit_tree();
+        
+
+                        g_free(buf);
+                }
+                
+
+
+                aim_bos_clientready(command->conn);
+
+		set_login_progress(5, "Logged in.\n");
+#ifdef USE_APPLET
+		if (applet_buddy_auto_show) {
+			show_buddy_list();
+			refresh_buddy_window();
+		} else {
+		}
+
+		set_applet_draw_closed();
+		setUserState(online);
+#else
+		gtk_widget_hide(mainwindow);
+		show_buddy_list();
+		refresh_buddy_window();
+#endif
+		serv_finish_login();
+		gaim_conn = command->conn;
+
+                break;
+        }
+	case 0x0007: {
+		struct aim_conn_t       *tstconn;
+
+		tstconn = aim_newconn(AIM_CONN_TYPE_AUTH, ip);
+		if ((tstconn == NULL) ||
+		    (tstconn->status >= AIM_CONN_STATUS_RESOLVERR)) {
+#ifdef USE_APPLET
+			setUserState(offline);
+#endif /* USE_APPLET */
+			set_state(STATE_OFFLINE);
+			hide_login_progress("Unable to reconnect to authorizer");
+		} else
+			aim_auth_sendcookie(tstconn, cookie);
+		break;
+	}
+	case 0x000d: {
+		struct aim_conn_t       *tstconn;
+
+		tstconn = aim_newconn(AIM_CONN_TYPE_CHATNAV, ip);
+		if ((tstconn == NULL) ||
+		    (tstconn->status >= AIM_CONN_STATUS_RESOLVERR))
+			printf("Unable to connect to chatnav server\n");
+		else
+			aim_auth_sendcookie(
+					    aim_getconn_type(AIM_CONN_TYPE_CHATNAV),
+					    cookie);
+		break;
+	}
+	case 0x000e:
+		printf("CHAT is not yet supported :(\n");
+		break;
+	default:
+		printf("Unknown redirect %#04X\n", serviceid);
+		break;
+	}
+	return(1);
+		
+}
+
+
+
+int gaim_im_handle(struct command_rx_struct *command, ...)
+{
+        time_t  t = 0;
+        char    *screenname, *msg;
+        int     warninglevel, class, idletime, isautoreply;
+        ulong   membersince, onsince;
+        va_list ap;
+
+        va_start(ap, command);
+	screenname = va_arg(ap, char *);
+	msg = va_arg(ap, char *);
+	warninglevel = va_arg(ap, int);
+	class = va_arg(ap, int);
+        membersince = va_arg(ap, ulong);
+        onsince = va_arg(ap, ulong);
+        idletime = va_arg(ap, int);
+        isautoreply = va_arg(ap, int);
+        va_end(ap);
+
+        printf("'%s'\n", msg);
+        
+        serv_got_im(screenname, msg, isautoreply);
+
+        return(1);
+
+
+}
+
+#endif