]> www.infradead.org Git - pidgin-chime.git/commitdiff
Add generic Chime send_message functionality
authorDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 11 Aug 2017 22:06:41 +0000 (23:06 +0100)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Fri, 11 Aug 2017 22:06:45 +0000 (23:06 +0100)
chime-connection.c
chime-object.h

index 502afd86d40295ebe65af1fc086ace75c5ebac9c..b08b38830f7546c223a3cd3a6fb62b87127e3582 100644 (file)
@@ -921,3 +921,81 @@ gboolean parse_time(JsonNode *parent, const gchar *name, const gchar **time_str,
 
        return TRUE;
 }
+
+static void send_message_cb(ChimeConnection *self, SoupMessage *msg,
+                           JsonNode *node, gpointer user_data)
+{
+       GTask *task = G_TASK(user_data);
+
+       /* Nothing to do o nsuccess */
+       if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) {
+               g_task_return_new_error(task, CHIME_ERROR,
+                                       CHIME_ERROR_NETWORK,
+                                       _("Failed to send message: %d %s"),
+                                       msg->status_code, msg->reason_phrase);
+       } else {
+               JsonObject *obj = json_node_get_object(node);
+               JsonNode *node = json_object_get_member(obj, "Message");
+
+               if (node)
+                       g_task_return_pointer(task, json_node_ref(node), (GDestroyNotify)json_node_unref);
+               else
+                       g_task_return_new_error(task, CHIME_ERROR,
+                                               CHIME_ERROR_NETWORK,
+                                               _("Failed to send message"));
+       }
+       g_object_unref(task);
+}
+
+void
+chime_connection_send_message_async(ChimeConnection *self,
+                                   ChimeObject *obj,
+                                   const gchar *message,
+                                   GCancellable *cancellable,
+                                   GAsyncReadyCallback callback,
+                                   gpointer user_data)
+{
+       g_return_if_fail(CHIME_IS_CONNECTION(self));
+       ChimeConnectionPrivate *priv = CHIME_CONNECTION_GET_PRIVATE (self);
+
+       GTask *task = g_task_new(self, cancellable, callback, user_data);
+
+       /* g_uuid_string_random() not till 2.52. So do this instead... */
+       GChecksum *sum = g_checksum_new(G_CHECKSUM_SHA256);
+       g_checksum_update(sum, (void *)&message, sizeof(&message));
+       g_checksum_update(sum, (void *)message, strlen(message));
+       gint64 t = g_get_monotonic_time();
+       g_checksum_update(sum, (void *)&t, sizeof(t));
+       guint32 r = g_random_int();
+       g_checksum_update(sum, (void *)&r, sizeof(r));
+       const gchar *uuid = g_checksum_get_string(sum);
+
+       JsonBuilder *jb = json_builder_new();
+       jb = json_builder_begin_object(jb);
+       jb = json_builder_set_member_name(jb, "Content");
+       jb = json_builder_add_string_value(jb, message);
+       jb = json_builder_set_member_name(jb, "ClientRequestToken");
+       jb = json_builder_add_string_value(jb, uuid);
+       jb = json_builder_end_object(jb);
+
+       SoupURI *uri = soup_uri_new_printf(priv->messaging_url, "/%ss/%s/messages",
+                                          CHIME_IS_ROOM(obj) ? "room" : "conversation",
+                                          chime_object_get_id(obj));
+       JsonNode *node = json_builder_get_root(jb);
+       chime_connection_queue_http_request(self, node, uri, "POST", send_message_cb, task);
+
+       json_node_unref(node);
+       g_object_unref(jb);
+
+       g_checksum_free(sum);
+}
+
+JsonNode *
+chime_connection_send_message_finish(ChimeConnection *self, GAsyncResult *result,
+                                    GError **error)
+{
+       g_return_val_if_fail(CHIME_IS_CONNECTION(self), FALSE);
+       g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
+
+       return g_task_propagate_pointer(G_TASK(result), error);
+}
index 1743518f65d326f5c9e37717317a3ab8dc15b802..323c3151a0dfcebb4b475e93da0f93fe091f9dc1 100644 (file)
@@ -63,6 +63,17 @@ void chime_object_collection_foreach_object(ChimeConnection *cxn, ChimeObjectCol
 
 void chime_object_collection_expire_outdated(ChimeObjectCollection *coll);
 
+void             chime_connection_send_message_async         (ChimeConnection    *self,
+                                                              ChimeObject        *obj,
+                                                              const gchar        *message,
+                                                              GCancellable       *cancellable,
+                                                              GAsyncReadyCallback callback,
+                                                              gpointer            user_data);
+
+JsonNode        *chime_connection_send_message_finish        (ChimeConnection  *self,
+                                                              GAsyncResult     *result,
+                                                              GError          **error);
+
 G_END_DECLS
 
 #endif /* __CHIME_OBJECT_H__ */