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 |
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. |