about summary refs log tree commit diff stats
path: root/src/xmpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/message.c12
-rw-r--r--src/xmpp/stanza.c58
-rw-r--r--src/xmpp/stanza.h7
-rw-r--r--src/xmpp/xmpp.h1
4 files changed, 77 insertions, 1 deletions
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index ab899407..064e7b29 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -1560,3 +1560,15 @@ _openpgp_signcrypt(xmpp_ctx_t* ctx, const char* const to, const char* const text
     return signcrypt;
 }
 #endif // HAVE_LIBGPGME
+
+void
+message_request_voice(const char* const roomjid)
+{
+    xmpp_ctx_t* const ctx = connection_get_ctx();
+    xmpp_stanza_t* stanza = stanza_request_voice(ctx, roomjid);
+
+    log_debug("Requesting voice in %s", roomjid);
+
+    _send_message_stanza(stanza);
+    xmpp_stanza_release(stanza);
+}
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index 86bd0d91..3ce2c88a 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -2755,3 +2755,61 @@ stanza_change_password(xmpp_ctx_t* ctx, const char* const user, const char* cons
 
     return iq;
 }
+
+xmpp_stanza_t*
+stanza_request_voice(xmpp_ctx_t* ctx, const char* const room)
+{
+    char* id = connection_create_stanza_id();
+    xmpp_stanza_t* message = xmpp_message_new(ctx, NULL, room, id);
+    free(id);
+
+    xmpp_stanza_t* request_voice_st = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(request_voice_st, STANZA_NAME_X);
+    xmpp_stanza_set_type(request_voice_st, STANZA_TYPE_SUBMIT);
+    xmpp_stanza_set_ns(request_voice_st, STANZA_NS_DATA);
+
+    xmpp_stanza_t* form_type = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(form_type, STANZA_NAME_FIELD);
+    xmpp_stanza_set_attribute(form_type, STANZA_ATTR_VAR, "FORM_TYPE");
+
+    xmpp_stanza_t* value_request = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(value_request, STANZA_NAME_VALUE);
+
+    xmpp_stanza_t* request_text = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_text(request_text, STANZA_NS_VOICEREQUEST);
+
+    xmpp_stanza_add_child(value_request, request_text);
+    xmpp_stanza_release(request_text);
+
+    xmpp_stanza_add_child(form_type, value_request);
+    xmpp_stanza_release(value_request);
+
+    xmpp_stanza_add_child(request_voice_st, form_type);
+    xmpp_stanza_release(form_type);
+
+    xmpp_stanza_t* request_role = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(request_role, STANZA_NAME_FIELD);
+    xmpp_stanza_set_attribute(request_role, STANZA_ATTR_VAR, "muc#role");
+    xmpp_stanza_set_attribute(request_role, STANZA_ATTR_TYPE, "list-single");
+    xmpp_stanza_set_attribute(request_role, STANZA_ATTR_LABEL, "Requested role");
+
+    xmpp_stanza_t* value_role = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(value_role, STANZA_NAME_VALUE);
+
+    xmpp_stanza_t* role_text = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_text(role_text, "participant");
+
+    xmpp_stanza_add_child(value_role, role_text);
+    xmpp_stanza_release(role_text);
+
+    xmpp_stanza_add_child(request_role, value_role);
+    xmpp_stanza_release(value_role);
+
+    xmpp_stanza_add_child(request_voice_st, request_role);
+    xmpp_stanza_release(request_role);
+
+    xmpp_stanza_add_child(message, request_voice_st);
+    xmpp_stanza_release(request_voice_st);
+
+    return message;
+}
diff --git a/src/xmpp/stanza.h b/src/xmpp/stanza.h
index 35f38055..3600fb0b 100644
--- a/src/xmpp/stanza.h
+++ b/src/xmpp/stanza.h
@@ -158,6 +158,7 @@
 #define STANZA_TYPE_SET          "set"
 #define STANZA_TYPE_ERROR        "error"
 #define STANZA_TYPE_RESULT       "result"
+#define STANZA_TYPE_SUBMIT       "submit"
 
 #define STANZA_ATTR_TO             "to"
 #define STANZA_ATTR_FROM           "from"
@@ -186,6 +187,7 @@
 #define STANZA_ATTR_FILENAME       "filename"
 #define STANZA_ATTR_SIZE           "size"
 #define STANZA_ATTR_CONTENTTYPE    "content-type"
+#define STANZA_ATTR_LABEL          "label"
 
 #define STANZA_TEXT_AWAY   "away"
 #define STANZA_TEXT_DND    "dnd"
@@ -233,6 +235,7 @@
 #define STANZA_NS_EXT_GAJIM_BOOKMARKS     "xmpp:gajim.org/bookmarks"
 #define STANZA_NS_RSM                     "http://jabber.org/protocol/rsm"
 #define STANZA_NS_REGISTER                "jabber:iq:register"
+#define STANZA_NS_VOICEREQUEST            "http://jabber.org/protocol/muc#request"
 
 #define STANZA_DATAFORM_SOFTWARE "urn:xmpp:dataforms:softwareinfo"
 
@@ -338,7 +341,6 @@ xmpp_stanza_t* stanza_create_command_config_submit_iq(xmpp_ctx_t* ctx, const cha
 void stanza_attach_publish_options_va(xmpp_ctx_t* const ctx, xmpp_stanza_t* const iq, int count, ...);
 void stanza_attach_publish_options(xmpp_ctx_t* const ctx, xmpp_stanza_t* const iq, const char* const option, const char* const value);
 
-
 xmpp_stanza_t* stanza_create_omemo_devicelist_request(xmpp_ctx_t* ctx, const char* const id, const char* const jid);
 xmpp_stanza_t* stanza_create_omemo_devicelist_subscribe(xmpp_ctx_t* ctx, const char* const jid);
 xmpp_stanza_t* stanza_create_omemo_devicelist_publish(xmpp_ctx_t* ctx, GList* const ids);
@@ -396,4 +398,7 @@ xmpp_stanza_t* stanza_create_mam_iq(xmpp_ctx_t* ctx, const char* const jid, cons
 
 xmpp_stanza_t* stanza_change_password(xmpp_ctx_t* ctx, const char* const user, const char* const password);
 
+xmpp_stanza_t*
+stanza_request_voice(xmpp_ctx_t* ctx, const char* const room);
+
 #endif
diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h
index d4d32836..5f4efece 100644
--- a/src/xmpp/xmpp.h
+++ b/src/xmpp/xmpp.h
@@ -214,6 +214,7 @@ void message_send_composing(const char* const jid);
 void message_send_paused(const char* const jid);
 void message_send_gone(const char* const jid);
 void message_send_invite(const char* const room, const char* const contact, const char* const reason);
+void message_request_voice(const char* const roomjid);
 
 bool message_is_sent_by_us(const ProfMessage* const message, bool checkOID);