summaryrefslogtreecommitdiff
path: root/clib/sendxmpp.c
diff options
context:
space:
mode:
Diffstat (limited to 'clib/sendxmpp.c')
-rw-r--r--clib/sendxmpp.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/clib/sendxmpp.c b/clib/sendxmpp.c
new file mode 100644
index 0000000..3f06202
--- /dev/null
+++ b/clib/sendxmpp.c
@@ -0,0 +1,88 @@
+#include <strophe.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+struct message {
+ const char * to;
+ const char * message;
+};
+
+static void xmpp_send_message(xmpp_conn_t *conn, struct message * const msg) {
+ xmpp_stanza_t *x_msg, *x_body, *x_text;
+ xmpp_ctx_t *ctx = xmpp_conn_get_context(conn);
+
+ x_msg = xmpp_stanza_new(ctx);
+ xmpp_stanza_set_name(x_msg, "message");
+ xmpp_stanza_set_type(x_msg, "chat");
+ xmpp_stanza_set_attribute(x_msg, "to", msg->to);
+
+ x_body = xmpp_stanza_new(ctx);
+ xmpp_stanza_set_name(x_body, "body");
+
+ x_text = xmpp_stanza_new(ctx);
+ xmpp_stanza_set_text(x_text, msg->message);
+ xmpp_stanza_add_child(x_body, x_text);
+ xmpp_stanza_add_child(x_msg, x_body);
+
+ xmpp_send(conn, x_msg);
+ xmpp_stanza_release(x_msg);
+}
+
+static void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status,
+ const int error, xmpp_stream_error_t * const stream_error,
+ void * const userdata) {
+ if (status == XMPP_CONN_CONNECT) {
+ fprintf(stderr, "DEBUG: connected\n");
+ xmpp_send_message(conn, (struct message*) userdata);
+ xmpp_disconnect(conn);
+ } else {
+ xmpp_ctx_t * ctx = xmpp_conn_get_context(conn);
+ fprintf(stderr, "DEBUG: disconnected\n");
+ xmpp_stop(ctx);
+ }
+}
+
+void send_message(const char * jid,
+ const char * password,
+ const char * message,
+ const char * to) {
+ xmpp_conn_t *conn;
+ xmpp_log_t *log;
+ xmpp_ctx_t * ctx;
+ struct message * const msg = (struct message *)alloca(sizeof(struct message));
+ msg->to = to;
+ msg->message = message;
+
+ long flags = XMPP_CONN_FLAG_MANDATORY_TLS;
+
+ /* init library */
+ xmpp_initialize();
+
+ /* create a context */
+ log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); /* pass NULL instead to silence output */
+ ctx = xmpp_ctx_new(NULL, log);
+
+ /* create a connection */
+ conn = xmpp_conn_new(ctx);
+
+ /* configure connection properties (optional) */
+ xmpp_conn_set_flags(conn, flags);
+
+ /* setup authentication information */
+ xmpp_conn_set_jid(conn, jid);
+ xmpp_conn_set_pass(conn, password);
+
+ /* initiate connection */
+ xmpp_connect_client(conn, NULL, 0, conn_handler, (void*)msg);
+
+ /* enter the event loop -
+ our connect handler will trigger an exit */
+ xmpp_run(ctx);
+
+ /* release our connection and context */
+ xmpp_conn_release(conn);
+ xmpp_ctx_free(ctx);
+
+ /* final shutdown of the library */
+ xmpp_shutdown();
+}