jingle-ibb/ibb.c
changeset 124 7773e8147c29
parent 123 58bd57666ef9
child 126 059a6737f6a4
equal deleted inserted replaced
123:58bd57666ef9 124:7773e8147c29
    38 
    38 
    39 #include "ibb.h"
    39 #include "ibb.h"
    40 
    40 
    41 static LmMessageHandler* jingle_ibb_handler = NULL;
    41 static LmMessageHandler* jingle_ibb_handler = NULL;
    42 
    42 
    43 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err);
    43 static gconstpointer check(JingleContent *cn, GError **err);
    44 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2);
    44 static gboolean cmp(gconstpointer data1, gconstpointer data2);
    45 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node);
    45 static void tomessage(gconstpointer data, LmMessageNode *node);
    46 const gchar* jingle_ibb_xmlns(void);
    46 static const gchar* xmlns(void);
    47 gconstpointer jingle_ibb_new(void);
    47 static gconstpointer new(void);
    48 void jingle_ibb_send(session_content *sc, gconstpointer data, gchar *buf, gsize size);
    48 static void send(session_content *sc, gconstpointer data, gchar *buf, gsize size);
    49 void jingle_ibb_end(session_content *sc, gconstpointer data);
    49 static void end(session_content *sc, gconstpointer data);
    50 static void _send_internal(session_content *sc, const gchar *to, gchar *buf,
    50 static void _send_internal(session_content *sc, const gchar *to, gchar *buf,
    51                            gsize size, const gchar *sid, gint64 *seq);
    51                            gsize size, const gchar *sid, gint64 *seq);
    52 
    52 
    53 static void jingle_ibb_init(void);
    53 static void jingle_ibb_init(void);
    54 static void jingle_ibb_uninit(void);
    54 static void jingle_ibb_uninit(void);
    57 static guint disconn_hid = 0;
    57 static guint disconn_hid = 0;
    58 
    58 
    59 const gchar *deps[] = { "jingle", NULL };
    59 const gchar *deps[] = { "jingle", NULL };
    60 
    60 
    61 static JingleTransportFuncs funcs = {
    61 static JingleTransportFuncs funcs = {
    62   jingle_ibb_xmlns,
    62   .xmlns     = xmlns,
    63   jingle_ibb_check,
    63   .check     = check,
    64   jingle_ibb_tomessage,
    64   .tomessage = tomessage,
    65   jingle_ibb_cmp,
    65   .cmp       = cmp,
    66   jingle_ibb_new,
    66   .new       = new,
    67   jingle_ibb_send,
    67   .send      = send,
    68   jingle_ibb_end
    68   .end       = end
    69 };
    69 };
    70 
    70 
    71 module_info_t  info_jingle_inbandbytestream = {
    71 module_info_t  info_jingle_inbandbytestream = {
    72   .branch          = MCABBER_BRANCH,
    72   .branch          = MCABBER_BRANCH,
    73   .api             = MCABBER_API_VERSION,
    73   .api             = MCABBER_API_VERSION,
    78   .uninit          = jingle_ibb_uninit,
    78   .uninit          = jingle_ibb_uninit,
    79   .next            = NULL,
    79   .next            = NULL,
    80 };
    80 };
    81 
    81 
    82 
    82 
    83 const gchar* jingle_ibb_xmlns(void)
    83 static const gchar* xmlns(void)
    84 {
    84 {
    85   return NS_JINGLE_TRANSPORT_IBB;
    85   return NS_JINGLE_TRANSPORT_IBB;
    86 }
    86 }
    87 
    87 
    88 gconstpointer jingle_ibb_check(JingleContent *cn, GError **err)
    88 static gconstpointer check(JingleContent *cn, GError **err)
    89 {
    89 {
    90   JingleIBB *ibb = NULL;
    90   JingleIBB *ibb = NULL;
    91   LmMessageNode *node = cn->transport;
    91   LmMessageNode *node = cn->transport;
    92   const gchar *blocksize;
    92   const gchar *blocksize;
    93 
    93 
   153   
   153   
   154   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   154   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   155 }
   155 }
   156 
   156 
   157 
   157 
   158 gboolean jingle_ibb_cmp(gconstpointer data1, gconstpointer data2)
   158 static gboolean cmp(gconstpointer data1, gconstpointer data2)
   159 {
   159 {
   160   const JingleIBB *ibb1 = data1, *ibb2 = data2;
   160   const JingleIBB *ibb1 = data1, *ibb2 = data2;
   161   if(g_strcmp0(ibb1->sid, ibb2->sid))
   161   if(g_strcmp0(ibb1->sid, ibb2->sid))
   162     return FALSE;
   162     return FALSE;
   163   return TRUE;
   163   return TRUE;
   175   sid[6] = '\0';
   175   sid[6] = '\0';
   176   
   176   
   177   return sid;
   177   return sid;
   178 }
   178 }
   179 
   179 
   180 gconstpointer jingle_ibb_new(void)
   180 static gconstpointer new(void)
   181 {
   181 {
   182   JingleIBB *ibb = g_new0(JingleIBB, 1);
   182   JingleIBB *ibb = g_new0(JingleIBB, 1);
   183   ibb->blocksize = IBB_BLOCK_SIZE_MAX;
   183   ibb->blocksize = IBB_BLOCK_SIZE_MAX;
   184   ibb->sid = new_ibb_sid();
   184   ibb->sid = new_ibb_sid();
   185   ibb->seq = 0;
   185   ibb->seq = 0;
   193   if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq == ibb2->seq + 1)
   193   if(!g_strcmp0(ibb1->sid, ibb2->sid) && ibb1->seq == ibb2->seq + 1)
   194     return 0;
   194     return 0;
   195   return 1;
   195   return 1;
   196 }
   196 }
   197 
   197 
   198 void jingle_ibb_tomessage(gconstpointer data, LmMessageNode *node)
   198 static void tomessage(gconstpointer data, LmMessageNode *node)
   199 {
   199 {
   200   JingleIBB *jibb = (JingleIBB*) data;
   200   JingleIBB *jibb = (JingleIBB*) data;
   201   gchar *bsize = g_strdup_printf("%i", jibb->blocksize);
   201   gchar *bsize = g_strdup_printf("%i", jibb->blocksize);
   202 
   202 
   203   if (lm_message_node_get_child(node, "transport") != NULL)
   203   if (lm_message_node_get_child(node, "transport") != NULL)
   214 
   214 
   215 static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data)
   215 static void jingle_ibb_handle_ack_iq_send(LmMessage *mess, gpointer data)
   216 {
   216 {
   217   // TODO: check the sub type (error ??)
   217   // TODO: check the sub type (error ??)
   218   session_content *sc = (session_content *)data;
   218   session_content *sc = (session_content *)data;
       
   219   
   219   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   220   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
       
   221   
       
   222   // If there is no more session, maybe it's finish
       
   223   if (sess == NULL)
       
   224     return;
       
   225   
   220   SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
   226   SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
   221 
   227 
   222   JingleIBB *jibb = (JingleIBB *)sc2->transport;
   228   JingleIBB *jibb = (JingleIBB *)sc2->transport;
   223 
   229 
   224   // We look if there is enough data staying
   230   // We look if there is enough data staying
   225   if (jibb->dataleft > jibb->blocksize) {
   231   if (jibb->dataleft > jibb->blocksize) {
   226     gchar *buf = g_memdup(jibb->buf, jibb->blocksize);
   232     gchar *buf = g_memdup(jibb->buf, jibb->blocksize);
   227     jibb->dataleft-=jibb->blocksize;
   233     jibb->dataleft-=jibb->blocksize;
   228     g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft);
   234     g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft);
   229     _send_internal(sc, sess->to, buf, jibb->blocksize, sess->sid, &jibb->seq);
   235     _send_internal(sc, sess->to, buf, jibb->blocksize, jibb->sid, &jibb->seq);
   230     g_free(buf);
   236     g_free(buf);
   231   } else { // ask for more data
   237   } else { // ask for more data
   232     handle_trans_next(sc);
   238     handle_trans_next(sc);
   233   }
   239   }
   234 }
   240 }
   264   
   270   
   265   g_free(base64);
   271   g_free(base64);
   266   g_free(strseq);
   272   g_free(strseq);
   267 }
   273 }
   268 
   274 
   269 void jingle_ibb_send(session_content *sc, gconstpointer data, gchar *buf,
   275 static void send(session_content *sc, gconstpointer data, gchar *buf,
   270                      gsize size)
   276                      gsize size)
   271 {
   277 {
   272   JingleIBB *jibb = (JingleIBB*)data;
   278   JingleIBB *jibb = (JingleIBB*)data;
   273   
   279   
   274   if (jibb->size_buf >= size + jibb->dataleft) {
   280   if (jibb->size_buf >= size + jibb->dataleft) {
   295   
   301   
   296     jibb->dataleft-=jibb->blocksize;
   302     jibb->dataleft-=jibb->blocksize;
   297   
   303   
   298     g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft);
   304     g_memmove(jibb->buf, jibb->buf+jibb->blocksize, jibb->dataleft);
   299   
   305   
   300     _send_internal(sc, sess->to, buffer, jibb->blocksize, sess->sid,
   306     _send_internal(sc, sess->to, buffer, jibb->blocksize, jibb->sid,
   301                    &jibb->seq);
   307                    &jibb->seq);
   302   
   308   
   303     g_free(buf);
   309     g_free(buffer);
   304   }
   310   }
   305 }
   311 }
   306 
   312 
   307 void jingle_ibb_end(session_content *sc, gconstpointer data)
   313 static void end(session_content *sc, gconstpointer data)
   308 {
   314 {
   309   JingleIBB *jibb = (JingleIBB*)data;
   315   JingleIBB *jibb = (JingleIBB*)data;
   310   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   316   JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
   311   
   317   
   312   if (jibb->dataleft > 0) {
   318   if (jibb->dataleft > 0) {
   313     _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, sess->sid,
   319     _send_internal(sc, sess->to, jibb->buf, jibb->dataleft, jibb->sid,
   314                    &jibb->seq);
   320                    &jibb->seq);
   315   }
   321   }
   316   
   322   
   317   g_free(jibb->buf);
   323   g_free(jibb->buf);
   318 }
   324 }