diff options
Diffstat (limited to 'protocols/jabber')
| -rw-r--r-- | protocols/jabber/conference.c | 21 | ||||
| -rw-r--r-- | protocols/jabber/io.c | 4 | ||||
| -rw-r--r-- | protocols/jabber/iq.c | 12 | ||||
| -rw-r--r-- | protocols/jabber/jabber.c | 16 | ||||
| -rw-r--r-- | protocols/jabber/jabber.h | 2 | 
5 files changed, 51 insertions, 4 deletions
| diff --git a/protocols/jabber/conference.c b/protocols/jabber/conference.c index c5bc0e68..074412ec 100644 --- a/protocols/jabber/conference.c +++ b/protocols/jabber/conference.c @@ -175,6 +175,27 @@ int jabber_chat_leave( struct groupchat *c, const char *reason )  	return 1;  } +void jabber_chat_invite( struct groupchat *c, char *who, char *message ) +{ +	struct xt_node *node; +	struct im_connection *ic = c->ic; +	struct jabber_chat *jc = c->data; + +	node = xt_new_node( "reason", message, NULL );  + +	node = xt_new_node( "invite", NULL, node ); +	xt_add_attr( node, "to", who );  + +	node = xt_new_node( "x", NULL, node );  +	xt_add_attr( node, "xmlns", XMLNS_MUC_USER );  +	 +	node = jabber_make_packet( "message", NULL, jc->name, node );  + +	jabber_write_packet( ic, node );  + +	xt_free_node( node ); +} +  /* Not really the same syntax as the normal pkt_ functions, but this isn't     called by the xmltree parser directly and this way I can add some extra     parameters so we won't have to repeat too many things done by the caller diff --git a/protocols/jabber/io.c b/protocols/jabber/io.c index 61cd142e..29561b86 100644 --- a/protocols/jabber/io.c +++ b/protocols/jabber/io.c @@ -119,7 +119,7 @@ static gboolean jabber_write_queue( struct im_connection *ic )  		return TRUE;  	} -	else if( st == 0 || ( st < 0 && !sockerr_again() ) ) +	else if( st == 0 || ( st < 0 && !ssl_sockerr_again( jd->ssl ) ) )  	{  		/* Set fd to -1 to make sure we won't write to it anymore. */  		closesocket( jd->fd );	/* Shouldn't be necessary after errors? */ @@ -230,7 +230,7 @@ static gboolean jabber_read_callback( gpointer data, gint fd, b_input_condition  			}  		}  	} -	else if( st == 0 || ( st < 0 && !sockerr_again() ) ) +	else if( st == 0 || ( st < 0 && !ssl_sockerr_again( jd->ssl ) ) )  	{  		closesocket( jd->fd );  		jd->fd = -1; diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c index 8bd1111a..2f0959b0 100644 --- a/protocols/jabber/iq.c +++ b/protocols/jabber/iq.c @@ -49,7 +49,8 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )  	}  	else if( strcmp( type, "get" ) == 0 )  	{ -		if( !( c = xt_find_node( node->children, "query" ) ) || +		if( !( ( c = xt_find_node( node->children, "query" ) ) || +		       ( c = xt_find_node( node->children, "ping" ) ) ) || /* O_o WHAT is wrong with just <query/> ????? */  		    !( s = xt_find_attr( c, "xmlns" ) ) )  		{  			imcb_log( ic, "WARNING: Received incomplete IQ-%s packet", type ); @@ -80,12 +81,21 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )  			strftime( buf, sizeof( buf ) - 1, "%Z", localtime( &time_ep ) );  			xt_add_child( reply, xt_new_node( "tz", buf, NULL ) );  		} +		else if( strcmp( s, XMLNS_PING ) == 0 ) +		{ +			xt_free_node( reply ); +			reply = jabber_make_packet( "iq", "result", xt_find_attr( node, "from" ), NULL ); +			if( ( s = xt_find_attr( node, "id" ) ) ) +				xt_add_attr( reply, "id", s ); +			pack = 0; +		}  		else if( strcmp( s, XMLNS_DISCO_INFO ) == 0 )  		{  			const char *features[] = { XMLNS_VERSION,  			                           XMLNS_TIME,  			                           XMLNS_CHATSTATES,  			                           XMLNS_MUC, +			                           XMLNS_PING,  						   XMLNS_SI,  						   XMLNS_BYTESTREAMS,  						   XMLNS_FILETRANSFER, diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index 98d2dadf..1d3225dd 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -422,6 +422,20 @@ static void jabber_chat_leave_( struct groupchat *c )  		jabber_chat_leave( c, NULL );  } +static void jabber_chat_invite_( struct groupchat *c, char *who, char *msg ) +{ +	struct jabber_chat *jc = c->data; +	gchar *msg_alt = NULL; + +	if( msg == NULL ) +		msg_alt = g_strdup_printf( "%s invited you to %s", c->ic->acc->user, jc->name ); +	 +	if( c && who ) +		jabber_chat_invite( c, who, msg ? msg : msg_alt ); +	 +	g_free( msg_alt ); +} +  static void jabber_keepalive( struct im_connection *ic )  {  	/* Just any whitespace character is enough as a keepalive for XMPP sessions. */ @@ -493,7 +507,7 @@ void jabber_initmodule()  	ret->remove_buddy = jabber_remove_buddy;  	ret->chat_msg = jabber_chat_msg_;  	ret->chat_topic = jabber_chat_topic_; -//	ret->chat_invite = jabber_chat_invite; +	ret->chat_invite = jabber_chat_invite_;  	ret->chat_leave = jabber_chat_leave_;  	ret->chat_join = jabber_chat_join_;  	ret->keepalive = jabber_keepalive; diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 9edb844e..3251b49b 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -188,6 +188,7 @@ struct jabber_transfer  #define XMLNS_AUTH         "jabber:iq:auth"                                      /* XEP-0078 */  #define XMLNS_VERSION      "jabber:iq:version"                                   /* XEP-0092 */  #define XMLNS_TIME         "jabber:iq:time"                                      /* XEP-0090 */ +#define XMLNS_PING         "urn:xmpp:ping"                                       /* XEP-0199 */  #define XMLNS_VCARD        "vcard-temp"                                          /* XEP-0054 */  #define XMLNS_DELAY        "jabber:x:delay"                                      /* XEP-0091 */  #define XMLNS_XDATA        "jabber:x:data"                                       /* XEP-0004 */ @@ -292,5 +293,6 @@ int jabber_chat_topic( struct groupchat *c, char *topic );  int jabber_chat_leave( struct groupchat *c, const char *reason );  void jabber_chat_pkt_presence( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node );  void jabber_chat_pkt_message( struct im_connection *ic, struct jabber_buddy *bud, struct xt_node *node ); +void jabber_chat_invite( struct groupchat *c, char *who, char *message );  #endif | 
