| 91 static GList *accounts = NULL; |
91 static GList *accounts = NULL; |
| 92 static guint accounts_save_timer = 0; |
92 static guint accounts_save_timer = 0; |
| 93 static gboolean accounts_loaded = FALSE; |
93 static gboolean accounts_loaded = FALSE; |
| 94 |
94 |
| 95 static void |
95 static void |
| 96 __delete_setting(void *data) |
96 delete_setting(void *data) |
| 97 { |
97 { |
| 98 GaimAccountSetting *setting = (GaimAccountSetting *)data; |
98 GaimAccountSetting *setting = (GaimAccountSetting *)data; |
| 99 |
99 |
| 100 if (setting->ui != NULL) |
100 if (setting->ui != NULL) |
| 101 g_free(setting->ui); |
101 g_free(setting->ui); |
| 117 |
117 |
| 118 static void |
118 static void |
| 119 schedule_accounts_save() |
119 schedule_accounts_save() |
| 120 { |
120 { |
| 121 if (!accounts_save_timer) |
121 if (!accounts_save_timer) |
| 122 accounts_save_timer = g_timeout_add(5000, __accounts_save_cb, NULL); |
122 accounts_save_timer = g_timeout_add(5000, accounts_save_cb, NULL); |
| 123 } |
123 } |
| 124 |
124 |
| 125 GaimAccount * |
125 GaimAccount * |
| 126 gaim_account_new(const char *username, GaimProtocol protocol) |
126 gaim_account_new(const char *username, GaimProtocol protocol) |
| 127 { |
127 { |
| 133 |
133 |
| 134 gaim_account_set_username(account, username); |
134 gaim_account_set_username(account, username); |
| 135 gaim_account_set_protocol(account, protocol); |
135 gaim_account_set_protocol(account, protocol); |
| 136 |
136 |
| 137 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
137 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| 138 g_free, __delete_setting); |
138 g_free, delete_setting); |
| 139 account->ui_settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
139 account->ui_settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| 140 g_free, (GDestroyNotify)g_hash_table_destroy); |
140 g_free, (GDestroyNotify)g_hash_table_destroy); |
| 141 |
141 |
| 142 return account; |
142 return account; |
| 143 } |
143 } |
| 331 g_return_if_fail(account != NULL); |
331 g_return_if_fail(account != NULL); |
| 332 |
332 |
| 333 g_hash_table_destroy(account->settings); |
333 g_hash_table_destroy(account->settings); |
| 334 |
334 |
| 335 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
335 account->settings = g_hash_table_new_full(g_str_hash, g_str_equal, |
| 336 g_free, __delete_setting); |
336 g_free, delete_setting); |
| 337 } |
337 } |
| 338 |
338 |
| 339 void |
339 void |
| 340 gaim_account_set_int(GaimAccount *account, const char *name, int value) |
340 gaim_account_set_int(GaimAccount *account, const char *name, int value) |
| 341 { |
341 { |
| 390 |
390 |
| 391 schedule_accounts_save(); |
391 schedule_accounts_save(); |
| 392 } |
392 } |
| 393 |
393 |
| 394 static GHashTable * |
394 static GHashTable * |
| 395 _get_ui_settings_table(GaimAccount *account, const char *ui) |
395 get_ui_settings_table(GaimAccount *account, const char *ui) |
| 396 { |
396 { |
| 397 GHashTable *table; |
397 GHashTable *table; |
| 398 |
398 |
| 399 table = g_hash_table_lookup(account->ui_settings, ui); |
399 table = g_hash_table_lookup(account->ui_settings, ui); |
| 400 |
400 |
| 401 if (table == NULL) { |
401 if (table == NULL) { |
| 402 table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
402 table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, |
| 403 __delete_setting); |
403 delete_setting); |
| 404 g_hash_table_insert(account->ui_settings, g_strdup(ui), table); |
404 g_hash_table_insert(account->ui_settings, g_strdup(ui), table); |
| 405 } |
405 } |
| 406 |
406 |
| 407 return table; |
407 return table; |
| 408 } |
408 } |
| 422 |
422 |
| 423 setting->type = GAIM_PREF_INT; |
423 setting->type = GAIM_PREF_INT; |
| 424 setting->ui = g_strdup(ui); |
424 setting->ui = g_strdup(ui); |
| 425 setting->value.integer = value; |
425 setting->value.integer = value; |
| 426 |
426 |
| 427 table = _get_ui_settings_table(account, ui); |
427 table = get_ui_settings_table(account, ui); |
| 428 |
428 |
| 429 g_hash_table_insert(table, g_strdup(name), setting); |
429 g_hash_table_insert(table, g_strdup(name), setting); |
| 430 |
430 |
| 431 schedule_accounts_save(); |
431 schedule_accounts_save(); |
| 432 } |
432 } |
| 446 |
446 |
| 447 setting->type = GAIM_PREF_STRING; |
447 setting->type = GAIM_PREF_STRING; |
| 448 setting->ui = g_strdup(ui); |
448 setting->ui = g_strdup(ui); |
| 449 setting->value.string = g_strdup(value); |
449 setting->value.string = g_strdup(value); |
| 450 |
450 |
| 451 table = _get_ui_settings_table(account, ui); |
451 table = get_ui_settings_table(account, ui); |
| 452 |
452 |
| 453 g_hash_table_insert(table, g_strdup(name), setting); |
453 g_hash_table_insert(table, g_strdup(name), setting); |
| 454 |
454 |
| 455 schedule_accounts_save(); |
455 schedule_accounts_save(); |
| 456 } |
456 } |
| 470 |
470 |
| 471 setting->type = GAIM_PREF_BOOLEAN; |
471 setting->type = GAIM_PREF_BOOLEAN; |
| 472 setting->ui = g_strdup(ui); |
472 setting->ui = g_strdup(ui); |
| 473 setting->value.bool = value; |
473 setting->value.bool = value; |
| 474 |
474 |
| 475 table = _get_ui_settings_table(account, ui); |
475 table = get_ui_settings_table(account, ui); |
| 476 |
476 |
| 477 g_hash_table_insert(table, g_strdup(name), setting); |
477 g_hash_table_insert(table, g_strdup(name), setting); |
| 478 |
478 |
| 479 schedule_accounts_save(); |
479 schedule_accounts_save(); |
| 480 } |
480 } |
| 714 |
714 |
| 715 g_free(data); |
715 g_free(data); |
| 716 } |
716 } |
| 717 |
717 |
| 718 static void |
718 static void |
| 719 __start_element_handler(GMarkupParseContext *context, |
719 start_element_handler(GMarkupParseContext *context, |
| 720 const gchar *element_name, |
720 const gchar *element_name, |
| 721 const gchar **attribute_names, |
721 const gchar **attribute_names, |
| 722 const gchar **attribute_values, |
722 const gchar **attribute_values, |
| 723 gpointer user_data, GError **error) |
723 gpointer user_data, GError **error) |
| 724 { |
724 { |
| 725 const char *value; |
725 const char *value; |
| 726 AccountParserData *data = user_data; |
726 AccountParserData *data = user_data; |
| 727 GHashTable *atts; |
727 GHashTable *atts; |
| 728 int i; |
728 int i; |
| 783 } |
783 } |
| 784 } |
784 } |
| 785 } |
785 } |
| 786 |
786 |
| 787 static void |
787 static void |
| 788 __end_element_handler(GMarkupParseContext *context, const gchar *element_name, |
788 end_element_handler(GMarkupParseContext *context, const gchar *element_name, |
| 789 gpointer user_data, GError **error) |
789 gpointer user_data, GError **error) |
| 790 { |
790 { |
| 791 AccountParserData *data = user_data; |
791 AccountParserData *data = user_data; |
| 792 gchar *buffer; |
792 gchar *buffer; |
| 793 |
793 |
| 794 if (data->buffer == NULL) |
794 if (data->buffer == NULL) |
| 925 |
925 |
| 926 g_free(buffer); |
926 g_free(buffer); |
| 927 } |
927 } |
| 928 |
928 |
| 929 static void |
929 static void |
| 930 __text_handler(GMarkupParseContext *context, const gchar *text, |
930 text_handler(GMarkupParseContext *context, const gchar *text, |
| 931 gsize text_len, gpointer user_data, GError **error) |
931 gsize text_len, gpointer user_data, GError **error) |
| 932 { |
932 { |
| 933 AccountParserData *data = user_data; |
933 AccountParserData *data = user_data; |
| 934 |
934 |
| 935 if (data->buffer == NULL) |
935 if (data->buffer == NULL) |
| 936 data->buffer = g_string_new_len(text, text_len); |
936 data->buffer = g_string_new_len(text, text_len); |
| 973 } |
973 } |
| 974 |
974 |
| 975 parser_data = g_new0(AccountParserData, 1); |
975 parser_data = g_new0(AccountParserData, 1); |
| 976 |
976 |
| 977 context = g_markup_parse_context_new(&accounts_parser, 0, |
977 context = g_markup_parse_context_new(&accounts_parser, 0, |
| 978 parser_data, __free_parser_data); |
978 parser_data, free_parser_data); |
| 979 |
979 |
| 980 if (!g_markup_parse_context_parse(context, contents, length, NULL)) { |
980 if (!g_markup_parse_context_parse(context, contents, length, NULL)) { |
| 981 g_markup_parse_context_free(context); |
981 g_markup_parse_context_free(context); |
| 982 g_free(contents); |
982 g_free(contents); |
| 983 |
983 |
| 1031 name, setting->value.bool); |
1031 name, setting->value.bool); |
| 1032 } |
1032 } |
| 1033 } |
1033 } |
| 1034 |
1034 |
| 1035 static void |
1035 static void |
| 1036 _write_ui_setting_list(gpointer key, gpointer value, gpointer user_data) |
1036 write_ui_setting_list(gpointer key, gpointer value, gpointer user_data) |
| 1037 { |
1037 { |
| 1038 GHashTable *table; |
1038 GHashTable *table; |
| 1039 const char *ui; |
1039 const char *ui; |
| 1040 FILE *fp; |
1040 FILE *fp; |
| 1041 |
1041 |
| 1042 table = (GHashTable *)value; |
1042 table = (GHashTable *)value; |
| 1043 ui = (const char *)key; |
1043 ui = (const char *)key; |
| 1044 fp = (FILE *)user_data; |
1044 fp = (FILE *)user_data; |
| 1045 |
1045 |
| 1046 fprintf(fp, " <settings ui='%s'>\n", ui); |
1046 fprintf(fp, " <settings ui='%s'>\n", ui); |
| 1047 g_hash_table_foreach(table, _write_setting, fp); |
1047 g_hash_table_foreach(table, write_setting, fp); |
| 1048 fprintf(fp, " </settings>\n"); |
1048 fprintf(fp, " </settings>\n"); |
| 1049 } |
1049 } |
| 1050 |
1050 |
| 1051 static void |
1051 static void |
| 1052 gaim_accounts_write(FILE *fp, GaimAccount *account) |
1052 gaim_accounts_write(FILE *fp, GaimAccount *account) |
| 1086 fprintf(fp, " <buddyicon>%s</buddyicon>\n", esc); |
1086 fprintf(fp, " <buddyicon>%s</buddyicon>\n", esc); |
| 1087 g_free(esc); |
1087 g_free(esc); |
| 1088 } |
1088 } |
| 1089 |
1089 |
| 1090 fprintf(fp, " <settings>\n"); |
1090 fprintf(fp, " <settings>\n"); |
| 1091 g_hash_table_foreach(account->settings, _write_setting, fp); |
1091 g_hash_table_foreach(account->settings, write_setting, fp); |
| 1092 fprintf(fp, " </settings>\n"); |
1092 fprintf(fp, " </settings>\n"); |
| 1093 |
1093 |
| 1094 g_hash_table_foreach(account->ui_settings, _write_ui_setting_list, fp); |
1094 g_hash_table_foreach(account->ui_settings, write_ui_setting_list, fp); |
| 1095 |
1095 |
| 1096 if ((proxy_info = gaim_account_get_proxy_info(account)) != NULL && |
1096 if ((proxy_info = gaim_account_get_proxy_info(account)) != NULL && |
| 1097 (proxy_type = gaim_proxy_info_get_type(proxy_info)) != GAIM_PROXY_NONE) |
1097 (proxy_type = gaim_proxy_info_get_type(proxy_info)) != GAIM_PROXY_NONE) |
| 1098 { |
1098 { |
| 1099 const char *value; |
1099 const char *value; |