Mercurial > pidgin.yaz
comparison src/savedstatuses.c @ 10419:c9b1f3fac753
[gaim-migrate @ 11670]
Added some GaimStatusPrimitive<-->text mapping functions
Renamed the GaimStatusSaved data types to GaimSavedStatus
Modifying a status will now bring up an editor thing with the
correct values set
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 26 Dec 2004 02:03:14 +0000 |
parents | bed2c96bc1fb |
children | 854c972ea863 |
comparison
equal
deleted
inserted
replaced
10418:bed2c96bc1fb | 10419:c9b1f3fac753 |
---|---|
40 * | 40 * |
41 * The changes to status.xml caused by the new status API | 41 * The changes to status.xml caused by the new status API |
42 * are fully backward compatible. The new status API just | 42 * are fully backward compatible. The new status API just |
43 * adds the optional sub-statuses to the XML file. | 43 * adds the optional sub-statuses to the XML file. |
44 */ | 44 */ |
45 struct _GaimStatusSaved | 45 struct _GaimSavedStatus |
46 { | 46 { |
47 char *title; | 47 char *title; |
48 GaimStatusPrimitive type; | 48 GaimStatusPrimitive type; |
49 char *message; | 49 char *message; |
50 | 50 |
51 GList *substatuses; /**< A list of GaimStatusSavedSub's. */ | 51 GList *substatuses; /**< A list of GaimSavedStatusSub's. */ |
52 }; | 52 }; |
53 | 53 |
54 /* | 54 /* |
55 * TODO: If an account is deleted, need to also delete any associated | 55 * TODO: If an account is deleted, need to also delete any associated |
56 * GaimStatusSavedSub's. | 56 * GaimSavedStatusSub's. |
57 * TODO: If a GaimStatusType is deleted, need to also delete any | 57 * TODO: If a GaimStatusType is deleted, need to also delete any |
58 * associated GaimStatusSavedSub's? | 58 * associated GaimSavedStatusSub's? |
59 */ | 59 */ |
60 struct _GaimStatusSavedSub | 60 struct _GaimSavedStatusSub |
61 { | 61 { |
62 GaimAccount *account; | 62 GaimAccount *account; |
63 const GaimStatusType *type; | 63 const GaimStatusType *type; |
64 char *message; | 64 char *message; |
65 }; | 65 }; |
70 | 70 |
71 /************************************************************************** | 71 /************************************************************************** |
72 * Helper functions | 72 * Helper functions |
73 **************************************************************************/ | 73 **************************************************************************/ |
74 | 74 |
75 /** | |
76 * Elements of this array correspond to the GaimStatusPrimitive | |
77 * enumeration. | |
78 */ | |
79 static const char *primitive_names[] = | |
80 { | |
81 "unset", | |
82 "offline", | |
83 "available", | |
84 "unavailable", | |
85 "hidden", | |
86 "away", | |
87 "extended_away" | |
88 }; | |
89 | |
90 static GaimStatusPrimitive | |
91 gaim_primitive_get_type(const char *name) | |
92 { | |
93 int i; | |
94 | |
95 g_return_val_if_fail(name != NULL, GAIM_STATUS_UNSET); | |
96 | |
97 for (i = 0; i < GAIM_STATUS_NUM_PRIMITIVES; i++) | |
98 { | |
99 if (!strcmp(name, primitive_names[i])) | |
100 return i; | |
101 } | |
102 | |
103 return GAIM_STATUS_UNSET; | |
104 } | |
105 | |
106 static void | 75 static void |
107 free_statussavedsub(GaimStatusSavedSub *substatus) | 76 free_statussavedsub(GaimSavedStatusSub *substatus) |
108 { | 77 { |
109 g_return_if_fail(substatus != NULL); | 78 g_return_if_fail(substatus != NULL); |
110 | 79 |
111 g_free(substatus->message); | 80 g_free(substatus->message); |
112 g_free(substatus); | 81 g_free(substatus); |
113 } | 82 } |
114 | 83 |
115 static void | 84 static void |
116 free_statussaved(GaimStatusSaved *status) | 85 free_statussaved(GaimSavedStatus *status) |
117 { | 86 { |
118 g_return_if_fail(status != NULL); | 87 g_return_if_fail(status != NULL); |
119 | 88 |
120 g_free(status->title); | 89 g_free(status->title); |
121 g_free(status->message); | 90 g_free(status->message); |
122 | 91 |
123 while (status->substatuses != NULL) | 92 while (status->substatuses != NULL) |
124 { | 93 { |
125 GaimStatusSavedSub *substatus = status->substatuses->data; | 94 GaimSavedStatusSub *substatus = status->substatuses->data; |
126 status->substatuses = g_list_remove(status->substatuses, substatus); | 95 status->substatuses = g_list_remove(status->substatuses, substatus); |
127 free_statussavedsub(substatus); | 96 free_statussavedsub(substatus); |
128 } | 97 } |
129 | 98 |
130 g_free(status); | 99 g_free(status); |
134 /************************************************************************** | 103 /************************************************************************** |
135 * Saved status writting to disk | 104 * Saved status writting to disk |
136 **************************************************************************/ | 105 **************************************************************************/ |
137 | 106 |
138 static xmlnode * | 107 static xmlnode * |
139 substatus_to_xmlnode(GaimStatusSavedSub *substatus) | 108 substatus_to_xmlnode(GaimSavedStatusSub *substatus) |
140 { | 109 { |
141 xmlnode *node, *child; | 110 xmlnode *node, *child; |
142 | 111 |
143 node = xmlnode_new("substatus"); | 112 node = xmlnode_new("substatus"); |
144 | 113 |
162 | 131 |
163 return node; | 132 return node; |
164 } | 133 } |
165 | 134 |
166 static xmlnode * | 135 static xmlnode * |
167 status_to_xmlnode(GaimStatusSaved *status) | 136 status_to_xmlnode(GaimSavedStatus *status) |
168 { | 137 { |
169 xmlnode *node, *child; | 138 xmlnode *node, *child; |
170 GList *cur; | 139 GList *cur; |
171 | 140 |
172 node = xmlnode_new("status"); | 141 node = xmlnode_new("status"); |
173 xmlnode_set_attrib(node, "name", status->title); | 142 xmlnode_set_attrib(node, "name", status->title); |
174 | 143 |
175 child = xmlnode_new("state"); | 144 child = xmlnode_new("state"); |
176 xmlnode_insert_data(child, primitive_names[status->type], -1); | 145 xmlnode_insert_data(child, strdup(gaim_primitive_get_id_from_type(status->type)), -1); |
177 xmlnode_insert_child(node, child); | 146 xmlnode_insert_child(node, child); |
178 | 147 |
179 child = xmlnode_new("message"); | 148 child = xmlnode_new("message"); |
180 xmlnode_insert_data(child, status->message, -1); | 149 xmlnode_insert_data(child, status->message, -1); |
181 xmlnode_insert_child(node, child); | 150 xmlnode_insert_child(node, child); |
244 | 213 |
245 | 214 |
246 /************************************************************************** | 215 /************************************************************************** |
247 * Saved status reading from disk | 216 * Saved status reading from disk |
248 **************************************************************************/ | 217 **************************************************************************/ |
249 static GaimStatusSavedSub * | 218 static GaimSavedStatusSub * |
250 parse_substatus(xmlnode *substatus) | 219 parse_substatus(xmlnode *substatus) |
251 { | 220 { |
252 GaimStatusSavedSub *ret; | 221 GaimSavedStatusSub *ret; |
253 xmlnode *node; | 222 xmlnode *node; |
254 char *data = NULL; | 223 char *data = NULL; |
255 | 224 |
256 ret = g_new0(GaimStatusSavedSub, 1); | 225 ret = g_new0(GaimSavedStatusSub, 1); |
257 | 226 |
258 /* Read the account */ | 227 /* Read the account */ |
259 node = xmlnode_get_child(substatus, "account"); | 228 node = xmlnode_get_child(substatus, "account"); |
260 if (node != NULL) | 229 if (node != NULL) |
261 { | 230 { |
317 * </substatus> | 286 * </substatus> |
318 * </status> | 287 * </status> |
319 * | 288 * |
320 * I know. Moving, huh? | 289 * I know. Moving, huh? |
321 */ | 290 */ |
322 static GaimStatusSaved * | 291 static GaimSavedStatus * |
323 parse_status(xmlnode *status) | 292 parse_status(xmlnode *status) |
324 { | 293 { |
325 GaimStatusSaved *ret; | 294 GaimSavedStatus *ret; |
326 xmlnode *node; | 295 xmlnode *node; |
327 const char *attrib; | 296 const char *attrib; |
328 char *data = NULL; | 297 char *data = NULL; |
329 int i; | 298 int i; |
330 | 299 |
331 ret = g_new0(GaimStatusSaved, 1); | 300 ret = g_new0(GaimSavedStatus, 1); |
332 | 301 |
333 /* Read the title */ | 302 /* Read the title */ |
334 attrib = xmlnode_get_attrib(status, "name"); | 303 attrib = xmlnode_get_attrib(status, "name"); |
335 if (attrib == NULL) | 304 if (attrib == NULL) |
336 attrib = "No Title"; | 305 attrib = "No Title"; |
337 /* Ensure the title is unique */ | 306 /* Ensure the title is unique */ |
338 ret->title = g_strdup(attrib); | 307 ret->title = g_strdup(attrib); |
339 i = 2; | 308 i = 2; |
340 while (gaim_savedstatuses_find(ret->title) != NULL) | 309 while (gaim_savedstatus_find(ret->title) != NULL) |
341 { | 310 { |
342 g_free(ret->title); | 311 g_free(ret->title); |
343 ret->title = g_strdup_printf("%s %d", attrib, i); | 312 ret->title = g_strdup_printf("%s %d", attrib, i); |
344 i++; | 313 i++; |
345 } | 314 } |
347 /* Read the primitive status type */ | 316 /* Read the primitive status type */ |
348 node = xmlnode_get_child(status, "state"); | 317 node = xmlnode_get_child(status, "state"); |
349 if (node != NULL) | 318 if (node != NULL) |
350 data = xmlnode_get_data(node); | 319 data = xmlnode_get_data(node); |
351 if (data != NULL) { | 320 if (data != NULL) { |
352 ret->type = gaim_primitive_get_type(data); | 321 ret->type = gaim_primitive_get_type_from_id(data); |
353 g_free(data); | 322 g_free(data); |
354 data = NULL; | 323 data = NULL; |
355 } | 324 } |
356 | 325 |
357 /* Read the message */ | 326 /* Read the message */ |
363 | 332 |
364 /* Read substatuses */ | 333 /* Read substatuses */ |
365 for (node = xmlnode_get_child(status, "status"); node != NULL; | 334 for (node = xmlnode_get_child(status, "status"); node != NULL; |
366 node = xmlnode_get_next_twin(node)) | 335 node = xmlnode_get_next_twin(node)) |
367 { | 336 { |
368 GaimStatusSavedSub *new; | 337 GaimSavedStatusSub *new; |
369 new = parse_substatus(node); | 338 new = parse_substatus(node); |
370 if (new != NULL) | 339 if (new != NULL) |
371 ret->substatuses = g_list_append(ret->substatuses, new); | 340 ret->substatuses = g_list_append(ret->substatuses, new); |
372 } | 341 } |
373 | 342 |
424 g_free(contents); | 393 g_free(contents); |
425 | 394 |
426 for (status = xmlnode_get_child(statuses, "status"); status != NULL; | 395 for (status = xmlnode_get_child(statuses, "status"); status != NULL; |
427 status = xmlnode_get_next_twin(status)) | 396 status = xmlnode_get_next_twin(status)) |
428 { | 397 { |
429 GaimStatusSaved *new; | 398 GaimSavedStatus *new; |
430 new = parse_status(status); | 399 new = parse_status(status); |
431 saved_statuses = g_list_append(saved_statuses, new); | 400 saved_statuses = g_list_append(saved_statuses, new); |
432 } | 401 } |
433 | 402 |
434 gaim_debug_info("status", "Finished reading statuses\n"); | 403 gaim_debug_info("status", "Finished reading statuses\n"); |
469 | 438 |
470 | 439 |
471 /************************************************************************** | 440 /************************************************************************** |
472 * Saved status API | 441 * Saved status API |
473 **************************************************************************/ | 442 **************************************************************************/ |
474 GaimStatusSaved * | 443 GaimSavedStatus * |
475 gaim_savedstatuses_new(const char *title, GaimStatusPrimitive type) | 444 gaim_savedstatus_new(const char *title, GaimStatusPrimitive type) |
476 { | 445 { |
477 GaimStatusSaved *status; | 446 GaimSavedStatus *status; |
478 | 447 |
479 status = g_new0(GaimStatusSaved, 1); | 448 status = g_new0(GaimSavedStatus, 1); |
480 status->title = g_strdup(title); | 449 status->title = g_strdup(title); |
481 status->type = type; | 450 status->type = type; |
482 | 451 |
483 saved_statuses = g_list_append(saved_statuses, status); | 452 saved_statuses = g_list_append(saved_statuses, status); |
484 | 453 |
486 | 455 |
487 return status; | 456 return status; |
488 } | 457 } |
489 | 458 |
490 gboolean | 459 gboolean |
491 gaim_savedstatuses_delete(const char *title) | 460 gaim_savedstatus_delete(const char *title) |
492 { | 461 { |
493 GaimStatusSaved *status; | 462 GaimSavedStatus *status; |
494 | 463 |
495 status = gaim_savedstatuses_find(title); | 464 status = gaim_savedstatus_find(title); |
496 | 465 |
497 if (status == NULL) | 466 if (status == NULL) |
498 return FALSE; | 467 return FALSE; |
499 | 468 |
500 saved_statuses = g_list_remove(saved_statuses, status); | 469 saved_statuses = g_list_remove(saved_statuses, status); |
509 gaim_savedstatuses_get_all(void) | 478 gaim_savedstatuses_get_all(void) |
510 { | 479 { |
511 return saved_statuses; | 480 return saved_statuses; |
512 } | 481 } |
513 | 482 |
514 GaimStatusSaved * | 483 GaimSavedStatus * |
515 gaim_savedstatuses_find(const char *title) | 484 gaim_savedstatus_find(const char *title) |
516 { | 485 { |
517 GList *l; | 486 GList *l; |
518 GaimStatusSaved *status; | 487 GaimSavedStatus *status; |
519 | 488 |
520 for (l = saved_statuses; l != NULL; l = g_list_next(l)) | 489 for (l = saved_statuses; l != NULL; l = g_list_next(l)) |
521 { | 490 { |
522 status = (GaimStatusSaved *)l->data; | 491 status = (GaimSavedStatus *)l->data; |
523 if (!strcmp(status->title, title)) | 492 if (!strcmp(status->title, title)) |
524 return status; | 493 return status; |
525 } | 494 } |
526 | 495 |
527 return NULL; | 496 return NULL; |
528 } | 497 } |
529 | 498 |
530 const char * | 499 const char * |
531 gaim_savedstatuses_get_title(const GaimStatusSaved *saved_status) | 500 gaim_savedstatus_get_title(const GaimSavedStatus *saved_status) |
532 { | 501 { |
533 return saved_status->title; | 502 return saved_status->title; |
534 } | 503 } |
535 | 504 |
536 GaimStatusPrimitive | 505 GaimStatusPrimitive |
537 gaim_savedstatuses_get_type(const GaimStatusSaved *saved_status) | 506 gaim_savedstatus_get_type(const GaimSavedStatus *saved_status) |
538 { | 507 { |
539 return saved_status->type; | 508 return saved_status->type; |
540 } | 509 } |
541 | 510 |
542 const char * | 511 const char * |
543 gaim_savedstatuses_get_message(const GaimStatusSaved *saved_status) | 512 gaim_savedstatus_get_message(const GaimSavedStatus *saved_status) |
544 { | 513 { |
545 return saved_status->message; | 514 return saved_status->message; |
546 } | 515 } |
547 | 516 |
548 void | 517 void |
560 statuses_save_timer = 0; | 529 statuses_save_timer = 0; |
561 sync_statuses(); | 530 sync_statuses(); |
562 } | 531 } |
563 | 532 |
564 while (saved_statuses != NULL) { | 533 while (saved_statuses != NULL) { |
565 GaimStatusSaved *status = saved_statuses->data; | 534 GaimSavedStatus *status = saved_statuses->data; |
566 saved_statuses = g_list_remove(saved_statuses, status); | 535 saved_statuses = g_list_remove(saved_statuses, status); |
567 free_statussaved(status); | 536 free_statussaved(status); |
568 } | 537 } |
569 } | 538 } |