aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2009-10-11 22:08:26 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2009-10-11 22:08:26 +0100
commitb74b287af7ee980b01b89e911e21ec8f163d24b3 (patch)
tree44ea65719a488595b8ad8a69ec491476dc75b14a
parent0f7ee7e53f6bcb2d1d262a94c278440413c0103a (diff)
Fixed account cleanup (use remove, not destroy) and now using user's account
settings.
-rw-r--r--protocols/purple/purple.c46
-rw-r--r--set.c16
-rw-r--r--set.h16
3 files changed, 58 insertions, 20 deletions
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index f3d8f0f4..82978dc4 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -92,6 +92,43 @@ static void purple_init( account_t *acc )
}
}
+static void purple_sync_settings( account_t *acc, PurpleAccount *pa )
+{
+ PurplePlugin *prpl = purple_plugins_find_with_id( pa->protocol_id );
+ PurplePluginProtocolInfo *pi = prpl->info->extra_info;
+ GList *i;
+
+ for( i = pi->protocol_options; i; i = i->next )
+ {
+ PurpleAccountOption *o = i->data;
+ const char *name;
+ set_t *s;
+
+ name = purple_account_option_get_setting( o );
+ s = set_find( &acc->set, name );
+ if( s->value == NULL )
+ continue;
+
+ switch( purple_account_option_get_type( o ) )
+ {
+ case PURPLE_PREF_STRING:
+ purple_account_set_string( pa, name, set_getstr( &acc->set, name ) );
+ break;
+
+ case PURPLE_PREF_INT:
+ purple_account_set_int( pa, name, set_getint( &acc->set, name ) );
+ break;
+
+ case PURPLE_PREF_BOOLEAN:
+ purple_account_set_bool( pa, name, set_getbool( &acc->set, name ) );
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
static void purple_login( account_t *acc )
{
struct im_connection *ic = imcb_new( acc );
@@ -102,10 +139,9 @@ static void purple_login( account_t *acc )
on dead connections. */
purple_connections = g_slist_prepend( purple_connections, ic );
- pa = purple_account_new( acc->user, acc->prpl->name );
+ ic->proto_data = pa = purple_account_new( acc->user, acc->prpl->name );
purple_account_set_password( pa, acc->pass );
-
- ic->proto_data = pa;
+ purple_sync_settings( acc, pa );
purple_account_set_enabled( pa, "BitlBee", TRUE );
}
@@ -116,7 +152,7 @@ static void purple_logout( struct im_connection *ic )
purple_account_set_enabled( pa, "BitlBee", FALSE );
purple_connections = g_slist_remove( purple_connections, ic );
- purple_account_destroy( pa );
+ purple_accounts_remove( pa );
}
static int purple_buddy_msg( struct im_connection *ic, char *who, char *message, int flags )
@@ -193,7 +229,9 @@ static void prplcb_conn_disconnected( PurpleConnection *gc )
struct im_connection *ic = purple_ic_by_gc( gc );
if( ic != NULL )
+ {
imc_logout( ic, TRUE );
+ }
}
static void prplcb_conn_notice( PurpleConnection *gc, const char *text )
diff --git a/set.c b/set.c
index f72e0ace..7abae37a 100644
--- a/set.c
+++ b/set.c
@@ -62,7 +62,7 @@ set_t *set_add( set_t **head, const char *key, const char *def, set_eval eval, v
return s;
}
-set_t *set_find( set_t **head, char *key )
+set_t *set_find( set_t **head, const char *key )
{
set_t *s = *head;
@@ -76,7 +76,7 @@ set_t *set_find( set_t **head, char *key )
return s;
}
-char *set_getstr( set_t **head, char *key )
+char *set_getstr( set_t **head, const char *key )
{
set_t *s = set_find( head, key );
@@ -86,7 +86,7 @@ char *set_getstr( set_t **head, char *key )
return s->value ? s->value : s->def;
}
-int set_getint( set_t **head, char *key )
+int set_getint( set_t **head, const char *key )
{
char *s = set_getstr( head, key );
int i = 0;
@@ -100,7 +100,7 @@ int set_getint( set_t **head, char *key )
return i;
}
-int set_getbool( set_t **head, char *key )
+int set_getbool( set_t **head, const char *key )
{
char *s = set_getstr( head, key );
@@ -110,7 +110,7 @@ int set_getbool( set_t **head, char *key )
return bool2int( s );
}
-int set_setstr( set_t **head, char *key, char *value )
+int set_setstr( set_t **head, const char *key, char *value )
{
set_t *s = set_find( head, key );
char *nv = value;
@@ -149,7 +149,7 @@ int set_setstr( set_t **head, char *key, char *value )
return 1;
}
-int set_setint( set_t **head, char *key, int value )
+int set_setint( set_t **head, const char *key, int value )
{
char s[24]; /* Not quite 128-bit clean eh? ;-) */
@@ -157,7 +157,7 @@ int set_setint( set_t **head, char *key, int value )
return set_setstr( head, key, s );
}
-void set_del( set_t **head, char *key )
+void set_del( set_t **head, const char *key )
{
set_t *s = *head, *t = NULL;
@@ -181,7 +181,7 @@ void set_del( set_t **head, char *key )
}
}
-int set_reset( set_t **head, char *key )
+int set_reset( set_t **head, const char *key )
{
set_t *s;
diff --git a/set.h b/set.h
index d20a58d3..42522506 100644
--- a/set.h
+++ b/set.h
@@ -75,23 +75,23 @@ typedef struct set
set_t *set_add( set_t **head, const char *key, const char *def, set_eval eval, void *data );
/* Returns the raw set_t. Might be useful sometimes. */
-set_t *set_find( set_t **head, char *key );
+set_t *set_find( set_t **head, const char *key );
/* Returns a pointer to the string value of this setting. Don't modify the
returned string, and don't free() it! */
-G_MODULE_EXPORT char *set_getstr( set_t **head, char *key );
+G_MODULE_EXPORT char *set_getstr( set_t **head, const char *key );
/* Get an integer. In previous versions set_getint() was also used to read
boolean values, but this SHOULD be done with set_getbool() now! */
-G_MODULE_EXPORT int set_getint( set_t **head, char *key );
-G_MODULE_EXPORT int set_getbool( set_t **head, char *key );
+G_MODULE_EXPORT int set_getint( set_t **head, const char *key );
+G_MODULE_EXPORT int set_getbool( set_t **head, const char *key );
/* set_setstr() strdup()s the given value, so after using this function
you can free() it, if you want. */
-int set_setstr( set_t **head, char *key, char *value );
-int set_setint( set_t **head, char *key, int value );
-void set_del( set_t **head, char *key );
-int set_reset( set_t **head, char *key );
+int set_setstr( set_t **head, const char *key, char *value );
+int set_setint( set_t **head, const char *key, int value );
+void set_del( set_t **head, const char *key );
+int set_reset( set_t **head, const char *key );
/* Two very useful generic evaluators. */
char *set_eval_int( set_t *set, char *value );