From 8806899a523df0dcf9b6c7c3402b630a5eebd8f2 Mon Sep 17 00:00:00 2001
From: Olivier Dion <olivier.dion@savoirfairelinux.com>
Date: Fri, 15 Oct 2021 11:59:50 -0400
Subject: [PATCH] agent/bindings/signal: Add all Jami's signal bindings

Change-Id: I373ddb0efdeca41bf54e80aec4b9d1db69f77300
---
 test/agent/src/bindings/signal.cpp | 581 ++++++++++++++++++++++++-----
 1 file changed, 486 insertions(+), 95 deletions(-)

diff --git a/test/agent/src/bindings/signal.cpp b/test/agent/src/bindings/signal.cpp
index 1f62d5cf36..e6a212a478 100644
--- a/test/agent/src/bindings/signal.cpp
+++ b/test/agent/src/bindings/signal.cpp
@@ -35,6 +35,7 @@
 #include "jami/callmanager_interface.h"
 #include "jami/configurationmanager_interface.h"
 #include "jami/conversation_interface.h"
+#include "jami/datatransfer_interface.h"
 #include "jami/presencemanager_interface.h"
 
 /* Agent */
@@ -108,17 +109,19 @@ public:
 
     void execute(Args... args) {
 
-            std::tuple<Args...> tuple(args...);
+        std::tuple<Args...> tuple(args...);
 
-            cb_ctx ctx = {*this, tuple};
+        cb_ctx ctx = {*this, tuple};
 
-            scm_with_guile(executeInGuile, &ctx);
-        }
+        scm_with_guile(executeInGuile, &ctx);
+    }
 };
 
 static SCM
 on_signal_binding(SCM signal_sym, SCM handler_proc)
 {
+    static SCM bad_signal_sym = scm_from_utf8_symbol("bad-signal");
+
     SCM handler_pair;
 
     std::vector<SCM> *callbacks;
@@ -130,7 +133,7 @@ on_signal_binding(SCM signal_sym, SCM handler_proc)
     handler_pair = scm_assq_ref(signal_alist, signal_sym);
 
     if (scm_is_false(handler_pair)) {
-
+        scm_throw(bad_signal_sym, scm_list_2(signal_sym, handler_proc));
     }
 
     callbacks = static_cast<std::vector<SCM>*>(scm_to_pointer(scm_car(handler_pair)));
@@ -142,103 +145,491 @@ on_signal_binding(SCM signal_sym, SCM handler_proc)
     return SCM_UNDEFINED;
 }
 
