mcabber/mcabber/xmpp.c
changeset 2213 0c78d31c753d
parent 2212 778280b01bcb
child 2230 f5659f0f9db8
equal deleted inserted replaced
2212:778280b01bcb 2213:0c78d31c753d
   297   }
   297   }
   298   g_slist_free(resources);
   298   g_slist_free(resources);
   299 }
   299 }
   300 
   300 
   301 //  xmpp_send_msg(jid, text, type, subject,
   301 //  xmpp_send_msg(jid, text, type, subject,
   302 //                otrinject, *encrypted, type_overwrite)
   302 //                otrinject, *encrypted, type_overwrite, *xep184)
   303 // When encrypted is not NULL, the function set *encrypted to 1 if the
   303 // When encrypted is not NULL, the function set *encrypted to 1 if the
   304 // message has been PGP-encrypted.  If encryption enforcement is set and
   304 // message has been PGP (or OTR) -encrypted.  If encryption enforcement is set
   305 // encryption fails, *encrypted is set to -1.
   305 // and encryption fails, *encrypted is set to -1.
       
   306 // otrinject should be set to FALSE (unless the message already has an OTR
       
   307 // payload, i.e. if the function is called from an otr.c routine).
   306 void xmpp_send_msg(const char *fjid, const char *text, int type,
   308 void xmpp_send_msg(const char *fjid, const char *text, int type,
   307                    const char *subject, gboolean otrinject, gint *encrypted,
   309                    const char *subject, gboolean otrinject, gint *encrypted,
   308                    LmMessageSubType type_overwrite, gpointer *xep184)
   310                    LmMessageSubType type_overwrite, gpointer *xep184)
   309 {
   311 {
   310   LmMessage *x;
   312   LmMessage *x;
   311   LmMessageSubType subtype;
   313   LmMessageSubType subtype;
   312 #ifdef HAVE_LIBOTR
   314 #ifdef HAVE_LIBOTR
   313   int otr_msg = 0;
   315   int otr_msg = 0;
       
   316   char *otr_msg_string = NULL;
   314 #endif
   317 #endif
   315   char *barejid;
   318   char *barejid;
   316 #if defined HAVE_GPGME || defined XEP0085
   319 #if defined HAVE_GPGME || defined XEP0085
   317   char *rname;
   320   char *rname;
   318   GSList *sl_buddy;
   321   GSList *sl_buddy;
   352     rname++;
   355     rname++;
   353 
   356 
   354 #ifdef HAVE_LIBOTR
   357 #ifdef HAVE_LIBOTR
   355   if (otr_enabled() && !otrinject) {
   358   if (otr_enabled() && !otrinject) {
   356     if (type == ROSTER_TYPE_USER) {
   359     if (type == ROSTER_TYPE_USER) {
   357       otr_msg = otr_send((char **)&text, barejid);
   360       otr_msg_string = otr_send(text, barejid, &otr_msg);
   358       if (!text) {
   361       if (!otr_msg_string) {
   359         g_free(barejid);
       
   360         if (encrypted)
   362         if (encrypted)
   361           *encrypted = -1;
   363           *encrypted = -1;
   362         return;
   364         goto xmpp_send_msg_return;
   363       }
   365       }
       
   366       text = otr_msg_string;
   364     }
   367     }
   365     if (otr_msg && encrypted)
   368     if (otr_msg && encrypted)
   366       *encrypted = ENCRYPTED_OTR;
   369       *encrypted = ENCRYPTED_OTR;
   367   }
   370   }
   368 #endif
   371 #endif
   392           enc = gpg_encrypt(text, keys, nkeys);
   395           enc = gpg_encrypt(text, keys, nkeys);
   393         }
   396         }
   394         if (!enc && force) {
   397         if (!enc && force) {
   395           if (encrypted)
   398           if (encrypted)
   396             *encrypted = -1;
   399             *encrypted = -1;
   397           g_free(barejid);
   400           goto xmpp_send_msg_return;
   398           return;
       
   399         }
   401         }
   400       }
   402       }
   401     }
   403     }
   402   }
   404   }
   403 #endif // HAVE_GPGME
   405 #endif // HAVE_GPGME
   434     lm_message_node_set_attribute(lm_message_node_add_child(x->node, "request",
   436     lm_message_node_set_attribute(lm_message_node_add_child(x->node, "request",
   435                                                             NULL),
   437                                                             NULL),
   436                                   "xmlns", NS_RECEIPTS);
   438                                   "xmlns", NS_RECEIPTS);
   437     *xep184 = g_strdup(lm_message_get_id(x));
   439     *xep184 = g_strdup(lm_message_get_id(x));
   438   }
   440   }
   439   g_free(barejid);
       
   440 
   441 
   441 #ifdef XEP0085
   442 #ifdef XEP0085
   442   // If typing notifications are disabled, we can skip all this stuff...
   443   // If typing notifications are disabled, we can skip all this stuff...
   443   if (chatstates_disabled || type == ROSTER_TYPE_ROOM)
   444   if (chatstates_disabled || type == ROSTER_TYPE_ROOM)
   444     goto xmpp_send_msg_no_chatstates;
   445     goto xmpp_send_msg_no_chatstates;
   468   if (mystatus != invisible)
   469   if (mystatus != invisible)
   469 #endif
   470 #endif
   470     update_last_use();
   471     update_last_use();
   471   lm_connection_send(lconnection, x, NULL);
   472   lm_connection_send(lconnection, x, NULL);
   472   lm_message_unref(x);
   473   lm_message_unref(x);
       
   474 
       
   475 xmpp_send_msg_return:
       
   476 #ifdef HAVE_LIBOTR
       
   477   g_free(otr_msg_string);
       
   478 #endif
       
   479   g_free(barejid);
   473 }
   480 }
   474 
   481 
   475 #ifdef XEP0085
   482 #ifdef XEP0085
   476 //  xmpp_send_xep85_chatstate()
   483 //  xmpp_send_xep85_chatstate()
   477 // Send a XEP-85 chatstate.
   484 // Send a XEP-85 chatstate.