Mercurial > pidgin
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); |