| 145 |
145 |
| 146 void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt) |
146 void yahoo_process_presence(PurpleConnection *gc, struct yahoo_packet *pkt) |
| 147 { |
147 { |
| 148 GSList *l = pkt->hash; |
148 GSList *l = pkt->hash; |
| 149 YahooFriend *f; |
149 YahooFriend *f; |
| |
150 char *temp = NULL; |
| 150 char *who = NULL; |
151 char *who = NULL; |
| 151 int value = 0; |
152 int value = 0; |
| |
153 int protocol = 0; |
| |
154 gboolean wlm = FALSE; |
| 152 |
155 |
| 153 while (l) { |
156 while (l) { |
| 154 struct yahoo_pair *pair = l->data; |
157 struct yahoo_pair *pair = l->data; |
| 155 |
158 |
| 156 switch (pair->key) { |
159 switch (pair->key) { |
| 157 case 7: |
160 case 7: |
| 158 who = pair->value; |
161 temp = pair->value; |
| 159 break; |
162 break; |
| 160 case 31: |
163 case 31: |
| 161 value = strtol(pair->value, NULL, 10); |
164 value = strtol(pair->value, NULL, 10); |
| 162 break; |
165 break; |
| |
166 case 241: |
| |
167 protocol = strtol(pair->value, NULL, 10); |
| |
168 wlm = TRUE; |
| |
169 break; |
| 163 } |
170 } |
| 164 |
171 |
| 165 l = l->next; |
172 l = l->next; |
| 166 } |
173 } |
| |
174 |
| |
175 if(wlm) |
| |
176 who = g_strconcat("wlm/", temp, NULL); |
| |
177 else |
| |
178 who = g_strdup(temp); |
| 167 |
179 |
| 168 if (value != 1 && value != 2) { |
180 if (value != 1 && value != 2) { |
| 169 purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value); |
181 purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value); |
| 170 return; |
182 return; |
| 171 } |
183 } |
| 172 |
184 |
| 173 g_return_if_fail(who != NULL); |
185 g_return_if_fail(who != NULL); |
| 174 |
186 |
| 175 f = yahoo_friend_find(gc, who); |
187 f = yahoo_friend_find(gc, who); |
| 176 if (!f) |
188 if (!f) { |
| 177 return; |
189 g_free(who); |
| |
190 return; |
| |
191 } |
| 178 |
192 |
| 179 if (pkt->service == YAHOO_SERVICE_PRESENCE_PERM) { |
193 if (pkt->service == YAHOO_SERVICE_PRESENCE_PERM) { |
| 180 purple_debug_info("yahoo", "Setting permanent presence for %s to %d.\n", who, (value == 1)); |
194 purple_debug_info("yahoo", "Setting permanent presence for %s to %d.\n", who, (value == 1)); |
| 181 /* If setting from perm offline to online when in invisible status, |
195 /* If setting from perm offline to online when in invisible status, |
| 182 * this has already been taken care of (when the temp status changed) */ |
196 * this has already been taken care of (when the temp status changed) */ |
| 192 if (value == 1) |
206 if (value == 1) |
| 193 f->presence = YAHOO_PRESENCE_ONLINE; |
207 f->presence = YAHOO_PRESENCE_ONLINE; |
| 194 else |
208 else |
| 195 f->presence = YAHOO_PRESENCE_DEFAULT; |
209 f->presence = YAHOO_PRESENCE_DEFAULT; |
| 196 } |
210 } |
| |
211 g_free(who); |
| 197 } |
212 } |
| 198 |
213 |
| 199 void yahoo_friend_update_presence(PurpleConnection *gc, const char *name, |
214 void yahoo_friend_update_presence(PurpleConnection *gc, const char *name, |
| 200 YahooPresenceVisibility presence) |
215 YahooPresenceVisibility presence) |
| 201 { |
216 { |
| 202 struct yahoo_data *yd = gc->proto_data; |
217 struct yahoo_data *yd = gc->proto_data; |
| 203 struct yahoo_packet *pkt = NULL; |
218 struct yahoo_packet *pkt = NULL; |
| 204 YahooFriend *f; |
219 YahooFriend *f; |
| 205 const char *thirtyone, *thirteen; |
220 const char *thirtyone, *thirteen; |
| 206 int service = -1; |
221 int service = -1; |
| |
222 const char *temp = NULL; |
| 207 |
223 |
| 208 if (!yd->logged_in) |
224 if (!yd->logged_in) |
| 209 return; |
225 return; |
| 210 |
226 |
| 211 f = yahoo_friend_find(gc, name); |
227 f = yahoo_friend_find(gc, name); |
| 212 if (!f) |
228 if (!f) |
| 213 return; |
229 return; |
| |
230 |
| |
231 if(f->protocol == 2) |
| |
232 temp = name+4; |
| |
233 else |
| |
234 temp = name; |
| 214 |
235 |
| 215 /* No need to change the value if it is already correct */ |
236 /* No need to change the value if it is already correct */ |
| 216 if (f->presence == presence) { |
237 if (f->presence == presence) { |
| 217 purple_debug_info("yahoo", "Not setting presence because there are no changes.\n"); |
238 purple_debug_info("yahoo", "Not setting presence because there are no changes.\n"); |
| 218 return; |
239 return; |
| 239 if(f->protocol) |
260 if(f->protocol) |
| 240 yahoo_packet_hash(pkt, "ssssssiss", |
261 yahoo_packet_hash(pkt, "ssssssiss", |
| 241 1, purple_connection_get_display_name(gc), |
262 1, purple_connection_get_display_name(gc), |
| 242 31, "2", 13, "2", |
263 31, "2", 13, "2", |
| 243 302, "319", 300, "319", |
264 302, "319", 300, "319", |
| 244 7, name, 241, f->protocol, |
265 7, temp, 241, f->protocol, |
| 245 301, "319", 303, "319"); |
266 301, "319", 303, "319"); |
| 246 else |
267 else |
| 247 yahoo_packet_hash(pkt, "ssssssss", |
268 yahoo_packet_hash(pkt, "ssssssss", |
| 248 1, purple_connection_get_display_name(gc), |
269 1, purple_connection_get_display_name(gc), |
| 249 31, "2", 13, "2", |
270 31, "2", 13, "2", |
| 250 302, "319", 300, "319", |
271 302, "319", 300, "319", |
| 251 7, name, |
272 7, temp, |
| 252 301, "319", 303, "319"); |
273 301, "319", 303, "319"); |
| 253 |
274 |
| 254 yahoo_packet_send_and_free(pkt, yd); |
275 yahoo_packet_send_and_free(pkt, yd); |
| 255 } |
276 } |
| 256 |
277 |
| 266 if(f->protocol) |
287 if(f->protocol) |
| 267 yahoo_packet_hash(pkt, "ssssssiss", |
288 yahoo_packet_hash(pkt, "ssssssiss", |
| 268 1, purple_connection_get_display_name(gc), |
289 1, purple_connection_get_display_name(gc), |
| 269 31, thirtyone, 13, thirteen, |
290 31, thirtyone, 13, thirteen, |
| 270 302, "319", 300, "319", |
291 302, "319", 300, "319", |
| 271 7, name, 241, f->protocol, |
292 7, temp, 241, f->protocol, |
| 272 301, "319", 303, "319"); |
293 301, "319", 303, "319"); |
| 273 else |
294 else |
| 274 yahoo_packet_hash(pkt, "ssssssss", |
295 yahoo_packet_hash(pkt, "ssssssss", |
| 275 1, purple_connection_get_display_name(gc), |
296 1, purple_connection_get_display_name(gc), |
| 276 31, thirtyone, 13, thirteen, |
297 31, thirtyone, 13, thirteen, |
| 277 302, "319", 300, "319", |
298 302, "319", 300, "319", |
| 278 7, name, |
299 7, temp, |
| 279 301, "319", 303, "319"); |
300 301, "319", 303, "319"); |
| 280 |
301 |
| 281 yahoo_packet_send_and_free(pkt, yd); |
302 yahoo_packet_send_and_free(pkt, yd); |
| 282 } |
303 } |
| 283 } |
304 } |