jingle/send.c
changeset 48 3c08b78be871
parent 47 964b3ebeba8d
child 49 8dddfbe488b6
equal deleted inserted replaced
47:964b3ebeba8d 48:3c08b78be871
    26 #include <mcabber/xmpp_defines.h>
    26 #include <mcabber/xmpp_defines.h>
    27 
    27 
    28 #include <jingle/jingle.h>
    28 #include <jingle/jingle.h>
    29 #include <jingle/sessions.h>
    29 #include <jingle/sessions.h>
    30 #include <jingle/send.h>
    30 #include <jingle/send.h>
       
    31 #include <jingle/general-handlers.h>
    31 
    32 
    32 extern LmMessageHandler* jingle_ack_iq_handler;
    33 extern LmMessageHandler* jingle_ack_iq_handler;
    33 
    34 
    34 void jingle_send_session_terminate(JingleNode *jn, const gchar *reason)
    35 void jingle_send_session_terminate(JingleNode *jn, const gchar *reason)
    35 {
    36 {
    36   LmMessage *r;
    37   LmMessage *r;
    37   LmMessageNode *err;
    38   LmMessageNode *err;
    38   JingleNode *reply = g_new0(JingleNode, 1);
    39   JingleNode *reply = g_new0(JingleNode, 1);
       
    40   ack_iq *elem;
    39 
    41 
    40   reply->action = JINGLE_SESSION_TERMINATE;
    42   reply->action = JINGLE_SESSION_TERMINATE;
    41   reply->sid = jn->sid;
    43   reply->sid = jn->sid;
    42 
    44 
    43   r = lm_message_from_jinglenode(reply, lm_message_get_from(jn->message));
    45   r = lm_message_from_jinglenode(reply, lm_message_get_from(jn->message));
    47     err = lm_message_node_add_child(r->node, "reason", NULL);
    49     err = lm_message_node_add_child(r->node, "reason", NULL);
    48     lm_message_node_add_child(err, reason, NULL);
    50     lm_message_node_add_child(err, reason, NULL);
    49   }
    51   }
    50 
    52 
    51   if (r) {
    53   if (r) {
    52     lm_connection_send(lconnection, r, NULL);
    54     elem->id = g_strdup(lm_message_get_id(r));
       
    55     elem->callback = NULL;
       
    56     elem->udata = NULL;
       
    57     add_ack_wait(elem);
       
    58 
       
    59     lm_connection_send_with_reply(lconnection, r, jingle_ack_iq_handler, NULL);
    53     lm_message_unref(r);
    60     lm_message_unref(r);
    54   }
    61   }
    55 }
    62 }
    56 
    63 
    57 void jingle_send_session_accept(JingleNode *jn)
    64 void jingle_send_session_accept(JingleNode *jn)
    63   JingleAppFuncs *appfuncs;
    70   JingleAppFuncs *appfuncs;
    64   JingleTransportFuncs *transfuncs;
    71   JingleTransportFuncs *transfuncs;
    65   gconstpointer description, transport;
    72   gconstpointer description, transport;
    66   const gchar *xmlns;
    73   const gchar *xmlns;
    67   GError *err = NULL;
    74   GError *err = NULL;
    68 
    75   ack_iq *elem;
       
    76  
    69   accept.action = JINGLE_SESSION_ACCEPT;
    77   accept.action = JINGLE_SESSION_ACCEPT;
    70   accept.responder = g_strdup_printf("%s/%s",
    78   accept.responder = g_strdup_printf("%s/%s",
    71                                      lm_connection_get_jid(lconnection),
    79                                      lm_connection_get_jid(lconnection),
    72                                      settings_opt_get("resource"));
    80                                      settings_opt_get("resource"));
    73   accept.sid = jn->sid;
    81   accept.sid = jn->sid;
    82     appfuncs = jingle_get_appfuncs(xmlns);
    90     appfuncs = jingle_get_appfuncs(xmlns);
    83     if (appfuncs == NULL) continue;
    91     if (appfuncs == NULL) continue;
    84 
    92 
    85     xmlns = lm_message_node_get_attribute(cn->transport, "xmlns");
    93     xmlns = lm_message_node_get_attribute(cn->transport, "xmlns");
    86     transfuncs = jingle_get_transportfuncs(xmlns);
    94     transfuncs = jingle_get_transportfuncs(xmlns);
    87     if (appfuncs == NULL) continue; // negociate another transport ?
    95     if (appfuncs == NULL) continue;
    88 
    96 
    89     description = appfuncs->check(cn, &err);
    97     description = appfuncs->check(cn, &err);
    90     if (description == NULL || err != NULL) continue;
    98     if (description == NULL || err != NULL) continue;
    91     transport = transfuncs->check(cn, &err);
    99     transport = transfuncs->check(cn, &err);
    92     if (transport == NULL || err != NULL) continue;
   100     if (transport == NULL || err != NULL) continue;
   103 
   111 
   104   if (g_slist_length(accept.content) <= 0) return;
   112   if (g_slist_length(accept.content) <= 0) return;
   105 
   113 
   106   accept.message = lm_message_from_jinglenode(&accept, lm_message_get_from(jn->message));
   114   accept.message = lm_message_from_jinglenode(&accept, lm_message_get_from(jn->message));
   107   if (accept.message) {
   115   if (accept.message) {
       
   116 	 elem->id = g_strdup(lm_message_get_id(accept.message));
       
   117     elem->callback = NULL;
       
   118     elem->udata = NULL;
       
   119     add_ack_wait(elem);
   108     lm_connection_send_with_reply(lconnection, accept.message,
   120     lm_connection_send_with_reply(lconnection, accept.message,
   109                                   jingle_ack_iq_handler, &err);
   121                                   jingle_ack_iq_handler, &err);
   110     lm_message_unref(accept.message);
   122     lm_message_unref(accept.message);
   111   }
   123   }
   112 }
   124 }