aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/jabber/io.c29
-rw-r--r--protocols/jabber/jabber.c21
-rw-r--r--protocols/jabber/jabber.h23
-rw-r--r--protocols/jabber/xmltree.c2
4 files changed, 63 insertions, 12 deletions
diff --git a/protocols/jabber/io.c b/protocols/jabber/io.c
index 67deb3a6..edde5a8d 100644
--- a/protocols/jabber/io.c
+++ b/protocols/jabber/io.c
@@ -44,6 +44,15 @@ int jabber_write( struct im_connection *ic, char *buf, int len )
struct jabber_data *jd = ic->proto_data;
gboolean ret;
+ if( jd->flags & JFLAG_XMLCONSOLE )
+ {
+ char *msg;
+
+ msg = g_strdup_printf( "TX: %s", buf );
+ imcb_buddy_msg( ic, JABBER_XMLCONSOLE_HANDLE, msg, 0, 0 );
+ g_free( msg );
+ }
+
if( jd->tx_len == 0 )
{
/* If the queue is empty, allocate a new buffer. */
@@ -483,7 +492,27 @@ static xt_status jabber_pkt_misc( struct xt_node *node, gpointer data )
return XT_HANDLED;
}
+static xt_status jabber_xmlconsole( struct xt_node *node, gpointer data )
+{
+ struct im_connection *ic = data;
+ struct jabber_data *jd = ic->proto_data;
+
+ if( jd->flags & JFLAG_XMLCONSOLE )
+ {
+ char *msg, *pkt;
+
+ pkt = xt_to_string( node );
+ msg = g_strdup_printf( "RX: %s", pkt );
+ imcb_buddy_msg( ic, JABBER_XMLCONSOLE_HANDLE, msg, 0, 0 );
+ g_free( msg );
+ g_free( pkt );
+ }
+
+ return XT_NEXT;
+}
+
static const struct xt_handler_entry jabber_handlers[] = {
+ { NULL, "stream:stream", jabber_xmlconsole },
{ "stream:stream", "<root>", jabber_end_of_stream },
{ "message", "stream:stream", jabber_pkt_message },
{ "presence", "stream:stream", jabber_pkt_presence },
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index 6c0f6240..b70af944 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -225,6 +225,9 @@ static int jabber_buddy_msg( struct im_connection *ic, char *who, char *message,
struct xt_node *node;
int st;
+ if( g_strcasecmp( who, JABBER_XMLCONSOLE_HANDLE ) == 0 )
+ return jabber_write( ic, message, strlen( message ) );
+
bud = jabber_buddy_by_jid( ic, who, 0 );
node = xt_new_node( "body", message, NULL );
@@ -310,12 +313,30 @@ static void jabber_set_away( struct im_connection *ic, char *state_txt, char *me
static void jabber_add_buddy( struct im_connection *ic, char *who, char *group )
{
+ struct jabber_data *jd = ic->proto_data;
+
+ if( g_strcasecmp( who, JABBER_XMLCONSOLE_HANDLE ) == 0 )
+ {
+ jd->flags |= JFLAG_XMLCONSOLE;
+ imcb_add_buddy( ic, JABBER_XMLCONSOLE_HANDLE, NULL );
+ return;
+ }
+
if( jabber_add_to_roster( ic, who, NULL ) )
presence_send_request( ic, who, "subscribe" );
}
static void jabber_remove_buddy( struct im_connection *ic, char *who, char *group )
{
+ struct jabber_data *jd = ic->proto_data;
+
+ if( g_strcasecmp( who, JABBER_XMLCONSOLE_HANDLE ) == 0 )
+ {
+ jd->flags &= ~JFLAG_XMLCONSOLE;
+ /* FIXME imcb_remove_buddy( ic, JABBER_XMLCONSOLE_HANDLE, NULL ); */
+ return;
+ }
+
/* We should always do this part. Clean up our administration a little bit. */
jabber_buddy_remove_bare( ic, who );
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index ba61920c..2fb01fdc 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -31,16 +31,17 @@
typedef enum
{
- JFLAG_STREAM_STARTED = 1, /* Set when we detected the beginning of the stream
+ JFLAG_STREAM_STARTED = 1, /* Set when we detected the beginning of the stream
and want to do auth. */
- JFLAG_AUTHENTICATED = 2, /* Set when we're successfully authenticatd. */
- JFLAG_STREAM_RESTART = 4, /* Set when we want to restart the stream (after
+ JFLAG_AUTHENTICATED = 2, /* Set when we're successfully authenticatd. */
+ JFLAG_STREAM_RESTART = 4, /* Set when we want to restart the stream (after
SASL or TLS). */
- JFLAG_WAIT_SESSION = 8, /* Set if we sent a <session> tag and need a reply
+ JFLAG_WAIT_SESSION = 8, /* Set if we sent a <session> tag and need a reply
before we continue. */
- JFLAG_WAIT_BIND = 16, /* ... for <bind> tag. */
- JFLAG_WANT_TYPING = 32, /* Set if we ever sent a typing notification, this
+ JFLAG_WAIT_BIND = 16, /* ... for <bind> tag. */
+ JFLAG_WANT_TYPING = 32, /* Set if we ever sent a typing notification, this
activates all XEP-85 related code. */
+ JFLAG_XMLCONSOLE = 64, /* If the user added an xmlconsole buddy. */
} jabber_flags_t;
typedef enum
@@ -55,10 +56,6 @@ typedef enum
have a real JID. */
} jabber_buddy_flags_t;
-#define JABBER_PORT_DEFAULT "5222"
-#define JABBER_PORT_MIN 5220
-#define JABBER_PORT_MAX 5229
-
struct jabber_data
{
struct im_connection *ic;
@@ -124,6 +121,12 @@ struct jabber_chat
struct jabber_buddy *me;
};
+#define JABBER_XMLCONSOLE_HANDLE "xmlconsole"
+
+#define JABBER_PORT_DEFAULT "5222"
+#define JABBER_PORT_MIN 5220
+#define JABBER_PORT_MAX 5229
+
/* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the
first one should be used, but when storing a packet in the cache, a
"special" kind of ID is assigned to make it easier later to figure out
diff --git a/protocols/jabber/xmltree.c b/protocols/jabber/xmltree.c
index c8bef362..7a165a1e 100644
--- a/protocols/jabber/xmltree.c
+++ b/protocols/jabber/xmltree.c
@@ -187,8 +187,6 @@ int xt_handle( struct xt_parser *xt, struct xt_node *node, int depth )
/* If there's no parent, the handler should mention <root> as a parent. */
g_strcasecmp( xt->handlers[i].parent, "<root>" ) == 0 ) ) )
{
- xt_print( node );
-
st = xt->handlers[i].func( node, xt->data );
if( st == XT_ABORT )