diff -Nru freetalk-orig/src/callbacks.cc freetalk-iqs/src/callbacks.cc --- freetalk-orig/src/callbacks.cc 2006-08-12 07:50:09.000000000 +0200 +++ freetalk-iqs/src/callbacks.cc 2006-08-12 07:50:12.000000000 +0200 @@ -218,19 +218,28 @@ /* Currently the only IQ message we'll handle is the roster */ LmMessageNode *query = lm_message_node_get_child (msg->node, "query"); - if ((LM_MESSAGE_SUB_TYPE_GET == lm_message_get_sub_type (msg))){ - ft_msg_sub_type_get_cb (msg); - - } else if ((LM_MESSAGE_SUB_TYPE_RESULT == lm_message_get_sub_type (msg))){ - ft_msg_sub_type_result_cb (msg); - } + int type = lm_message_get_sub_type (msg); if (query) { const char *ns = lm_message_node_get_attribute (query, "xmlns"); - if (ns && !g_ascii_strcasecmp (ns, "jabber:iq:roster")) + if (ns && !g_ascii_strcasecmp (ns, "jabber:iq:roster")) { ft_roster_cb (msg); - else + } else if (ns && !g_ascii_strcasecmp (ns, "jabber:iq:version")) { + if( type == LM_MESSAGE_SUB_TYPE_GET ) { + ft_msg_iq_version_cb (msg); + } + } else if (ns && !g_ascii_strcasecmp (ns, "jabber:iq:last")) { + if( type == LM_MESSAGE_SUB_TYPE_GET ) { + ft_msg_iq_last_cb (msg); + } + } else if (ns && !g_ascii_strcasecmp (ns, "http://jabber.org/protocol/disco#info")) { + if( type == LM_MESSAGE_SUB_TYPE_GET ) { + ft_msg_sub_type_get_cb (msg); + } else if( type == LM_MESSAGE_SUB_TYPE_RESULT ) { + ft_msg_sub_type_result_cb (msg); + } + } else PRINTF (_("[iq received: %s (unhandled yet)]"), ns); } else { diff -Nru freetalk-orig/src/commands.cc freetalk-iqs/src/commands.cc --- freetalk-orig/src/commands.cc 2006-08-12 07:50:09.000000000 +0200 +++ freetalk-iqs/src/commands.cc 2006-08-12 07:50:12.000000000 +0200 @@ -294,6 +294,7 @@ do_send_message_no_hook (char *jid, char *msg_str) { LmMessage *msg; + state.last = time(NULL); if (!jid || !msg_str) return -2; diff -Nru freetalk-orig/src/freetalk.cc freetalk-iqs/src/freetalk.cc --- freetalk-orig/src/freetalk.cc 2006-08-12 07:50:09.000000000 +0200 +++ freetalk-iqs/src/freetalk.cc 2006-08-12 07:50:12.000000000 +0200 @@ -57,6 +57,7 @@ state.f_state = NULL; state.download_dirname = (char *)calloc (1, strlen (getenv ("HOME")) + 1 + strlen (".freetalk/downloads") + 1); sprintf (state.download_dirname, "%s/.freetalk/downloads", getenv ("HOME")); + state.last = time(NULL); } scm_t_catch_handler catcher () @@ -227,3 +228,62 @@ gh_enter (argc, argv, inner_main); return 0; } + +/* function called when we receive a jabber:iq:version message */ +int ft_msg_iq_version_cb(LmMessage *msg) +{ + const char *from = lm_message_node_get_attribute (msg->node, "from"); + const char *id = lm_message_node_get_attribute (msg->node, "id"); + LmMessage *send_msg; + LmMessageNode *query, *name, *version; + + send_msg = lm_message_new_with_sub_type (from, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_RESULT); + + lm_message_node_set_attribute (send_msg->node, + "id", id); + query = lm_message_node_add_child (send_msg->node, "query", NULL); + lm_message_node_set_attribute (query, + "xmlns", "jabber:iq:version"); + + name = lm_message_node_add_child (query, "name", PACKAGE_NAME); + version = lm_message_node_add_child (query, "version", PACKAGE_VERSION); + + int result = lm_connection_send (state.conn, send_msg, NULL); + lm_message_node_unref (version); + lm_message_node_unref (name); + lm_message_node_unref (query); + lm_message_unref (send_msg); + return result; +} + +/* function called when we receive a jabber:iq:last message */ +int ft_msg_iq_last_cb(LmMessage *msg) +{ + const char *from = lm_message_node_get_attribute (msg->node, "from"); + const char *id = lm_message_node_get_attribute (msg->node, "id"); + LmMessage *send_msg; + LmMessageNode *query; + + char seconds[256]; + snprintf( seconds, sizeof(seconds)-1, "%ld", time(NULL) - state.last ); + + send_msg = lm_message_new_with_sub_type (from, + LM_MESSAGE_TYPE_IQ, + LM_MESSAGE_SUB_TYPE_RESULT); + + lm_message_node_set_attribute (send_msg->node, + "id", id); + query = lm_message_node_add_child (send_msg->node, "query", NULL); + + lm_message_node_set_attribute (query, + "seconds", seconds ); + lm_message_node_set_attribute (query, + "xmlns", "jabber:iq:last" ); + + int result = lm_connection_send (state.conn, send_msg, NULL); + lm_message_node_unref (query); + lm_message_unref (send_msg); + return result; +} diff -Nru freetalk-orig/src/freetalk.h freetalk-iqs/src/freetalk.h --- freetalk-orig/src/freetalk.h 2006-08-12 07:50:09.000000000 +0200 +++ freetalk-iqs/src/freetalk.h 2006-08-12 07:50:12.000000000 +0200 @@ -23,6 +23,7 @@ #include #include +#include #include "util.h" #include "file_transfer.h" @@ -62,10 +63,13 @@ char *config_dir; GSList *f_state; /* file transfer states - linked list */ char *download_dirname; /* default directory where all files xfered go */ + time_t last; } ft_state; extern ft_state state; void interface_init (void); +int ft_msg_iq_version_cb (LmMessage*); +int ft_msg_iq_last_cb (LmMessage*); #endif /* __FREETALK_H__ */