src/protocols/msn/sync.c

branch
gaim
changeset 20470
77693555855f
parent 13071
b98e72d4089a
parent 20469
b2836a24d81e
child 20471
1966704b3e42
equal deleted inserted replaced
13071:b98e72d4089a 20470:77693555855f
1 /**
2 * @file sync.c MSN list synchronization functions
3 *
4 * gaim
5 *
6 * Gaim is the legal property of its developers, whose names are too numerous
7 * to list here. Please refer to the COPYRIGHT file distributed with this
8 * source distribution.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24 #include "msn.h"
25 #include "sync.h"
26 #include "state.h"
27
28 static MsnTable *cbs_table;
29
30 static void
31 blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
32 {
33 GaimConnection *gc = cmdproc->session->account->gc;
34 const char *list_name;
35
36 list_name = cmd->params[0];
37
38 if (!g_ascii_strcasecmp(list_name, "AL"))
39 {
40 /*
41 * If the current setting is AL, messages from users who
42 * are not in BL will be delivered.
43 *
44 * In other words, deny some.
45 */
46 gc->account->perm_deny = GAIM_PRIVACY_DENY_USERS;
47 }
48 else
49 {
50 /* If the current setting is BL, only messages from people
51 * who are in the AL will be delivered.
52 *
53 * In other words, permit some.
54 */
55 gc->account->perm_deny = GAIM_PRIVACY_ALLOW_USERS;
56 }
57 }
58
59 static void
60 prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
61 {
62 MsnSession *session = cmdproc->session;
63 const char *type, *value;
64
65 type = cmd->params[0];
66 value = cmd->params[1];
67
68 if (cmd->param_count == 2)
69 {
70 if (!strcmp(type, "PHH"))
71 msn_user_set_home_phone(session->user, gaim_url_decode(value));
72 else if (!strcmp(type, "PHW"))
73 msn_user_set_work_phone(session->user, gaim_url_decode(value));
74 else if (!strcmp(type, "PHM"))
75 msn_user_set_mobile_phone(session->user, gaim_url_decode(value));
76 }
77 else
78 {
79 if (!strcmp(type, "PHH"))
80 msn_user_set_home_phone(session->user, NULL);
81 else if (!strcmp(type, "PHW"))
82 msn_user_set_work_phone(session->user, NULL);
83 else if (!strcmp(type, "PHM"))
84 msn_user_set_mobile_phone(session->user, NULL);
85 }
86 }
87
88 static void
89 lsg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
90 {
91 MsnSession *session = cmdproc->session;
92 MsnGroup *group;
93 GaimGroup *g;
94 const char *name;
95 int group_id;
96
97 group_id = atoi(cmd->params[0]);
98 name = gaim_url_decode(cmd->params[1]);
99
100 group = msn_group_new(session->userlist, group_id, name);
101
102 /* HACK */
103 if (group_id == 0)
104 /* Group of ungroupped buddies */
105 return;
106
107 if ((g = gaim_find_group(name)) == NULL)
108 {
109 g = gaim_group_new(name);
110 gaim_blist_add_group(g, NULL);
111 }
112 }
113
114 static void
115 lst_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
116 {
117 MsnSession *session = cmdproc->session;
118 char *passport = NULL;
119 const char *friend = NULL;
120 int list_op;
121 MsnUser *user;
122
123 passport = cmd->params[0];
124 friend = gaim_url_decode(cmd->params[1]);
125 list_op = atoi(cmd->params[2]);
126
127 user = msn_user_new(session->userlist, passport, friend);
128
129 msn_userlist_add_user(session->userlist, user);
130
131 session->sync->last_user = user;
132
133 /* TODO: This can be improved */
134
135 if (list_op & MSN_LIST_FL_OP)
136 {
137 char **c;
138 char **tokens;
139 const char *group_nums;
140 GSList *group_ids;
141
142 group_nums = cmd->params[3];
143
144 group_ids = NULL;
145
146 tokens = g_strsplit(group_nums, ",", -1);
147
148 for (c = tokens; *c != NULL; c++)
149 {
150 int id;
151
152 id = atoi(*c);
153 group_ids = g_slist_append(group_ids, GINT_TO_POINTER(id));
154 }
155
156 g_strfreev(tokens);
157
158 msn_got_lst_user(session, user, list_op, group_ids);
159
160 g_slist_free(group_ids);
161 }
162 else
163 {
164 msn_got_lst_user(session, user, list_op, NULL);
165 }
166
167 session->sync->num_users++;
168
169 if (session->sync->num_users == session->sync->total_users)
170 {
171 cmdproc->cbs_table = session->sync->old_cbs_table;
172
173 msn_session_finish_login(session);
174
175 msn_sync_destroy(session->sync);
176 session->sync = NULL;
177 }
178 }
179
180 static void
181 bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
182 {
183 MsnSync *sync = cmdproc->session->sync;
184 const char *type, *value;
185 MsnUser *user;
186
187 user = sync->last_user;
188
189 type = cmd->params[0];
190 value = cmd->params[1];
191
192 if (value)
193 {
194 if (!strcmp(type, "MOB"))
195 {
196 if (!strcmp(value, "Y"))
197 user->mobile = TRUE;
198 }
199 else if (!strcmp(type, "PHH"))
200 msn_user_set_home_phone(user, gaim_url_decode(value));
201 else if (!strcmp(type, "PHW"))
202 msn_user_set_work_phone(user, gaim_url_decode(value));
203 else if (!strcmp(type, "PHM"))
204 msn_user_set_mobile_phone(user, gaim_url_decode(value));
205 }
206 }
207
208 void
209 msn_sync_init(void)
210 {
211 /* TODO: check prp, blp, bpr */
212
213 cbs_table = msn_table_new();
214
215 /* Syncing */
216 msn_table_add_cmd(cbs_table, NULL, "GTC", NULL);
217 msn_table_add_cmd(cbs_table, NULL, "BLP", blp_cmd);
218 msn_table_add_cmd(cbs_table, NULL, "PRP", prp_cmd);
219 msn_table_add_cmd(cbs_table, NULL, "LSG", lsg_cmd);
220 msn_table_add_cmd(cbs_table, NULL, "LST", lst_cmd);
221 msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd);
222 }
223
224 void
225 msn_sync_end(void)
226 {
227 msn_table_destroy(cbs_table);
228 }
229
230 MsnSync *
231 msn_sync_new(MsnSession *session)
232 {
233 MsnSync *sync;
234
235 sync = g_new0(MsnSync, 1);
236
237 sync->session = session;
238 sync->cbs_table = cbs_table;
239
240 return sync;
241 }
242
243 void
244 msn_sync_destroy(MsnSync *sync)
245 {
246 g_free(sync);
247 }

mercurial