]> www.infradead.org Git - pidgin-chime.git/commitdiff
Allow p2p calls
authorDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 25 Apr 2018 14:30:14 +0000 (15:30 +0100)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Wed, 25 Apr 2018 14:30:14 +0000 (15:30 +0100)
chime/chime-meeting.c
chime/chime-meeting.h
prpl/chime.c
prpl/chime.h
prpl/meeting.c

index b55d2a4fd647e3e523389289a2232d0d55b44e9a..ff3df9905ddb15b2c20e67a59fc58954c0cca078 100644 (file)
@@ -843,3 +843,79 @@ ChimeMeeting *chime_connection_join_meeting_finish(ChimeConnection *self,
        return g_task_propagate_pointer(G_TASK(result), error);
 }
 
+static void add_new_meeting_member(gpointer _contact, gpointer _jb)
+{
+       JsonBuilder **jb = _jb;
+       ChimeContact *contact = CHIME_CONTACT(_contact);
+
+       *jb = json_builder_add_string_value(*jb, chime_contact_get_profile_id(contact));
+}
+
+static void meet_created_cb(ChimeConnection *cxn, SoupMessage *msg, JsonNode *node,
+                           gpointer user_data)
+{
+       GTask *task = G_TASK(user_data);
+
+       if (SOUP_STATUS_IS_SUCCESSFUL(msg->status_code) && node) {
+               ChimeMeeting *mtg = chime_connection_parse_meeting(cxn, node, NULL);
+               if (mtg)
+                       g_task_return_pointer(task, g_object_ref(mtg), g_object_unref);
+               else
+                       g_task_return_new_error(task, CHIME_ERROR, CHIME_ERROR_NETWORK,
+                                               _("Failed to create/parse AdHoc meeting"));
+       } else {
+               const gchar *reason = msg->reason_phrase;
+
+               parse_string(node, "Message", &reason);
+
+               g_task_return_new_error(task, CHIME_ERROR, CHIME_ERROR_NETWORK,
+                                     _("Failed to create AdHoc meeting (%d): %s\n"),
+                                     msg->status_code, reason);
+       }
+       g_object_unref(task);
+}
+
+void chime_connection_create_meeting_async(ChimeConnection *cxn,
+                                          GSList *contacts,
+                                          gboolean bridge_locked,
+                                          gboolean create_bridge_passcode,
+                                          gboolean p2p,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data)
+{
+       g_return_if_fail(CHIME_IS_CONNECTION(cxn));
+       ChimeConnectionPrivate *priv = CHIME_CONNECTION_GET_PRIVATE (cxn);
+
+       GTask *task = g_task_new(cxn, cancellable, callback, user_data);
+       JsonBuilder *jb = json_builder_new();
+       jb = json_builder_begin_object(jb);
+       jb = json_builder_set_member_name(jb, "attendee_ids");
+       jb = json_builder_begin_array(jb);
+       g_slist_foreach(contacts, add_new_meeting_member, &jb);
+       jb = json_builder_end_array(jb);
+       jb = json_builder_set_member_name(jb, "bridge_locked");
+       jb = json_builder_add_boolean_value(jb, bridge_locked);
+       jb = json_builder_set_member_name(jb, "create_bridge_passcode");
+       jb = json_builder_add_boolean_value(jb, create_bridge_passcode);
+       jb = json_builder_set_member_name(jb, "p2p");
+       jb = json_builder_add_boolean_value(jb, p2p);
+       jb = json_builder_end_object(jb);
+
+       SoupURI *uri = soup_uri_new_printf(priv->conference_url, "/ad_hoc_meetings");
+       JsonNode *node = json_builder_get_root(jb);
+       chime_connection_queue_http_request(cxn, node, uri, "POST", meet_created_cb, task);
+
+       json_node_unref(node);
+       g_object_unref(jb);
+}
+
+ChimeMeeting *chime_connection_create_meeting_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 a27b0cfe7c016e89d01043f0971abaa1957d946f..3141b3188b26a89d8732d7e23b3bfa16d2a35449 100644 (file)
@@ -141,6 +141,18 @@ ChimeMeeting *chime_connection_join_meeting_finish(ChimeConnection *self,
                                                   GAsyncResult *result,
                                                   GError **error);
 
