jingle/send.c
changeset 129 2d5c3efda92a
parent 128 cded9f40039e
child 148 cb40539b88b7
equal deleted inserted replaced
128:cded9f40039e 129:2d5c3efda92a
    58   lm_connection_send_with_reply(lconnection, r,
    58   lm_connection_send_with_reply(lconnection, r,
    59                                 jingle_new_ack_handler(ackhandle), NULL);
    59                                 jingle_new_ack_handler(ackhandle), NULL);
    60   lm_message_unref(r);
    60   lm_message_unref(r);
    61 }
    61 }
    62 
    62 
    63 static void jingle_handle_ack_iq_sa(LmMessage *mess, gpointer data)
    63 static void jingle_handle_ack_iq_sa(JingleAckType acktype, LmMessage *mess,
       
    64                                     gpointer data)
    64 {
    65 {
    65   LmMessageNode *node;
    66   LmMessageNode *node;
    66   const gchar *type, *cause;
    67   const gchar *type, *cause;
    67   GSList *child = NULL;
    68   GSList *child = NULL;
    68   JingleSession *sess = (JingleSession*)data;
    69   JingleSession *sess = (JingleSession*)data;
    69   SessionContent *sc;
    70   SessionContent *sc;
    70   
    71 
       
    72   if (acktype == JINGLE_ACK_TIMEOUT) {
       
    73     // TODO: handle ack timeout...
       
    74     scr_LogPrint(LPRINT_LOGNORM, "Jingle: session-accept %s: %s", type, cause);
       
    75     session_delete(sess);
       
    76     return;
       
    77   }
       
    78 
    71   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) {
    79   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT) {
    72     return;
    80     return;
    73   }
    81   }
    74   
    82 
    75   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) {
    83   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) {
    76     node = lm_message_get_node(mess);
    84     node = lm_message_get_node(mess);
    77     node = lm_message_node_get_child(node,"error");
    85     node = lm_message_node_get_child(node,"error");
    78     type = lm_message_node_get_attribute(node, "type");
    86     type = lm_message_node_get_attribute(node, "type");
    79     if(node->children != NULL)
    87     if(node->children != NULL)
    95  
   103  
    96   if (mess) {
   104   if (mess) {
    97     ackhandle = g_new0(JingleAckHandle, 1);
   105     ackhandle = g_new0(JingleAckHandle, 1);
    98     ackhandle->callback = jingle_handle_ack_iq_sa;
   106     ackhandle->callback = jingle_handle_ack_iq_sa;
    99     ackhandle->user_data = (gpointer)js;
   107     ackhandle->user_data = (gpointer)js;
   100         scr_log_print(LPRINT_DEBUG,
   108     ackhandle->timeout = 60;
   101                   "%s", lm_message_node_to_string(mess->node));lm_connection_send_with_reply(lconnection, mess,
   109     lm_connection_send_with_reply(lconnection, mess,
   102                                   jingle_new_ack_handler(ackhandle), NULL);
   110                                   jingle_new_ack_handler(ackhandle), NULL);
   103     lm_message_unref(mess);
   111     lm_message_unref(mess);
   104   }
   112   }
   105 }
   113 }
   106 
   114 
   107 static void jingle_handle_ack_iq_si(LmMessage *mess, gpointer data)
   115 static void jingle_handle_ack_iq_si(JingleAckType acktype, LmMessage *mess,
       
   116                                     gpointer data)
   108 {
   117 {
   109   LmMessageNode *node;
   118   LmMessageNode *node;
   110   const gchar *type, *cause;
   119   const gchar *type, *cause;
   111   JingleSession *sess = (JingleSession*)data;
   120   JingleSession *sess = (JingleSession*)data;
   112   
   121 
   113   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT)
   122   if (acktype == JINGLE_ACK_TIMEOUT) {
       
   123     // TODO: handle ack timeout...
       
   124     scr_LogPrint(LPRINT_LOGNORM, "Jingle: did not receive the ack in time, aborting");
       
   125     session_delete(sess);
   114     return;
   126     return;
   115   if(lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) {
   127   }
       
   128 
       
   129   if (lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_RESULT)
       
   130     return;
       
   131   if (lm_message_get_sub_type(mess) == LM_MESSAGE_SUB_TYPE_ERROR) {
   116     node = lm_message_get_node(mess);
   132     node = lm_message_get_node(mess);
   117     node = lm_message_node_get_child(node,"error");
   133     node = lm_message_node_get_child(node,"error");
   118     type = lm_message_node_get_attribute(node, "type");
   134     type = lm_message_node_get_attribute(node, "type");
   119     if(node->children != NULL)
   135     if(node->children != NULL)
   120       cause = node->children->name;
   136       cause = node->children->name;
   126 
   142 
   127 void jingle_send_session_initiate(JingleSession *js)
   143 void jingle_send_session_initiate(JingleSession *js)
   128 {
   144 {
   129   JingleAckHandle *ackhandle;
   145   JingleAckHandle *ackhandle;
   130   GSList *listentry;
   146   GSList *listentry;
   131   GError *err;
   147   GError *err = NULL;
   132   gboolean status;
   148   gboolean status;
   133   
   149   
   134   LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE);
   150   LmMessage *mess = lm_message_from_jinglesession(js, JINGLE_SESSION_INITIATE);
   135   lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"),
   151   lm_message_node_set_attribute(lm_message_node_get_child(mess->node, "jingle"),
   136                                 "initiator", js->from);
   152                                 "initiator", js->from);
   137  
   153  
   138   if (mess) {
   154   if (mess) {
   139     ackhandle = g_new0(JingleAckHandle, 1);
   155     ackhandle = g_new0(JingleAckHandle, 1);
   140     ackhandle->callback = jingle_handle_ack_iq_si;
   156     ackhandle->callback = jingle_handle_ack_iq_si;
   141     ackhandle->user_data = (gpointer)js;
   157     ackhandle->user_data = (gpointer)js;
   142     scr_log_print(LPRINT_DEBUG,
   158     ackhandle->timeout = 60;
   143                   "%s", lm_message_node_to_string(mess->node));
       
   144     status = lm_connection_send_with_reply(lconnection, mess,
   159     status = lm_connection_send_with_reply(lconnection, mess,
   145                                        jingle_new_ack_handler(ackhandle), &err);
   160                                        jingle_new_ack_handler(ackhandle), &err);
   146     // TODO: delete the ack_handler
   161     // TODO: delete the ack_handler
   147     if (status == FALSE || err != NULL) {
   162     if (status == FALSE || err != NULL) {
   148       scr_LogPrint(LPRINT_LOGNORM, "Jingle: %s: try again", err->message);
   163       scr_LogPrint(LPRINT_LOGNORM, "Jingle: %s: try again", err->message);