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 }