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