comparison src/oscar.c @ 1156:b6b2d26a4e2f

[gaim-migrate @ 1166] it's the little things ;) committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 28 Nov 2000 10:34:13 +0000
parents 3063e6743913
children 984cbc219724
comparison
equal deleted inserted replaced
1155:f4d4a14752ee 1156:b6b2d26a4e2f
68 int create_exchange; 68 int create_exchange;
69 char *create_name; 69 char *create_name;
70 70
71 GSList *oscar_chats; 71 GSList *oscar_chats;
72 GSList *direct_ims; 72 GSList *direct_ims;
73 GSList *getfiles;
73 }; 74 };
74 75
75 struct chat_connection { 76 struct chat_connection {
76 char *name; 77 char *name;
77 int fd; /* this is redundant since we have the conn below */ 78 int fd; /* this is redundant since we have the conn below */
98 char *sn; 99 char *sn;
99 char *cookie; 100 char *cookie;
100 char *ip; 101 char *ip;
101 }; 102 };
102 103
104 struct getfile_transfer {
105 struct gaim_connection *gc;
106 char *filename;
107 struct aim_conn_t *conn;
108 int gip;
109 FILE *file;
110 };
111
103 static struct direct_im *find_direct_im(struct oscar_data *od, char *who) { 112 static struct direct_im *find_direct_im(struct oscar_data *od, char *who) {
104 GSList *d = od->direct_ims; 113 GSList *d = od->direct_ims;
105 char *n = g_strdup(normalize(who)); 114 char *n = g_strdup(normalize(who));
106 struct direct_im *m = NULL; 115 struct direct_im *m = NULL;
107 116
113 d = d->next; 122 d = d->next;
114 } 123 }
115 124
116 g_free(n); 125 g_free(n);
117 return m; 126 return m;
127 }
128
129 static struct getfile_transfer *find_getfile_transfer(struct oscar_data *od, struct aim_conn_t *conn) {
130 GSList *g = od->getfiles;
131 struct getfile_transfer *n = NULL;
132
133 while (g) {
134 n = (struct getfile_transfer *)g->data;
135 if (n->conn == conn)
136 return n;
137 n = NULL;
138 g = g->next;
139 }
140
141 return n;
118 } 142 }
119 143
120 struct chat_connection *find_oscar_chat(struct gaim_connection *gc, char *name) { 144 struct chat_connection *find_oscar_chat(struct gaim_connection *gc, char *name) {
121 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats; 145 GSList *g = ((struct oscar_data *)gc->proto_data)->oscar_chats;
122 struct chat_connection *c = NULL; 146 struct chat_connection *c = NULL;
296 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) { 320 } else if (conn->type == AIM_CONN_TYPE_CHATNAV) {
297 if (odata->cnpa > -1) 321 if (odata->cnpa > -1)
298 gdk_input_remove(odata->cnpa); 322 gdk_input_remove(odata->cnpa);
299 odata->cnpa = -1; 323 odata->cnpa = -1;
300 debug_print("removing chatnav input watcher\n"); 324 debug_print("removing chatnav input watcher\n");
325 aim_conn_kill(odata->sess, &conn);
326 } else if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) {
327 debug_printf("No handler for rendezvous disconnect (%d).\n",
328 source);
301 aim_conn_kill(odata->sess, &conn); 329 aim_conn_kill(odata->sess, &conn);
302 } else { 330 } else {
303 sprintf(debug_buff, "holy crap! generic connection error! %d\n", 331 sprintf(debug_buff, "holy crap! generic connection error! %d\n",
304 conn->type); 332 conn->type);
305 debug_print(debug_buff); 333 debug_print(debug_buff);
765 g_free(g->cookie); 793 g_free(g->cookie);
766 g_free(g->sn); 794 g_free(g->sn);
767 g_free(g); 795 g_free(g);
768 } 796 }
769 797
770 static int accept_getfile(gpointer w, struct ask_getfile *g) { 798 static void cancel_getfile_file(GtkObject *obj, struct ask_getfile *g) {
771 /* 799 GtkWidget *w = gtk_object_get_user_data(obj);
800 gtk_widget_destroy(w);
801 cancel_getfile(w, g);
802 }
803
804 static int gaim_getfile_filereq(struct aim_session_t *sess, struct command_rx_struct *command, ...) {
805 va_list ap;
806 struct aim_conn_t *oftconn;
807 struct aim_fileheader_t *fh;
808 char *cookie;
809
810 va_start(ap, command);
811 oftconn = va_arg(ap, struct aim_conn_t *);
812 fh = va_arg(ap, struct aim_fileheader_t *);
813 cookie = va_arg(ap, char *);
814 va_end(ap);
815
816 debug_printf("faimtest: request for file %s.\n", fh->name);
817
818 return 1;
819 }
820
821 static int gaim_getfile_filesend(struct aim_session_t *sess, struct command_rx_struct *command, ...) {
822 va_list ap;
823 struct aim_conn_t *oftconn;
824 struct aim_fileheader_t *fh;
825 char *path, *cookie;
826
827 va_start(ap, command);
828 oftconn = va_arg(ap, struct aim_conn_t *);
829 fh = va_arg(ap, struct aim_fileheader_t *);
830 cookie = va_arg(ap, char *);
831 va_end(ap);
832
833 debug_printf("faimtest: sending file %s.\n", fh->name);
834
835 return 1;
836 }
837
838 static int gaim_getfile_complete(struct aim_session_t *sess, struct command_rx_struct *command, ...) {
839 }
840
841 static int gaim_getfile_disconnect(struct aim_session_t *sess, struct command_rx_struct *command, ...) {
842 struct gaim_connection *gc = find_gaim_conn_by_aim_sess(sess);
843 struct oscar_data *od = (struct oscar_data *)gc->proto_data;
844 va_list ap;
845 struct aim_conn_t *conn;
846 char *sn;
847 struct getfile_transfer *gt;
848
849 va_start(ap, command);
850 conn = va_arg(ap, struct aim_conn_t *);
851 sn = va_arg(ap, char *);
852 va_end(ap);
853
854 gt = find_getfile_transfer(od, conn);
855 od->getfiles = g_slist_remove(od->getfiles, gt);
856 gdk_input_remove(gt->gip);
857 g_free(gt->filename);
858 aim_conn_kill(sess, &conn);
859 g_free(gt);
860
861 debug_printf("getfile disconnect\n");
862
863 return 1;
864 }
865
866 static void do_getfile(GtkObject *obj, struct ask_getfile *g) {
867 GtkWidget *w = gtk_object_get_user_data(obj);
868 char *filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(w));
772 struct gaim_connection *gc = g->gc; 869 struct gaim_connection *gc = g->gc;
773 870 struct oscar_data *od = (struct oscar_data *)gc->proto_data;
774 if ((newconn = aim_accepttransfer(od->sess, od->conn, g->sn, g->cookie, g->ip, od->sess->oft.listing, AIM_CAPS_GETFILE)) == NULL) { 871 struct getfile_transfer *gf;
872 struct stat st;
873 struct tm *ft;
874 char tmppath[256];
875 FILE *file;
876 static int current = 0;
877 struct aim_conn_t *newconn;
878
879 if (file_is_dir(filename, w))
880 return;
881
882 if (stat(filename, &st) != 0) {
883 gtk_widget_destroy(w);
884 do_error_dialog(_("Error examining file"), _("GetFile Error"));
775 cancel_getfile(w, g); 885 cancel_getfile(w, g);
776 return; 886 return;
777 } 887 }
778 */ 888
779 889 g_snprintf(tmppath, sizeof tmppath, "/%s/gaim%d%d", g_get_tmp_dir(), getpid(), current++);
780 do_error_dialog("getfile FIXME", "ha"); 890 if ((file = fopen(tmppath, "w+")) == NULL) {
781 891 gtk_widget_destroy(w);
782 cancel_getfile(w, g); 892 do_error_dialog(_("Could not open temporary file, aborting"), _("GetFile Error"));
893 cancel_getfile(w, g);
894 return;
895 }
896
897 gf = g_new0(struct getfile_transfer, 1);
898 od->getfiles = g_slist_append(od->getfiles, gf);
899 gf->gc = gc;
900 gf->filename = g_strdup(filename);
901
902 ft = localtime(&st.st_ctime);
903 fprintf(file, "%2d/%2d/%4d %2d:%2d %8ld %s\r\n",
904 ft->tm_mon + 1, ft->tm_mday, ft->tm_year + 1900,
905 ft->tm_hour + 1, ft->tm_min + 1, st.st_size, g_basename(filename));
906 rewind(file);
907
908
909 debug_printf("cookie: %s ip: %s\n", g->cookie, g->ip);
910 if ((newconn = aim_accepttransfer(od->sess, od->conn, g->sn, g->cookie, g->ip, file, AIM_CAPS_GETFILE)) == NULL) {
911 do_error_dialog(_("Error connecting for transfer"), _("GetFile Error"));
912 g_free(gf->filename);
913 fclose(file);
914 g_free(gf);
915 return;
916 }
917
918 gtk_widget_destroy(w);
919 fclose(file); /* can we do this? */
920
921 gf->gip = gdk_input_add(newconn->fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, oscar_callback, newconn);
922 aim_conn_addhandler(od->sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILEREQ, gaim_getfile_filereq, 0);
923 aim_conn_addhandler(od->sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEFILESEND, gaim_getfile_filesend, 0);
924 aim_conn_addhandler(od->sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILECOMPLETE, gaim_getfile_complete, 0);
925 aim_conn_addhandler(od->sess, newconn, AIM_CB_FAM_OFT, AIM_CB_OFT_GETFILEDISCONNECT, gaim_getfile_disconnect, 0);
926 }
927
928 static int accept_getfile(gpointer w, struct ask_getfile *g) {
929 GtkWidget *window;
930 window = gtk_file_selection_new(_("Gaim - Send File..."));
931 gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(window));
932 gtk_object_set_user_data(GTK_OBJECT(window), window);
933 gtk_signal_connect(GTK_OBJECT(window), "destroy",
934 GTK_SIGNAL_FUNC(cancel_getfile_file), g);
935 gtk_object_set_user_data(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), window);
936 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(window)->ok_button), "clicked",
937 GTK_SIGNAL_FUNC(do_getfile), g);
938 gtk_object_set_user_data(GTK_OBJECT(GTK_FILE_SELECTION(window)->cancel_button), window);
939 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(window)->cancel_button), "clicked",
940 GTK_SIGNAL_FUNC(cancel_getfile_file), g);
941 gtk_widget_show(window);
783 942
784 return TRUE; 943 return TRUE;
785 } 944 }
786 945
787 int gaim_parse_incoming_im(struct aim_session_t *sess, 946 int gaim_parse_incoming_im(struct aim_session_t *sess,
839 userinfo = va_arg(ap, struct aim_userinfo_s *); 998 userinfo = va_arg(ap, struct aim_userinfo_s *);
840 ip = va_arg(ap, char *); 999 ip = va_arg(ap, char *);
841 cookie = va_arg(ap, char *); 1000 cookie = va_arg(ap, char *);
842 va_end(ap); 1001 va_end(ap);
843 1002
844 debug_printf("%s received getfile request from %s (%s)\n", 1003 debug_printf("%s received getfile request from %s (%s), cookie = %s\n",
845 gc->username, userinfo->sn, ip); 1004 gc->username, userinfo->sn, ip, cookie);
846 1005
847 g->gc = gc; 1006 g->gc = gc;
848 g->sn = g_strdup(userinfo->sn); 1007 g->sn = g_strdup(userinfo->sn);
849 g->cookie = g_strdup(cookie); 1008 g->cookie = g_strdup(cookie);
850 g->ip = g_strdup(ip); 1009 g->ip = g_strdup(ip);