Mercurial > pidgin.yaz
annotate src/protocols/msn/sync.c @ 10087:9fdbfe832fac
[gaim-migrate @ 11098]
gaim_prefs_connect_callback() now takes a handle that can be used to disconnect
the callbacks later on. The callback id's remain, so people can still use those
if they want, although I'm not sure if there's any need for them any more.
I also switched the order for initializing the prefs subsystem and statically
compiled protocol plugins so that prpl prefs can work for statically compiled
prpls.
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Tue, 12 Oct 2004 00:49:19 +0000 |
parents | 86a6d78b070b |
children | 92d4a25fd33c |
rev | line source |
---|---|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
1 /** |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
2 * @file sync.c MSN list synchronization functions |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
3 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
4 * gaim |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
5 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
6 * Gaim is the legal property of its developers, whose names are too numerous |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
7 * to list here. Please refer to the COPYRIGHT file distributed with this |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
8 * source distribution. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
9 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
10 * This program is free software; you can redistribute it and/or modify |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
13 * (at your option) any later version. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
14 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
15 * This program is distributed in the hope that it will be useful, |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
18 * GNU General Public License for more details. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
19 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
20 * You should have received a copy of the GNU General Public License |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
21 * along with this program; if not, write to the Free Software |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
23 */ |
9193 | 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 if ((g = gaim_find_group(name)) == NULL) | |
103 { | |
104 g = gaim_group_new(name); | |
105 gaim_blist_add_group(g, NULL); | |
106 } | |
107 } | |
108 | |
109 static void | |
110 lst_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) | |
111 { | |
112 MsnSession *session = cmdproc->session; | |
113 char *passport = NULL; | |
114 const char *friend = NULL; | |
115 int list_op; | |
116 MsnUser *user; | |
117 | |
10044 | 118 passport = cmd->params[0]; |
119 friend = gaim_url_decode(cmd->params[1]); | |
120 list_op = atoi(cmd->params[2]); | |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9198
diff
changeset
|
121 |
9193 | 122 user = msn_user_new(session->userlist, passport, friend); |
123 | |
124 msn_userlist_add_user(session->userlist, user); | |
125 | |
126 session->sync->last_user = user; | |
127 | |
128 /* TODO: This can be improved */ | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
129 |
9193 | 130 if (list_op & MSN_LIST_FL_OP) |
131 { | |
132 char **c; | |
133 char **tokens; | |
134 const char *group_nums; | |
135 GSList *group_ids; | |
136 | |
137 group_nums = cmd->params[3]; | |
138 | |
139 group_ids = NULL; | |
140 | |
141 tokens = g_strsplit(group_nums, ",", -1); | |
142 | |
143 for (c = tokens; *c != NULL; c++) | |
144 { | |
145 int id; | |
146 | |
147 id = atoi(*c); | |
148 group_ids = g_slist_append(group_ids, GINT_TO_POINTER(id)); | |
149 } | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
150 |
9193 | 151 g_strfreev(tokens); |
152 | |
153 msn_got_lst_user(session, user, list_op, group_ids); | |
154 | |
155 g_slist_free(group_ids); | |
156 } | |
157 else | |
158 { | |
159 msn_got_lst_user(session, user, list_op, NULL); | |
160 } | |
161 | |
162 session->sync->num_users++; | |
163 | |
164 if (session->sync->num_users == session->sync->total_users) | |
165 { | |
166 cmdproc->cbs_table = session->sync->old_cbs_table; | |
167 | |
10044 | 168 msn_session_finish_login(session); |
9193 | 169 |
170 msn_sync_destroy(session->sync); | |
171 session->sync = NULL; | |
172 } | |
173 } | |
174 | |
175 static void | |
176 bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) | |
177 { | |
178 MsnSync *sync = cmdproc->session->sync; | |
179 const char *type, *value; | |
180 MsnUser *user; | |
181 | |
182 user = sync->last_user; | |
183 | |
184 type = cmd->params[0]; | |
185 value = cmd->params[1]; | |
186 | |
187 if (value) | |
188 { | |
189 if (!strcmp(type, "MOB")) | |
190 { | |
191 if (!strcmp(value, "Y")) | |
192 user->mobile = TRUE; | |
193 } | |
194 else if (!strcmp(type, "PHH")) | |
195 msn_user_set_home_phone(user, gaim_url_decode(value)); | |
196 else if (!strcmp(type, "PHW")) | |
197 msn_user_set_work_phone(user, gaim_url_decode(value)); | |
198 else if (!strcmp(type, "PHM")) | |
199 msn_user_set_mobile_phone(user, gaim_url_decode(value)); | |
200 } | |
201 } | |
202 | |
203 void | |
204 msn_sync_init(void) | |
205 { | |
206 /* TODO: check prp, blp, bpr */ | |
207 | |
208 cbs_table = msn_table_new(); | |
209 | |
210 /* Syncing */ | |
211 msn_table_add_cmd(cbs_table, NULL, "GTC", NULL); | |
212 msn_table_add_cmd(cbs_table, NULL, "BLP", blp_cmd); | |
213 msn_table_add_cmd(cbs_table, NULL, "PRP", prp_cmd); | |
214 msn_table_add_cmd(cbs_table, NULL, "LSG", lsg_cmd); | |
215 msn_table_add_cmd(cbs_table, NULL, "LST", lst_cmd); | |
216 msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd); | |
217 } | |
218 | |
219 void | |
220 msn_sync_end(void) | |
221 { | |
222 msn_table_destroy(cbs_table); | |
223 } | |
224 | |
225 MsnSync * | |
226 msn_sync_new(MsnSession *session) | |
227 { | |
228 MsnSync *sync; | |
229 | |
230 sync = g_new0(MsnSync, 1); | |
231 | |
232 sync->session = session; | |
233 sync->cbs_table = cbs_table; | |
234 | |
235 return sync; | |
236 } | |
237 | |
238 void | |
239 msn_sync_destroy(MsnSync *sync) | |
240 { | |
241 g_free(sync); | |
242 } |