diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-06 14:50:52 +0000 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-03-06 14:50:52 +0000 | 
| commit | 840bba81bc4ab7ce37aeeea5f32091684b19e5b8 (patch) | |
| tree | 0baee2717433122e7ccd4d49617825e8db2b9400 /protocols/jabber | |
| parent | d1ad6f0973bda799bdf21e36f20dc58f7bb1bf08 (diff) | |
The Jabber part of the change. Also made representation of not-away a bit
more consistent. Except for free-for-chat, which is nuts anyway.
Diffstat (limited to 'protocols/jabber')
| -rw-r--r-- | protocols/jabber/jabber.c | 11 | ||||
| -rw-r--r-- | protocols/jabber/jabber.h | 2 | ||||
| -rw-r--r-- | protocols/jabber/jabber_util.c | 9 | ||||
| -rw-r--r-- | protocols/jabber/presence.c | 17 | 
4 files changed, 22 insertions, 17 deletions
| diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index b8e88c26..35cf08c5 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -79,6 +79,8 @@ static void jabber_init( account_t *acc )  	s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc );  	s->flags |= ACC_SET_OFFLINE_ONLY; +	 +	acc->flags |= ACC_FLAG_AWAY_MESSAGE | ACC_FLAG_STATUS_MESSAGE;  }  static void jabber_generate_id_hash( struct jabber_data *jd ); @@ -376,11 +378,12 @@ static void jabber_get_info( struct im_connection *ic, char *who )  static void jabber_set_away( struct im_connection *ic, char *state_txt, char *message )  {  	struct jabber_data *jd = ic->proto_data; -	struct jabber_away_state *state; -	/* Save all this info. We need it, for example, when changing the priority setting. */ -	state = (void *) jabber_away_state_by_name( state_txt ); -	jd->away_state = state ? state : (void *) jabber_away_state_list; /* Fall back to "Away" if necessary. */ +	/* state_txt == NULL -> Not away. +	   Unknown state -> fall back to the first defined away state. */ +	jd->away_state = state_txt ? jabber_away_state_by_name( state_txt ) +	                 ? : jabber_away_state_list : NULL; +	  	g_free( jd->away_message );  	jd->away_message = ( message && *message ) ? g_strdup( message ) : NULL; diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 1180d2b9..7bb66e0e 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -83,7 +83,7 @@ struct jabber_data  	/* 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; +	const struct jabber_away_state *away_state;  	char *away_message;  	md5_state_t cached_id_prefix; diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c index 19a73b6a..185d3878 100644 --- a/protocols/jabber/jabber_util.c +++ b/protocols/jabber/jabber_util.c @@ -227,10 +227,9 @@ xt_status jabber_cache_handle_packet( struct im_connection *ic, struct xt_node *  const struct jabber_away_state jabber_away_state_list[] =  {  	{ "away",  "Away" }, -	{ "chat",  "Free for Chat" }, +	{ "chat",  "Free for Chat" },   /* WTF actually uses this? */  	{ "dnd",   "Do not Disturb" },  	{ "xa",    "Extended Away" }, -	{ "",      "Online" },  	{ "",      NULL }  }; @@ -238,6 +237,9 @@ const struct jabber_away_state *jabber_away_state_by_code( char *code )  {  	int i; +	if( code == NULL ) +		return NULL; +	  	for( i = 0; jabber_away_state_list[i].full_name; i ++ )  		if( g_strcasecmp( jabber_away_state_list[i].code, code ) == 0 )  			return jabber_away_state_list + i; @@ -249,6 +251,9 @@ const struct jabber_away_state *jabber_away_state_by_name( char *name )  {  	int i; +	if( name == NULL ) +		return NULL; +	  	for( i = 0; jabber_away_state_list[i].full_name; i ++ )  		if( g_strcasecmp( jabber_away_state_list[i].full_name, name ) == 0 )  			return jabber_away_state_list + i; diff --git a/protocols/jabber/presence.c b/protocols/jabber/presence.c index 939bc888..28aaea1b 100644 --- a/protocols/jabber/presence.c +++ b/protocols/jabber/presence.c @@ -189,13 +189,12 @@ xt_status jabber_pkt_presence( struct xt_node *node, gpointer data )  	{  		int is_away = 0; -		if( send_presence->away_state && !( *send_presence->away_state->code == 0 || -		    strcmp( send_presence->away_state->code, "chat" ) == 0 ) ) +		if( send_presence->away_state && +		    strcmp( send_presence->away_state->code, "chat" ) != 0 )  			is_away = OPT_AWAY;  		imcb_buddy_status( ic, send_presence->bare_jid, OPT_LOGGED_IN | is_away, -		                   ( is_away && send_presence->away_state ) ? -		                   send_presence->away_state->full_name : NULL, +		                   is_away ? send_presence->away_state->full_name : NULL,  		                   send_presence->away_message );  	} @@ -208,17 +207,15 @@ int presence_send_update( struct im_connection *ic )  {  	struct jabber_data *jd = ic->proto_data;  	struct xt_node *node, *cap; -	char *show = jd->away_state->code; -	char *status = jd->away_message;  	struct groupchat *c;  	int st;  	node = jabber_make_packet( "presence", NULL, NULL, NULL );  	xt_add_child( node, xt_new_node( "priority", set_getstr( &ic->acc->set, "priority" ), 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( jd->away_state ) +		xt_add_child( node, xt_new_node( "show", jd->away_state->code, NULL ) ); +	if( jd->away_message ) +		xt_add_child( node, xt_new_node( "status", jd->away_message, NULL ) );  	/* This makes the packet slightly bigger, but clients interested in  	   capabilities can now cache the discovery info. This reduces the | 
