comparison src/protocols/msn/dispatch.c @ 5309:e2e53316a21d

[gaim-migrate @ 5681] Announcing the new MSN prpl! It probably has some bugs, and for the time being, there is no file transfer. That's good though, because the current MSN file transfer is a little broken. I've had many corrupted files. I'll commit new file transfer code when it's written. I want this heavily tested before 0.63! If you use MSN, please talk to people on it. Let me know of any oddities, crashes, bugs, whatever. I'll fix things as I find them. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Tue, 06 May 2003 02:06:56 +0000
parents
children 187c740f2a4e
comparison
equal deleted inserted replaced
5308:6aa785e55d0f 5309:e2e53316a21d
1 /**
2 * @file dispatch.c Dispatch server functions
3 *
4 * gaim
5 *
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22 #include "msn.h"
23 #include "dispatch.h"
24 #include "notification.h"
25 #include "error.h"
26
27 static GHashTable *dispatch_commands = NULL;
28
29 static gboolean
30 __ver_cmd(MsnServConn *servconn, const char *command, const char **params,
31 size_t param_count)
32 {
33 struct gaim_connection *gc = servconn->session->account->gc;
34 size_t i;
35 gboolean msnp5_found = FALSE;
36
37 for (i = 1; i < param_count; i++) {
38 if (!strcmp(params[i], "MSNP5")) {
39 msnp5_found = TRUE;
40 break;
41 }
42 }
43
44 if (!msnp5_found) {
45 hide_login_progress(gc, _("Protocol not supported"));
46 signoff(gc);
47
48 return FALSE;
49 }
50
51 if (!msn_servconn_send_command(servconn, "INF", NULL)) {
52 hide_login_progress(gc, _("Unable to request INF\n"));
53 signoff(gc);
54
55 return FALSE;
56 }
57
58 return TRUE;
59 }
60
61 static gboolean
62 __inf_cmd(MsnServConn *servconn, const char *command, const char **params,
63 size_t param_count)
64 {
65 struct gaim_connection *gc = servconn->session->account->gc;
66 char outparams[MSN_BUF_LEN];
67
68 if (strcmp(params[1], "MD5")) {
69 hide_login_progress(gc, _("Unable to login using MD5"));
70 signoff(gc);
71
72 return FALSE;
73 }
74
75 g_snprintf(outparams, sizeof(outparams), "MD5 I %s", gc->username);
76
77 if (!msn_servconn_send_command(servconn, "USR", outparams)) {
78 hide_login_progress(gc, _("Unable to send USR\n"));
79 signoff(gc);
80
81 return FALSE;
82 }
83
84 set_login_progress(gc, 3, _("Requesting to send password"));
85
86 return TRUE;
87 }
88
89 static gboolean
90 __xfr_cmd(MsnServConn *servconn, const char *command, const char **params,
91 size_t param_count)
92 {
93 MsnSession *session = servconn->session;
94 struct gaim_connection *gc = servconn->session->account->gc;
95 char *host;
96 int port;
97 char *c;
98
99 if (param_count < 2 || strcmp(params[1], "NS")) {
100 hide_login_progress(gc, _("Got invalid XFR\n"));
101 signoff(gc);
102
103 return FALSE;
104 }
105
106 host = g_strdup(params[2]);
107
108 if ((c = strchr(host, ':')) != NULL) {
109 *c = '\0';
110
111 port = atoi(c + 1);
112 }
113 else
114 port = 1863;
115
116 session->passport_info.sl = time(NULL);
117
118 /* Disconnect from here. */
119 msn_servconn_destroy(servconn);
120 session->dispatch_conn = NULL;
121
122 /* Now connect to the switchboard. */
123 session->notification_conn = msn_notification_new(session, host, port);
124
125 g_free(host);
126
127 if (!msn_servconn_connect(session->notification_conn)) {
128 hide_login_progress(gc, _("Unable to transfer"));
129 signoff(gc);
130 }
131
132 return FALSE;
133 }
134
135 static gboolean
136 __unknown_cmd(MsnServConn *servconn, const char *command, const char **params,
137 size_t param_count)
138 {
139 struct gaim_connection *gc = servconn->session->account->gc;
140
141 if (isdigit(*command)) {
142 char buf[4];
143
144 strncpy(buf, command, 4);
145 buf[4] = '\0';
146
147 hide_login_progress(gc, (char *)msn_error_get_text(atoi(buf)));
148 }
149 else
150 hide_login_progress(gc, _("Unable to parse message."));
151
152 signoff(gc);
153
154 return FALSE;
155 }
156
157 static gboolean
158 __connect_cb(gpointer data, gint source, GaimInputCondition cond)
159 {
160 MsnServConn *dispatch = data;
161 MsnSession *session = dispatch->session;
162 struct gaim_connection *gc = session->account->gc;
163
164 if (source == -1) {
165 hide_login_progress(session->account->gc, _("Unable to connect"));
166 signoff(session->account->gc);
167 return FALSE;
168 }
169
170 set_login_progress(gc, 1, _("Connecting"));
171
172 if (dispatch->fd != source)
173 dispatch->fd = source;
174
175 if (!msn_servconn_send_command(dispatch, "VER",
176 "MSNP7 MSNP6 MSNP5 MSNP4 CVR0")) {
177 hide_login_progress(gc, _("Unable to write to server"));
178 signoff(gc);
179 return FALSE;
180 }
181
182 set_login_progress(session->account->gc, 2, _("Syncing with server"));
183
184 return TRUE;
185 }
186
187 static void
188 __failed_read_cb(gpointer data, gint source, GaimInputCondition cond)
189 {
190 MsnServConn *dispatch = data;
191 struct gaim_connection *gc;
192
193 gc = dispatch->session->account->gc;
194
195 hide_login_progress(gc, _("Error reading from server"));
196 signoff(gc);
197 }
198
199 MsnServConn *
200 msn_dispatch_new(MsnSession *session, const char *server, int port)
201 {
202 MsnServConn *dispatch;
203
204 dispatch = msn_servconn_new(session);
205
206 msn_servconn_set_server(dispatch, server, port);
207 msn_servconn_set_connect_cb(dispatch, __connect_cb);
208 msn_servconn_set_failed_read_cb(dispatch, __failed_read_cb);
209
210 if (dispatch_commands == NULL) {
211 /* Register the command callbacks. */
212 msn_servconn_register_command(dispatch, "VER", __ver_cmd);
213 msn_servconn_register_command(dispatch, "INF", __inf_cmd);
214 msn_servconn_register_command(dispatch, "XFR", __xfr_cmd);
215 msn_servconn_register_command(dispatch, "_unknown_", __unknown_cmd);
216
217 /* Save this for future use. */
218 dispatch_commands = dispatch->commands;
219 }
220 else {
221 g_hash_table_destroy(dispatch->commands);
222
223 dispatch->commands = dispatch_commands;
224 }
225
226 return dispatch;
227 }
228