jingle-ibb/ibb.c
changeset 105 c31988e107b3
parent 104 060e69633902
child 106 2942c71f434a
equal deleted inserted replaced
104:060e69633902 105:c31988e107b3
    24 #include <glib.h>
    24 #include <glib.h>
    25 
    25 
    26 #include <mcabber/modules.h>
    26 #include <mcabber/modules.h>
    27 #include <mcabber/utils.h>
    27 #include <mcabber/utils.h>
    28 #include <mcabber/xmpp_helper.h>
    28 #include <mcabber/xmpp_helper.h>
       
    29 #include <mcabber/logprint.h>
    29 
    30 
    30 #include <jingle/jingle.h>
    31 #include <jingle/jingle.h>
    31 #include <jingle/check.h>
    32 #include <jingle/check.h>
    32 #include <jingle/register.h>
    33 #include <jingle/register.h>
    33 
    34 
    38 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err);
    39 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err);
    39 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2);
    40 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2);
    40 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node);
    41 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node);
    41 const gchar* jingle_ibb_xmlns(void);
    42 const gchar* jingle_ibb_xmlns(void);
    42 gconstpointer jingle_ibb_new(void);
    43 gconstpointer jingle_ibb_new(void);
       
    44 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size);
    43 
    45 
    44 static void jingle_ibb_init(void);
    46 static void jingle_ibb_init(void);
    45 static void jingle_ibb_uninit(void);
    47 static void jingle_ibb_uninit(void);
    46 
    48 
    47 
    49 
    50 static JingleTransportFuncs funcs = {
    52 static JingleTransportFuncs funcs = {
    51   jingle_ibb_xmlns,
    53   jingle_ibb_xmlns,
    52   jingle_ibb_check,
    54   jingle_ibb_check,
    53   jingle_ibb_tomessage,
    55   jingle_ibb_tomessage,
    54   jingle_ibb_cmp,
    56   jingle_ibb_cmp,
    55   jingle_ibb_new
    57   jingle_ibb_new,
       
    58   jingle_ibb_send
    56 };
    59 };
    57 
    60 
    58 module_info_t  info_jingle_inbandbytestream = {
    61 module_info_t  info_jingle_inbandbytestream = {
    59   .branch          = MCABBER_BRANCH,
    62   .branch          = MCABBER_BRANCH,
    60   .api             = MCABBER_API_VERSION,
    63   .api             = MCABBER_API_VERSION,
   106 LmHandlerResult jingle_ibb_handle_iq(LmMessageHandler *handler,
   109 LmHandlerResult jingle_ibb_handle_iq(LmMessageHandler *handler,
   107                                  LmConnection *connection, LmMessage *message,
   110                                  LmConnection *connection, LmMessage *message,
   108                                  gpointer user_data)
   111                                  gpointer user_data)
   109 {
   112 {
   110   const gchar *data64;
   113   const gchar *data64;
   111   JingleIBB *ibb = g_new0(JingleIBB, 1);
   114   JingleIBB *jibb = g_new0(JingleIBB, 1);
   112   gsize len;
   115   gsize len;
   113   guchar *data;
   116   guchar *data;
   114   
   117   
   115   LmMessageSubType iqtype = lm_message_get_sub_type(message);
   118   LmMessageSubType iqtype = lm_message_get_sub_type(message);
   116   if (iqtype != LM_MESSAGE_SUB_TYPE_SET)
   119   if (iqtype != LM_MESSAGE_SUB_TYPE_SET)
   126                 NS_TRANSPORT_IBB))
   129                 NS_TRANSPORT_IBB))
   127     return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   130     return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   128 
   131 
   129   jingle_ack_iq(message);
   132   jingle_ack_iq(message);
   130   
   133   
   131   ibb->sid = lm_message_node_get_attribute(dnode, "sid");
   134   jibb->sid = lm_message_node_get_attribute(dnode, "sid");
   132   ibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10);
   135   jibb->seq = g_ascii_strtoll(lm_message_node_get_attribute(dnode, "seq"), NULL, 10);
   133   
   136   
   134   data64 = lm_message_node_get_value(dnode);
   137   data64 = lm_message_node_get_value(dnode);
   135   
   138   
   136   data = g_base64_decode(data64, &len);
   139   data = g_base64_decode(data64, &len);
   137   
   140   
   138   handle_trans_data(NS_JINGLE_TRANSPORT_IBB, ibb, (const gchar *)data, (guint)len);
   141   handle_trans_data(NS_JINGLE_TRANSPORT_IBB, jibb, (const gchar *)data, (guint)len);
   139   
   142   
   140   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   143   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   141 }
   144 }
   142 
   145 
   143 
   146 
   207 
   210 
   208 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size)
   211 void jingle_ibb_send(const gchar *to, gconstpointer data, gchar *buf, gsize size)
   209 {
   212 {
   210   JingleIBB *jibb = (JingleIBB*)data;
   213   JingleIBB *jibb = (JingleIBB*)data;
   211   JingleAckHandle *ackhandle;
   214   JingleAckHandle *ackhandle;
   212   gchar* base64 = g_base64_encode((const guchar *)data, size);
   215   gchar *base64 = g_base64_encode((const guchar *)data, size);
       
   216   gchar *seq = g_strdup_printf("%" G_GINT64_FORMAT, jibb->seq);
   213   
   217   
   214   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
   218   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
   215   LmMessageNode *node = lm_message_get_node(r);
   219   LmMessageNode *node = lm_message_get_node(r);
   216   lm_message_node_add_child(node, "data", NULL);
   220   lm_message_node_add_child(node, "data", NULL);
   217   node = lm_message_node_get_child(node, "data");
   221   node = lm_message_node_get_child(node, "data");
   218   lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", jibb->seq, NULL);
   222   lm_message_node_set_attributes(node, "xmlns", NS_TRANSPORT_IBB, "sid", jibb->sid, "seq", seq, NULL);
   219   lm_message_node_set_value(node, base64);
   223   lm_message_node_set_value(node, base64);
   220   
   224   
   221   ackhandle = g_new0(JingleAckHandle, 1);
   225   ackhandle = g_new0(JingleAckHandle, 1);
   222   ackhandle->callback = jingle_ibb_handle_ack_iq_send;
   226   ackhandle->callback = jingle_ibb_handle_ack_iq_send;
   223   ackhandle->user_data = NULL;
   227   ackhandle->user_data = NULL;
   224   
   228   scr_log_print(LPRINT_DEBUG, "%s", lm_message_node_to_string(r->node));
   225   lm_connection_send_with_reply(lconnection, r,
   229   lm_connection_send_with_reply(lconnection, r,
   226                                 jingle_new_ack_handler(ackhandle), NULL);
   230                                 jingle_new_ack_handler(ackhandle), NULL);
   227   lm_message_unref(r);
   231   lm_message_unref(r);
   228   
   232   
   229   // The next packet will be seq++
   233   // The next packet will be seq++