# HG changeset patch # User Myhailo Danylenko # Date 1264009183 -7200 # Node ID 9a4d0f04c7d3860cca7040ffdd452ed675d3da33 # Parent 6ed6279de87f23df2fcc951b3ff1d471f7a03d88 Check online status * Delay publication until connected * Not send requests if not online * Unregister reply handlers diff -r 6ed6279de87f -r 9a4d0f04c7d3 CMakeLists.txt --- a/CMakeLists.txt Sun Jan 17 12:04:48 2010 +0200 +++ b/CMakeLists.txt Wed Jan 20 19:39:43 2010 +0200 @@ -29,6 +29,15 @@ set(AALIB_LIBRARY_DIRS "/usr/lib" CACHE FILEPATH "Path, where AAlib is located") set(AALIB_INCLUDE_DIRS "/usr/include" CACHE FILEPATH "Path to AAlib includes") set(AALIB_LIBRARIES "-laa" CACHE TEXT "Libraries, necessary to link with AAlib") +find_program(GREP_EXECUTABLE grep DOC "Grep binary to detect functions in headers") +if(GREP_EXECUTABLE) + execute_process(COMMAND ${GREP_EXECUTABLE} xmpp_is_online ${MCABBER_INCLUDE_DIR}/mcabber/xmpp.h OUTPUT_VARIABLE HAVE_XMPP_IS_ONLINE ERROR_QUIET) +endif() +include(CheckSymbolExists) +set(CMAKE_REQUIRED_INCLUDES ${LM_INCLUDE_DIRS}) +set(CMAKE_REQUIRED_LIBRARIES ${LM_LIBRARIES}) +set(CMAKE_REQUIRED_FLAGS ${LM_LDFLAGS} ${LM_CFLAGS}) +check_symbol_exists(lm_connection_unregister_reply_handler loudmouth/loudmouth.h HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER) link_directories(${GLIB_LIBRARY_DIRS} ${GMODULE_LIBRARY_DIRS} ${LM_LIBRARY_DIRS} @@ -39,6 +48,7 @@ add_library(avatar MODULE avatar.c) ## Compiler setup +configure_file(config.h.in config.h) include_directories(SYSTEM ${GLIB_INCLUDE_DIRS} ${GMODULE_INCLUDE_DIRS} ${LM_INCLUDE_DIRS} diff -r 6ed6279de87f -r 9a4d0f04c7d3 avatar.c --- a/avatar.c Sun Jan 17 12:04:48 2010 +0200 +++ b/avatar.c Wed Jan 20 19:39:43 2010 +0200 @@ -45,6 +45,8 @@ #include +#include "config.h" + #define NS_AVATAR_DATA ( "urn:xmpp:avatar:data" ) #define NS_AVATAR_METADATA ( "urn:xmpp:avatar:metadata" ) #define NS_AVATAR_METADATA_NOTIFY ( "urn:xmpp:avatar:metadata+notify" ) @@ -55,6 +57,10 @@ static LmMessageHandler *avatar_metadata_reply_handler = NULL; +static gboolean publish_delayed = FALSE; +static gsize publish_len = 0; +static gchar *publish_data = NULL; + // predeclarations static LmHandlerResult avatar_retrieve_data_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer userdata); @@ -562,10 +568,17 @@ struct stat buf; if (stat (file, &buf) == -1) { - gchar *bjid = jidtodisp (jid); + gchar *bjid; LmMessage *request; LmMessageNode *node; + if (!xmpp_is_online ()) { + scr_LogPrint (LPRINT_NORMAL, "avatar: You are not online, request not sent."); + return FALSE; + } + + bjid = jidtodisp (jid); + scr_WriteIncomingMessage (bjid, "No avatar for this buddy yet, sending request.", 0, HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0); // NO conversion from utf-8 // create data request @@ -783,6 +796,18 @@ LmMessage *request; LmMessageNode *node; + if (!xmpp_is_online ()) { + scr_LogPrint (LPRINT_DEBUG, "avatar: Not connected, delaying publish."); + + g_free (publish_data); + + publish_data = g_strndup (data, len); + publish_len = len; + publish_delayed = TRUE; + + return; + } + request = lm_message_new_with_sub_type (NULL, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET); node = lm_message_get_node (request); @@ -1032,16 +1057,40 @@ for (hel = reply_handlers; hel; hel = hel->next) { LmMessageHandler *handler = (LmMessageHandler *) hel->data; lm_message_handler_invalidate (handler); - // it is already unreffed +#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER + if (lconnection) + lm_connection_unregister_reply_handler (lconnection, handler); +#endif } g_slist_free (reply_handlers); reply_handlers = NULL; + +#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLERS + if (lconnection) + lm_connection_unregister_reply_handler (lconnection, avatar_metadata_reply_handler); +#endif } // release handlers before reconnect static void avatar_hh (guint32 hid, hk_arg_t *args, gpointer userdata) { +#ifdef HOOK_PRE_DISCONNECT + if (hid == HOOK_PRE_DISCONNECT) + avatar_free_reply_handlers (); + else if (hid == HOOK_POST_CONNECT && publish_delayed) { + char *tmp_data = publish_data; + + scr_LogPrint (LPRINT_DEBUG, "avatar: Publishing delayed data."); + + publish_data = NULL; + publish_delayed = FALSE; + + avatar_publish (publish_data, publish_len); + + g_free (tmp_data); + } +#else hk_arg_t *arg; for (arg = args; arg->name; arg++) { @@ -1050,6 +1099,7 @@ return; } } +#endif } const gchar *g_module_check_init (GModule *module) @@ -1058,8 +1108,12 @@ avatar_metadata_reply_handler = lm_message_handler_new (avatar_publish_metadata_reply_handler, NULL, NULL); cmd_add ("avatar", "", COMPL_FILENAME, 0, do_avatar, NULL); - + +#ifdef HOOK_PRE_DISCONNECT + hk_add_handler (avatar_hh, HOOK_PRE_DISCONNECT | HOOK_POST_CONNECT, NULL); +#else hk_add_handler (avatar_hh, HOOK_INTERNAL, NULL); +#endif xmpp_add_feature (NS_AVATAR_METADATA); xmpp_add_feature (NS_AVATAR_METADATA_NOTIFY); @@ -1084,6 +1138,8 @@ lm_message_handler_invalidate (avatar_metadata_reply_handler); lm_message_handler_unref (avatar_metadata_reply_handler); } + + g_free (publish_data); } /* vim: se ts=4 sw=4: */ diff -r 6ed6279de87f -r 9a4d0f04c7d3 config.h --- a/config.h Sun Jan 17 12:04:48 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ - -#ifndef LOCAL_CONFIG_H -#define LOCAL_CONFIG_H - -#define MODULES_ENABLE 1 - -# endif - diff -r 6ed6279de87f -r 9a4d0f04c7d3 config.h.in --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/config.h.in Wed Jan 20 19:39:43 2010 +0200 @@ -0,0 +1,20 @@ + +#ifndef LOCAL_CONFIG_H +#define LOCAL_CONFIG_H + +#cmakedefine HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER + +#cmakedefine HAVE_XMPP_IS_ONLINE + +#ifndef HAVE_XMPP_IS_ONLINE +inline gboolean xmpp_is_online (void) +{ + if (lconnection && lm_connection_is_authenticated (lconnection)) + return TRUE; + else + return FALSE; +} +#endif + +#endif +