| 1013 xfer->ui_data = NULL; |
1007 xfer->ui_data = NULL; |
| 1014 } |
1008 } |
| 1015 } |
1009 } |
| 1016 |
1010 |
| 1017 static void |
1011 static void |
| 1018 choose_file_ok_cb(void *user_data, const char *filename) |
|
| 1019 { |
|
| 1020 GaimXfer *xfer; |
|
| 1021 struct stat st; |
|
| 1022 |
|
| 1023 xfer = (GaimXfer *)user_data; |
|
| 1024 |
|
| 1025 if (stat(filename, &st) != 0) { |
|
| 1026 /* File not found. */ |
|
| 1027 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { |
|
| 1028 gaim_xfer_request_accepted(xfer, filename); |
|
| 1029 } |
|
| 1030 else { |
|
| 1031 gaim_notify_error(NULL, NULL, |
|
| 1032 _("That file does not exist."), NULL); |
|
| 1033 |
|
| 1034 gaim_xfer_request_denied(xfer); |
|
| 1035 } |
|
| 1036 } |
|
| 1037 else if ((gaim_xfer_get_type(xfer) == GAIM_XFER_SEND) && |
|
| 1038 (st.st_size == 0)) { |
|
| 1039 |
|
| 1040 gaim_notify_error(NULL, NULL, |
|
| 1041 _("Cannot send a file of 0 bytes."), NULL); |
|
| 1042 |
|
| 1043 gaim_xfer_request_denied(xfer); |
|
| 1044 } |
|
| 1045 else { |
|
| 1046 if (S_ISDIR(st.st_mode)) { |
|
| 1047 /* XXX */ |
|
| 1048 gaim_xfer_request_denied(xfer); |
|
| 1049 } |
|
| 1050 else if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { |
|
| 1051 gaim_xfer_request_accepted(xfer, filename); |
|
| 1052 } |
|
| 1053 else { |
|
| 1054 gaim_xfer_request_accepted(xfer, filename); |
|
| 1055 } |
|
| 1056 } |
|
| 1057 |
|
| 1058 gaim_xfer_unref(xfer); |
|
| 1059 } |
|
| 1060 |
|
| 1061 static void |
|
| 1062 choose_file_cancel_cb(void *user_data, const char *filename) |
|
| 1063 { |
|
| 1064 GaimXfer *xfer = (GaimXfer *)user_data; |
|
| 1065 |
|
| 1066 gaim_xfer_request_denied(xfer); |
|
| 1067 } |
|
| 1068 |
|
| 1069 static int |
|
| 1070 choose_file(GaimXfer *xfer) |
|
| 1071 { |
|
| 1072 gaim_request_file(xfer, NULL, gaim_xfer_get_filename(xfer), |
|
| 1073 (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE), |
|
| 1074 G_CALLBACK(choose_file_ok_cb), |
|
| 1075 G_CALLBACK(choose_file_cancel_cb), xfer); |
|
| 1076 |
|
| 1077 return 0; |
|
| 1078 } |
|
| 1079 |
|
| 1080 static int |
|
| 1081 cancel_recv_cb(GaimXfer *xfer) |
|
| 1082 { |
|
| 1083 gaim_xfer_request_denied(xfer); |
|
| 1084 gaim_xfer_unref(xfer); |
|
| 1085 |
|
| 1086 return 0; |
|
| 1087 } |
|
| 1088 |
|
| 1089 static void |
|
| 1090 gaim_gtkxfer_ask_recv(GaimXfer *xfer) |
|
| 1091 { |
|
| 1092 char *buf, *size_buf; |
|
| 1093 size_t size; |
|
| 1094 |
|
| 1095 /* If we have already accepted the request, ask the destination file |
|
| 1096 name directly */ |
|
| 1097 if (gaim_xfer_get_status(xfer) != GAIM_XFER_STATUS_ACCEPTED) { |
|
| 1098 size = gaim_xfer_get_size(xfer); |
|
| 1099 size_buf = gaim_str_size_to_units(size); |
|
| 1100 |
|
| 1101 buf = g_strdup_printf(_("%s wants to send you %s (%s)"), |
|
| 1102 xfer->who, gaim_xfer_get_filename(xfer), |
|
| 1103 size_buf); |
|
| 1104 g_free(size_buf); |
|
| 1105 |
|
| 1106 gaim_request_accept_cancel(NULL, NULL, buf, NULL, 0, xfer, |
|
| 1107 G_CALLBACK(choose_file), |
|
| 1108 G_CALLBACK(cancel_recv_cb)); |
|
| 1109 g_free(buf); |
|
| 1110 } else |
|
| 1111 choose_file(xfer); |
|
| 1112 } |
|
| 1113 |
|
| 1114 static int |
|
| 1115 ask_accept_ok(GaimXfer *xfer) |
|
| 1116 { |
|
| 1117 gaim_xfer_request_accepted(xfer, NULL); |
|
| 1118 gaim_xfer_unref(xfer); |
|
| 1119 return 0; |
|
| 1120 } |
|
| 1121 |
|
| 1122 static int |
|
| 1123 ask_accept_cancel(GaimXfer *xfer) |
|
| 1124 { |
|
| 1125 gaim_xfer_request_denied(xfer); |
|
| 1126 gaim_xfer_unref(xfer); |
|
| 1127 return 0; |
|
| 1128 } |
|
| 1129 |
|
| 1130 static void |
|
| 1131 gaim_gtkxfer_ask_accept(GaimXfer *xfer) |
|
| 1132 { |
|
| 1133 char *buf, *buf2 = NULL; |
|
| 1134 |
|
| 1135 buf = g_strdup_printf(_("Accept file transfer request from %s?"), |
|
| 1136 xfer->who); |
|
| 1137 if (gaim_xfer_get_remote_ip(xfer) && |
|
| 1138 gaim_xfer_get_remote_port(xfer)) |
|
| 1139 buf2 = g_strdup_printf(_("A file is available for download from:\n" |
|
| 1140 "Remote host: %s\nRemote port: %d"), |
|
| 1141 gaim_xfer_get_remote_ip(xfer), |
|
| 1142 gaim_xfer_get_remote_port(xfer)); |
|
| 1143 gaim_request_accept_cancel(NULL, NULL, buf, buf2, 0, xfer, |
|
| 1144 G_CALLBACK(ask_accept_ok), |
|
| 1145 G_CALLBACK(ask_accept_cancel)); |
|
| 1146 g_free(buf); |
|
| 1147 g_free(buf2); |
|
| 1148 } |
|
| 1149 |
|
| 1150 static void |
|
| 1151 gaim_gtkxfer_request_file(GaimXfer *xfer) |
|
| 1152 { |
|
| 1153 gaim_xfer_ref(xfer); |
|
| 1154 if (gaim_xfer_get_type(xfer) == GAIM_XFER_RECEIVE) { |
|
| 1155 if (gaim_xfer_get_filename(xfer) || |
|
| 1156 gaim_xfer_get_status(xfer) == GAIM_XFER_STATUS_ACCEPTED) |
|
| 1157 gaim_gtkxfer_ask_recv(xfer); |
|
| 1158 else |
|
| 1159 gaim_gtkxfer_ask_accept(xfer); |
|
| 1160 } else |
|
| 1161 choose_file(xfer); |
|
| 1162 } |
|
| 1163 |
|
| 1164 static void |
|
| 1165 gaim_gtkxfer_ask_cancel(GaimXfer *xfer) |
|
| 1166 { |
|
| 1167 } |
|
| 1168 |
|
| 1169 static void |
|
| 1170 gaim_gtkxfer_add_xfer(GaimXfer *xfer) |
1012 gaim_gtkxfer_add_xfer(GaimXfer *xfer) |
| 1171 { |
1013 { |
| 1172 if (xfer_dialog == NULL) |
1014 if (xfer_dialog == NULL) |
| 1173 xfer_dialog = gaim_gtkxfer_dialog_new(); |
1015 xfer_dialog = gaim_gtkxfer_dialog_new(); |
| 1174 |
1016 |
| 1197 |
1039 |
| 1198 static GaimXferUiOps ops = |
1040 static GaimXferUiOps ops = |
| 1199 { |
1041 { |
| 1200 gaim_gtkxfer_new_xfer, |
1042 gaim_gtkxfer_new_xfer, |
| 1201 gaim_gtkxfer_destroy, |
1043 gaim_gtkxfer_destroy, |
| 1202 gaim_gtkxfer_request_file, |
|
| 1203 gaim_gtkxfer_ask_cancel, |
|
| 1204 gaim_gtkxfer_add_xfer, |
1044 gaim_gtkxfer_add_xfer, |
| 1205 gaim_gtkxfer_update_progress, |
1045 gaim_gtkxfer_update_progress, |
| 1206 gaim_gtkxfer_cancel_local, |
1046 gaim_gtkxfer_cancel_local, |
| 1207 gaim_gtkxfer_cancel_remote |
1047 gaim_gtkxfer_cancel_remote |
| 1208 }; |
1048 }; |