diff options
-rw-r--r-- | protocols/jabber/jabber.c | 2 | ||||
-rw-r--r-- | protocols/jabber/jabber.h | 5 | ||||
-rw-r--r-- | protocols/jabber/jabber_util.c | 39 | ||||
-rw-r--r-- | protocols/jabber/presence.c | 12 |
4 files changed, 47 insertions, 11 deletions
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index b3199cde..ee26a007 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -151,7 +151,7 @@ static void jabber_set_away( struct gaim_connection *gc, char *state_txt, char * g_free( jd->away_message ); jd->away_message = ( message && *message ) ? g_strdup( message ) : NULL; - presence_send( gc, NULL, jd->away_state->code, jd->away_message ); + presence_send_update( gc ); } static void jabber_keepalive( struct gaim_connection *gc ) diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 29cf6a84..4a8292ea 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -53,6 +53,9 @@ struct jabber_data char *username; /* USERNAME@server */ char *server; /* username@SERVER -=> server/domain, not hostname */ + + /* After changing one of these two (or the priority setting), call + presence_send_update() to inform the server about the changes. */ struct jabber_away_state *away_state; char *away_message; @@ -74,7 +77,7 @@ xt_status jabber_pkt_message( struct xt_node *node, gpointer data ); /* presence.c */ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ); -int presence_send( struct gaim_connection *gc, char *to, char *show, char *status ); +int presence_send_update( struct gaim_connection *gc ); /* jabber_util.c */ char *set_eval_resprio( set_t *set, char *value ); diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c index 21df5126..e7a161cc 100644 --- a/protocols/jabber/jabber_util.c +++ b/protocols/jabber/jabber_util.c @@ -28,17 +28,42 @@ static int next_id = 1; char *set_eval_resprio( set_t *set, char *value ) { account_t *acc = set->data; + char *ret; - /* Only run this stuff if the account is online ATM. */ - if( acc->gc ) + if( strcmp( set->key, "priority" ) == 0 ) + ret = set_eval_int( set, value ); + else + ret = value; + + /* Only run this stuff if the account is online ATM, + and if the setting seems to be acceptable. */ + if( acc->gc && ret ) { - /* ... */ + if( strcmp( set->key, "priority" ) == 0 ) + { + /* Although set_eval functions usually are very nice + and convenient, they have one disadvantage: If I + would just call p_s_u() now to send the new prio + setting, it would send the old setting because the + set->value gets changed when the eval returns a + non-NULL value. + + So now I can choose between implementing post-set + functions next to evals, or just do this little + hack: */ + g_free( set->value ); + set->value = g_strdup( ret ); + + /* (Yes, sorry, I prefer the hack. :-P) */ + + presence_send_update( acc->gc ); + } + else + { + } } - if( g_strcasecmp( set->key, "priority" ) == 0 ) - return set_eval_int( set, value ); - else - return value; + return ret; } char *set_eval_tls( set_t *set, char *value ) diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c index 18ce969b..d9053c5f 100644 --- a/protocols/jabber/presence.c +++ b/protocols/jabber/presence.c @@ -53,16 +53,24 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data ) return XT_HANDLED; } -int presence_send( struct gaim_connection *gc, char *to, char *show, char *status ) +/* Whenever presence information is updated, call this function to inform the + server. */ +int presence_send_update( struct gaim_connection *gc ) { + struct jabber_data *jd = gc->proto_data; struct xt_node *node; + char *show = jd->away_state->code; + char *status = jd->away_message; int st; - node = jabber_make_packet( "presence", NULL, to, NULL ); + node = jabber_make_packet( "presence", NULL, NULL, NULL ); if( show && *show ) xt_add_child( node, xt_new_node( "show", show, NULL ) ); if( status ) xt_add_child( node, xt_new_node( "status", status, NULL ) ); + /* if( set_getint( &gc->acc->set, "priority" ) != 0 ) */ + /* Let's just send this every time... */ + xt_add_child( node, xt_new_node( "priority", set_getstr( &gc->acc->set, "priority" ), NULL ) ); st = jabber_write_packet( gc, node ); |