+template<typename T, typename... Args>
+void add_handler(std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>>& handlers,
+                 const char* name)
+{
+    static Handler<Args...> handler(name);
 
-void
-install_signal_primitives(void *)
-    {
-    static Handler<const std::string&, const std::string&, std::map<std::string, std::string>>
-        onMessageReceived("message-received");
-
-    static Handler<const std::string&, const std::string&, std::map<std::string, std::string>>
-        onConversationRequestReceived("conversation-request-received");
-
-    static Handler<const std::string&, const std::string&>
-        onConversationReady("conversation-ready");
-
-    static Handler<const std::string&, const std::string&, signed>
-        onCallStateChanged("call-state-changed");
-
-    static Handler<const std::string&, const std::string&, const std::string&, const std::vector<DRing::MediaMap>>
-        onIncomingCall("incomming-call");
-
-    static Handler<const std::string&, const std::string&, bool> onContactAdded("contact-added");
-
-    static Handler<const std::string&, const std::string&, int, const std::string&>
-        onRegistrationStateChanged("registration-state-changed");
+    auto fn = [=](Args... args){
+        handler.execute(args...);
+    };
 
-    static Handler<const std::string&, const std::map<std::string, std::string>&>
-        onVolatileDetailsChanged("volatile-details-changed");
+    handlers.insert(DRing::exportable_callback<T>(std::move(fn)));
+}
 
+void
+install_signal_primitives(void *)
+{
     define_primitive("on-signal", 2, 0, 0, (void*) on_signal_binding);
 
     std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>> handlers;
 
-    using namespace std::placeholders;
-    using std::bind;
-
-    handlers.insert(DRing::exportable_callback<DRing::CallSignal::IncomingCallWithMedia>(
-                        bind(&Handler<const std::string&,
-                             const std::string&,
-                             const std::string&,
-                             const std::vector<DRing::MediaMap>>::execute,
-                             &onIncomingCall,
-                             _1,
-                             _2,
-                             _3,
-                             _4)));
-
-    handlers.insert(DRing::exportable_callback<DRing::CallSignal::StateChange>(
-                        bind(&Handler<const std::string&, const std::string&, signed>::execute,
-                             &onCallStateChanged,
-                             _1,
-                             _2,
-                             _3)));
-
-    handlers.insert(DRing::exportable_callback<DRing::ConversationSignal::MessageReceived>(
-                        bind(&Handler<const std::string&,
-                             const std::string&,
-                             std::map<std::string, std::string>>::execute,
-                             &onMessageReceived,
-                             _1,
-                             _2,
-                             _3)));
-
-    handlers.insert(
-        DRing::exportable_callback<DRing::ConversationSignal::ConversationRequestReceived>(
-            bind(&Handler<const std::string&,
-                 const std::string&,
-                 std::map<std::string, std::string>>::execute,
-                 &onConversationRequestReceived,
-                 _1,
-                 _2,
-                 _3)));
-
-    handlers.insert(DRing::exportable_callback<DRing::ConversationSignal::ConversationReady>(
-                        bind(&Handler<const std::string&, const std::string&>::execute,
-                             &onConversationReady,
-                             _1,
-                             _2)));
-
-    handlers.insert(DRing::exportable_callback<DRing::ConfigurationSignal::ContactAdded>(
-                        bind(&Handler<const std::string&, const std::string&, bool>::execute,
-                             &onContactAdded,
-                             _1,
-                             _2,
-                             _3)));
-
-    handlers.insert(DRing::exportable_callback<DRing::ConfigurationSignal::RegistrationStateChanged>(
-                        bind(&Handler<const std::string&, const std::string&, int, const std::string&>::execute,
-                             &onRegistrationStateChanged,
-                             _1,
-                             _2,
-                             _3,
-                             _4)));
-
-    handlers.insert(DRing::exportable_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(
-                        bind(&Handler<const std::string&, const std::map<std::string, std::string>&>::execute,
-                             &onVolatileDetailsChanged,
-                             _1,
-                             _2)));
+    add_handler<DRing::CallSignal::StateChange,
+                const std::string&,
+                const std::string&,
+                signed>
+        (handlers, "state-changed");
+
+    add_handler<DRing::CallSignal::TransferFailed>
+        (handlers, "transfer-failed");
+
+    add_handler<DRing::CallSignal::TransferSucceeded>
+        (handlers, "transfer-succeeded");
+
+    add_handler<DRing::CallSignal::RecordPlaybackStopped,
+                const std::string&>
+        (handlers, "record-playback-stopped");
+
+    add_handler<DRing::CallSignal::VoiceMailNotify,
+                const std::string&,
+                int32_t,
+                int32_t,
+                int32_t>
+        (handlers, "voice-mail-notify");
+
+    add_handler<DRing::CallSignal::IncomingMessage,
+                const std::string&,
+                const std::string&,
+                const std::map<std::string, std::string>&>
+        (handlers, "incoming-message");
+
+    add_handler<DRing::CallSignal::IncomingCall,
+                const std::string&,
+                const std::string&,
+                const std::string&>
+        (handlers, "incoming-call");
+
+    add_handler<DRing::CallSignal::IncomingCallWithMedia,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                const std::vector<DRing::MediaMap>>
+        (handlers, "incoming-call/media");
+
+    add_handler<DRing::CallSignal::MediaChangeRequested,
+                const std::string&,
+                const std::string&,
+                const std::vector<std::map<std::string, std::string>>&>
+        (handlers, "media-change-requested");
+
+    add_handler<DRing::CallSignal::RecordPlaybackFilepath,
+                const std::string&,
+                const std::string&>
+        (handlers, "record-playback-filepath");
+
+    add_handler<DRing::CallSignal::ConferenceCreated,
+                const std::string&>(handlers, "conference-created");
+
+    add_handler<DRing::CallSignal::ConferenceChanged,
+                const std::string&,
+                const std::string&>
+        (handlers, "conference-changed");
+
+    add_handler<DRing::CallSignal::UpdatePlaybackScale,
+                const std::string&,
+                unsigned,
+                unsigned>
+        (handlers, "update-playback-scale");
+
+    add_handler<DRing::CallSignal::ConferenceRemoved,
+                const std::string&>
+        (handlers, "conference-removed");
+
+    add_handler<DRing::CallSignal::RecordingStateChanged,
+                const std::string&,
+                int>
+        (handlers, "recording-state-changed");
+
+    add_handler<DRing::CallSignal::RtcpReportReceived,
+                const std::string&,
+                const std::map<std::string, int>&>
+        (handlers, "rtcp-report-received");
+
+    add_handler<DRing::CallSignal::PeerHold,
+                const std::string&,
+                bool>
+        (handlers, "peer-hold");
+
+    add_handler<DRing::CallSignal::VideoMuted,
+                const std::string&,
+                bool>
+        (handlers, "video-muted");
+
+    add_handler<DRing::CallSignal::AudioMuted,
+                const std::string&,
+                bool>
+        (handlers, "audio-muted");
+
+    add_handler<DRing::CallSignal::SmartInfo,
+                const std::map<std::string, std::string>&>
+        (handlers, "smart-info");
+
+    add_handler<DRing::CallSignal::ConnectionUpdate,
+                const std::string&,
+                int>
+        (handlers, "connection-update");
+
+    add_handler<DRing::CallSignal::OnConferenceInfosUpdated,
+                const std::string&,
+                const std::vector<std::map<std::string, std::string>>&>
+        (handlers, "conference-infos-updated");
+
+    add_handler<DRing::CallSignal::RemoteRecordingChanged,
+                const std::string&,
+                const std::string&,
+                bool>
+        (handlers, "remote-recording-changed");
+
+    add_handler<DRing::CallSignal::MediaNegotiationStatus,
+                const std::string&,
+                const std::string&,
+                const std::vector<std::map<std::string, std::string>>&>
+        (handlers, "media-negotiation-status");
+
+    /* Configuration */
+    add_handler<DRing::ConfigurationSignal::VolumeChanged,
+                const std::string&,
+                double>
+        (handlers, "volume-changed");
+
+    add_handler<DRing::ConfigurationSignal::Error,
+                int>
+        (handlers, "configuration-error");
+
+    add_handler<DRing::ConfigurationSignal::AccountsChanged>
+        (handlers, "accounts-changed");
+
+    add_handler<DRing::ConfigurationSignal::AccountDetailsChanged,
+                const std::string&,
+                const std::map<std::string, std::string>&>
+        (handlers, "account-details-changed");
+
+    add_handler<DRing::ConfigurationSignal::StunStatusFailed,
+                const std::string&>
+        (handlers, "stun-status-failed");
+
+    add_handler<DRing::ConfigurationSignal::RegistrationStateChanged,
+                const std::string&,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "registration-state-changed");
+
+    add_handler<DRing::ConfigurationSignal::VolatileDetailsChanged,
+                const std::string&,
+                const std::map<std::string, std::string>&>
+        (handlers, "volatile-details-changed");
+
+    add_handler<DRing::ConfigurationSignal::IncomingAccountMessage,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                const std::map<std::string, std::string>&>
+        (handlers, "incoming-account-message");
+
+    add_handler<DRing::ConfigurationSignal::AccountMessageStatusChanged,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "account-message-status-changed");
+
+    add_handler<DRing::ConfigurationSignal::ProfileReceived,
+                const std::string&,
+                const std::string&,
+                const std::string&>
+        (handlers, "profile-received");
+
+    add_handler<DRing::ConfigurationSignal::ComposingStatusChanged,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "composing-status-changed");
+
+    add_handler<DRing::ConfigurationSignal::IncomingTrustRequest,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                const std::vector<uint8_t>&,
+                time_t>
+        (handlers, "incoming-trust-request");
+
+    add_handler<DRing::ConfigurationSignal::ContactAdded,
+                const std::string&,
+                const std::string&,
+                bool>
+        (handlers, "contact-added");
+
+    add_handler<DRing::ConfigurationSignal::ContactRemoved,
+                const std::string&,
+                const std::string&,
+                bool>
+        (handlers, "contact-removed");
+
+    add_handler<DRing::ConfigurationSignal::ExportOnRingEnded,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "export-on-ring-ended");
+
+    add_handler<DRing::ConfigurationSignal::NameRegistrationEnded,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "name-registration-ended");
+
+    add_handler<DRing::ConfigurationSignal::KnownDevicesChanged,
+                const std::string&,
+                const std::map<std::string, std::string>&>
+        (handlers, "known-devices-changed");
+
+    add_handler<DRing::ConfigurationSignal::RegisteredNameFound,
+                const std::string&,
+                int,
+                const std::string&,
+                const std::string&>
+        (handlers, "registered-name-found");
+
+    add_handler<DRing::ConfigurationSignal::UserSearchEnded,
+                const std::string&,
+                int,
+                const std::string&,
+                const std::vector<std::map<std::string, std::string>>&>
+        (handlers, "user-search-ended");
+
+    add_handler<DRing::ConfigurationSignal::CertificatePinned,
+                const std::string&>
+        (handlers, "certificate-pinned");
+
+    add_handler<DRing::ConfigurationSignal::CertificatePathPinned,
+                const std::string&,
+                const std::vector<std::string>&>
+        (handlers, "certificate-path-pinned");
+
+    add_handler<DRing::ConfigurationSignal::CertificateExpired,
+                const std::string&>
+        (handlers, "certificate-expired");
+
+    add_handler<DRing::ConfigurationSignal::CertificateStateChanged,
+                const std::string&,
+                const std::string&,
+                const std::string&>
+        (handlers, "certificate-state-changed");
+
+    add_handler<DRing::ConfigurationSignal::MediaParametersChanged,
+                const std::string&>
+        (handlers, "media-parameters-changed");
+
+    add_handler<DRing::ConfigurationSignal::MigrationEnded,
+                const std::string&,
+                const std::string&>
+        (handlers, "migration-ended");
+
+    add_handler<DRing::ConfigurationSignal::DeviceRevocationEnded,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "device-revocation-ended");
+
+    add_handler<DRing::ConfigurationSignal::AccountProfileReceived,
+                const std::string&,
+                const std::string&,
+                const std::string&>
+        (handlers, "account-profile-received");
+
+#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS)
+    add_handler<DRing::ConfigurationSignal::GetHardwareAudioFormat,
+                std::vector<int32_t>*>
+        (handlers, "get-hardware-audio-format");
+#endif
+#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) || defined(RING_UWP)
+    add_handler<DRing::ConfigurationSignal::GetAppDataPath,
+                const std::string&,
+                std::vector<std::string>*>
+        (handlers, "get-app-data-path");
+
+    add_handler<DRing::ConfigurationSignal::GetDeviceName,
+                std::vector<std::string>*>
+        (handlers, "get-device-name");
+#endif
+    add_handler<DRing::ConfigurationSignal::HardwareDecodingChanged,
+                bool>
+        (handlers, "hardware-decoding-changed");
+
+    add_handler<DRing::ConfigurationSignal::HardwareEncodingChanged,
+                bool>
+        (handlers, "hardware-encoding-changed");
+
+    add_handler<DRing::ConfigurationSignal::MessageSend,
+                const std::string&>
+        (handlers, "message-send");
+
+    /* Presence */
+    add_handler<DRing::PresenceSignal::NewServerSubscriptionRequest,
+                const std::string&>
+        (handlers, "new-server-subscription-request");
+
+    add_handler<DRing::PresenceSignal::ServerError,
+                const std::string&,
+                const std::string&,
+                const std::string&>
+        (handlers, "server-error");
+
+    add_handler<DRing::PresenceSignal::NewBuddyNotification,
+                const std::string&,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "new-buddy-notification");
+
+    add_handler<DRing::PresenceSignal::NearbyPeerNotification,
+                const std::string&,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "nearby-peer-notification");
+
+    add_handler<DRing::PresenceSignal::SubscriptionStateChanged,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "subscription-state-changed");
+
+    /* Audio */
+    add_handler<DRing::AudioSignal::DeviceEvent>
+        (handlers, "audio-device-event");
+
+    add_handler<DRing::AudioSignal::AudioMeter,
+                const std::string&,
+                float>
+        (handlers, "audio-meter");
+
+    /* DataTransfer */
+    add_handler<DRing::DataTransferSignal::DataTransferEvent,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "data-transfer-event");
+
+#ifdef ENABLE_VIDEO
+    /* MediaPlayer */
+    add_handler<DRing::MediaPlayerSignal::FileOpened,
+                const std::string&,
+                std::map<std::string, std::string>>
+        (handlers, "media-file-opened");
+
+    /* Video */
+    add_handler<DRing::VideoSignal::DeviceEvent>
+        (handlers, "device-event");
+
+    add_handler<DRing::VideoSignal::DecodingStarted,
+                const std::string&,
+                const std::string&,
+                int,
+                int,
+                bool>
+        (handlers, "video-decoding-started");
+
+    add_handler<DRing::VideoSignal::DecodingStopped,
+                const std::string&,
+                const std::string&,
+                bool>
+        (handlers, "video-decoding-stopped");
+
+#ifdef __ANDROID__
+    add_handler<DRing::VideoSignal::GetCameraInfo,
+                const std::string&,
+                std::vector<int>*,
+                std::vector<unsigned>*,
+                std::vector<unsigned>*>
+        (handlers, "video-get-camera-info");
+
+    add_handler<DRing::VideoSignal::SetParameters,
+                const std::string&,
+                const int,
+                const int,
+                const int,
+                const int>
+        (handlers, "video-set-parameters");
+
+    add_handler<DRing::VideoSignal::RequestKeyFrame>
+        (handlers, "video-request-key-frame");
+
+    add_handler<DRing::VideoSignal::SetBitrate,
+                const std::string&,
+                const int>
+        (handlers, "video-set-bitrate");
+
+#endif
+    add_handler<DRing::VideoSignal::StartCapture,
+                const std::string&>
+        (handlers, "video-start-capture");
+
+    add_handler<DRing::VideoSignal::StopCapture>
+        (handlers, "video-stop-capture");
+
+    add_handler<DRing::VideoSignal::DeviceAdded,
+                const std::string&>
+        (handlers, "video-device-added");
+
+    add_handler<DRing::VideoSignal::ParametersChanged,
+                const std::string&>
+        (handlers, "video-parameters-changed");
+#endif
+
+    /* Conversation */
+    add_handler<DRing::ConversationSignal::ConversationLoaded,
+                uint32_t,
+                const std::string&,
+                const std::string&,
+                std::vector<std::map<std::string, std::string>>>
+        (handlers, "conversation-loaded");
+
+    add_handler<DRing::ConversationSignal::MessageReceived,
+                const std::string&,
+                const std::string&,
+                std::map<std::string, std::string>>
+        (handlers, "message-received");
+
+    add_handler<DRing::ConversationSignal::ConversationRequestReceived,
+                const std::string&,
+                const std::string&,
+                std::map<std::string, std::string>>
+        (handlers, "conversation-request-received");
+
+    add_handler<DRing::ConversationSignal::ConversationRequestDeclined,
+                const std::string&,
+                const std::string&>
+        (handlers, "conversation-request-declined");
+
+    add_handler<DRing::ConversationSignal::ConversationReady,
+                const std::string&,
+                const std::string&>
+        (handlers, "conversation-ready");
+
+    add_handler<DRing::ConversationSignal::ConversationRemoved,
+                const std::string&,
+                const std::string&>
+        (handlers, "conversation-removed");
+
+    add_handler<DRing::ConversationSignal::ConversationMemberEvent,
+                const std::string&,
+                const std::string&,
+                const std::string&,
+                int>
+        (handlers, "conversation-member-event");
+
+    add_handler<DRing::ConversationSignal::OnConversationError,
+                const std::string&,
+                const std::string&,
+                int,
+                const std::string&>
+        (handlers, "conversation-error");
 
     DRing::registerSignalHandlers(handlers);
 }
-- 
GitLab