+void chime_connection_create_meeting_async(ChimeConnection *cxn,
+                                          GSList *contacts,
+                                          gboolean bridge_locked,
+                                          gboolean create_bridge_passcode,
+                                          gboolean p2p,
+                                          GCancellable *cancellable,
+                                          GAsyncReadyCallback callback,
+                                          gpointer user_data);
+ChimeMeeting *chime_connection_create_meeting_finish(ChimeConnection *self,
+                                                    GAsyncResult *result,
+                                                    GError **error);
+
 G_END_DECLS
 
 #endif /* __CHIME_MEETING_H__ */
index 34ab2d65136269674b3334d4a45e4480c677a0c8..497f6ee9d2a7f0115fa79ccf7ac8df372b01ab8c 100644 (file)
@@ -321,6 +321,11 @@ static GList *chime_purple_blist_node_menu(PurpleBlistNode *node)
        }
 }
 
+static PurpleMediaCaps chime_purple_get_media_caps(PurpleAccount *account, const char *who)
+{
+       return PURPLE_MEDIA_CAPS_AUDIO;
+}
+
 #ifdef PURPLE_BLIST_NODE_IS_VISIBLE /* This was added at the same time */
 #define PRPL_HAS_GET_CB_ALIAS
 #else
@@ -351,6 +356,8 @@ static PurplePluginProtocolInfo chime_prpl_info = {
        .send_typing = chime_send_typing,
        .set_idle = chime_purple_set_idle,
        .blist_node_menu = chime_purple_blist_node_menu,
+       .get_media_caps = chime_purple_get_media_caps,
+       .initiate_media = chime_purple_initiate_media,
 #ifdef PRPL_HAS_GET_CB_ALIAS
        .get_cb_alias = chime_purple_get_cb_alias,
 #endif
index 219702a6631d22cc63d27d4efe1e8eaafdc6a1c9..c8b4b22ecbebc7b4bd6a02471e4003c2e14212e8 100644 (file)
@@ -76,6 +76,8 @@ void chime_purple_show_joinable(PurplePluginAction *action);
 void on_chime_new_meeting(ChimeConnection *cxn, ChimeMeeting *mtg, PurpleConnection *conn);
 void purple_chime_init_meetings(PurpleConnection *conn);
 void purple_chime_destroy_meetings(PurpleConnection *conn);
+gboolean chime_purple_initiate_media(PurpleAccount *account, const char *who,
+                                    PurpleMediaSessionType type);
 
 /* rooms.c */
 PurpleRoomlist *chime_purple_roomlist_get_list(PurpleConnection *conn);
index e053d6a030e80e13cf126747336244e3199ac76b..a04d03ac4ed8f0381c93251a1536820554c5de6e 100644 (file)
@@ -470,3 +470,44 @@ void purple_chime_destroy_meetings(PurpleConnection *conn)
        if (pc->joinable_handle)
                joinable_closed_cb(conn);
 }
+
+static void media_initiated_cb(GObject *source, GAsyncResult *result, gpointer _conn)
+{
+       ChimeConnection *cxn = CHIME_CONNECTION(source);
+       PurpleConnection *conn = _conn;
+       GError *error = NULL;
+
+       ChimeMeeting *mtg = chime_connection_create_meeting_finish(cxn, result, &error);
+       if (!mtg) {
+               purple_notify_error(conn, NULL,
+                                   _("Unable to create conference"),
+                                   error->message);
+               g_clear_error(&error);
+               return;
+       }
+
+       chime_connection_join_meeting_async(cxn, mtg, FALSE, NULL, join_mtg_done, conn);
+       g_object_unref(mtg);
+}
+
+gboolean chime_purple_initiate_media(PurpleAccount *account, const char *who,
+                                    PurpleMediaSessionType type)
+{
+       if (type != PURPLE_MEDIA_AUDIO)
+               return FALSE;
+
+       if (!account->gc)
+               return FALSE;
+
+       ChimeConnection *cxn = PURPLE_CHIME_CXN(account->gc);
+
+       ChimeContact *contact = chime_connection_contact_by_email(cxn, who);
+       if (!contact)
+               return FALSE;
+
+       GSList *cl = g_slist_append(NULL, contact);
+       chime_connection_create_meeting_async(cxn, cl, FALSE, TRUE, TRUE, NULL,
+                                             media_initiated_cb, account->gc);
+       g_slist_free(cl);
+       return TRUE;
+}