aboutsummaryrefslogtreecommitdiffstats
path: root/account.c
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-04-02 16:22:57 +0200
committerJelmer Vernooij <jelmer@samba.org>2008-04-02 16:22:57 +0200
commit85d7b857fb8ca8e3c03d4abb3368a0966760630c (patch)
treea16163e557bcae3af41bde7d2d771d64ca248a97 /account.c
parent875ad4201402b1a8f80ba22a6cdcdb152c6e5510 (diff)
parentdd345753c1742905c9f81aa71d8b09109fbc5456 (diff)
Merge trunk.
Diffstat (limited to 'account.c')
-rw-r--r--account.c108
1 files changed, 83 insertions, 25 deletions
diff --git a/account.c b/account.c
index 168d18c0..2c6e1069 100644
--- a/account.c
+++ b/account.c
@@ -30,11 +30,12 @@
account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
{
account_t *a;
+ set_t *s;
if( irc->accounts )
{
for( a = irc->accounts; a->next; a = a->next );
- a = a->next = g_new0 ( account_t, 1 );
+ a = a->next = g_new0( account_t, 1 );
}
else
{
@@ -44,11 +45,77 @@ account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
a->prpl = prpl;
a->user = g_strdup( user );
a->pass = g_strdup( pass );
+ a->auto_connect = 1;
a->irc = irc;
+ s = set_add( &a->set, "auto_connect", "true", set_eval_account, a );
+ s->flags |= ACC_SET_NOSAVE;
+
+ s = set_add( &a->set, "auto_reconnect", "true", set_eval_bool, a );
+
+ s = set_add( &a->set, "password", NULL, set_eval_account, a );
+ s->flags |= ACC_SET_NOSAVE;
+
+ s = set_add( &a->set, "username", NULL, set_eval_account, a );
+ s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
+ set_setstr( &a->set, "username", user );
+
+ a->nicks = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free );
+
+ /* This function adds some more settings (and might want to do more
+ things that have to be done now, although I can't think of anything. */
+ if( prpl->init )
+ prpl->init( a );
+
return( a );
}
+char *set_eval_account( set_t *set, char *value )
+{
+ account_t *acc = set->data;
+
+ /* Double-check: We refuse to edit on-line accounts. */
+ if( set->flags & ACC_SET_OFFLINE_ONLY && acc->ic )
+ return NULL;
+
+ if( strcmp( set->key, "username" ) == 0 )
+ {
+ g_free( acc->user );
+ acc->user = g_strdup( value );
+ return value;
+ }
+ else if( strcmp( set->key, "password" ) == 0 )
+ {
+ g_free( acc->pass );
+ acc->pass = g_strdup( value );
+ return NULL; /* password shouldn't be visible in plaintext! */
+ }
+ else if( strcmp( set->key, "server" ) == 0 )
+ {
+ g_free( acc->server );
+ if( *value )
+ {
+ acc->server = g_strdup( value );
+ return value;
+ }
+ else
+ {
+ acc->server = NULL;
+ return g_strdup( set->def );
+ }
+ }
+ else if( strcmp( set->key, "auto_connect" ) == 0 )
+ {
+ if( !is_bool( value ) )
+ return NULL;
+
+ acc->auto_connect = bool2int( value );
+ return value;
+ }
+
+ return NULL;
+}
+
account_t *account_get( irc_t *irc, char *id )
{
account_t *a, *ret = NULL;
@@ -67,7 +134,7 @@ account_t *account_get( irc_t *irc, char *id )
{
for( a = irc->accounts; a; a = a->next )
if( a->prpl == proto &&
- a->prpl->cmp_buddynames( handle, a->user ) == 0 )
+ a->prpl->handle_cmp( handle, a->user ) == 0 )
ret = a;
}
@@ -114,23 +181,26 @@ void account_del( irc_t *irc, account_t *acc )
{
account_t *a, *l = NULL;
+ if( acc->ic )
+ /* Caller should have checked, accounts still in use can't be deleted. */
+ return;
+
for( a = irc->accounts; a; a = (l=a)->next )
if( a == acc )
{
- if( a->gc ) return; /* Caller should have checked, accounts still in use can't be deleted. */
-
if( l )
- {
l->next = a->next;
- }
else
- {
irc->accounts = a->next;
- }
+
+ while( a->set )
+ set_del( &a->set, a->set->key );
+
+ g_hash_table_destroy( a->nicks );
g_free( a->user );
g_free( a->pass );
- if( a->server ) g_free( a->server );
+ g_free( a->server );
if( a->reconnect ) /* This prevents any reconnect still queued to happen */
cancel_auto_reconnect( a );
g_free( a );
@@ -141,9 +211,7 @@ void account_del( irc_t *irc, account_t *acc )
void account_on( irc_t *irc, account_t *a )
{
- struct aim_user *u;
-
- if( a->gc )
+ if( a->ic )
{
/* Trying to enable an already-enabled account */
return;
@@ -151,24 +219,14 @@ void account_on( irc_t *irc, account_t *a )
cancel_auto_reconnect( a );
- u = g_new0 ( struct aim_user, 1 );
- u->irc = irc;
- u->prpl = a->prpl;
- strncpy( u->username, a->user, sizeof( u->username ) - 1 );
- strncpy( u->password, a->pass, sizeof( u->password ) - 1 );
- if( a->server) strncpy( u->proto_opt[0], a->server, sizeof( u->proto_opt[0] ) - 1 );
-
- a->gc = (struct gaim_connection *) u; /* Bit hackish :-/ */
a->reconnect = 0;
-
- a->prpl->login( u );
+ a->prpl->login( a );
}
void account_off( irc_t *irc, account_t *a )
{
- a->gc->wants_to_die = TRUE;
- signoff( a->gc );
- a->gc = NULL;
+ imc_logout( a->ic, FALSE );
+ a->ic = NULL;
if( a->reconnect )
{
/* Shouldn't happen */