diff --git a/daemon/bin/dbus/configurationmanager-introspec.xml b/daemon/bin/dbus/configurationmanager-introspec.xml index 4a7e65fc1fa2f70e64c21dfe7c6349b0c770ffcc..f898eea96d305867f098c94bfbfadbd43d7e355e 100644 --- a/daemon/bin/dbus/configurationmanager-introspec.xml +++ b/daemon/bin/dbus/configurationmanager-introspec.xml @@ -622,7 +622,7 @@ </arg> </method> - <method name="getTlsSettingsDefault" tp:name-for-bindings="getTlsSettingsDefault"> + <method name="getTlsDefaultSettings" tp:name-for-bindings="getTlsDefaultSettings"> <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/> <arg type="a{ss}" name="details" direction="out"> </arg> diff --git a/daemon/bin/dbus/dbuscallmanager.cpp b/daemon/bin/dbus/dbuscallmanager.cpp index 1d1d5213aca2cccdef01f26ce9021fccaad688ab..20d0ee772dc54698344b952fe93bd81f2112c225 100644 --- a/daemon/bin/dbus/dbuscallmanager.cpp +++ b/daemon/bin/dbus/dbuscallmanager.cpp @@ -27,217 +27,256 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ -#include <iostream> -#include "dring.h" #include "dbuscallmanager.h" +#include "dring/callmanager_interface.h" DBusCallManager::DBusCallManager(DBus::Connection& connection) : DBus::ObjectAdaptor(connection, "/cx/ring/Ring/CallManager") -{ -} +{} -bool DBusCallManager::placeCall(const std::string& accountID, const std::string& callID, const std::string& to) +auto +DBusCallManager::placeCall(const std::string& accountID, const std::string& callID, const std::string& to) -> decltype(DRing::placeCall(accountID, callID, to)) { - return ring_call_place(accountID, callID, to); + return DRing::placeCall(accountID, callID, to); } -bool DBusCallManager::refuse(const std::string& callID) +auto +DBusCallManager::refuse(const std::string& callID) -> decltype(DRing::refuse(callID)) { - return ring_call_refuse(callID); + return DRing::refuse(callID); } -bool DBusCallManager::accept(const std::string& callID) +auto +DBusCallManager::accept(const std::string& callID) -> decltype(DRing::accept(callID)) { - return ring_call_accept(callID); + return DRing::accept(callID); } -bool DBusCallManager::hangUp(const std::string& callID) +auto +DBusCallManager::hangUp(const std::string& callID) -> decltype(DRing::hangUp(callID)) { - return ring_call_hang_up(callID); + return DRing::hangUp(callID); } -bool DBusCallManager::hold(const std::string& callID) +auto +DBusCallManager::hold(const std::string& callID) -> decltype(DRing::hold(callID)) { - return ring_call_hold(callID); + return DRing::hold(callID); } -bool DBusCallManager::unhold(const std::string& callID) +auto +DBusCallManager::unhold(const std::string& callID) -> decltype(DRing::unhold(callID)) { - return ring_call_unhold(callID); + return DRing::unhold(callID); } -bool DBusCallManager::transfer(const std::string& callID, const std::string& to) +auto +DBusCallManager::transfer(const std::string& callID, const std::string& to) -> decltype(DRing::transfer(callID, to)) { - return ring_call_transfer(callID, to); + return DRing::transfer(callID, to); } -bool DBusCallManager::attendedTransfer(const std::string& transferID, const std::string& targetID) +auto +DBusCallManager::attendedTransfer(const std::string& transferID, const std::string& targetID) -> decltype(DRing::attendedTransfer(transferID, targetID)) { - return ring_call_attended_transfer(transferID, targetID); + return DRing::attendedTransfer(transferID, targetID); } -std::map< std::string, std::string > DBusCallManager::getCallDetails(const std::string& callID) +auto +DBusCallManager::getCallDetails(const std::string& callID) -> decltype(DRing::getCallDetails(callID)) { - return ring_call_get_call_details(callID); + return DRing::getCallDetails(callID); } -std::vector< std::string > DBusCallManager::getCallList() +auto +DBusCallManager::getCallList() -> decltype(DRing::getCallList()) { - return ring_call_get_call_list(); + return DRing::getCallList(); } -void DBusCallManager::removeConference(const std::string& conference_id) +void +DBusCallManager::removeConference(const std::string& conference_id) { - ring_call_remove_conference(conference_id); + DRing::removeConference(conference_id); } -bool DBusCallManager::joinParticipant(const std::string& sel_callID, const std::string& drag_callID) +auto +DBusCallManager::joinParticipant(const std::string& sel_callID, const std::string& drag_callID) -> decltype(DRing::joinParticipant(sel_callID, drag_callID)) { - return ring_call_join_participant(sel_callID, drag_callID); + return DRing::joinParticipant(sel_callID, drag_callID); } -void DBusCallManager::createConfFromParticipantList(const std::vector< std::string >& participants) +void +DBusCallManager::createConfFromParticipantList(const std::vector< std::string >& participants) { - ring_call_create_conf_from_participant_list(participants); + DRing::createConfFromParticipantList(participants); } -bool DBusCallManager::isConferenceParticipant(const std::string& call_id) +auto +DBusCallManager::isConferenceParticipant(const std::string& call_id) -> decltype(DRing::isConferenceParticipant(call_id)) { - return ring_call_is_conference_participant(call_id); + return DRing::isConferenceParticipant(call_id); } -bool DBusCallManager::addParticipant(const std::string& callID, const std::string& confID) +auto +DBusCallManager::addParticipant(const std::string& callID, const std::string& confID) -> decltype(DRing::addParticipant(callID, confID)) { - return ring_call_add_participant(callID, confID); + return DRing::addParticipant(callID, confID); } -bool DBusCallManager::addMainParticipant(const std::string& confID) +auto +DBusCallManager::addMainParticipant(const std::string& confID) -> decltype(DRing::addMainParticipant(confID)) { - return ring_call_add_main_participant(confID); + return DRing::addMainParticipant(confID); } -bool DBusCallManager::detachParticipant(const std::string& callID) +auto +DBusCallManager::detachParticipant(const std::string& callID) -> decltype(DRing::detachParticipant(callID)) { - return ring_call_detach_participant(callID); + return DRing::detachParticipant(callID); } -bool DBusCallManager::joinConference(const std::string& sel_confID, const std::string& drag_confID) +auto +DBusCallManager::joinConference(const std::string& sel_confID, const std::string& drag_confID) -> decltype(DRing::joinConference(sel_confID, drag_confID)) { - return ring_call_join_conference(sel_confID, drag_confID); + return DRing::joinConference(sel_confID, drag_confID); } -bool DBusCallManager::hangUpConference(const std::string& confID) +auto +DBusCallManager::hangUpConference(const std::string& confID) -> decltype(DRing::hangUpConference(confID)) { - return ring_call_hang_up_conference(confID); + return DRing::hangUpConference(confID); } -bool DBusCallManager::holdConference(const std::string& confID) +auto +DBusCallManager::holdConference(const std::string& confID) -> decltype(DRing::holdConference(confID)) { - return ring_call_hold_conference(confID); + return DRing::holdConference(confID); } -bool DBusCallManager::unholdConference(const std::string& confID) +auto +DBusCallManager::unholdConference(const std::string& confID) -> decltype(DRing::unholdConference(confID)) { - return ring_call_unhold_conference(confID); + return DRing::unholdConference(confID); } -std::vector<std::string> DBusCallManager::getConferenceList() +auto +DBusCallManager::getConferenceList() -> decltype(DRing::getConferenceList()) { - return ring_call_get_conference_list(); + return DRing::getConferenceList(); } -std::vector<std::string> DBusCallManager::getParticipantList(const std::string& confID) +auto +DBusCallManager::getParticipantList(const std::string& confID) -> decltype(DRing::getParticipantList(confID)) { - return ring_call_get_participant_list(confID); + return DRing::getParticipantList(confID); } -std::vector<std::string> DBusCallManager::getDisplayNames(const std::string& confID) +auto +DBusCallManager::getDisplayNames(const std::string& confID) -> decltype(DRing::getDisplayNames(confID)) { - return ring_call_get_display_names(confID); + return DRing::getDisplayNames(confID); } -std::string DBusCallManager::getConferenceId(const std::string& callID) +auto +DBusCallManager::getConferenceId(const std::string& callID) -> decltype(DRing::getConferenceId(callID)) { - return ring_call_get_conference_id(callID); + return DRing::getConferenceId(callID); } -std::map<std::string, std::string> DBusCallManager::getConferenceDetails(const std::string& callID) +auto +DBusCallManager::getConferenceDetails(const std::string& callID) -> decltype(DRing::getConferenceDetails(callID)) { - return ring_call_get_conference_details(callID); + return DRing::getConferenceDetails(callID); } -bool DBusCallManager::startRecordedFilePlayback(const std::string& filepath) +auto +DBusCallManager::startRecordedFilePlayback(const std::string& filepath) -> decltype(DRing::startRecordedFilePlayback(filepath)) { - return ring_call_play_recorded_file(filepath); + return DRing::startRecordedFilePlayback(filepath); } -void DBusCallManager::stopRecordedFilePlayback(const std::string& filepath) +void +DBusCallManager::stopRecordedFilePlayback(const std::string& filepath) { - ring_call_stop_recorded_file(filepath); + DRing::stopRecordedFilePlayback(filepath); } -bool DBusCallManager::toggleRecording(const std::string& callID) +auto +DBusCallManager::toggleRecording(const std::string& callID) -> decltype(DRing::toggleRecording(callID)) { - return ring_call_toggle_recording(callID); + return DRing::toggleRecording(callID); } -void DBusCallManager::setRecording(const std::string& callID) +void +DBusCallManager::setRecording(const std::string& callID) { - ring_call_set_recording(callID); + DRing::setRecording(callID); } -void DBusCallManager::recordPlaybackSeek(const double& value) +void +DBusCallManager::recordPlaybackSeek(const double& value) { - ring_call_record_playback_seek(value); + DRing::recordPlaybackSeek(value); } -bool DBusCallManager::getIsRecording(const std::string& callID) +auto +DBusCallManager::getIsRecording(const std::string& callID) -> decltype(DRing::getIsRecording(callID)) { - return ring_call_is_recording(callID); + return DRing::getIsRecording(callID); } -std::string DBusCallManager::getCurrentAudioCodecName(const std::string& callID) +auto +DBusCallManager::getCurrentAudioCodecName(const std::string& callID) -> decltype(DRing::getCurrentAudioCodecName(callID)) { - return ring_call_get_current_audio_codec_name(callID); + return DRing::getCurrentAudioCodecName(callID); } -void DBusCallManager::playDTMF(const std::string& key) +void +DBusCallManager::playDTMF(const std::string& key) { - ring_call_play_dtmf(key); + DRing::playDTMF(key); } -void DBusCallManager::startTone(const int32_t& start, const int32_t& type) +void +DBusCallManager::startTone(const int32_t& start, const int32_t& type) { - ring_call_start_tone(start, type); + DRing::startTone(start, type); } -void DBusCallManager::setSASVerified(const std::string& callID) +void +DBusCallManager::setSASVerified(const std::string& callID) { - ring_call_set_sas_verified(callID); + DRing::setSASVerified(callID); } -void DBusCallManager::resetSASVerified(const std::string& callID) +void +DBusCallManager::resetSASVerified(const std::string& callID) { - ring_call_reset_sas_verified(callID); + DRing::resetSASVerified(callID); } -void DBusCallManager::setConfirmGoClear(const std::string& callID) +void +DBusCallManager::setConfirmGoClear(const std::string& callID) { - ring_call_set_confirm_go_clear(callID); + DRing::setConfirmGoClear(callID); } -void DBusCallManager::requestGoClear(const std::string& callID) +void +DBusCallManager::requestGoClear(const std::string& callID) { - ring_call_request_go_clear(callID); + DRing::requestGoClear(callID); } -void DBusCallManager::acceptEnrollment(const std::string& callID, const bool& accepted) +void +DBusCallManager::acceptEnrollment(const std::string& callID, const bool& accepted) { - ring_call_accept_enrollment(callID, accepted); + DRing::acceptEnrollment(callID, accepted); } -void DBusCallManager::sendTextMessage(const std::string& callID, const std::string& message) +void +DBusCallManager::sendTextMessage(const std::string& callID, const std::string& message) { - ring_call_send_text_message(callID, message); + DRing::sendTextMessage(callID, message); } diff --git a/daemon/bin/dbus/dbuscallmanager.h b/daemon/bin/dbus/dbuscallmanager.h index 89185e590b2dabc835d473f1f617f25bfcc075e8..0ef4dc42e942cf7b94d37550f42380cd93cdbb60 100644 --- a/daemon/bin/dbus/dbuscallmanager.h +++ b/daemon/bin/dbus/dbuscallmanager.h @@ -28,8 +28,8 @@ * as that of the covered work. */ -#ifndef __RING_CALLMANAGER_H__ -#define __RING_CALLMANAGER_H__ +#ifndef __RING_DBUSCALLMANAGER_H__ +#define __RING_DBUSCALLMANAGER_H__ #include <vector> #include <map> @@ -72,8 +72,8 @@ class DBusCallManager : bool unhold(const std::string& callID); bool transfer(const std::string& callID, const std::string& to); bool attendedTransfer(const std::string& transferID, const std::string& targetID); - std::map< std::string, std::string > getCallDetails(const std::string& callID); - std::vector< std::string > getCallList(); + std::map<std::string, std::string> getCallDetails(const std::string& callID); + std::vector<std::string> getCallList(); void removeConference(const std::string& conference_id); bool joinParticipant(const std::string& sel_callID, const std::string& drag_callID); void createConfFromParticipantList(const std::vector< std::string >& participants); diff --git a/daemon/bin/dbus/dbusclient.cpp b/daemon/bin/dbus/dbusclient.cpp index 777c76b0fe26932b3e8e7add2a57f8f7f190e3a9..704d79dacd0fc16e0ae22b94fe2b8fe31ca6dc90 100644 --- a/daemon/bin/dbus/dbusclient.cpp +++ b/daemon/bin/dbus/dbusclient.cpp @@ -1,6 +1,7 @@ /* - * Copyright (C) 2014 Savoir-Faire Linux Inc. + * Copyright (C) 2014-2015 Savoir-Faire Linux Inc. * Author: Philippe Proulx <philippe.proulx@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,200 +32,181 @@ #include <iostream> #include <cstring> #include <stdexcept> -#include "dring.h" #include "dbusclient.h" #include "dbus_cpp.h" #include "dbusinstance.h" + +#include "callmanager_interface.h" #include "dbuscallmanager.h" + #include "dbusconfigurationmanager.h" +#include "configurationmanager_interface.h" + #include "dbuspresencemanager.h" +#include "presencemanager_interface.h" #ifdef RING_VIDEO #include "dbusvideomanager.h" +#include "videomanager_interface.h" #endif -struct EventCallback : DBus::Callback_Base<void, DBus::DefaultTimeout&> +class EventCallback : + public DBus::Callback_Base<void, DBus::DefaultTimeout&> { - EventCallback(const std::function<void()> &func) : - callback_(func) - {} + public: + EventCallback(const std::function<void()>&& func) + : callback_ {std::forward<const std::function<void()>>(func)} + {} - void call(DBus::DefaultTimeout &) const - { - callback_(); - } + void call(DBus::DefaultTimeout&) const { + callback_(); + } -private: - std::function<void()> callback_; + private: + const std::function<void()> callback_; }; -DBusClient::DBusClient(int sflphFlags, bool persistent) : - callManager_(nullptr) - , configurationManager_(nullptr) - , presenceManager_(nullptr) - , instanceManager_(nullptr) - , dispatcher_(new DBus::BusDispatcher) -#ifdef RING_VIDEO - , videoManager_(nullptr) -#endif - , timeout_(nullptr) +DBusClient::DBusClient(int sflphFlags, bool persistent) + : dispatcher_(new DBus::BusDispatcher) { try { DBus::_init_threading(); - DBus::default_dispatcher = dispatcher_; + DBus::default_dispatcher = dispatcher_.get(); // timeout and expired are deleted internally by dispatcher_'s // destructor, so we must NOT delete them ourselves. - timeout_ = new DBus::DefaultTimeout(10 /* ms */, true, dispatcher_); - // Poll for SIP/IAX events - timeout_->expired = new EventCallback(ring_poll_events); + timeout_.reset(new DBus::DefaultTimeout {10 /* ms */, true, dispatcher_.get()}); + // Poll for Deamon events + timeout_->expired = new EventCallback {DRing::poll_events}; - DBus::Connection sessionConnection(DBus::Connection::SessionBus()); + DBus::Connection sessionConnection {DBus::Connection::SessionBus()}; sessionConnection.request_name("cx.ring.Ring"); - callManager_ = new DBusCallManager(sessionConnection); - configurationManager_ = new DBusConfigurationManager(sessionConnection); - - presenceManager_ = new DBusPresenceManager(sessionConnection); + callManager_.reset(new DBusCallManager {sessionConnection}); + configurationManager_.reset(new DBusConfigurationManager {sessionConnection}); + presenceManager_.reset(new DBusPresenceManager {sessionConnection}); DBusInstance::OnNoMoreClientFunc onNoMoreClientFunc; + if (!persistent) + onNoMoreClientFunc = [this] {this->exit();}; - if (!persistent) { - onNoMoreClientFunc = [this] () { - this->exit(); - }; - } - - instanceManager_ = new DBusInstance(sessionConnection, onNoMoreClientFunc); + instanceManager_.reset(new DBusInstance {sessionConnection, onNoMoreClientFunc}); #ifdef RING_VIDEO - videoManager_ = new DBusVideoManager(sessionConnection); + videoManager_.reset(new DBusVideoManager {sessionConnection}); #endif } catch (const DBus::Error &err) { - throw std::runtime_error("cannot initialize DBus stuff"); + throw std::runtime_error {"cannot initialize DBus stuff"}; } - auto ret = initLibrary(sflphFlags); - - if (ret < 0) { - throw std::runtime_error("cannot initialize libring"); - } + if (initLibrary(sflphFlags) < 0) + throw std::runtime_error {"cannot initialize libring"}; instanceManager_->started(); } DBusClient::~DBusClient() { -#ifdef RING_VIDEO - delete videoManager_; -#endif - - delete instanceManager_; - - delete presenceManager_; - - delete configurationManager_; - delete callManager_; - delete dispatcher_; + dispatcher_.reset(); // force dispatcher reset first } int DBusClient::initLibrary(int sflphFlags) { using namespace std::placeholders; - using std::bind; - - auto callM = callManager_; // just an alias - - // Call event handlers - ring_call_ev_handlers callEvHandlers = { - bind(&DBusCallManager::callStateChanged, callM, _1, _2), - bind(&DBusCallManager::transferFailed, callM), - bind(&DBusCallManager::transferSucceeded, callM), - bind(&DBusCallManager::recordPlaybackStopped, callM, _1), - bind(&DBusCallManager::voiceMailNotify, callM, _1, _2), - bind(&DBusCallManager::incomingMessage, callM, _1, _2, _3), - bind(&DBusCallManager::incomingCall, callM, _1, _2, _3), - bind(&DBusCallManager::recordPlaybackFilepath, callM, _1, _2), - bind(&DBusCallManager::conferenceCreated, callM, _1), - bind(&DBusCallManager::conferenceChanged, callM, _1, _2), - bind(&DBusCallManager::updatePlaybackScale, callM, _1, _2, _3), - bind(&DBusCallManager::conferenceRemoved, callM, _1), - bind(&DBusCallManager::newCallCreated, callM, _1, _2, _3), - bind(&DBusCallManager::sipCallStateChanged, callM, _1, _2, _3), - bind(&DBusCallManager::recordingStateChanged, callM, _1, _2), - bind(&DBusCallManager::secureSdesOn, callM, _1), - bind(&DBusCallManager::secureSdesOff, callM, _1), - bind(&DBusCallManager::secureZrtpOn, callM, _1, _2), - bind(&DBusCallManager::secureZrtpOff, callM, _1), - bind(&DBusCallManager::showSAS, callM, _1, _2, _3), - bind(&DBusCallManager::zrtpNotSuppOther, callM, _1), - bind(&DBusCallManager::zrtpNegotiationFailed, callM, _1, _2, _3), - bind(&DBusCallManager::onRtcpReportReceived, callM, _1, _2) - }; - - auto confM = configurationManager_; // just an alias - - // Configuration event handlers - ring_config_ev_handlers configEvHandlers = { - bind(&DBusConfigurationManager::volumeChanged, confM, _1, _2), - bind(&DBusConfigurationManager::accountsChanged, confM), - bind(&DBusConfigurationManager::historyChanged, confM), - bind(&DBusConfigurationManager::stunStatusFailure, confM, _1), - bind(&DBusConfigurationManager::registrationStateChanged, confM, _1, _2), - bind(&DBusConfigurationManager::sipRegistrationStateChanged, confM, _1, _2, _3), - bind(&DBusConfigurationManager::volatileAccountDetailsChanged, confM, _1, _2), - bind(&DBusConfigurationManager::errorAlert, confM, _1), - }; - - auto presM = presenceManager_; - // Presence event handlers - ring_pres_ev_handlers presEvHandlers = { - bind(&DBusPresenceManager::newServerSubscriptionRequest, presM, _1), - bind(&DBusPresenceManager::serverError, presM, _1, _2, _3), - bind(&DBusPresenceManager::newBuddyNotification, presM, _1, _2, _3, _4), - bind(&DBusPresenceManager::subscriptionStateChanged, presM, _1, _2, _3) - }; + using std::bind; + using DRing::exportable_callback; + using DRing::CallSignal; + using DRing::ConfigurationSignal; + using DRing::PresenceSignal; + using DRing::VideoSignal; + using SharedCallback = std::shared_ptr<DRing::CallbackWrapperBase>; + + auto callM = callManager_.get(); + auto confM = configurationManager_.get(); + auto presM = presenceManager_.get(); + auto videoM = videoManager_.get(); + + const std::map<DRing::EventHandlerKey, std::map<std::string, SharedCallback>> evHandlers = { + { // Call event handlers + DRing::EventHandlerKey::CALL, { + exportable_callback<CallSignal::StateChange>(bind(&DBusCallManager::callStateChanged, callM, _1, _2)), + exportable_callback<CallSignal::TransferFailed>(bind(&DBusCallManager::transferFailed, callM)), + exportable_callback<CallSignal::TransferSucceeded>(bind(&DBusCallManager::transferSucceeded, callM)), + exportable_callback<CallSignal::RecordPlaybackStopped>(bind(&DBusCallManager::recordPlaybackStopped, callM, _1)), + exportable_callback<CallSignal::VoiceMailNotify>(bind(&DBusCallManager::voiceMailNotify, callM, _1, _2)), + exportable_callback<CallSignal::IncomingMessage>(bind(&DBusCallManager::incomingMessage, callM, _1, _2, _3)), + exportable_callback<CallSignal::IncomingCall>(bind(&DBusCallManager::incomingCall, callM, _1, _2, _3)), + exportable_callback<CallSignal::RecordPlaybackFilepath>(bind(&DBusCallManager::recordPlaybackFilepath, callM, _1, _2)), + exportable_callback<CallSignal::ConferenceCreated>(bind(&DBusCallManager::conferenceCreated, callM, _1)), + exportable_callback<CallSignal::ConferenceChanged>(bind(&DBusCallManager::conferenceChanged, callM, _1, _2)), + exportable_callback<CallSignal::UpdatePlaybackScale>(bind(&DBusCallManager::updatePlaybackScale, callM, _1, _2, _3)), + exportable_callback<CallSignal::ConferenceRemoved>(bind(&DBusCallManager::conferenceRemoved, callM, _1)), + exportable_callback<CallSignal::NewCallCreated>(bind(&DBusCallManager::newCallCreated, callM, _1, _2, _3)), + exportable_callback<CallSignal::SipCallStateChanged>(bind(&DBusCallManager::sipCallStateChanged, callM, _1, _2, _3)), + exportable_callback<CallSignal::RecordingStateChanged>(bind(&DBusCallManager::recordingStateChanged, callM, _1, _2)), + exportable_callback<CallSignal::SecureSdesOn>(bind(&DBusCallManager::secureSdesOn, callM, _1)), + exportable_callback<CallSignal::SecureSdesOff>(bind(&DBusCallManager::secureSdesOff, callM, _1)), + exportable_callback<CallSignal::SecureZrtpOn>(bind(&DBusCallManager::secureZrtpOn, callM, _1, _2)), + exportable_callback<CallSignal::SecureZrtpOff>(bind(&DBusCallManager::secureZrtpOff, callM, _1)), + exportable_callback<CallSignal::ShowSAS>(bind(&DBusCallManager::showSAS, callM, _1, _2, _3)), + exportable_callback<CallSignal::ZrtpNotSuppOther>(bind(&DBusCallManager::zrtpNotSuppOther, callM, _1)), + exportable_callback<CallSignal::ZrtpNegotiationFailed>(bind(&DBusCallManager::zrtpNegotiationFailed, callM, _1, _2, _3)), + exportable_callback<CallSignal::RtcpReportReceived>(bind(&DBusCallManager::onRtcpReportReceived, callM, _1, _2)), + } + }, + { // Configuration event handlers + DRing::EventHandlerKey::CONFIG, { + exportable_callback<ConfigurationSignal::VolumeChanged>(bind(&DBusConfigurationManager::volumeChanged, confM, _1, _2)), + exportable_callback<ConfigurationSignal::AccountsChanged>(bind(&DBusConfigurationManager::accountsChanged, confM)), + exportable_callback<ConfigurationSignal::HistoryChanged>(bind(&DBusConfigurationManager::historyChanged, confM)), + exportable_callback<ConfigurationSignal::StunStatusFailed>(bind(&DBusConfigurationManager::stunStatusFailure, confM, _1)), + exportable_callback<ConfigurationSignal::RegistrationStateChanged>(bind(&DBusConfigurationManager::registrationStateChanged, confM, _1, _2)), + exportable_callback<ConfigurationSignal::SipRegistrationStateChanged>(bind(&DBusConfigurationManager::sipRegistrationStateChanged, confM, _1, _2, _3)), + exportable_callback<ConfigurationSignal::VolatileDetailsChanged>(bind(&DBusConfigurationManager::volatileAccountDetailsChanged, confM, _1, _2)), + exportable_callback<ConfigurationSignal::Error>(bind(&DBusConfigurationManager::errorAlert, confM, _1)), + } + }, + { // Presence event handlers + DRing::EventHandlerKey::PRESENCE, { + exportable_callback<PresenceSignal::NewServerSubscriptionRequest>(bind(&DBusPresenceManager::newServerSubscriptionRequest, presM, _1)), + exportable_callback<PresenceSignal::ServerError>(bind(&DBusPresenceManager::serverError, presM, _1, _2, _3)), + exportable_callback<PresenceSignal::NewBuddyNotification>(bind(&DBusPresenceManager::newBuddyNotification, presM, _1, _2, _3, _4)), + exportable_callback<PresenceSignal::SubscriptionStateChanged>(bind(&DBusPresenceManager::subscriptionStateChanged, presM, _1, _2, _3)), + } + }, #ifdef RING_VIDEO - auto videoM = videoManager_; - - // Video event handlers - ring_video_ev_handlers videoEvHandlers = { - bind(&DBusVideoManager::deviceEvent, videoM), - bind(&DBusVideoManager::startedDecoding, videoM, _1, _2, _3, _4, _5), - bind(&DBusVideoManager::stoppedDecoding, videoM, _1, _2, _3) - }; -#endif // RING_VIDEO - - // All event handlers - ring_ev_handlers evHandlers = { - .call_ev_handlers = callEvHandlers, - .config_ev_handlers = configEvHandlers, - .pres_ev_handlers = presEvHandlers, -#ifdef RING_VIDEO - .video_ev_handlers = videoEvHandlers -#endif // RING_VIDEO + { // Video event handlers + DRing::EventHandlerKey::VIDEO, { + exportable_callback<VideoSignal::DeviceEvent>(bind(&DBusVideoManager::deviceEvent, videoM)), + exportable_callback<VideoSignal::DecodingStarted>(bind(&DBusVideoManager::startedDecoding, videoM, _1, _2, _3, _4, _5)), + exportable_callback<VideoSignal::DecodingStopped>(bind(&DBusVideoManager::stoppedDecoding, videoM, _1, _2, _3)), + } + }, +#endif }; // Initialize now - return ring_init(&evHandlers, static_cast<ring_init_flag>(sflphFlags)); + return (unsigned)DRing::init(evHandlers, static_cast<DRing::InitFlag>(sflphFlags)); } -void DBusClient::finiLibrary() +void +DBusClient::finiLibrary() noexcept { - ring_fini(); + DRing::fini(); } -int DBusClient::event_loop() +int +DBusClient::event_loop() noexcept { try { dispatcher_->enter(); - } catch (const DBus::Error &err) { + } catch (const DBus::Error& err) { std::cerr << "quitting: " << err.name() << ": " << err.what() << std::endl; return 1; - } catch (const std::exception &err) { + } catch (const std::exception& err) { std::cerr << "quitting: " << err.what() << std::endl; return 1; } @@ -232,16 +214,17 @@ int DBusClient::event_loop() return 0; } -int DBusClient::exit() +int +DBusClient::exit() noexcept { try { dispatcher_->leave(); timeout_->expired = new EventCallback([] {}); finiLibrary(); - } catch (const DBus::Error &err) { + } catch (const DBus::Error& err) { std::cerr << "quitting: " << err.name() << ": " << err.what() << std::endl; return 1; - } catch (const std::exception &err) { + } catch (const std::exception& err) { std::cerr << "quitting: " << err.what() << std::endl; return 1; } diff --git a/daemon/bin/dbus/dbusclient.h b/daemon/bin/dbus/dbusclient.h index 0aedcae9c2a96d5ee70d8aef9052f20e48a388a9..21bd0e658e0a89ac9537905be71044f21baef41b 100644 --- a/daemon/bin/dbus/dbusclient.h +++ b/daemon/bin/dbus/dbusclient.h @@ -1,6 +1,7 @@ /* * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +33,6 @@ #define __DBUSCLIENT_H__ #include "dring.h" -#include "noncopyable.h" class DBusConfigurationManager; class DBusCallManager; @@ -54,26 +54,24 @@ class DBusClient { DBusClient(int sflphFlags, bool persistent); ~DBusClient(); - int event_loop(); - int exit(); + int event_loop() noexcept; + int exit() noexcept; private: - NON_COPYABLE(DBusClient); - int initLibrary(int sflphFlags); - void finiLibrary(); + void finiLibrary() noexcept; - DBusCallManager* callManager_; - DBusConfigurationManager* configurationManager_; + std::unique_ptr<DBus::BusDispatcher> dispatcher_; + std::unique_ptr<DBus::DefaultTimeout> timeout_; - DBusPresenceManager* presenceManager_; - DBusInstance* instanceManager_; - DBus::BusDispatcher* dispatcher_; + std::unique_ptr<DBusCallManager> callManager_; + std::unique_ptr<DBusConfigurationManager> configurationManager_; + std::unique_ptr<DBusPresenceManager> presenceManager_; + std::unique_ptr<DBusInstance> instanceManager_; #ifdef RING_VIDEO - DBusVideoManager *videoManager_; + std::unique_ptr<DBusVideoManager> videoManager_; #endif - DBus::DefaultTimeout *timeout_; }; #endif diff --git a/daemon/bin/dbus/dbusconfigurationmanager.cpp b/daemon/bin/dbus/dbusconfigurationmanager.cpp index 614c56a3b0b04a21a49f2b382a698fa6f2a89cec..9e755763edd4a4fea13d2c5977003ec65f9a1e39 100644 --- a/daemon/bin/dbus/dbusconfigurationmanager.cpp +++ b/daemon/bin/dbus/dbusconfigurationmanager.cpp @@ -27,342 +27,419 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ -#include <iostream> -#include "dring.h" #include "dbusconfigurationmanager.h" +#include "configurationmanager_interface.h" + +#include "media/audio/audiolayer.h" DBusConfigurationManager::DBusConfigurationManager(DBus::Connection& connection) : DBus::ObjectAdaptor(connection, "/cx/ring/Ring/ConfigurationManager") -{ -} +{} -std::map<std::string, std::string> DBusConfigurationManager::getAccountDetails(const std::string& accountID) +auto +DBusConfigurationManager::getAccountDetails(const std::string& accountID) -> decltype(DRing::getAccountDetails(accountID)) { - return ring_config_get_account_details(accountID); + return DRing::getAccountDetails(accountID); } -std::map<std::string, std::string> DBusConfigurationManager::getVolatileAccountDetails(const std::string& accountID) +auto +DBusConfigurationManager::getVolatileAccountDetails(const std::string& accountID) -> decltype(DRing::getVolatileAccountDetails(accountID)) { - return ring_config_get_volatile_account_details(accountID); + return DRing::getVolatileAccountDetails(accountID); } -void DBusConfigurationManager::setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details) +void +DBusConfigurationManager::setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details) { - ring_config_set_account_details(accountID, details); + DRing::setAccountDetails(accountID, details); } -std::map<std::string, std::string> DBusConfigurationManager::getAccountTemplate() +auto +DBusConfigurationManager::getAccountTemplate() -> decltype(DRing::getAccountTemplate()) { - return ring_config_get_account_template(); + return DRing::getAccountTemplate(); } -std::string DBusConfigurationManager::addAccount(const std::map< std::string, std::string >& details) +auto +DBusConfigurationManager::addAccount(const std::map<std::string, std::string>& details) -> decltype(DRing::addAccount(details)) { - return ring_config_add_account(details); + return DRing::addAccount(details); } -void DBusConfigurationManager::removeAccount(const std::string& accountID) +void +DBusConfigurationManager::removeAccount(const std::string& accountID) { - ring_config_remove_account(accountID); + DRing::removeAccount(accountID); } -std::vector< std::string > DBusConfigurationManager::getAccountList() +auto +DBusConfigurationManager::getAccountList() -> decltype(DRing::getAccountList()) { - return ring_config_get_account_list(); + return DRing::getAccountList(); } -void DBusConfigurationManager::sendRegister(const std::string& accountID, const bool& enable) +void +DBusConfigurationManager::sendRegister(const std::string& accountID, const bool& enable) { - ring_config_send_register(accountID, enable); + DRing::sendRegister(accountID, enable); } -void DBusConfigurationManager::registerAllAccounts(void) +void +DBusConfigurationManager::registerAllAccounts(void) { - ring_config_register_all_accounts(); + DRing::registerAllAccounts(); } -std::map< std::string, std::string > DBusConfigurationManager::getTlsSettingsDefault() +auto +DBusConfigurationManager::getTlsDefaultSettings() -> decltype(DRing::getTlsDefaultSettings()) { - return ring_config_get_tls_default_settings(); + return DRing::getTlsDefaultSettings(); } -std::vector< int32_t > DBusConfigurationManager::getAudioCodecList() +auto +DBusConfigurationManager::getAudioCodecList() -> decltype(DRing::getAudioCodecList()) { - return ring_config_get_audio_codec_list(); + return DRing::getAudioCodecList(); } -std::vector< std::string > DBusConfigurationManager::getSupportedTlsMethod() +auto +DBusConfigurationManager::getSupportedTlsMethod() -> decltype(DRing::getSupportedTlsMethod()) { - return ring_config_get_supported_tls_method(); + return DRing::getSupportedTlsMethod(); } -std::vector< std::string > DBusConfigurationManager::getSupportedCiphers(const std::string& accountID) +auto +DBusConfigurationManager::getSupportedCiphers(const std::string& accountID) -> decltype(DRing::getSupportedCiphers(accountID)) { - return ring_config_get_supported_ciphers(accountID); + return DRing::getSupportedCiphers(accountID); } -std::vector< std::string > DBusConfigurationManager::getAudioCodecDetails(const int32_t& payload) +auto +DBusConfigurationManager::getAudioCodecDetails(const int32_t& payload) -> decltype(DRing::getAudioCodecDetails(payload)) { - return ring_config_get_audio_codec_details(payload); + return DRing::getAudioCodecDetails(payload); } -std::vector< int32_t > DBusConfigurationManager::getActiveAudioCodecList(const std::string& accountID) +auto +DBusConfigurationManager::getActiveAudioCodecList(const std::string& accountID) -> decltype(DRing::getActiveAudioCodecList(accountID)) { - return ring_config_get_active_audio_codec_list(accountID); + return DRing::getActiveAudioCodecList(accountID); } -void DBusConfigurationManager::setActiveAudioCodecList(const std::vector< std::string >& list, const std::string& accountID) +void +DBusConfigurationManager::setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID) { - ring_config_set_active_audio_codec_list(list, accountID); + DRing::setActiveAudioCodecList(list, accountID); } -std::vector< std::string > DBusConfigurationManager::getAudioPluginList() +auto +DBusConfigurationManager::getAudioPluginList() -> decltype(DRing::getAudioPluginList()) { - return ring_config_get_audio_plugin_list(); + return DRing::getAudioPluginList(); } -void DBusConfigurationManager::setAudioPlugin(const std::string& audioPlugin) +void +DBusConfigurationManager::setAudioPlugin(const std::string& audioPlugin) { - ring_config_set_audio_plugin(audioPlugin); + DRing::setAudioPlugin(audioPlugin); } -std::vector< std::string > DBusConfigurationManager::getAudioOutputDeviceList() +auto +DBusConfigurationManager::getAudioOutputDeviceList() -> decltype(DRing::getAudioOutputDeviceList()) { - return ring_config_get_audio_output_device_list(); + return DRing::getAudioOutputDeviceList(); } -void DBusConfigurationManager::setAudioOutputDevice(const int32_t& index) +void +DBusConfigurationManager::setAudioOutputDevice(const int32_t& index) { - ring_config_set_audio_output_device(index); + DRing::setAudioOutputDevice(index); } -void DBusConfigurationManager::setAudioInputDevice(const int32_t& index) +void +DBusConfigurationManager::setAudioInputDevice(const int32_t& index) { - ring_config_set_audio_input_device(index); + DRing::setAudioInputDevice(index); } -void DBusConfigurationManager::setAudioRingtoneDevice(const int32_t& index) +void +DBusConfigurationManager::setAudioRingtoneDevice(const int32_t& index) { - ring_config_set_audio_ringtone_device(index); + DRing::setAudioRingtoneDevice(index); } -std::vector< std::string > DBusConfigurationManager::getAudioInputDeviceList() +auto +DBusConfigurationManager::getAudioInputDeviceList() -> decltype(DRing::getAudioInputDeviceList()) { - return ring_config_get_audio_input_device_list(); + return DRing::getAudioInputDeviceList(); } -std::vector< std::string > DBusConfigurationManager::getCurrentAudioDevicesIndex() +auto +DBusConfigurationManager::getCurrentAudioDevicesIndex() -> decltype(DRing::getCurrentAudioDevicesIndex()) { - return ring_config_get_current_audio_devices_index(); + return DRing::getCurrentAudioDevicesIndex(); } -int32_t DBusConfigurationManager::getAudioInputDeviceIndex(const std::string& name) +auto +DBusConfigurationManager::getAudioInputDeviceIndex(const std::string& name) -> decltype(DRing::getAudioInputDeviceIndex(name)) { - return ring_config_get_audio_input_device_index(name); + return DRing::getAudioInputDeviceIndex(name); } -int32_t DBusConfigurationManager::getAudioOutputDeviceIndex(const std::string& name) +auto +DBusConfigurationManager::getAudioOutputDeviceIndex(const std::string& name) -> decltype(DRing::getAudioOutputDeviceIndex(name)) { - return ring_config_get_audio_output_device_index(name); + return DRing::getAudioOutputDeviceIndex(name); } -std::string DBusConfigurationManager::getCurrentAudioOutputPlugin() +auto +DBusConfigurationManager::getCurrentAudioOutputPlugin() -> decltype(DRing::getCurrentAudioOutputPlugin()) { - return ring_config_get_current_audio_output_plugin(); + return DRing::getCurrentAudioOutputPlugin(); } -bool DBusConfigurationManager::getNoiseSuppressState() +auto +DBusConfigurationManager::getNoiseSuppressState() -> decltype(DRing::getNoiseSuppressState()) { - return ring_config_get_noise_suppress_state(); + return DRing::getNoiseSuppressState(); } -void DBusConfigurationManager::setNoiseSuppressState(const bool& state) +void +DBusConfigurationManager::setNoiseSuppressState(const bool& state) { - ring_config_set_noise_suppress_state(state); + DRing::setNoiseSuppressState(state); } -bool DBusConfigurationManager::isAgcEnabled() +auto +DBusConfigurationManager::isAgcEnabled() -> decltype(DRing::isAgcEnabled()) { - return ring_config_is_agc_enabled(); + return DRing::isAgcEnabled(); } -void DBusConfigurationManager::setAgcState(const bool& enabled) +void +DBusConfigurationManager::setAgcState(const bool& enabled) { - ring_config_enable_agc(enabled); + DRing::setAgcState(enabled); } -void DBusConfigurationManager::muteDtmf(const bool& mute) +void +DBusConfigurationManager::muteDtmf(const bool& mute) { - ring_config_mute_dtmf(mute); + DRing::muteDtmf(mute); } -bool DBusConfigurationManager::isDtmfMuted() +auto +DBusConfigurationManager::isDtmfMuted() -> decltype(DRing::isDtmfMuted()) { - return ring_config_is_dtmf_muted(); + return DRing::isDtmfMuted(); } -bool DBusConfigurationManager::isCaptureMuted() +auto +DBusConfigurationManager::isCaptureMuted() -> decltype(DRing::isCaptureMuted()) { - return ring_config_is_capture_muted(); + return DRing::isCaptureMuted(); } -void DBusConfigurationManager::muteCapture(const bool& mute) +void +DBusConfigurationManager::muteCapture(const bool& mute) { - ring_config_mute_capture(mute); + DRing::muteCapture(mute); } -bool DBusConfigurationManager::isPlaybackMuted() +auto +DBusConfigurationManager::isPlaybackMuted() -> decltype(DRing::isPlaybackMuted()) { - return ring_config_is_playback_muted(); + return DRing::isPlaybackMuted(); } -void DBusConfigurationManager::mutePlayback(const bool& mute) +void +DBusConfigurationManager::mutePlayback(const bool& mute) { - ring_config_mute_playback(mute); + DRing::mutePlayback(mute); } -std::string DBusConfigurationManager::getAudioManager() +auto +DBusConfigurationManager::getAudioManager() -> decltype(DRing::getAudioManager()) { - return ring_config_get_audio_manager(); + return DRing::getAudioManager(); } -bool DBusConfigurationManager::setAudioManager(const std::string& api) +auto +DBusConfigurationManager::setAudioManager(const std::string& api) -> decltype(DRing::setAudioManager(api)) { - return ring_config_set_audio_manager(api); + return DRing::setAudioManager(api); } -std::vector<std::string> DBusConfigurationManager::getSupportedAudioManagers() +//FIXME +std::vector<std::string> +DBusConfigurationManager::getSupportedAudioManagers() { - return ring_config_get_supported_audio_managers(); + return { +#if HAVE_ALSA + ALSA_API_STR, +#endif +#if HAVE_PULSE + PULSEAUDIO_API_STR, +#endif +#if HAVE_JACK + JACK_API_STR, +#endif + }; } -int32_t DBusConfigurationManager::isIax2Enabled() +auto +DBusConfigurationManager::isIax2Enabled() -> decltype(DRing::isIax2Enabled()) { - return ring_config_is_iax2_enabled(); + return DRing::isIax2Enabled(); } -std::string DBusConfigurationManager::getRecordPath() +auto +DBusConfigurationManager::getRecordPath() -> decltype(DRing::getRecordPath()) { - return ring_config_get_record_path(); + return DRing::getRecordPath(); } -void DBusConfigurationManager::setRecordPath(const std::string& recPath) +void +DBusConfigurationManager::setRecordPath(const std::string& recPath) { - ring_config_set_record_path(recPath); + DRing::setRecordPath(recPath); } -bool DBusConfigurationManager::getIsAlwaysRecording() +auto +DBusConfigurationManager::getIsAlwaysRecording() -> decltype(DRing::getIsAlwaysRecording()) { - return ring_config_is_always_recording(); + return DRing::getIsAlwaysRecording(); } -void DBusConfigurationManager::setIsAlwaysRecording(const bool& rec) +void +DBusConfigurationManager::setIsAlwaysRecording(const bool& rec) { - ring_config_set_always_recording(rec); + DRing::setIsAlwaysRecording(rec); } -void DBusConfigurationManager::setHistoryLimit(const int32_t& days) +void +DBusConfigurationManager::setHistoryLimit(const int32_t& days) { - ring_config_set_history_limit(days); + DRing::setHistoryLimit(days); } -int32_t DBusConfigurationManager::getHistoryLimit() +auto +DBusConfigurationManager::getHistoryLimit() -> decltype(DRing::getHistoryLimit()) { - return ring_config_get_history_limit(); + return DRing::getHistoryLimit(); } -void DBusConfigurationManager::clearHistory() +void +DBusConfigurationManager::clearHistory() { - ring_config_clear_history(); + DRing::clearHistory(); } -void DBusConfigurationManager::setAccountsOrder(const std::string& order) +void +DBusConfigurationManager::setAccountsOrder(const std::string& order) { - ring_config_set_accounts_order(order); + DRing::setAccountsOrder(order); } -std::map<std::string, std::string> DBusConfigurationManager::getHookSettings() +auto +DBusConfigurationManager::getHookSettings() -> decltype(DRing::getHookSettings()) { - return ring_config_get_hook_settings(); + return DRing::getHookSettings(); } -void DBusConfigurationManager::setHookSettings(const std::map<std::string, std::string>& settings) +void +DBusConfigurationManager::setHookSettings(const std::map<std::string, std::string>& settings) { - ring_config_set_hook_settings(settings); + DRing::setHookSettings(settings); } -std::vector<std::map<std::string, std::string> > DBusConfigurationManager::getHistory() +auto +DBusConfigurationManager::getHistory() -> decltype(DRing::getHistory()) { - return ring_config_get_history(); + return DRing::getHistory(); } -std::map<std::string, std::string> DBusConfigurationManager::getTlsSettings() +auto +DBusConfigurationManager::getTlsSettings() -> decltype(DRing::getTlsSettings()) { - return ring_config_get_tls_settings(); + return DRing::getTlsSettings(); } -std::map<std::string, std::string> DBusConfigurationManager::validateCertificate(const std::string& accountId, const std::string& certificate, const std::string& privateKey) +auto +DBusConfigurationManager::validateCertificate(const std::string& accountId, const std::string& certificate, const std::string& privateKey) -> decltype(DRing::validateCertificate(accountId, certificate, privateKey)) { - return ring_config_validate_certificate(accountId, certificate, privateKey); + return DRing::validateCertificate(accountId, certificate, privateKey); } -std::map<std::string, std::string> DBusConfigurationManager::getCertificateDetails(const std::string& certificate) +auto +DBusConfigurationManager::getCertificateDetails(const std::string& certificate) -> decltype(DRing::getCertificateDetails(certificate)) { - return ring_config_get_certificate_details(certificate); + return DRing::getCertificateDetails(certificate); } -void DBusConfigurationManager::setTlsSettings(const std::map< std::string, std::string >& details) +void +DBusConfigurationManager::setTlsSettings(const std::map<std::string, std::string>& details) { - ring_config_set_tls_settings(details); + DRing::setTlsSettings(details); } -std::map< std::string, std::string > DBusConfigurationManager::getIp2IpDetails() +auto +DBusConfigurationManager::getIp2IpDetails() -> decltype(DRing::getIp2IpDetails()) { - return ring_config_get_ip2ip_details(); + return DRing::getIp2IpDetails(); } -std::vector< std::map< std::string, std::string > > DBusConfigurationManager::getCredentials(const std::string& accountID) +auto +DBusConfigurationManager::getCredentials(const std::string& accountID) -> decltype(DRing::getCredentials(accountID)) { - return ring_config_get_credentials(accountID); + return DRing::getCredentials(accountID); } -void DBusConfigurationManager::setCredentials(const std::string& accountID, const std::vector< std::map< std::string, std::string > >& details) +void +DBusConfigurationManager::setCredentials(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details) { - ring_config_set_credentials(accountID, details); + DRing::setCredentials(accountID, details); } -std::string DBusConfigurationManager::getAddrFromInterfaceName(const std::string& interface) +auto +DBusConfigurationManager::getAddrFromInterfaceName(const std::string& interface) -> decltype(DRing::getAddrFromInterfaceName(interface)) { - return ring_config_get_addr_from_interface_name(interface); + return DRing::getAddrFromInterfaceName(interface); } -std::vector<std::string> DBusConfigurationManager::getAllIpInterface() +auto +DBusConfigurationManager::getAllIpInterface() -> decltype(DRing::getAllIpInterface()) { - return ring_config_get_all_ip_interface(); + return DRing::getAllIpInterface(); } -std::vector<std::string> DBusConfigurationManager::getAllIpInterfaceByName() +auto +DBusConfigurationManager::getAllIpInterfaceByName() -> decltype(DRing::getAllIpInterfaceByName()) { - return ring_config_get_all_ip_interface_by_name(); + return DRing::getAllIpInterfaceByName(); } -std::map<std::string, std::string> DBusConfigurationManager::getShortcuts() +auto +DBusConfigurationManager::getShortcuts() -> decltype(DRing::getShortcuts()) { - return ring_config_get_shortcuts(); + return DRing::getShortcuts(); } -void DBusConfigurationManager::setShortcuts(const std::map<std::string, std::string> &shortcutsMap) +void +DBusConfigurationManager::setShortcuts(const std::map<std::string, std::string> &shortcutsMap) { - ring_config_set_shortcuts(shortcutsMap); + DRing::setShortcuts(shortcutsMap); } -void DBusConfigurationManager::setVolume(const std::string& device, const double& value) +void +DBusConfigurationManager::setVolume(const std::string& device, const double& value) { - ring_config_set_volume(device, value); + DRing::setVolume(device, value); } -double DBusConfigurationManager::getVolume(const std::string& device) +auto +DBusConfigurationManager::getVolume(const std::string& device) -> decltype(DRing::getVolume(device)) { - return ring_config_get_volume(device); + return DRing::getVolume(device); } diff --git a/daemon/bin/dbus/dbusconfigurationmanager.h b/daemon/bin/dbus/dbusconfigurationmanager.h index 39465eda05bec9905f9fbe3ba56c2f78e4360d44..940e6857966ffeef656691e66231be6349086ed4 100644 --- a/daemon/bin/dbus/dbusconfigurationmanager.h +++ b/daemon/bin/dbus/dbusconfigurationmanager.h @@ -56,8 +56,6 @@ #pragma GCC diagnostic warning "-Wunused-but-set-variable" #endif -#include <stdexcept> - class DBusConfigurationManager : public cx::ring::Ring::ConfigurationManager_adaptor, public DBus::IntrospectableAdaptor, @@ -67,30 +65,30 @@ class DBusConfigurationManager : DBusConfigurationManager(DBus::Connection& connection); // Methods - std::map< std::string, std::string > getAccountDetails(const std::string& accountID); + std::map<std::string, std::string> getAccountDetails(const std::string& accountID); std::map<std::string, std::string> getVolatileAccountDetails(const std::string& accountID); - void setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details); + void setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details); std::map<std::string, std::string> getAccountTemplate(); - std::string addAccount(const std::map< std::string, std::string >& details); + std::string addAccount(const std::map<std::string, std::string>& details); void removeAccount(const std::string& accoundID); - std::vector< std::string > getAccountList(); + std::vector<std::string> getAccountList(); void sendRegister(const std::string& accoundID, const bool& enable); void registerAllAccounts(void); - std::map< std::string, std::string > getTlsSettingsDefault(); - std::vector< std::string > getSupportedCiphers(const std::string& accountID); - std::vector< int32_t > getAudioCodecList(); - std::vector< std::string > getSupportedTlsMethod(); - std::vector< std::string > getAudioCodecDetails(const int32_t& payload); - std::vector< int32_t > getActiveAudioCodecList(const std::string& accountID); - void setActiveAudioCodecList(const std::vector< std::string >& list, const std::string& accountID); - std::vector< std::string > getAudioPluginList(); + std::map<std::string, std::string> getTlsDefaultSettings(); + std::vector<std::string> getSupportedCiphers(const std::string& accountID); + std::vector<int32_t> getAudioCodecList(); + std::vector<std::string> getSupportedTlsMethod(); + std::vector<std::string> getAudioCodecDetails(const int32_t& payload); + std::vector<int32_t> getActiveAudioCodecList(const std::string& accountID); + void setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID); + std::vector<std::string> getAudioPluginList(); void setAudioPlugin(const std::string& audioPlugin); - std::vector< std::string > getAudioOutputDeviceList(); + std::vector<std::string> getAudioOutputDeviceList(); void setAudioOutputDevice(const int32_t& index); void setAudioInputDevice(const int32_t& index); void setAudioRingtoneDevice(const int32_t& index); - std::vector< std::string > getAudioInputDeviceList(); - std::vector< std::string > getCurrentAudioDevicesIndex(); + std::vector<std::string> getAudioInputDeviceList(); + std::vector<std::string> getCurrentAudioDevicesIndex(); int32_t getAudioInputDeviceIndex(const std::string& name); int32_t getAudioOutputDeviceIndex(const std::string& name); std::string getCurrentAudioOutputPlugin(); @@ -104,7 +102,6 @@ class DBusConfigurationManager : void muteCapture(const bool& mute); bool isPlaybackMuted(); void mutePlayback(const bool& mute); - std::map<std::string, std::string> getRingtoneList(); std::string getAudioManager(); bool setAudioManager(const std::string& api); std::vector<std::string> getSupportedAudioManagers(); @@ -119,12 +116,12 @@ class DBusConfigurationManager : void setAccountsOrder(const std::string& order); std::map<std::string, std::string> getHookSettings(); void setHookSettings(const std::map<std::string, std::string>& settings); - std::vector<std::map<std::string, std::string> > getHistory(); + std::vector<std::map<std::string, std::string>> getHistory(); std::map<std::string, std::string> getTlsSettings(); - void setTlsSettings(const std::map< std::string, std::string >& details); - std::map< std::string, std::string > getIp2IpDetails(); - std::vector< std::map< std::string, std::string > > getCredentials(const std::string& accountID); - void setCredentials(const std::string& accountID, const std::vector< std::map< std::string, std::string > >& details); + void setTlsSettings(const std::map<std::string, std::string>& details); + std::map<std::string, std::string> getIp2IpDetails(); + std::vector<std::map<std::string, std::string>> getCredentials(const std::string& accountID); + void setCredentials(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details); std::string getAddrFromInterfaceName(const std::string& interface); std::vector<std::string> getAllIpInterface(); std::vector<std::string> getAllIpInterfaceByName(); @@ -132,8 +129,7 @@ class DBusConfigurationManager : void setShortcuts(const std::map<std::string, std::string> &shortcutsMap); void setVolume(const std::string& device, const double& value); double getVolume(const std::string& device); - std::map<std::string, std::string> validateCertificate(const std::string& accountId, - const std::string& certificate, const std::string& privateKey); + std::map<std::string, std::string> validateCertificate(const std::string& accountId, const std::string& certificate, const std::string& privateKey); std::map<std::string, std::string> getCertificateDetails(const std::string& certificate); }; diff --git a/daemon/bin/dbus/dbusinstance.cpp b/daemon/bin/dbus/dbusinstance.cpp index 87f81b0cdf87bb2af704927985774f5f2580979b..8aedbc307e6f384653fa3990579692b1b2924332 100644 --- a/daemon/bin/dbus/dbusinstance.cpp +++ b/daemon/bin/dbus/dbusinstance.cpp @@ -31,10 +31,10 @@ #include "dbusinstance.h" DBusInstance::DBusInstance(DBus::Connection& connection, - const OnNoMoreClientFunc& onNoMoreClientFunc) : - DBus::ObjectAdaptor(connection, "/cx/ring/Ring/Instance"), - onNoMoreClientFunc_(onNoMoreClientFunc), - count_(0) + const OnNoMoreClientFunc& onNoMoreClientFunc) + : DBus::ObjectAdaptor(connection, "/cx/ring/Ring/Instance") + , onNoMoreClientFunc_(onNoMoreClientFunc) + , count_(0) {} void diff --git a/daemon/bin/dbus/dbusinstance.h b/daemon/bin/dbus/dbusinstance.h index 2ad3e14c76375708e7776d2181ebe7366ed9c65b..b410c21a7eabb0096e3a4a2b5b55f1aca0ce0dfd 100644 --- a/daemon/bin/dbus/dbusinstance.h +++ b/daemon/bin/dbus/dbusinstance.h @@ -53,9 +53,8 @@ class DBusInstance : public DBus::ObjectAdaptor { public: - typedef std::function<void ()> OnNoMoreClientFunc; + typedef std::function<void()> OnNoMoreClientFunc; - public: DBusInstance(DBus::Connection& connection, const OnNoMoreClientFunc& onNoMoreClientFunc); diff --git a/daemon/bin/dbus/dbuspresencemanager.cpp b/daemon/bin/dbus/dbuspresencemanager.cpp index 14f3246830a61f5cbb63d26482f3421938072298..21a838e348883e39fb3f8b72ec13746d0aa68afa 100644 --- a/daemon/bin/dbus/dbuspresencemanager.cpp +++ b/daemon/bin/dbus/dbuspresencemanager.cpp @@ -27,36 +27,40 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ -#include "dring.h" #include "dbuspresencemanager.h" +#include "presencemanager_interface.h" DBusPresenceManager::DBusPresenceManager(DBus::Connection& connection) : DBus::ObjectAdaptor(connection, "/cx/ring/Ring/PresenceManager") -{ -} +{} -void DBusPresenceManager::publish(const std::string& accountID, const bool& status, const std::string& note) +void +DBusPresenceManager::publish(const std::string& accountID, const bool& status, const std::string& note) { - ring_pres_publish(accountID, status, note); + DRing::publish(accountID, status, note); } -void DBusPresenceManager::answerServerRequest(const std::string& uri, const bool& flag) +void +DBusPresenceManager::answerServerRequest(const std::string& uri, const bool& flag) { - ring_pres_answer_server_request(uri, flag); + DRing::answerServerRequest(uri, flag); } -void DBusPresenceManager::subscribeBuddy(const std::string& accountID, const std::string& uri, const bool& flag) +void +DBusPresenceManager::subscribeBuddy(const std::string& accountID, const std::string& uri, const bool& flag) { - ring_pres_subscribe_buddy(accountID, uri, flag); + DRing::subscribeBuddy(accountID, uri, flag); } -std::vector<std::map<std::string, std::string> > DBusPresenceManager::getSubscriptions(const std::string& accountID) +auto +DBusPresenceManager::getSubscriptions(const std::string& accountID) -> decltype(DRing::getSubscriptions(accountID)) { - return ring_pres_get_subscriptions(accountID); + return DRing::getSubscriptions(accountID); } -void DBusPresenceManager::setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris) +void +DBusPresenceManager::setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris) { - ring_pres_set_subscriptions(accountID, uris); + DRing::setSubscriptions(accountID, uris); } diff --git a/daemon/bin/dbus/dbuspresencemanager.h b/daemon/bin/dbus/dbuspresencemanager.h index fce1283f48fee6fa88cc301f7728363f914637d8..9b9a8dbe6632bdc8e19b2fe4c881eb4442372c2b 100644 --- a/daemon/bin/dbus/dbuspresencemanager.h +++ b/daemon/bin/dbus/dbuspresencemanager.h @@ -53,8 +53,6 @@ #pragma GCC diagnostic warning "-Wunused-but-set-variable" #endif -#include <stdexcept> - class DBusPresenceManager : public cx::ring::Ring::PresenceManager_adaptor, public DBus::IntrospectableAdaptor, @@ -67,7 +65,7 @@ class DBusPresenceManager : void publish(const std::string& accountID, const bool& status, const std::string& note); void answerServerRequest(const std::string& uri, const bool& flag); void subscribeBuddy(const std::string& accountID, const std::string& uri, const bool& flag); - std::vector<std::map<std::string, std::string> > getSubscriptions(const std::string& accountID); + std::vector<std::map<std::string, std::string>> getSubscriptions(const std::string& accountID); void setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris); }; diff --git a/daemon/bin/dbus/dbusvideomanager.cpp b/daemon/bin/dbus/dbusvideomanager.cpp index 16596813b08ef3d50b591061db7c87f9c374f40d..e69e1e4a15c27f25fc51dd7eb00ee1ca29b46951 100644 --- a/daemon/bin/dbus/dbusvideomanager.cpp +++ b/daemon/bin/dbus/dbusvideomanager.cpp @@ -27,76 +27,90 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ -#include "dring.h" #include "dbusvideomanager.h" +#include "managerimpl.h" +#include "manager.h" +#include "client/videomanager.h" DBusVideoManager::DBusVideoManager(DBus::Connection& connection) : DBus::ObjectAdaptor(connection, "/cx/ring/Ring/VideoManager") -{ -} +{} -std::vector<std::map<std::string, std::string>> DBusVideoManager::getCodecs(const std::string& accountID) +auto +DBusVideoManager::getCodecs(const std::string& accountID) -> decltype(DRing::getCodecs(accountID)) { - return ring_video_get_codecs(accountID); + return DRing::getCodecs(accountID); } -void DBusVideoManager::setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string> > &details) +void +DBusVideoManager::setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details) { - ring_video_set_codecs(accountID, details); + DRing::setCodecs(accountID, details); } -std::vector<std::string> DBusVideoManager::getDeviceList() +auto +DBusVideoManager::getDeviceList() -> decltype(DRing::getDeviceList()) { - return ring_video_get_device_list(); + return DRing::getDeviceList(); } -std::map<std::string, std::map<std::string, std::vector<std::string>>> DBusVideoManager::getCapabilities(const std::string& name) +auto +DBusVideoManager::getCapabilities(const std::string& name) -> decltype(DRing::getCapabilities(name)) { - return ring_video_get_capabilities(name); + return DRing::getCapabilities(name); } -std::map<std::string, std::string> DBusVideoManager::getSettings(const std::string& name) +auto +DBusVideoManager::getSettings(const std::string& name) -> decltype(DRing::getSettings(name)) { - return ring_video_get_settings(name); + return DRing::getSettings(name); } -void DBusVideoManager::applySettings(const std::string& name, const std::map<std::string, std::string>& settings) +void +DBusVideoManager::applySettings(const std::string& name, const std::map<std::string, std::string>& settings) { - ring_video_apply_settings(name, settings); + DRing::applySettings(name, settings); } -void DBusVideoManager::setDefaultDevice(const std::string &dev) +void +DBusVideoManager::setDefaultDevice(const std::string& dev) { - ring_video_set_default_device(dev); + DRing::setDefaultDevice(dev); } -std::string DBusVideoManager::getDefaultDevice() +auto +DBusVideoManager::getDefaultDevice() -> decltype(DRing::getDefaultDevice()) { - return ring_video_get_default_device(); + return DRing::getDefaultDevice(); } -std::string DBusVideoManager::getCurrentCodecName(const std::string &callID) +auto +DBusVideoManager::getCurrentCodecName(const std::string& callID) -> decltype(DRing::getCurrentCodecName(callID)) { - return ring_video_get_current_codec_name(callID); + return DRing::getCurrentCodecName(callID); } -void DBusVideoManager::startCamera() +void +DBusVideoManager::startCamera() { - ring_video_start_camera(); + DRing::startCamera(); } -void DBusVideoManager::stopCamera() +void +DBusVideoManager::stopCamera() { - ring_video_stop_camera(); + DRing::stopCamera(); } -bool DBusVideoManager::switchInput(const std::string& resource) +auto +DBusVideoManager::switchInput(const std::string& resource) -> decltype(DRing::switchInput(resource)) { - return ring_video_switch_input(resource); + return DRing::switchInput(resource); } -bool DBusVideoManager::hasCameraStarted() +auto +DBusVideoManager::hasCameraStarted() -> decltype(DRing::hasCameraStarted()) { - return ring_video_is_camera_started(); + return DRing::hasCameraStarted(); } diff --git a/daemon/bin/dbus/dbusvideomanager.h b/daemon/bin/dbus/dbusvideomanager.h index 2d499c350b2e656468623b726ff1e9c1ef93633b..7d2d279804373f423b2143a15039f84e817c1ba0 100644 --- a/daemon/bin/dbus/dbusvideomanager.h +++ b/daemon/bin/dbus/dbusvideomanager.h @@ -52,26 +52,25 @@ #pragma GCC diagnostic warning "-Wunused-but-set-variable" #endif -#include <stdexcept> - class DBusVideoManager : public cx::ring::Ring::VideoManager_adaptor, public DBus::IntrospectableAdaptor, public DBus::ObjectAdaptor { + public: DBusVideoManager(DBus::Connection& connection); // Methods std::vector<std::map<std::string, std::string>> getCodecs(const std::string& accountID); - void setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string> > &details); + void setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details); std::vector<std::string> getDeviceList(); std::map<std::string, std::map<std::string, std::vector<std::string>>> getCapabilities(const std::string& name); std::map<std::string, std::string> getSettings(const std::string& name); void applySettings(const std::string& name, const std::map<std::string, std::string>& settings); - void setDefaultDevice(const std::string &dev); + void setDefaultDevice(const std::string& dev); std::string getDefaultDevice(); - std::string getCurrentCodecName(const std::string &callID); + std::string getCurrentCodecName(const std::string& callID); void startCamera(); void stopCamera(); bool switchInput(const std::string& resource); diff --git a/daemon/bin/main.cpp b/daemon/bin/main.cpp index 3a1c29bde1d665b46ebb2e42b662e8920a4e049a..83a40182c8bfc8a533e32a5072a43fab6b5bb57f 100644 --- a/daemon/bin/main.cpp +++ b/daemon/bin/main.cpp @@ -41,14 +41,17 @@ static int ringFlags = 0; static std::unique_ptr<DBusClient> dbusClient; -static void print_title() +static void +print_title() { - std::cout << "Ring Daemon " << ring_version() << - ", by Savoir-Faire Linux 2004-2015" << std::endl << - "http://www.sflphone.org/" << std::endl; + std::cout + << "Ring Daemon " << DRing::version() + << ", by Savoir-Faire Linux 2004-2015" << std::endl + << "http://www.sflphone.org/" << std::endl; } -static void print_usage() +static void +print_usage() { std::cout << std::endl << "-c, --console \t- Log in console (instead of syslog)" << std::endl << @@ -60,12 +63,9 @@ static void print_usage() // Parse command line arguments, setting debug options or printing a help // message accordingly. // returns true if we should quit (i.e. help was printed), false otherwise -static bool parse_args(int argc, char *argv[], bool &persistent) +static bool +parse_args(int argc, char *argv[], bool& persistent) { - int consoleFlag = false; - int debugFlag = false; - int helpFlag = false; - int versionFlag = false; static const struct option long_options[] = { /* These options set a flag. */ {"debug", no_argument, NULL, 'd'}, @@ -76,16 +76,16 @@ static bool parse_args(int argc, char *argv[], bool &persistent) {0, 0, 0, 0} /* Sentinel */ }; + int consoleFlag = false; + int debugFlag = false; + int helpFlag = false; + int versionFlag = false; + while (true) { /* getopt_long stores the option index here. */ int option_index = 0; - int c = getopt_long(argc, argv, "dcphv", long_options, &option_index); - /* Detect the end of the options. */ - if (c == -1) - break; - - switch (c) { + switch (getopt_long(argc, argv, "dcphv", long_options, &option_index)) { case 'd': debugFlag = true; break; @@ -107,49 +107,51 @@ static bool parse_args(int argc, char *argv[], bool &persistent) versionFlag = true; break; + case -1: // end of the options default: break; } } - bool quit = false; if (helpFlag) { print_usage(); - quit = true; - } else if (versionFlag) { + return true; + } + + if (versionFlag) { // We've always print the title/version, so we can just exit - quit = true; - } else { - if (consoleFlag) { - ringFlags |= RING_FLAG_CONSOLE_LOG; - } - if (debugFlag) { - ringFlags |= RING_FLAG_DEBUG; - } + return true; } - return quit; + + if (consoleFlag) + ringFlags |= DRing::DRING_FLAG_CONSOLE_LOG; + + if (debugFlag) + ringFlags |= DRing::DRING_FLAG_DEBUG; + + return false; } -static int run() +static int +run() { - if (dbusClient) { + if (dbusClient) return dbusClient->event_loop(); - } - return 1; } -static void interrupt() +static void +interrupt() { - if (dbusClient) { + if (dbusClient) dbusClient->exit(); - } } -static void signal_handler(int code) +static void +signal_handler(int code) { std::cerr << "Caught signal " << strsignal(code) - << ", terminating..." << std::endl; + << ", terminating..." << std::endl; // Unset signal handlers signal(SIGHUP, SIG_DFL); @@ -159,13 +161,12 @@ static void signal_handler(int code) interrupt(); } -int main(int argc, char *argv []) +int +main(int argc, char *argv []) { - int ret; - // make a copy as we don't want to modify argv[0], copy it to a vector to // guarantee that memory is correctly managed/exception safe - std::string programName(argv[0]); + std::string programName {argv[0]}; std::vector<char> writable(programName.size() + 1); std::copy(programName.begin(), programName.end(), writable.begin()); @@ -179,13 +180,12 @@ int main(int argc, char *argv []) print_title(); bool persistent = false; - if (parse_args(argc, argv, persistent)) return 0; // initialize client/library try { - dbusClient = std::unique_ptr<DBusClient>(new DBusClient(ringFlags, persistent)); + dbusClient.reset(new DBusClient {ringFlags, persistent}); } catch (const std::exception& ex) { std::cerr << "One does not simply initialize the DBus client: " << ex.what() << std::endl; return 1; @@ -201,10 +201,5 @@ int main(int argc, char *argv []) std::cerr << "Warning: built with video support" << std::endl; #endif - ret = run(); - - // terminate client/library - dbusClient = nullptr; - - return ret; + return run(); } diff --git a/daemon/bin/osxmain.cpp b/daemon/bin/osxmain.cpp index f147f806036f8977dc1666592d57f480ac8a4fef..e0a24d966c077ada0280390aaa7f05fb2a95f8c3 100644 --- a/daemon/bin/osxmain.cpp +++ b/daemon/bin/osxmain.cpp @@ -37,18 +37,26 @@ #include <string> #include "dring.h" +#include "callmanager_interface.h" +#include "configurationmanager_interface.h" +#include "presencemanager_interface.h" +#ifdef RING_VIDEO +#include "videomanager_interface.h" +#endif #include "fileutils.h" -static int sflphFlags = 0; +static int ringFlags = 0; -static void print_title() +static void +print_title() { - std::cout << "Ring Daemon " << ring_version() << - ", by Savoir-Faire Linux 2004-2015" << std::endl << - "http://www.sflphone.org/" << std::endl; + std::cout << "Ring Daemon " << DRing::version() + << ", by Savoir-Faire Linux 2004-2015" << std::endl + << "http://www.sflphone.org/" << std::endl; } -static void print_usage() +static void +print_usage() { std::cout << std::endl << "-c, --console \t- Log in console (instead of syslog)" << std::endl << @@ -60,12 +68,9 @@ static void print_usage() // Parse command line arguments, setting debug options or printing a help // message accordingly. // returns true if we should quit (i.e. help was printed), false otherwise -static bool parse_args(int argc, char *argv[], bool &persistent) +static bool +parse_args(int argc, char *argv[], bool& persistent) { - int consoleFlag = false; - int debugFlag = false; - int helpFlag = false; - int versionFlag = false; static const struct option long_options[] = { /* These options set a flag. */ {"debug", no_argument, NULL, 'd'}, @@ -76,16 +81,16 @@ static bool parse_args(int argc, char *argv[], bool &persistent) {0, 0, 0, 0} /* Sentinel */ }; + int consoleFlag = false; + int debugFlag = false; + int helpFlag = false; + int versionFlag = false; + while (true) { /* getopt_long stores the option index here. */ int option_index = 0; - int c = getopt_long(argc, argv, "dcphv", long_options, &option_index); - - /* Detect the end of the options. */ - if (c == -1) - break; - switch (c) { + switch (getopt_long(argc, argv, "dcphv", long_options, &option_index)) { case 'd': debugFlag = true; break; @@ -107,86 +112,63 @@ static bool parse_args(int argc, char *argv[], bool &persistent) versionFlag = true; break; + case -1: // end of the options default: break; } } - bool quit = false; if (helpFlag) { print_usage(); - quit = true; - } else if (versionFlag) { + return true; + } + + if (versionFlag) { // We've always print the title/version, so we can just exit - quit = true; - } else { - if (consoleFlag) { - sflphFlags |= RING_FLAG_CONSOLE_LOG; - } - if (debugFlag) { - sflphFlags |= RING_FLAG_DEBUG; - } + return true; } - return quit; -} -void myOnIncomingCall(const std::string& acc_id, const std::string& call_id, const std::string& from) -{ - std::cout << std::endl << "INCOMING CALL!" << std::endl << - "Account: " << acc_id << - ", Id: " << call_id << - ", From: " << from << std::endl << std::endl; - - ring_call_accept(call_id); - ring_call_set_recording(call_id); - //ring_call_join_participant(call_id, "patate"); -} + if (consoleFlag) + ringFlags |= DRing::DRING_FLAG_CONSOLE_LOG; -static int osxTests() -{ - ring_ev_handlers evHandlers = { - .call_ev_handlers = { - .on_incoming_call = myOnIncomingCall - }, - .config_ev_handlers = {}, - .pres_ev_handlers = {} -#ifdef RING_VIDEO - ,.video_ev_handlers = {} -#endif - }; + if (debugFlag) + ringFlags |= DRing::DRING_FLAG_DEBUG; - ring_init(&evHandlers, static_cast<ring_init_flag>(sflphFlags)); + return false; +} - //ring_call_play_dtmf("0"); - //sleep(1); - //ring_call_play_dtmf("1"); - //sleep(1); +static int +osxTests() +{ + using SharedCallback = std::shared_ptr<DRing::CallbackWrapperBase>; - //ring_call_place("IP2IP", "patate", "127.0.0.1"); - //ring_call_set_recording("patate"); + DRing::init(std::map<DRing::EventHandlerKey, std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>>>(), + static_cast<DRing::InitFlag>(ringFlags)); while (true) { - ring_poll_events(); + DRing::poll_events(); sleep(1); } - ring_fini(); + DRing::fini(); } -static int run() +static int +run() { osxTests(); return 0; } -static void interrupt() -{ -} +static void +interrupt() +{} -static void signal_handler(int code) +static void +signal_handler(int code) { std::cerr << "Caught signal " << strsignal(code) - << ", terminating..." << std::endl; + << ", terminating..." << std::endl; // Unset signal handlers signal(SIGHUP, SIG_DFL); @@ -196,13 +178,12 @@ static void signal_handler(int code) interrupt(); } -int main(int argc, char *argv []) +int +main(int argc, char *argv []) { - int ret; - // make a copy as we don't want to modify argv[0], copy it to a vector to // guarantee that memory is correctly managed/exception safe - std::string programName(argv[0]); + std::string programName {argv[0]}; std::vector<char> writable(programName.size() + 1); std::copy(programName.begin(), programName.end(), writable.begin()); @@ -216,7 +197,6 @@ int main(int argc, char *argv []) print_title(); bool persistent = false; - if (parse_args(argc, argv, persistent)) return 0; @@ -230,7 +210,5 @@ int main(int argc, char *argv []) std::cerr << "Warning: built with video support" << std::endl; #endif - ret = run(); - - return ret; + return run(); } diff --git a/daemon/src/Makefile.am b/daemon/src/Makefile.am index f32f2ad5c52be427175b243e2af4f5f8246d66b2..5f1fe1d81253f64038228950545d5753d43c7d0c 100644 --- a/daemon/src/Makefile.am +++ b/daemon/src/Makefile.am @@ -137,4 +137,12 @@ libring_la_SOURCES = conference.cpp \ nobase_include_HEADERS= dring/dring.h \ dring/security_const.h \ + dring/callmanager_interface.h \ + dring/configurationmanager_interface.h \ + dring/presencemanager_interface.h \ dring/account_const.h + +if RING_VIDEO +nobase_include_HEADERS+= \ + dring/videomanager_interface.h +endif diff --git a/daemon/src/account.cpp b/daemon/src/account.cpp index fa8ce0b2a7eef4f3ec0b5d9539842c5beff08eeb..28c9cdfb26a15e06a5c1d2456ffd34dd1eb09dc3 100644 --- a/daemon/src/account.cpp +++ b/daemon/src/account.cpp @@ -47,7 +47,7 @@ #include "logger.h" #include "manager.h" -#include "client/configurationmanager.h" +#include "client/signal.h" #include "account_schema.h" #include "string_utils.h" #include "config/yamlparser.h" @@ -150,9 +150,11 @@ void Account::setRegistrationState(RegistrationState state) if (state != registrationState_) { registrationState_ = state; // Notify the client - ConfigurationManager *c(Manager::instance().getConfigurationManager()); - c->registrationStateChanged(accountID_, static_cast<int32_t>(registrationState_)); - c->volatileAccountDetailsChanged(accountID_, getVolatileAccountDetails()); + emitSignal<DRing::ConfigurationSignal::RegistrationStateChanged>(accountID_, + static_cast<int32_t>(registrationState_)); + + emitSignal<DRing::ConfigurationSignal::VolatileDetailsChanged>(accountID_, + getVolatileAccountDetails()); } } diff --git a/daemon/src/client/Makefile.am b/daemon/src/client/Makefile.am index 988530745dda41220e77cf109ac8a4e58a30572a..6a6c0cbec8db17c03ea0af53e3b265781c2b789c 100644 --- a/daemon/src/client/Makefile.am +++ b/daemon/src/client/Makefile.am @@ -2,23 +2,25 @@ include $(top_srcdir)/globals.mak noinst_LTLIBRARIES = libclient.la -noinst_HEADERS = callmanager.h \ - configurationmanager.h +noinst_HEADERS = \ + signal.h PRESENCE_SRC = presencemanager.cpp -noinst_HEADERS += presencemanager.h if RING_VIDEO VIDEO_SRC = videomanager.cpp noinst_HEADERS += videomanager.h endif -libclient_la_SOURCES = callmanager.cpp \ - configurationmanager.cpp \ - $(PRESENCE_SRC) \ - $(VIDEO_SRC) +libclient_la_SOURCES = \ + signal.cpp \ + callmanager.cpp \ + configurationmanager.cpp \ + $(PRESENCE_SRC) \ + $(VIDEO_SRC) -libclient_la_CXXFLAGS = -I./ \ - -I../ \ - -DPREFIX=\"$(prefix)\" \ - -DPROGSHAREDIR=\"${datadir}/ring\" +libclient_la_CXXFLAGS = \ + -I./ \ + -I../ \ + -DPREFIX=\"$(prefix)\" \ + -DPROGSHAREDIR=\"${datadir}/ring\" diff --git a/daemon/src/client/callmanager.cpp b/daemon/src/client/callmanager.cpp index 51f1956644709574606e63a6bf9ede1cbe4e4ea9..6fa6b321ba4feb83332ffbedd88d230882aaf86e 100644 --- a/daemon/src/client/callmanager.cpp +++ b/daemon/src/client/callmanager.cpp @@ -2,6 +2,7 @@ * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> * Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,9 +32,9 @@ #include <vector> #include <cstring> -#include "callmanager.h" -#include "libav_utils.h" +#include "callmanager_interface.h" #include "call_factory.h" +#include "client/signal.h" #include "sip/sipcall.h" #include "sip/sipvoiplink.h" @@ -42,453 +43,301 @@ #include "logger.h" #include "manager.h" -namespace ring { +namespace DRing { -CallManager::CallManager() -{ - libav_utils::sfl_avcodec_init(); -} - -void CallManager::registerEvHandlers(struct ring_call_ev_handlers* evHandlers) -{ - evHandlers_ = *evHandlers; +void +registerCallHandlers(const std::map<std::string, + std::shared_ptr<CallbackWrapperBase>>& handlers) +{ + auto& handlers_ = ring::getSignalHandlers(); + for (auto& item : handlers) { + auto iter = handlers_.find(item.first); + if (iter == handlers_.end()) { + RING_ERR("Signal %s not supported", item.first.c_str()); + continue; + } + + iter->second = std::move(item.second); + } } -bool CallManager::placeCall(const std::string& accountID, - const std::string& callID, - const std::string& to) +bool +placeCall(const std::string& accountID, + const std::string& callID, + const std::string& to) { // Check if a destination number is available if (to.empty()) { RING_DBG("No number entered - Call stopped"); return false; } else { - return Manager::instance().outgoingCall(accountID, callID, to); + return ring::Manager::instance().outgoingCall(accountID, callID, to); } } bool -CallManager::refuse(const std::string& callID) +refuse(const std::string& callID) { - return Manager::instance().refuseCall(callID); + return ring::Manager::instance().refuseCall(callID); } bool -CallManager::accept(const std::string& callID) +accept(const std::string& callID) { - return Manager::instance().answerCall(callID); + return ring::Manager::instance().answerCall(callID); } bool -CallManager::hangUp(const std::string& callID) +hangUp(const std::string& callID) { - return Manager::instance().hangupCall(callID); + return ring::Manager::instance().hangupCall(callID); } bool -CallManager::hangUpConference(const std::string& confID) +hangUpConference(const std::string& confID) { - return Manager::instance().hangupConference(confID); + return ring::Manager::instance().hangupConference(confID); } bool -CallManager::hold(const std::string& callID) +hold(const std::string& callID) { - return Manager::instance().onHoldCall(callID); + return ring::Manager::instance().onHoldCall(callID); } bool -CallManager::unhold(const std::string& callID) +unhold(const std::string& callID) { - return Manager::instance().offHoldCall(callID); + return ring::Manager::instance().offHoldCall(callID); } bool -CallManager::transfer(const std::string& callID, const std::string& to) +transfer(const std::string& callID, const std::string& to) { - return Manager::instance().transferCall(callID, to); + return ring::Manager::instance().transferCall(callID, to); } bool -CallManager::attendedTransfer(const std::string& transferID, const std::string& targetID) +attendedTransfer(const std::string& transferID, const std::string& targetID) { - return Manager::instance().attendedTransfer(transferID, targetID); + return ring::Manager::instance().attendedTransfer(transferID, targetID); } bool -CallManager::joinParticipant(const std::string& sel_callID, +joinParticipant(const std::string& sel_callID, const std::string& drag_callID) { - return Manager::instance().joinParticipant(sel_callID, drag_callID); + return ring::Manager::instance().joinParticipant(sel_callID, drag_callID); } void -CallManager::createConfFromParticipantList(const std::vector<std::string>& participants) +createConfFromParticipantList(const std::vector<std::string>& participants) { - Manager::instance().createConfFromParticipantList(participants); + ring::Manager::instance().createConfFromParticipantList(participants); } bool -CallManager::isConferenceParticipant(const std::string& callID) +isConferenceParticipant(const std::string& callID) { - return Manager::instance().isConferenceParticipant(callID); + return ring::Manager::instance().isConferenceParticipant(callID); } void -CallManager::removeConference(const std::string& conference_id) +removeConference(const std::string& conference_id) { - Manager::instance().removeConference(conference_id); + ring::Manager::instance().removeConference(conference_id); } bool -CallManager::addParticipant(const std::string& callID, const std::string& confID) +addParticipant(const std::string& callID, const std::string& confID) { - return Manager::instance().addParticipant(callID, confID); + return ring::Manager::instance().addParticipant(callID, confID); } bool -CallManager::addMainParticipant(const std::string& confID) +addMainParticipant(const std::string& confID) { - return Manager::instance().addMainParticipant(confID); + return ring::Manager::instance().addMainParticipant(confID); } bool -CallManager::detachParticipant(const std::string& callID) +detachParticipant(const std::string& callID) { - return Manager::instance().detachParticipant(callID); + return ring::Manager::instance().detachParticipant(callID); } bool -CallManager::joinConference(const std::string& sel_confID, const std::string& drag_confID) +joinConference(const std::string& sel_confID, const std::string& drag_confID) { - return Manager::instance().joinConference(sel_confID, drag_confID); + return ring::Manager::instance().joinConference(sel_confID, drag_confID); } bool -CallManager::holdConference(const std::string& confID) +holdConference(const std::string& confID) { - return Manager::instance().holdConference(confID); + return ring::Manager::instance().holdConference(confID); } bool -CallManager::unholdConference(const std::string& confID) +unholdConference(const std::string& confID) { - return Manager::instance().unHoldConference(confID); + return ring::Manager::instance().unHoldConference(confID); } std::map<std::string, std::string> -CallManager::getConferenceDetails(const std::string& callID) +getConferenceDetails(const std::string& callID) { - return Manager::instance().getConferenceDetails(callID); + return ring::Manager::instance().getConferenceDetails(callID); } std::vector<std::string> -CallManager::getConferenceList() +getConferenceList() { - return Manager::instance().getConferenceList(); + return ring::Manager::instance().getConferenceList(); } std::vector<std::string> -CallManager::getParticipantList(const std::string& confID) +getParticipantList(const std::string& confID) { - return Manager::instance().getParticipantList(confID); + return ring::Manager::instance().getParticipantList(confID); } std::vector<std::string> -CallManager::getDisplayNames(const std::string& confID) +getDisplayNames(const std::string& confID) { - return Manager::instance().getDisplayNames(confID); + return ring::Manager::instance().getDisplayNames(confID); } std::string -CallManager::getConferenceId(const std::string& callID) +getConferenceId(const std::string& callID) { - return Manager::instance().getConferenceId(callID); + return ring::Manager::instance().getConferenceId(callID); } bool -CallManager::startRecordedFilePlayback(const std::string& filepath) +startRecordedFilePlayback(const std::string& filepath) { - return Manager::instance().startRecordedFilePlayback(filepath); + return ring::Manager::instance().startRecordedFilePlayback(filepath); } void -CallManager::stopRecordedFilePlayback(const std::string& filepath) +stopRecordedFilePlayback(const std::string& filepath) { - Manager::instance().stopRecordedFilePlayback(filepath); + ring::Manager::instance().stopRecordedFilePlayback(filepath); } bool -CallManager::toggleRecording(const std::string& callID) +toggleRecording(const std::string& callID) { - return Manager::instance().toggleRecordingCall(callID); + return ring::Manager::instance().toggleRecordingCall(callID); } void -CallManager::setRecording(const std::string& callID) +setRecording(const std::string& callID) { toggleRecording(callID); } void -CallManager::recordPlaybackSeek(double value) +recordPlaybackSeek(double value) { - Manager::instance().recordingPlaybackSeek(value); + ring::Manager::instance().recordingPlaybackSeek(value); } bool -CallManager::getIsRecording(const std::string& callID) +getIsRecording(const std::string& callID) { - return Manager::instance().isRecording(callID); + return ring::Manager::instance().isRecording(callID); } -std::string CallManager::getCurrentAudioCodecName(const std::string& /*callID*/) +std::string +getCurrentAudioCodecName(const std::string&) { RING_WARN("Deprecated"); return ""; } std::map<std::string, std::string> -CallManager::getCallDetails(const std::string& callID) +getCallDetails(const std::string& callID) { - return Manager::instance().getCallDetails(callID); + return ring::Manager::instance().getCallDetails(callID); } std::vector<std::string> -CallManager::getCallList() +getCallList() { - return Manager::instance().getCallList(); + return ring::Manager::instance().getCallList(); } void -CallManager::playDTMF(const std::string& key) +playDTMF(const std::string& key) { auto code = key.data()[0]; - Manager::instance().playDtmf(code); + ring::Manager::instance().playDtmf(code); - if (auto current_call = Manager::instance().getCurrentCall()) + if (auto current_call = ring::Manager::instance().getCurrentCall()) current_call->carryingDTMFdigits(code); } void -CallManager::startTone(int32_t start, int32_t type) +startTone(int32_t start, int32_t type) { if (start) { if (type == 0) - Manager::instance().playTone(); + ring::Manager::instance().playTone(); else - Manager::instance().playToneWithMessage(); + ring::Manager::instance().playToneWithMessage(); } else - Manager::instance().stopTone(); + ring::Manager::instance().stopTone(); } void -CallManager::setSASVerified(const std::string& /*callID*/) +setSASVerified(const std::string& /*callID*/) { RING_ERR("ZRTP not supported"); } void -CallManager::resetSASVerified(const std::string& /*callID*/) +resetSASVerified(const std::string& /*callID*/) { RING_ERR("ZRTP not supported"); } void -CallManager::setConfirmGoClear(const std::string& /*callID*/) +setConfirmGoClear(const std::string& /*callID*/) { RING_ERR("ZRTP not supported"); } void -CallManager::requestGoClear(const std::string& /*callID*/) +requestGoClear(const std::string& /*callID*/) { RING_ERR("ZRTP not supported"); } void -CallManager::acceptEnrollment(const std::string& /*callID*/, bool /*accepted*/) +acceptEnrollment(const std::string& /*callID*/, bool /*accepted*/) { RING_ERR("ZRTP not supported"); } -void CallManager::sendTextMessage(const std::string& callID, const std::string& message, const std::string& from) +void +sendTextMessage(const std::string& callID, const std::string& message, const std::string& from) { #if HAVE_INSTANT_MESSAGING - Manager::instance().sendTextMessage(callID, message, from); + ring::Manager::instance().sendTextMessage(callID, message, from); #endif } void -CallManager::sendTextMessage(const std::string& callID, const std::string& message) +sendTextMessage(const std::string& callID, const std::string& message) { #if HAVE_INSTANT_MESSAGING - if (!Manager::instance().sendTextMessage(callID, message, "Me")) + if (!ring::Manager::instance().sendTextMessage(callID, message, "Me")) throw CallManagerException(); #else RING_ERR("Could not send \"%s\" text message to %s since SFLphone daemon does not support it, please recompile with instant messaging support", message.c_str(), callID.c_str()); #endif } -void CallManager::callStateChanged(const std::string& callID, const std::string& state) -{ - if (evHandlers_.on_state_change) { - evHandlers_.on_state_change(callID, state); - } -} - -void CallManager::transferFailed() -{ - if (evHandlers_.on_transfer_fail) { - evHandlers_.on_transfer_fail(); - } -} - -void CallManager::transferSucceeded() -{ - if (evHandlers_.on_transfer_success) { - evHandlers_.on_transfer_success(); - } -} - -void CallManager::recordPlaybackStopped(const std::string& path) -{ - if (evHandlers_.on_record_playback_stopped) { - evHandlers_.on_record_playback_stopped(path); - } -} - -void CallManager::voiceMailNotify(const std::string& callID, int32_t nd_msg) -{ - if (evHandlers_.on_voice_mail_notify) { - evHandlers_.on_voice_mail_notify(callID, nd_msg); - } -} - -void CallManager::incomingMessage(const std::string& ID, const std::string& from, const std::string& msg) -{ - if (evHandlers_.on_incoming_message) { - evHandlers_.on_incoming_message(ID, from, msg); - } -} - -void CallManager::incomingCall(const std::string& accountID, const std::string& callID, const std::string& from) -{ - if (evHandlers_.on_incoming_call) { - evHandlers_.on_incoming_call(accountID, callID, from); - } -} - -void CallManager::recordPlaybackFilepath(const std::string& id, const std::string& filename) -{ - if (evHandlers_.on_record_playback_filepath) { - evHandlers_.on_record_playback_filepath(id, filename); - } -} - -void CallManager::conferenceCreated(const std::string& confID) -{ - if (evHandlers_.on_conference_created) { - evHandlers_.on_conference_created(confID); - } -} - -void CallManager::conferenceChanged(const std::string& confID, const std::string& state) -{ - if (evHandlers_.on_conference_changed) { - evHandlers_.on_conference_changed(confID, state); - } -} - -void CallManager::updatePlaybackScale(const std::string& filepath, int32_t position, int32_t scale) -{ - if (evHandlers_.on_update_playback_scale) { - evHandlers_.on_update_playback_scale(filepath, position, scale); - } -} - -void CallManager::conferenceRemoved(const std::string& confID) -{ - if (evHandlers_.on_conference_remove) { - evHandlers_.on_conference_remove(confID); - } -} - -void CallManager::newCallCreated(const std::string& accountID, const std::string& callID, const std::string& to) -{ - if (evHandlers_.on_new_call) { - evHandlers_.on_new_call(accountID, callID, to); - } -} - -void CallManager::sipCallStateChanged(const std::string& callID, const std::string& state, int32_t code) -{ - if (evHandlers_.on_sip_call_state_change) { - evHandlers_.on_sip_call_state_change(callID, state, code); - } -} - -void CallManager::recordingStateChanged(const std::string& callID, bool state) -{ - if (evHandlers_.on_record_state_change) { - evHandlers_.on_record_state_change(callID, state); - } -} - -void CallManager::secureSdesOn(const std::string& callID) -{ - if (evHandlers_.on_secure_sdes_on) { - evHandlers_.on_secure_sdes_on(callID); - } -} - -void CallManager::secureSdesOff(const std::string& callID) -{ - if (evHandlers_.on_secure_sdes_off) { - evHandlers_.on_secure_sdes_off(callID); - } -} - -void CallManager::secureZrtpOn(const std::string& callID, const std::string& cipher) -{ - if (evHandlers_.on_secure_zrtp_on) { - evHandlers_.on_secure_zrtp_on(callID, cipher); - } -} - -void CallManager::secureZrtpOff(const std::string& callID) -{ - if (evHandlers_.on_secure_zrtp_off) { - evHandlers_.on_secure_zrtp_off(callID); - } -} - -void CallManager::showSAS(const std::string& callID, const std::string& sas, bool verified) -{ - if (evHandlers_.on_show_sas) { - evHandlers_.on_show_sas(callID, sas, verified); - } -} - -void CallManager::zrtpNotSuppOther(const std::string& callID) -{ - if (evHandlers_.on_zrtp_not_supp_other) { - evHandlers_.on_zrtp_not_supp_other(callID); - } -} - -void CallManager::zrtpNegotiationFailed(const std::string& callID, const std::string& reason, const std::string& severity) -{ - if (evHandlers_.on_zrtp_negotiation_fail) { - evHandlers_.on_zrtp_negotiation_fail(callID, reason, severity); - } -} - -void CallManager::onRtcpReportReceived(const std::string& callID, const std::map<std::string, int>& stats) -{ - if (evHandlers_.on_rtcp_receive_report) { - evHandlers_.on_rtcp_receive_report(callID, stats); - } -} - -} // namespace ring +} // namespace DRing diff --git a/daemon/src/client/callmanager.h b/daemon/src/client/callmanager.h deleted file mode 100644 index 6686a14a74fde3dc81c697cca9c2be81f29202d1..0000000000000000000000000000000000000000 --- a/daemon/src/client/callmanager.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. - * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Additional permission under GNU GPL version 3 section 7: - * - * If you modify this program, or any covered work, by linking or - * combining it with the OpenSSL project's OpenSSL library (or a - * modified version of that library), containing parts covered by the - * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. - * grants you additional permission to convey the resulting work. - * Corresponding Source for a non-source form of such a combination - * shall include the source code for the parts of OpenSSL used as well - * as that of the covered work. - */ - -#ifndef __RING_CALLMANAGER_H__ -#define __RING_CALLMANAGER_H__ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdexcept> -#include <map> -#include <vector> -#include <string> - -#include "dring.h" - -namespace ring { - -class AudioZrtpSession; - -class CallManagerException: public std::runtime_error { - public: - CallManagerException(const std::string& str = "") : - std::runtime_error("A CallManagerException occured: " + str) {} -}; - -class CallManager -{ - public: - CallManager(); - void registerEvHandlers(struct ring_call_ev_handlers* evHandlers); - - // Methods - public: - /* Call related methods */ - bool placeCall(const std::string& accountID, const std::string& callID, const std::string& to); - - bool refuse(const std::string& callID); - bool accept(const std::string& callID); - bool hangUp(const std::string& callID); - bool hold(const std::string& callID); - bool unhold(const std::string& callID); - bool transfer(const std::string& callID, const std::string& to); - bool attendedTransfer(const std::string& transferID, const std::string& targetID); - std::map< std::string, std::string > getCallDetails(const std::string& callID); - std::vector< std::string > getCallList(); - - /* Conference related methods */ - void removeConference(const std::string& conference_id); - bool joinParticipant(const std::string& sel_callID, const std::string& drag_callID); - void createConfFromParticipantList(const std::vector< std::string >& participants); - bool isConferenceParticipant(const std::string& call_id); - bool addParticipant(const std::string& callID, const std::string& confID); - bool addMainParticipant(const std::string& confID); - bool detachParticipant(const std::string& callID); - bool joinConference(const std::string& sel_confID, const std::string& drag_confID); - bool hangUpConference(const std::string& confID); - bool holdConference(const std::string& confID); - bool unholdConference(const std::string& confID); - std::vector<std::string> getConferenceList(); - std::vector<std::string> getParticipantList(const std::string& confID); - std::vector<std::string> getDisplayNames(const std::string& confID); - std::string getConferenceId(const std::string& callID); - std::map<std::string, std::string> getConferenceDetails(const std::string& callID); - - /* File Playback methods */ - bool startRecordedFilePlayback(const std::string& filepath); - void stopRecordedFilePlayback(const std::string& filepath); - - /* General audio methods */ - bool toggleRecording(const std::string& callID); - /* DEPRECATED */ - void setRecording(const std::string& callID); - - void recordPlaybackSeek(double value); - bool getIsRecording(const std::string& callID); - std::string getCurrentAudioCodecName(const std::string& callID); - void playDTMF(const std::string& key); - void startTone(int32_t start, int32_t type); - - /* Security related methods */ - void setSASVerified(const std::string& callID); - void resetSASVerified(const std::string& callID); - void setConfirmGoClear(const std::string& callID); - void requestGoClear(const std::string& callID); - void acceptEnrollment(const std::string& callID, bool accepted); - - /* Instant messaging */ - void sendTextMessage(const std::string& callID, const std::string& message); - void sendTextMessage(const std::string& callID, const std::string& message, const std::string& from); - - // Signals - public: - void callStateChanged(const std::string& callID, const std::string& state); - - void transferFailed(); - - void transferSucceeded(); - - void recordPlaybackStopped(const std::string& path); - - void voiceMailNotify(const std::string& callID, int32_t nd_msg); - - void incomingMessage(const std::string& ID, const std::string& from, const std::string& msg); - - void incomingCall(const std::string& accountID, const std::string& callID, const std::string& from); - - void recordPlaybackFilepath(const std::string& id, const std::string& filename); - - void conferenceCreated(const std::string& confID); - - void conferenceChanged(const std::string& confID,const std::string& state); - - void updatePlaybackScale(const std::string&, int32_t, int32_t); - void conferenceRemoved(const std::string&); - void newCallCreated(const std::string&, const std::string&, const std::string&); - void sipCallStateChanged(const std::string&, const std::string&, int32_t); - void recordingStateChanged(const std::string& callID, bool state); - void secureSdesOn(const std::string& arg); - void secureSdesOff(const std::string& arg); - - void secureZrtpOn(const std::string& callID, const std::string& cipher); - void secureZrtpOff(const std::string& callID); - void showSAS(const std::string& callID, const std::string& sas, bool verified); - void zrtpNotSuppOther(const std::string& callID); - void zrtpNegotiationFailed(const std::string& callID, const std::string& arg2, const std::string& arg3); - - void onRtcpReportReceived(const std::string& callID, const std::map<std::string, int>& stats); - - private: -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - // Event handlers; needed by the library API - ring_call_ev_handlers evHandlers_{}; -#pragma GCC diagnostic warning "-Wmissing-field-initializers" -}; - -} // namespace ring - -#endif//CALLMANAGER_H diff --git a/daemon/src/client/configurationmanager.cpp b/daemon/src/client/configurationmanager.cpp index c3fb0f46d0aa3a46c5a2dd18f8a10a449ee2c744..410a8f6c379b37bdb708a5bdb509340a3837d4a2 100644 --- a/daemon/src/client/configurationmanager.cpp +++ b/daemon/src/client/configurationmanager.cpp @@ -3,6 +3,7 @@ * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,7 +35,7 @@ #include "config.h" #endif -#include "configurationmanager.h" +#include "configurationmanager_interface.h" #include "account_schema.h" #include "manager.h" #if HAVE_TLS && HAVE_DHT @@ -46,6 +47,7 @@ #include "sip/sipaccount.h" #include "security_const.h" #include "audio/audiolayer.h" +#include "client/signal.h" #include <dirent.h> @@ -53,124 +55,127 @@ #include <cstring> #include <sstream> -#define CODECS_NOT_LOADED 0x1000 /** Codecs not found */ +namespace DRing { -namespace ring { +constexpr unsigned CODECS_NOT_LOADED = 0x1000; /** Codecs not found */ -void ConfigurationManager::registerEvHandlers(struct ring_config_ev_handlers* evHandlers) +using ring::SIPAccount; +using ring::TlsValidator; +using ring::Account; +using ring::DeviceType; +using ring::HookPreference; + +void +registerConfHandlers(const std::map<std::string, + std::shared_ptr<CallbackWrapperBase>>& handlers) { - evHandlers_ = *evHandlers; + auto& handlers_ = ring::getSignalHandlers(); + for (auto& item : handlers) { + auto iter = handlers_.find(item.first); + if (iter == handlers_.end()) { + RING_ERR("Signal %s not supported", item.first.c_str()); + continue; + } + + iter->second = std::move(item.second); + } } -std::map<std::string, std::string> ConfigurationManager::getIp2IpDetails() +std::map<std::string, std::string> +getIp2IpDetails() { - const auto account = Manager::instance().getIP2IPAccount(); - const auto sipaccount = static_cast<SIPAccount *>(account.get()); - - if (!sipaccount) { - RING_ERR("Could not find IP2IP account"); - return std::map<std::string, std::string>(); - } else + auto account = ring::Manager::instance().getIP2IPAccount(); + if (auto sipaccount = static_cast<SIPAccount*>(account.get())) return sipaccount->getIp2IpDetails(); + RING_ERR("Could not find IP2IP account"); + return std::map<std::string, std::string>(); } -std::map<std::string, std::string> ConfigurationManager::getAccountDetails( - const std::string& accountID) +std::map<std::string, std::string> +getAccountDetails(const std::string& accountID) { - return Manager::instance().getAccountDetails(accountID); + return ring::Manager::instance().getAccountDetails(accountID); } -std::map<std::string, std::string> ConfigurationManager::getVolatileAccountDetails( - const std::string& accountID) +std::map<std::string, std::string> +getVolatileAccountDetails(const std::string& accountID) { - return Manager::instance().getVolatileAccountDetails(accountID); + return ring::Manager::instance().getVolatileAccountDetails(accountID); } std::map<std::string, std::string> -ConfigurationManager::getTlsSettingsDefault() +getTlsDefaultSettings() { std::stringstream portstr; portstr << DEFAULT_SIP_TLS_PORT; - std::map<std::string, std::string> tlsSettingsDefault; - tlsSettingsDefault[Conf::CONFIG_TLS_LISTENER_PORT] = portstr.str(); - tlsSettingsDefault[Conf::CONFIG_TLS_CA_LIST_FILE] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_CERTIFICATE_FILE] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_PRIVATE_KEY_FILE] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_PASSWORD] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_METHOD] = "TLSv1"; - tlsSettingsDefault[Conf::CONFIG_TLS_CIPHERS] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_SERVER_NAME] = ""; - tlsSettingsDefault[Conf::CONFIG_TLS_VERIFY_SERVER] = "true"; - tlsSettingsDefault[Conf::CONFIG_TLS_VERIFY_CLIENT] = "true"; - tlsSettingsDefault[Conf::CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE] = "true"; - tlsSettingsDefault[Conf::CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC] = "2"; - - return tlsSettingsDefault; + return { + {ring::Conf::CONFIG_TLS_LISTENER_PORT, portstr.str()}, + {ring::Conf::CONFIG_TLS_CA_LIST_FILE, ""}, + {ring::Conf::CONFIG_TLS_CERTIFICATE_FILE, ""}, + {ring::Conf::CONFIG_TLS_PRIVATE_KEY_FILE, ""}, + {ring::Conf::CONFIG_TLS_PASSWORD, ""}, + {ring::Conf::CONFIG_TLS_METHOD, "TLSv1"}, + {ring::Conf::CONFIG_TLS_CIPHERS, ""}, + {ring::Conf::CONFIG_TLS_SERVER_NAME, ""}, + {ring::Conf::CONFIG_TLS_VERIFY_SERVER, "true"}, + {ring::Conf::CONFIG_TLS_VERIFY_CLIENT, "true"}, + {ring::Conf::CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, "true"}, + {ring::Conf::CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, "2"} + }; } -std::map<std::string, std::string> ConfigurationManager::getTlsSettings() +std::map<std::string, std::string> +getTlsSettings() { - std::map<std::string, std::string> tlsSettings; - - const auto account = Manager::instance().getIP2IPAccount(); - const auto sipaccount = static_cast<SIPAccount *>(account.get()); - - if (!sipaccount) - return tlsSettings; - - return sipaccount->getTlsSettings(); + auto account = ring::Manager::instance().getIP2IPAccount(); + if (auto sipaccount = static_cast<SIPAccount*>(account.get())) + return sipaccount->getTlsSettings(); + RING_ERR("Could not find IP2IP account"); + return std::map<std::string, std::string>(); } -void ConfigurationManager::setTlsSettings(const std::map<std::string, std::string>& details) +void +setTlsSettings(const std::map<std::string, std::string>& details) { - const auto account = Manager::instance().getIP2IPAccount(); - const auto sipaccount = static_cast<SIPAccount *>(account.get()); - - if (!sipaccount) { - RING_DBG("No valid account in set TLS settings"); - return; + auto account = ring::Manager::instance().getIP2IPAccount(); + if (auto sipaccount = static_cast<SIPAccount*>(account.get())) { + sipaccount->setTlsSettings(details); + ring::Manager::instance().saveConfig(); + ring::emitSignal<ConfigurationSignal::AccountsChanged>(); } - sipaccount->setTlsSettings(details); - - Manager::instance().saveConfig(); - - // Update account details to the client side - accountsChanged(); + RING_DBG("No valid account in set TLS settings"); + return; } -std::map<std::string, std::string> ConfigurationManager::validateCertificate(const std::string&, - const std::string& certificate, - const std::string& privateKey) +std::map<std::string, std::string> +validateCertificate(const std::string&, + const std::string& certificate, + const std::string& privateKey) { #if HAVE_TLS && HAVE_DHT try { - TlsValidator validator(certificate,privateKey); - return validator.getSerializedChecks(); - } - catch(const std::runtime_error& e) { - std::map<std::string, std::string> res; + return TlsValidator{certificate, privateKey}.getSerializedChecks(); + } catch(const std::runtime_error& e) { RING_WARN("Certificate loading failed"); - res[DRing::Certificate::ChecksNames::EXIST] = DRing::Certificate::CheckValuesNames::FAILED; - return res; + return {{Certificate::ChecksNames::EXIST, Certificate::CheckValuesNames::FAILED}}; } #else RING_WARN("TLS not supported"); - return std::map<std::string, std::string>(); + return {}; #endif } -std::map<std::string, std::string> ConfigurationManager::getCertificateDetails(const std::string& certificate) +std::map<std::string, std::string> +getCertificateDetails(const std::string& certificate) { #if HAVE_TLS && HAVE_DHT try { - TlsValidator validator(certificate,""); - return validator.getSerializedDetails(); - } - catch(const std::runtime_error& e) { + return TlsValidator{certificate,""}.getSerializedDetails(); + } catch(const std::runtime_error& e) { RING_WARN("Certificate loading failed"); } #else @@ -179,474 +184,415 @@ std::map<std::string, std::string> ConfigurationManager::getCertificateDetails(c return std::map<std::string, std::string>(); } -void ConfigurationManager::setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details) +void +setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details) { - Manager::instance().setAccountDetails(accountID, details); + ring::Manager::instance().setAccountDetails(accountID, details); } -void ConfigurationManager::sendRegister(const std::string& accountID, bool enable) +void +sendRegister(const std::string& accountID, bool enable) { - Manager::instance().sendRegister(accountID, enable); + ring::Manager::instance().sendRegister(accountID, enable); } -void ConfigurationManager::registerAllAccounts() +void +registerAllAccounts() { - Manager::instance().registerAccounts(); + ring::Manager::instance().registerAccounts(); } ///This function is used as a base for new accounts for clients that support it -std::map<std::string, std::string> ConfigurationManager::getAccountTemplate() +std::map<std::string, std::string> +getAccountTemplate() { - SIPAccount dummy("dummy", false); - return dummy.getAccountDetails(); + return SIPAccount{"dummy", false}.getAccountDetails(); } -std::string ConfigurationManager::addAccount(const std::map<std::string, std::string>& details) +std::string +addAccount(const std::map<std::string, std::string>& details) { - return Manager::instance().addAccount(details); + return ring::Manager::instance().addAccount(details); } -void ConfigurationManager::removeAccount(const std::string& accountID) +void +removeAccount(const std::string& accountID) { - return Manager::instance().removeAccount(accountID); + return ring::Manager::instance().removeAccount(accountID); } -std::vector<std::string> ConfigurationManager::getAccountList() +std::vector<std::string> +getAccountList() { - return Manager::instance().getAccountList(); + return ring::Manager::instance().getAccountList(); } /** * Send the list of all codecs loaded to the client through DBus. * Can stay global, as only the active codecs will be set per accounts */ -std::vector<int32_t> ConfigurationManager::getAudioCodecList() +std::vector<int32_t> +getAudioCodecList() { - std::vector<int32_t> list(Manager::instance().audioCodecFactory.getCodecList()); - + std::vector<int32_t> list {ring::Manager::instance().audioCodecFactory.getCodecList()}; if (list.empty()) - errorAlert(CODECS_NOT_LOADED); - + ring::emitSignal<ConfigurationSignal::Error>(CODECS_NOT_LOADED); return list; } -std::vector<std::string> ConfigurationManager::getSupportedTlsMethod() +std::vector<std::string> +getSupportedTlsMethod() { - std::vector<std::string> method; - method.push_back("Default"); - method.push_back("TLSv1"); - method.push_back("SSLv3"); - method.push_back("SSLv23"); - return method; + return {"Default", "TLSv1", "SSLv3", "SSLv23"}; } -std::vector<std::string> ConfigurationManager::getSupportedCiphers(const std::string& accountID) const +std::vector<std::string> +getSupportedCiphers(const std::string& accountID) { #if HAVE_TLS - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - if (sipaccount) { + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) return sipaccount->getSupportedCiphers(); - } else { - RING_ERR("SIP account %s doesn't exist", accountID.c_str()); -#else - { + RING_ERR("SIP account %s doesn't exist", accountID.c_str()); #endif - return {}; - } - + return {}; } -std::vector<std::string> ConfigurationManager::getAudioCodecDetails(int32_t payload) +std::vector<std::string> +getAudioCodecDetails(int32_t payload) { - std::vector<std::string> result(Manager::instance().audioCodecFactory.getCodecSpecifications(payload)); - + std::vector<std::string> result {ring::Manager::instance().audioCodecFactory.getCodecSpecifications(payload)}; if (result.empty()) - errorAlert(CODECS_NOT_LOADED); - + ring::emitSignal<ConfigurationSignal::Error>(CODECS_NOT_LOADED); return result; } -std::vector<int32_t> ConfigurationManager::getActiveAudioCodecList(const std::string& accountID) +std::vector<int32_t> +getActiveAudioCodecList(const std::string& accountID) { - if (const auto acc = Manager::instance().getAccount(accountID)) + if (auto acc = ring::Manager::instance().getAccount(accountID)) return acc->getActiveAudioCodecs(); - else { - RING_ERR("Could not find account %s, returning default", accountID.c_str()); - return Account::getDefaultAudioCodecs(); - } + RING_ERR("Could not find account %s, returning default", accountID.c_str()); + return Account::getDefaultAudioCodecs(); } -void ConfigurationManager::setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID) +void +setActiveAudioCodecList(const std::vector<std::string>& list, + const std::string& accountID) { - if (auto acc = Manager::instance().getAccount(accountID)) { + if (auto acc = ring::Manager::instance().getAccount(accountID)) { acc->setActiveAudioCodecs(list); - Manager::instance().saveConfig(); + ring::Manager::instance().saveConfig(); } else { RING_ERR("Could not find account %s", accountID.c_str()); } } -std::vector<std::string> ConfigurationManager::getAudioPluginList() +std::vector<std::string> +getAudioPluginList() { - std::vector<std::string> v; - - v.push_back(PCM_DEFAULT); - v.push_back(PCM_DMIX_DSNOOP); - - return v; + return {PCM_DEFAULT, PCM_DMIX_DSNOOP}; } -void ConfigurationManager::setAudioPlugin(const std::string& audioPlugin) +void +setAudioPlugin(const std::string& audioPlugin) { - return Manager::instance().setAudioPlugin(audioPlugin); + return ring::Manager::instance().setAudioPlugin(audioPlugin); } -std::vector<std::string> ConfigurationManager::getAudioOutputDeviceList() +std::vector<std::string> +getAudioOutputDeviceList() { - return Manager::instance().getAudioOutputDeviceList(); + return ring::Manager::instance().getAudioOutputDeviceList(); } -std::vector<std::string> ConfigurationManager::getAudioInputDeviceList() +std::vector<std::string> +getAudioInputDeviceList() { - return Manager::instance().getAudioInputDeviceList(); + return ring::Manager::instance().getAudioInputDeviceList(); } -void ConfigurationManager::setAudioOutputDevice(int32_t index) +void +setAudioOutputDevice(int32_t index) { - return Manager::instance().setAudioDevice(index, DeviceType::PLAYBACK); + return ring::Manager::instance().setAudioDevice(index, DeviceType::PLAYBACK); } -void ConfigurationManager::setAudioInputDevice(int32_t index) +void +setAudioInputDevice(int32_t index) { - return Manager::instance().setAudioDevice(index, DeviceType::CAPTURE); + return ring::Manager::instance().setAudioDevice(index, DeviceType::CAPTURE); } -void ConfigurationManager::setAudioRingtoneDevice(int32_t index) +void +setAudioRingtoneDevice(int32_t index) { - return Manager::instance().setAudioDevice(index, DeviceType::RINGTONE); + return ring::Manager::instance().setAudioDevice(index, DeviceType::RINGTONE); } -std::vector<std::string> ConfigurationManager::getCurrentAudioDevicesIndex() +std::vector<std::string> +getCurrentAudioDevicesIndex() { - return Manager::instance().getCurrentAudioDevicesIndex(); + return ring::Manager::instance().getCurrentAudioDevicesIndex(); } -int32_t ConfigurationManager::getAudioInputDeviceIndex(const std::string& name) +int32_t +getAudioInputDeviceIndex(const std::string& name) { - return Manager::instance().getAudioInputDeviceIndex(name); + return ring::Manager::instance().getAudioInputDeviceIndex(name); } -int32_t ConfigurationManager::getAudioOutputDeviceIndex(const std::string& name) +int32_t +getAudioOutputDeviceIndex(const std::string& name) { - return Manager::instance().getAudioOutputDeviceIndex(name); + return ring::Manager::instance().getAudioOutputDeviceIndex(name); } -std::string ConfigurationManager::getCurrentAudioOutputPlugin() +std::string +getCurrentAudioOutputPlugin() { - RING_DBG("Get audio plugin %s", Manager::instance().getCurrentAudioOutputPlugin().c_str()); - - return Manager::instance().getCurrentAudioOutputPlugin(); + auto plugin = ring::Manager::instance().getCurrentAudioOutputPlugin(); + RING_DBG("Get audio plugin %s", plugin.c_str()); + return plugin; } -bool ConfigurationManager::getNoiseSuppressState() +bool +getNoiseSuppressState() { - return Manager::instance().getNoiseSuppressState(); + return ring::Manager::instance().getNoiseSuppressState(); } -void ConfigurationManager::setNoiseSuppressState(bool state) +void +setNoiseSuppressState(bool state) { - Manager::instance().setNoiseSuppressState(state); + ring::Manager::instance().setNoiseSuppressState(state); } -bool ConfigurationManager::isAgcEnabled() +bool +isAgcEnabled() { - return Manager::instance().isAGCEnabled(); + return ring::Manager::instance().isAGCEnabled(); } -void ConfigurationManager::setAgcState(bool enabled) +void +setAgcState(bool enabled) { - Manager::instance().setAGCState(enabled); + ring::Manager::instance().setAGCState(enabled); } -int32_t ConfigurationManager::isIax2Enabled() +int32_t +isIax2Enabled() { return HAVE_IAX; } -std::string ConfigurationManager::getRecordPath() +std::string +getRecordPath() { - return Manager::instance().audioPreference.getRecordPath(); + return ring::Manager::instance().audioPreference.getRecordPath(); } -void ConfigurationManager::setRecordPath(const std::string& recPath) +void +setRecordPath(const std::string& recPath) { - Manager::instance().audioPreference.setRecordPath(recPath); + ring::Manager::instance().audioPreference.setRecordPath(recPath); } -bool ConfigurationManager::getIsAlwaysRecording() +bool +getIsAlwaysRecording() { - return Manager::instance().getIsAlwaysRecording(); + return ring::Manager::instance().getIsAlwaysRecording(); } -void ConfigurationManager::setIsAlwaysRecording(bool rec) +void +setIsAlwaysRecording(bool rec) { - Manager::instance().setIsAlwaysRecording(rec); + ring::Manager::instance().setIsAlwaysRecording(rec); } -int32_t ConfigurationManager::getHistoryLimit() +int32_t +getHistoryLimit() { - return Manager::instance().getHistoryLimit(); + return ring::Manager::instance().getHistoryLimit(); } -void ConfigurationManager::clearHistory() +void +clearHistory() { - return Manager::instance().clearHistory(); + return ring::Manager::instance().clearHistory(); } -void ConfigurationManager::setHistoryLimit(int32_t days) +void +setHistoryLimit(int32_t days) { - Manager::instance().setHistoryLimit(days); + ring::Manager::instance().setHistoryLimit(days); } -bool ConfigurationManager::setAudioManager(const std::string& api) +bool +setAudioManager(const std::string& api) { - return Manager::instance().setAudioManager(api); + return ring::Manager::instance().setAudioManager(api); } -std::string ConfigurationManager::getAudioManager() +std::string +getAudioManager() { - return Manager::instance().getAudioManager(); + return ring::Manager::instance().getAudioManager(); } -void ConfigurationManager::setVolume(const std::string& device, double value) +void +setVolume(const std::string& device, double value) { - auto audiolayer = Manager::instance().getAudioDriver(); - - if (!audiolayer) { - RING_ERR("Audio layer not valid while updating volume"); - return; - } + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) { + RING_DBG("set volume for %s: %f", device.c_str(), value); - RING_DBG("set volume for %s: %f", device.c_str(), value); + if (device == "speaker") + audiolayer->setPlaybackGain(value); + else if (device == "mic") + audiolayer->setCaptureGain(value); - if (device == "speaker") { - audiolayer->setPlaybackGain(value); - } else if (device == "mic") { - audiolayer->setCaptureGain(value); + ring::emitSignal<ConfigurationSignal::VolumeChanged>(device, value); + } else { + RING_ERR("Audio layer not valid while updating volume"); } - - volumeChanged(device, value); } double -ConfigurationManager::getVolume(const std::string& device) +getVolume(const std::string& device) { - auto audiolayer = Manager::instance().getAudioDriver(); - - if (!audiolayer) { - RING_ERR("Audio layer not valid while updating volume"); - return 0.0; + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) { + if (device == "speaker") + return audiolayer->getPlaybackGain(); + if (device == "mic") + return audiolayer->getCaptureGain(); } - if (device == "speaker") - return audiolayer->getPlaybackGain(); - else if (device == "mic") - return audiolayer->getCaptureGain(); - - return 0; + RING_ERR("Audio layer not valid while updating volume"); + return 0.0; } // FIXME: we should store "muteDtmf" instead of "playDtmf" // in config and avoid negating like this -bool ConfigurationManager::isDtmfMuted() +bool +isDtmfMuted() { - return not Manager::instance().voipPreferences.getPlayDtmf(); + return not ring::Manager::instance().voipPreferences.getPlayDtmf(); } -void ConfigurationManager::muteDtmf(bool mute) +void +muteDtmf(bool mute) { - Manager::instance().voipPreferences.setPlayDtmf(not mute); + ring::Manager::instance().voipPreferences.setPlayDtmf(not mute); } -bool ConfigurationManager::isCaptureMuted() +bool +isCaptureMuted() { - auto audiolayer = Manager::instance().getAudioDriver(); + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) + return audiolayer->isCaptureMuted(); - if (!audiolayer) { - RING_ERR("Audio layer not valid"); - return false; - } - - return audiolayer->isCaptureMuted(); + RING_ERR("Audio layer not valid"); + return false; } -void ConfigurationManager::muteCapture(bool mute) +void +muteCapture(bool mute) { - auto audiolayer = Manager::instance().getAudioDriver(); - - if (!audiolayer) { - RING_ERR("Audio layer not valid"); - return; - } + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) + return audiolayer->muteCapture(mute); - return audiolayer->muteCapture(mute); + RING_ERR("Audio layer not valid"); + return; } -bool ConfigurationManager::isPlaybackMuted() +bool +isPlaybackMuted() { - auto audiolayer = Manager::instance().getAudioDriver(); + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) + return audiolayer->isPlaybackMuted(); - if (!audiolayer) { - RING_ERR("Audio layer not valid"); - return false; - } - - return audiolayer->isPlaybackMuted(); + RING_ERR("Audio layer not valid"); + return false; } -void ConfigurationManager::mutePlayback(bool mute) +void +mutePlayback(bool mute) { - auto audiolayer = Manager::instance().getAudioDriver(); - - if (!audiolayer) { - RING_ERR("Audio layer not valid"); - return; - } + if (auto audiolayer = ring::Manager::instance().getAudioDriver()) + return audiolayer->mutePlayback(mute); - return audiolayer->mutePlayback(mute); + RING_ERR("Audio layer not valid"); + return; } -std::map<std::string, std::string> ConfigurationManager::getHookSettings() +std::map<std::string, std::string> +getHookSettings() { - return Manager::instance().hookPreference.toMap(); + return ring::Manager::instance().hookPreference.toMap(); } -void ConfigurationManager::setHookSettings(const std::map<std::string, - std::string>& settings) +void +setHookSettings(const std::map<std::string, + std::string>& settings) { - Manager::instance().hookPreference = HookPreference(settings); + ring::Manager::instance().hookPreference = HookPreference(settings); } -void ConfigurationManager::setAccountsOrder(const std::string& order) +void setAccountsOrder(const std::string& order) { - Manager::instance().setAccountsOrder(order); + ring::Manager::instance().setAccountsOrder(order); } -std::vector<std::map<std::string, std::string> > ConfigurationManager::getHistory() +std::vector<std::map<std::string, std::string>> +getHistory() { - return Manager::instance().getHistory(); + return ring::Manager::instance().getHistory(); } std::string -ConfigurationManager::getAddrFromInterfaceName(const std::string& interface) +getAddrFromInterfaceName(const std::string& interface) { - return ip_utils::getInterfaceAddr(interface); + return ring::ip_utils::getInterfaceAddr(interface); } -std::vector<std::string> ConfigurationManager::getAllIpInterface() +std::vector<std::string> +getAllIpInterface() { - return ip_utils::getAllIpInterface(); + return ring::ip_utils::getAllIpInterface(); } -std::vector<std::string> ConfigurationManager::getAllIpInterfaceByName() +std::vector<std::string> +getAllIpInterfaceByName() { - return ip_utils::getAllIpInterfaceByName(); + return ring::ip_utils::getAllIpInterfaceByName(); } -std::map<std::string, std::string> ConfigurationManager::getShortcuts() +std::map<std::string, std::string> +getShortcuts() { - return Manager::instance().shortcutPreferences.getShortcuts(); + return ring::Manager::instance().shortcutPreferences.getShortcuts(); } -void ConfigurationManager::setShortcuts( - const std::map<std::string, std::string>& shortcutsMap) +void +setShortcuts(const std::map<std::string, std::string>& shortcutsMap) { - Manager::instance().shortcutPreferences.setShortcuts(shortcutsMap); - Manager::instance().saveConfig(); + ring::Manager::instance().shortcutPreferences.setShortcuts(shortcutsMap); + ring::Manager::instance().saveConfig(); } -std::vector<std::map<std::string, std::string> > ConfigurationManager::getCredentials( - const std::string& accountID) +std::vector<std::map<std::string, std::string>> +getCredentials(const std::string& accountID) { - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - std::vector<std::map<std::string, std::string> > credentialInformation; - - if (!sipaccount) - return credentialInformation; - else + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) return sipaccount->getCredentials(); + return {}; } -void ConfigurationManager::setCredentials(const std::string& accountID, - const std::vector<std::map<std::string, std::string> >& details) +void +setCredentials(const std::string& accountID, + const std::vector<std::map<std::string, std::string>>& details) { - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - if (sipaccount) + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) sipaccount->setCredentials(details); } -void ConfigurationManager::volumeChanged(const std::string& device, double value) -{ - if (evHandlers_.on_volume_change) { - evHandlers_.on_volume_change(device, value); - } -} - -void ConfigurationManager::accountsChanged() -{ - if (evHandlers_.on_accounts_change) { - evHandlers_.on_accounts_change(); - } -} - -void ConfigurationManager::historyChanged() -{ - if (evHandlers_.on_history_change) { - evHandlers_.on_history_change(); - } -} - -void ConfigurationManager::stunStatusFailure(const std::string& accountID) -{ - if (evHandlers_.on_stun_status_fail) { - evHandlers_.on_stun_status_fail(accountID); - } -} - -void ConfigurationManager::registrationStateChanged(const std::string& accountID, int state) -{ - if (evHandlers_.on_registration_state_change) { - evHandlers_.on_registration_state_change(accountID, state); - } -} - -void ConfigurationManager::sipRegistrationStateChanged(const std::string& accountID, const std::string& state, int32_t code) -{ - if (evHandlers_.on_sip_registration_state_change) { - evHandlers_.on_sip_registration_state_change(accountID, state, code); - } -} - - -void ConfigurationManager::volatileAccountDetailsChanged(const std::string& accountID, const std::map<std::string, std::string> &details) -{ - if (evHandlers_.on_volatile_details_change) { - evHandlers_.on_volatile_details_change(accountID, details); - } -} - -void ConfigurationManager::errorAlert(int alert) -{ - if (evHandlers_.on_error) { - evHandlers_.on_error(alert); - } -} - -std::vector< int32_t > ConfigurationManager::getHardwareAudioFormat() -{ - return std::vector<int32_t> {44100, 64}; -} - -} // namespace ring +} // namespace DRing diff --git a/daemon/src/client/configurationmanager.h b/daemon/src/client/configurationmanager.h deleted file mode 100644 index f979c2c6aed2664aad1a9123c1a1f83c893c1b80..0000000000000000000000000000000000000000 --- a/daemon/src/client/configurationmanager.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. - * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> - * Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com> - * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> - * Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Additional permission under GNU GPL version 3 section 7: - * - * If you modify this program, or any covered work, by linking or - * combining it with the OpenSSL project's OpenSSL library (or a - * modified version of that library), containing parts covered by the - * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. - * grants you additional permission to convey the resulting work. - * Corresponding Source for a non-source form of such a combination - * shall include the source code for the parts of OpenSSL used as well - * as that of the covered work. - */ - -#ifndef CONFIGURATIONMANAGER_H -#define CONFIGURATIONMANAGER_H - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <vector> -#include <map> -#include <string> - -#include "dring.h" - -namespace ring { - -class ConfigurationManager -{ - public: - void registerEvHandlers(struct ring_config_ev_handlers* evHandlers); - - // Methods - public: - std::map< std::string, std::string > getAccountDetails(const std::string& accountID); - std::map<std::string, std::string> getVolatileAccountDetails(const std::string& accountID); - void setAccountDetails(const std::string& accountID, const std::map< std::string, std::string >& details); - std::map<std::string, std::string> getAccountTemplate(); - std::string addAccount(const std::map< std::string, std::string >& details); - void removeAccount(const std::string& accoundID); - std::vector< std::string > getAccountList(); - void sendRegister(const std::string& accoundID, bool enable); - void registerAllAccounts(void); - - std::map< std::string, std::string > getTlsSettingsDefault(); - - std::vector< int32_t > getAudioCodecList(); - std::vector< std::string > getSupportedTlsMethod(); - std::vector< std::string > getSupportedCiphers(const std::string& accountID) const; - std::vector< std::string > getAudioCodecDetails(int32_t payload); - std::vector< int32_t > getActiveAudioCodecList(const std::string& accountID); - - void setActiveAudioCodecList(const std::vector< std::string >& list, const std::string& accountID); - - std::vector< std::string > getAudioPluginList(); - void setAudioPlugin(const std::string& audioPlugin); - std::vector< std::string > getAudioOutputDeviceList(); - void setAudioOutputDevice(int32_t index); - void setAudioInputDevice(int32_t index); - void setAudioRingtoneDevice(int32_t index); - std::vector< std::string > getAudioInputDeviceList(); - std::vector< std::string > getCurrentAudioDevicesIndex(); - int32_t getAudioInputDeviceIndex(const std::string& name); - int32_t getAudioOutputDeviceIndex(const std::string& name); - std::string getCurrentAudioOutputPlugin(); - bool getNoiseSuppressState(); - void setNoiseSuppressState(bool state); - - bool isAgcEnabled(); - void setAgcState(bool enabled); - - void muteDtmf(bool mute); - bool isDtmfMuted(); - - bool isCaptureMuted(); - void muteCapture(bool mute); - bool isPlaybackMuted(); - void mutePlayback(bool mute); - - std::string getAudioManager(); - bool setAudioManager(const std::string& api); - - int32_t isIax2Enabled(); - std::string getRecordPath(); - void setRecordPath(const std::string& recPath); - bool getIsAlwaysRecording(); - void setIsAlwaysRecording(bool rec); - - void setHistoryLimit(int32_t days); - int32_t getHistoryLimit(); - void clearHistory(); - - void setAccountsOrder(const std::string& order); - - std::map<std::string, std::string> getHookSettings(); - void setHookSettings(const std::map<std::string, std::string>& settings); - - std::vector<std::map<std::string, std::string> > getHistory(); - - std::map<std::string, std::string> getTlsSettings(); - void setTlsSettings(const std::map< std::string, std::string >& details); - std::map< std::string, std::string > getIp2IpDetails(); - - std::vector< std::map< std::string, std::string > > getCredentials(const std::string& accountID); - void setCredentials(const std::string& accountID, const std::vector< std::map< std::string, std::string > >& details); - - std::string getAddrFromInterfaceName(const std::string& interface); - - std::vector<std::string> getAllIpInterface(); - std::vector<std::string> getAllIpInterfaceByName(); - - std::map<std::string, std::string> getShortcuts(); - void setShortcuts(const std::map<std::string, std::string> &shortcutsMap); - - void setVolume(const std::string& device, double value); - double getVolume(const std::string& device); - - /* - * Security - */ - std::map<std::string, std::string> validateCertificate(const std::string& accountId, - const std::string& certificate, const std::string& privateKey); - std::map<std::string, std::string> getCertificateDetails(const std::string& certificate); - - - // Signals - public: - void volumeChanged(const std::string& device, double value); - - void accountsChanged(); - - void historyChanged(); - - void stunStatusFailure(const std::string& accoundID); - - void registrationStateChanged(const std::string& accoundID, int state); - void sipRegistrationStateChanged(const std::string&, const std::string&, int32_t state); - void volatileAccountDetailsChanged(const std::string& accountID, const std::map<std::string, std::string> &details); - void errorAlert(int alert); - - std::vector< int32_t > getHardwareAudioFormat(); - - private: -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - // Event handlers; needed by the library API - ring_config_ev_handlers evHandlers_{}; -#pragma GCC diagnostic warning "-Wmissing-field-initializers" -}; - -} // namespace ring - -#endif //CONFIGURATIONMANAGER_H diff --git a/daemon/src/client/presencemanager.cpp b/daemon/src/client/presencemanager.cpp index bb7564c6278c46b5c98d75975579ae20cac3eee6..7625c1dcbca4041ba397058a75283cdd728ca1d4 100644 --- a/daemon/src/client/presencemanager.cpp +++ b/daemon/src/client/presencemanager.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2013 Savoir-Faire Linux Inc. * Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +33,7 @@ #include "config.h" #endif -#include "presencemanager.h" +#include "presencemanager_interface.h" #include <cerrno> #include <sstream> @@ -43,39 +44,48 @@ #include "sip/sipaccount.h" #include "sip/sippresence.h" #include "sip/pres_sub_client.h" +#include "client/signal.h" -namespace ring { +namespace DRing { + +using ring::SIPAccount; constexpr static const char* STATUS_KEY = "Status"; constexpr static const char* LINESTATUS_KEY = "LineStatus"; constexpr static const char* ONLINE_KEY = "Online"; constexpr static const char* OFFLINE_KEY = "Offline"; -void PresenceManager::registerEvHandlers(struct ring_pres_ev_handlers* evHandlers) +void +registerPresHandlers(const std::map<std::string, + std::shared_ptr<CallbackWrapperBase>>& handlers) { - evHandlers_ = *evHandlers; + auto& handlers_ = ring::getSignalHandlers(); + for (auto& item : handlers) { + auto iter = handlers_.find(item.first); + if (iter == handlers_.end()) { + RING_ERR("Signal %s not supported", item.first.c_str()); + continue; + } + + iter->second = std::move(item.second); + } } /** * Un/subscribe to buddySipUri for an accountID */ void -PresenceManager::subscribeBuddy(const std::string& accountID, const std::string& uri, bool flag) +subscribeBuddy(const std::string& accountID, const std::string& uri, bool flag) { - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - if (!sipaccount) { + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) { + auto pres = sipaccount->getPresence(); + if (pres and pres->isEnabled() and pres->isSupported(PRESENCE_FUNCTION_SUBSCRIBE)) { + RING_DBG("%subscribePresence (acc:%s, buddy:%s)", + flag ? "S" : "Uns", accountID.c_str(), uri.c_str()); + pres->subscribeClient(uri, flag); + } + } else RING_ERR("Could not find account %s", accountID.c_str()); - return; - } - - auto pres = sipaccount->getPresence(); - - if (pres and pres->isEnabled() and pres->isSupported(PRESENCE_FUNCTION_SUBSCRIBE)) { - RING_DBG("%subscribePresence (acc:%s, buddy:%s)", flag ? "S" : "Uns", - accountID.c_str(), uri.c_str()); - pres->subscribeClient(uri, flag); - } } /** @@ -83,75 +93,58 @@ PresenceManager::subscribeBuddy(const std::string& accountID, const std::string& * Notify for IP2IP account and publish for PBX account */ void -PresenceManager::publish(const std::string& accountID, bool status, const std::string& note) +publish(const std::string& accountID, bool status, const std::string& note) { - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - if (!sipaccount) { + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) { + auto pres = sipaccount->getPresence(); + if (pres and pres->isEnabled() and pres->isSupported(PRESENCE_FUNCTION_PUBLISH)) { + RING_DBG("Send Presence (acc:%s, status %s).", accountID.c_str(), + status ? "online" : "offline"); + pres->sendPresence(status, note); + } + } else RING_ERR("Could not find account %s.", accountID.c_str()); - return; - } - - auto pres = sipaccount->getPresence(); - - if (pres and pres->isEnabled() and pres->isSupported(PRESENCE_FUNCTION_PUBLISH)) { - RING_DBG("Send Presence (acc:%s, status %s).", accountID.c_str(), - status ? "online" : "offline"); - pres->sendPresence(status, note); - } } /** * Accept or not a PresSubServer request for IP2IP account */ void -PresenceManager::answerServerRequest(const std::string& uri, bool flag) +answerServerRequest(const std::string& uri, bool flag) { - const auto account = Manager::instance().getIP2IPAccount(); - const auto sipaccount = static_cast<SIPAccount *>(account.get()); - - if (!sipaccount) { + auto account = ring::Manager::instance().getIP2IPAccount(); + if (auto sipaccount = static_cast<SIPAccount *>(account.get())) { + RING_DBG("Approve presence (acc:IP2IP, serv:%s, flag:%s)", uri.c_str(), + flag ? "true" : "false"); + + if (auto pres = sipaccount->getPresence()) + pres->approvePresSubServer(uri, flag); + else + RING_ERR("Presence not initialized"); + } else RING_ERR("Could not find account IP2IP"); - return; - } - - RING_DBG("Approve presence (acc:IP2IP, serv:%s, flag:%s)", uri.c_str(), - flag ? "true" : "false"); - - auto pres = sipaccount->getPresence(); - - if (!pres) { - RING_ERR("Presence not initialized"); - return; - } - - pres->approvePresSubServer(uri, flag); } /** * Get all active subscriptions for "accountID" */ std::vector<std::map<std::string, std::string> > -PresenceManager::getSubscriptions(const std::string& accountID) +getSubscriptions(const std::string& accountID) { - std::vector<std::map<std::string, std::string> > ret; - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - if (sipaccount) { - const auto pres = sipaccount->getPresence(); - - if (!pres) { + std::vector<std::map<std::string, std::string>> ret; + + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) { + if (auto pres = sipaccount->getPresence()) { + for (const auto& s : pres->getClientSubscriptions()) { + ret.push_back({ + {STATUS_KEY, s->isPresent() ? ONLINE_KEY : OFFLINE_KEY}, + {LINESTATUS_KEY, s->getLineStatus()} + }); + } + } else RING_ERR("Presence not initialized"); - return ret; - } - - for (const auto& s : pres->getClientSubscriptions()) { - std::map<std::string, std::string> sub; - sub[ STATUS_KEY ] = s->isPresent() ? ONLINE_KEY : OFFLINE_KEY; - sub[ LINESTATUS_KEY ] = s->getLineStatus(); - ret.push_back(sub); - } - } + } else + RING_ERR("Could not find account %s.", accountID.c_str()); return ret; } @@ -160,52 +153,16 @@ PresenceManager::getSubscriptions(const std::string& accountID) * Batch subscribing of URIs */ void -PresenceManager::setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris) -{ - const auto sipaccount = Manager::instance().getAccount<SIPAccount>(accountID); - - if (!sipaccount) - return; - - auto pres = sipaccount->getPresence(); - - if (!pres) { - RING_ERR("Presence not initialized"); - return; - } - - for (const auto &u : uris) - pres->subscribeClient(u, true); -} - -void PresenceManager::newServerSubscriptionRequest(const std::string& remote) +setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris) { - if (evHandlers_.on_new_server_subscription_request) { - evHandlers_.on_new_server_subscription_request(remote); - } -} - -void PresenceManager::serverError(const std::string& accountID, const std::string& error, const std::string& msg) -{ - if (evHandlers_.on_server_error) { - evHandlers_.on_server_error(accountID, error, msg); - } -} - -void PresenceManager::newBuddyNotification(const std::string& accountID, const std::string& buddyUri, - bool status, const std::string& lineStatus) -{ - if (evHandlers_.on_new_buddy_notification) { - evHandlers_.on_new_buddy_notification(accountID, buddyUri, status, lineStatus); - } -} - -void PresenceManager::subscriptionStateChanged(const std::string& accountID, const std::string& buddyUri, - bool state) -{ - if (evHandlers_.on_subscription_state_change) { - evHandlers_.on_subscription_state_change(accountID, buddyUri, state); - } + if (auto sipaccount = ring::Manager::instance().getAccount<SIPAccount>(accountID)) { + if (auto pres = sipaccount->getPresence()) { + for (const auto &u : uris) + pres->subscribeClient(u, true); + } else + RING_ERR("Presence not initialized"); + } else + RING_ERR("Could not find account %s.", accountID.c_str()); } -} // namespace ring +} // namespace DRing diff --git a/daemon/src/client/presencemanager.h b/daemon/src/client/presencemanager.h deleted file mode 100644 index ddd24e953e1dc0d5a1a0336d1f44d4ad41aedbb8..0000000000000000000000000000000000000000 --- a/daemon/src/client/presencemanager.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2013 Savoir-Faire Linux Inc. - * Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Additional permission under GNU GPL version 3 section 7: - * - * If you modify this program, or any covered work, by linking or - * combining it with the OpenSSL project's OpenSSL library (or a - * modified version of that library), containing parts covered by the - * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. - * grants you additional permission to convey the resulting work. - * Corresponding Source for a non-source form of such a combination - * shall include the source code for the parts of OpenSSL used as well - * as that of the covered work. - */ - -#ifndef PRESENCEINT_H -#define PRESENCEINT_H - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <vector> -#include <string> - -#include "dring.h" - -namespace ring { - -class PresenceManager -{ - public: - void registerEvHandlers(struct ring_pres_ev_handlers* evHandlers); - - // Methods - public: - /* Presence subscription/Notification. */ - void publish(const std::string& accountID, bool status, const std::string& note); - void answerServerRequest(const std::string& uri, bool flag); - void subscribeBuddy(const std::string& accountID, const std::string& uri, bool flag); - std::vector<std::map<std::string, std::string> > getSubscriptions(const std::string& accountID); - void setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris); - - // Signals - public: - void newServerSubscriptionRequest(const std::string& remote); - void serverError(const std::string& accountID, const std::string& error, const std::string& msg); - void newBuddyNotification(const std::string& accountID, const std::string& buddyUri, - bool status, const std::string& lineStatus); - void subscriptionStateChanged(const std::string& accountID, const std::string& buddyUri, bool state); - - private: -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - // Event handlers; needed by the library API - ring_pres_ev_handlers evHandlers_{}; -#pragma GCC diagnostic warning "-Wmissing-field-initializers" -}; - -} // namespace ring - -#endif //PRESENCEINT_H diff --git a/daemon/src/client/signal.cpp b/daemon/src/client/signal.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5991976a11ae48e6e2fe76e0dbd2f3c10bb85663 --- /dev/null +++ b/daemon/src/client/signal.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2015 Savoir-Faire Linux Inc. + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#include "signal.h" + +namespace ring { + +SignalHandlerMap& +getSignalHandlers() +{ + static SignalHandlerMap handlers = { + /* Call */ + exported_callback<DRing::CallSignal::StateChange>(), + exported_callback<DRing::CallSignal::TransferFailed>(), + exported_callback<DRing::CallSignal::TransferSucceeded>(), + exported_callback<DRing::CallSignal::RecordPlaybackStopped>(), + exported_callback<DRing::CallSignal::VoiceMailNotify>(), + exported_callback<DRing::CallSignal::IncomingMessage>(), + exported_callback<DRing::CallSignal::IncomingCall>(), + exported_callback<DRing::CallSignal::RecordPlaybackFilepath>(), + exported_callback<DRing::CallSignal::ConferenceCreated>(), + exported_callback<DRing::CallSignal::ConferenceChanged>(), + exported_callback<DRing::CallSignal::UpdatePlaybackScale>(), + exported_callback<DRing::CallSignal::ConferenceRemoved>(), + exported_callback<DRing::CallSignal::NewCallCreated>(), + exported_callback<DRing::CallSignal::SipCallStateChanged>(), + exported_callback<DRing::CallSignal::RecordingStateChanged>(), + exported_callback<DRing::CallSignal::SecureSdesOn>(), + exported_callback<DRing::CallSignal::SecureSdesOff>(), + exported_callback<DRing::CallSignal::SecureZrtpOn>(), + exported_callback<DRing::CallSignal::SecureZrtpOff>(), + exported_callback<DRing::CallSignal::ShowSAS>(), + exported_callback<DRing::CallSignal::ZrtpNotSuppOther>(), + exported_callback<DRing::CallSignal::ZrtpNegotiationFailed>(), + exported_callback<DRing::CallSignal::RtcpReportReceived>(), + + /* Configuration */ + exported_callback<DRing::ConfigurationSignal::VolumeChanged>(), + exported_callback<DRing::ConfigurationSignal::AccountsChanged>(), + exported_callback<DRing::ConfigurationSignal::HistoryChanged>(), + exported_callback<DRing::ConfigurationSignal::StunStatusFailed>(), + exported_callback<DRing::ConfigurationSignal::RegistrationStateChanged>(), + exported_callback<DRing::ConfigurationSignal::SipRegistrationStateChanged>(), + exported_callback<DRing::ConfigurationSignal::VolatileDetailsChanged>(), + exported_callback<DRing::ConfigurationSignal::Error>(), + + /* Presence */ + exported_callback<DRing::PresenceSignal::NewServerSubscriptionRequest>(), + exported_callback<DRing::PresenceSignal::ServerError>(), + exported_callback<DRing::PresenceSignal::NewBuddyNotification>(), + exported_callback<DRing::PresenceSignal::SubscriptionStateChanged>(), + + /* Video */ + exported_callback<DRing::VideoSignal::DeviceEvent>(), + exported_callback<DRing::VideoSignal::DecodingStarted>(), + exported_callback<DRing::VideoSignal::DecodingStopped>(), + }; + + return handlers; +} + +}; // namespace ring diff --git a/daemon/src/client/signal.h b/daemon/src/client/signal.h new file mode 100644 index 0000000000000000000000000000000000000000..28a66a90576a05d0d3b68ffa68f7fa55d4bc02de --- /dev/null +++ b/daemon/src/client/signal.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2015 Savoir-Faire Linux Inc. + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#pragma once + +#include "dring/callmanager_interface.h" +#include "dring/configurationmanager_interface.h" +#include "dring/presencemanager_interface.h" + +#ifdef RING_VIDEO +#include "dring/videomanager_interface.h" +#endif // RING_VIDEO + +#include "logger.h" + +#include <exception> +#include <memory> + +namespace ring { + +using SignalHandlerMap = std::map<std::string, std::shared_ptr<DRing::CallbackWrapperBase>>; +extern SignalHandlerMap& getSignalHandlers(); + +/* + * Find related user given callback and call it with given + * arguments. + */ +template <typename Ts, typename ...Args> +static void emitSignal(Args...args) { + const auto& handlers = getSignalHandlers(); + if (auto cb = *DRing::CallbackWrapper<typename Ts::cb_type> {handlers.at(Ts::name)}) { + try { + cb(args...); + } catch (std::exception& e) { + RING_ERR("Exception during emit signal %d:\n%s", Ts::name, e.what()); + } + } +} + +template <typename Ts> +std::pair<std::string, std::shared_ptr<DRing::CallbackWrapper<typename Ts::cb_type>>> +exported_callback() { + return std::make_pair((const std::string&)Ts::name, std::make_shared<DRing::CallbackWrapper<typename Ts::cb_type>>()); +} + +} // namespace ring diff --git a/daemon/src/client/videomanager.cpp b/daemon/src/client/videomanager.cpp index 2afdd9f6e8a8e809b4af96bc5362cac125d515e9..5ec3995271f51243bf96b652203d0e27679bbbd1 100644 --- a/daemon/src/client/videomanager.cpp +++ b/daemon/src/client/videomanager.cpp @@ -30,6 +30,7 @@ * as that of the covered work. */ +#include "videomanager_interface.h" #include "videomanager.h" #include "libav_utils.h" #include "video/video_input.h" @@ -37,151 +38,150 @@ #include "account.h" #include "logger.h" #include "manager.h" +#include "client/signal.h" -namespace ring { +namespace DRing { -void VideoManager::registerEvHandlers(struct ring_video_ev_handlers* evHandlers) -{ - evHandlers_ = *evHandlers; -} +using ring::videoManager; -video::VideoDeviceMonitor & -VideoManager::getVideoDeviceMonitor() -{ - return videoDeviceMonitor_; +void +registerVideoHandlers(const std::map<std::string, + std::shared_ptr<CallbackWrapperBase>>& handlers) +{ + auto& handlers_ = ring::getSignalHandlers(); + for (auto& item : handlers) { + auto iter = handlers_.find(item.first); + if (iter == handlers_.end()) { + RING_ERR("Signal %s not supported", item.first.c_str()); + continue; + } + + iter->second = std::move(item.second); + } } -std::vector<std::map<std::string, std::string> > -VideoManager::getCodecs(const std::string &accountID) + +std::vector<std::map<std::string, std::string>> +getCodecs(const std::string& accountID) { - if (const auto acc = Manager::instance().getAccount(accountID)) + if (auto acc = ring::Manager::instance().getAccount(accountID)) return acc->getAllVideoCodecs(); - else - return std::vector<std::map<std::string, std::string> >(); + return {}; } void -VideoManager::setCodecs(const std::string& accountID, - const std::vector<std::map<std::string, std::string> > &details) +setCodecs(const std::string& accountID, + const std::vector<std::map<std::string, std::string>>& details) { - if (auto acc = Manager::instance().getAccount(accountID)) { + if (auto acc = ring::Manager::instance().getAccount(accountID)) { acc->setVideoCodecs(details); - Manager::instance().saveConfig(); + ring::Manager::instance().saveConfig(); } } std::vector<std::string> -VideoManager::getDeviceList() +getDeviceList() { - return videoDeviceMonitor_.getDeviceList(); + return videoManager.videoDeviceMonitor.getDeviceList(); } -video::VideoCapabilities -VideoManager::getCapabilities(const std::string& name) +VideoCapabilities +getCapabilities(const std::string& name) { - return videoDeviceMonitor_.getCapabilities(name); + return videoManager.videoDeviceMonitor.getCapabilities(name); } std::string -VideoManager::getDefaultDevice() +getDefaultDevice() { - return videoDeviceMonitor_.getDefaultDevice(); + return videoManager.videoDeviceMonitor.getDefaultDevice(); } void -VideoManager::setDefaultDevice(const std::string &name) +setDefaultDevice(const std::string& name) { RING_DBG("Setting device to %s", name.c_str()); - videoDeviceMonitor_.setDefaultDevice(name); + videoManager.videoDeviceMonitor.setDefaultDevice(name); } std::map<std::string, std::string> -VideoManager::getSettings(const std::string& name) { - return videoDeviceMonitor_.getSettings(name); +getSettings(const std::string& name) +{ + return videoManager.videoDeviceMonitor.getSettings(name); } void -VideoManager::applySettings(const std::string& name, - const std::map<std::string, std::string>& settings) +applySettings(const std::string& name, + const std::map<std::string, std::string>& settings) { - videoDeviceMonitor_.applySettings(name, settings); + videoManager.videoDeviceMonitor.applySettings(name, settings); } void -VideoManager::startCamera() +startCamera() { - videoPreview_ = getVideoCamera(); - started_ = switchToCamera(); + videoManager.videoPreview = ring::getVideoCamera(); + videoManager.started = switchToCamera(); } void -VideoManager::stopCamera() +stopCamera() { if (switchInput("")) - started_ = false; - videoPreview_.reset(); + videoManager.started = false; + videoManager.videoPreview.reset(); } bool -VideoManager::switchInput(const std::string &resource) +switchInput(const std::string& resource) { - auto input = videoInput_.lock(); - if (!input) { - RING_WARN("Video input not initialized"); - return false; - } - return input->switchInput(resource); + if (auto input = videoManager.videoInput.lock()) + return input->switchInput(resource); + + RING_WARN("Video input not initialized"); + return false; } bool -VideoManager::switchToCamera() +switchToCamera() { - return switchInput("v4l2://" + videoDeviceMonitor_.getDefaultDevice()); -} - -std::shared_ptr<video::VideoFrameActiveWriter> -VideoManager::getVideoCamera() -{ - auto input = videoInput_.lock(); - if (!input) { - started_ = false; - input.reset(new video::VideoInput()); - videoInput_ = input; - } - return input; + return switchInput("v4l2://" + videoManager.videoDeviceMonitor.getDefaultDevice()); } bool -VideoManager::hasCameraStarted() +hasCameraStarted() { - return started_; + return videoManager.started; } std::string -VideoManager::getCurrentCodecName(const std::string & /*callID*/) +getCurrentCodecName(const std::string& /*callID*/) { return ""; } -void VideoManager::deviceEvent() -{ - if (evHandlers_.on_device_event) { - evHandlers_.on_device_event(); - } -} +} // namespace DRing + +namespace ring { -void VideoManager::startedDecoding(const std::string &id, const std::string& shmPath, int w, int h, bool isMixer) +VideoManager videoManager; + +std::shared_ptr<video::VideoFrameActiveWriter> +getVideoCamera() { - if (evHandlers_.on_start_decoding) { - evHandlers_.on_start_decoding(id, shmPath, w, h, isMixer); - } + if (auto input = videoManager.videoInput.lock()) + return input; + + videoManager.started = false; + auto input = std::make_shared<video::VideoInput>(); + videoManager.videoInput = input; + return input; } -void VideoManager::stoppedDecoding(const std::string &id, const std::string& shmPath, bool isMixer) +video::VideoDeviceMonitor& +getVideoDeviceMonitor() { - if (evHandlers_.on_stop_decoding) { - evHandlers_.on_stop_decoding(id, shmPath, isMixer); - } + return videoManager.videoDeviceMonitor; } } // namespace ring diff --git a/daemon/src/client/videomanager.h b/daemon/src/client/videomanager.h index d287ca320d3708a07927182f472ffdcad5ec2d0e..c7772faa6232f6bfcd3fe18a300228102c3efd8c 100644 --- a/daemon/src/client/videomanager.h +++ b/daemon/src/client/videomanager.h @@ -43,13 +43,12 @@ #include "video/video_base.h" #include "video/video_input.h" -#include "dring.h" namespace ring { -class VideoManager +struct VideoManager { - private: + public: /* VideoManager acts as a cache of the active VideoInput. * When this input is needed, you must use getVideoCamera * to create the instance if not done yet and obtain a shared pointer @@ -58,63 +57,16 @@ class VideoManager * this video input instance: this instance is destroyed when the last * external user has released its shared pointer. */ - std::weak_ptr<video::VideoInput> videoInput_ = {}; - std::shared_ptr<video::VideoFrameActiveWriter> videoPreview_ = nullptr; - video::VideoDeviceMonitor videoDeviceMonitor_ = {}; - - public: - void registerEvHandlers(struct ring_video_ev_handlers* evHandlers); - video::VideoDeviceMonitor& getVideoDeviceMonitor(); - - // Methods - public: - std::vector<std::map<std::string, std::string> > - getCodecs(const std::string& accountID); - - void - setCodecs(const std::string& accountID, - const std::vector<std::map<std::string, std::string> > &details); - - std::vector<std::string> - getDeviceList(); - - video::VideoCapabilities - getCapabilities(const std::string& name); - - std::map<std::string, std::string> - getSettings(const std::string& name); - - void - applySettings(const std::string& name, const std::map<std::string, std::string>& settings); - - void - setDefaultDevice(const std::string& name); - - std::string - getDefaultDevice(); - - std::string - getCurrentCodecName(const std::string &callID); - - std::atomic_bool started_ = {false}; - void startCamera(); - void stopCamera(); - bool hasCameraStarted(); - bool switchInput(const std::string& resource); - bool switchToCamera(); - std::shared_ptr<video::VideoFrameActiveWriter> getVideoCamera(); + std::weak_ptr<video::VideoInput> videoInput; + std::shared_ptr<video::VideoFrameActiveWriter> videoPreview; + video::VideoDeviceMonitor videoDeviceMonitor; + std::atomic_bool started; +}; - // Signals - public: - void deviceEvent(); - void startedDecoding(const std::string &id, const std::string& shmPath, int w, int h, bool isMixer); - void stoppedDecoding(const std::string &id, const std::string& shmPath, bool isMixer); +extern VideoManager videoManager; - private: -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" - ring_video_ev_handlers evHandlers_{}; -#pragma GCC diagnostic warning "-Wmissing-field-initializers" -}; +std::shared_ptr<video::VideoFrameActiveWriter> getVideoCamera(); +video::VideoDeviceMonitor& getVideoDeviceMonitor(); } // namespace ring diff --git a/daemon/src/dring/callmanager_interface.h b/daemon/src/dring/callmanager_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..f53970542ccce5840562cb74730ebc9efba32682 --- /dev/null +++ b/daemon/src/dring/callmanager_interface.h @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. + * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#ifndef __RING_CALLMANAGERI_H__ +#define __RING_CALLMANAGERI_H__ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdexcept> +#include <map> +#include <vector> +#include <string> +#include <functional> +#include <string> + +#include "dring.h" + +namespace DRing { + +class CallManagerException: public std::runtime_error { + public: + CallManagerException(const std::string& str = "") : + std::runtime_error("A CallManagerException occured: " + str) {} +}; + +// Call signal type definitions +struct CallSignal { + struct StateChange { + constexpr static const char* name = "StateChange"; + using cb_type = void(const std::string&, const std::string&); + }; + struct TransferFailed { + constexpr static const char* name = "TransferFailed"; + using cb_type = void(void); + }; + struct TransferSucceeded { + constexpr static const char* name = "TransferSucceeded"; + using cb_type = void(void); + }; + struct RecordPlaybackStopped { + constexpr static const char* name = "RecordPlaybackStopped"; + using cb_type = void(const std::string&); + }; + struct VoiceMailNotify { + constexpr static const char* name = "VoiceMailNotify"; + using cb_type = void(const std::string&, int32_t); + }; + struct IncomingMessage { + constexpr static const char* name = "IncomingMessage"; + using cb_type = void(const std::string&, const std::string&, const std::string&); + }; + struct IncomingCall { + constexpr static const char* name = "IncomingCall"; + using cb_type = void(const std::string&, const std::string&, const std::string&); + }; + struct RecordPlaybackFilepath { + constexpr static const char* name = "RecordPlaybackFilepath"; + using cb_type = void(const std::string&, const std::string&); + }; + struct ConferenceCreated { + constexpr static const char* name = "ConferenceCreated"; + using cb_type = void(const std::string&); + }; + struct ConferenceChanged { + constexpr static const char* name = "ConferenceChanged"; + using cb_type = void(const std::string&, const std::string&); + }; + struct UpdatePlaybackScale { + constexpr static const char* name = "UpdatePlaybackScale"; + using cb_type = void(const std::string&, unsigned, unsigned); + }; + struct ConferenceRemoved { + constexpr static const char* name = "ConferenceRemoved"; + using cb_type = void(const std::string&); + }; + struct NewCallCreated { + constexpr static const char* name = "NewCallCreated"; + using cb_type = void(const std::string&, const std::string&, const std::string&); + }; + struct SipCallStateChanged { + constexpr static const char* name = "SipCallStateChanged"; + using cb_type = void(const std::string&, const std::string&, int); + }; + struct RecordingStateChanged { + constexpr static const char* name = "RecordingStateChanged"; + using cb_type = void(const std::string&, int); + }; + struct SecureSdesOn { + constexpr static const char* name = "SecureSdesOn"; + using cb_type = void(const std::string&); + }; + struct SecureSdesOff { + constexpr static const char* name = "SecureSdesOff"; + using cb_type = void(const std::string&); + }; + struct SecureZrtpOn { + constexpr static const char* name = "SecureZrtpOn"; + using cb_type = void(const std::string&, const std::string&); + }; + struct SecureZrtpOff { + constexpr static const char* name = "SecureZrtpOff"; + using cb_type = void(const std::string&); + }; + struct ShowSAS { + constexpr static const char* name = "ShowSAS"; + using cb_type = void(const std::string&, const std::string&, int); + }; + struct ZrtpNotSuppOther { + constexpr static const char* name = "ZrtpNotSuppOther"; + using cb_type = void(const std::string&); + }; + struct ZrtpNegotiationFailed { + constexpr static const char* name = "ZrtpNegotiationFailed"; + using cb_type = void(const std::string&, const std::string&, const std::string&); + }; + struct RtcpReportReceived { + constexpr static const char* name = "RtcpReportReceived"; + using cb_type = void(const std::string&, const std::map<std::string, int>&); + }; +}; + +void registerCallHandlers(const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&); + +/* Call related methods */ +bool placeCall(const std::string& accountID, const std::string& callID, const std::string& to); + +bool refuse(const std::string& callID); +bool accept(const std::string& callID); +bool hangUp(const std::string& callID); +bool hold(const std::string& callID); +bool unhold(const std::string& callID); +bool transfer(const std::string& callID, const std::string& to); +bool attendedTransfer(const std::string& transferID, const std::string& targetID); +std::map<std::string, std::string> getCallDetails(const std::string& callID); +std::vector<std::string> getCallList(); + +/* Conference related methods */ +void removeConference(const std::string& conference_id); +bool joinParticipant(const std::string& sel_callID, const std::string& drag_callID); +void createConfFromParticipantList(const std::vector<std::string>& participants); +bool isConferenceParticipant(const std::string& call_id); +bool addParticipant(const std::string& callID, const std::string& confID); +bool addMainParticipant(const std::string& confID); +bool detachParticipant(const std::string& callID); +bool joinConference(const std::string& sel_confID, const std::string& drag_confID); +bool hangUpConference(const std::string& confID); +bool holdConference(const std::string& confID); +bool unholdConference(const std::string& confID); +std::vector<std::string> getConferenceList(); +std::vector<std::string> getParticipantList(const std::string& confID); +std::vector<std::string> getDisplayNames(const std::string& confID); +std::string getConferenceId(const std::string& callID); +std::map<std::string, std::string> getConferenceDetails(const std::string& callID); + +/* File Playback methods */ +bool startRecordedFilePlayback(const std::string& filepath); +void stopRecordedFilePlayback(const std::string& filepath); + +/* General audio methods */ +bool toggleRecording(const std::string& callID); +/* DEPRECATED */ +void setRecording(const std::string& callID); + +void recordPlaybackSeek(double value); +bool getIsRecording(const std::string& callID); +std::string getCurrentAudioCodecName(const std::string& callID); +void playDTMF(const std::string& key); +void startTone(int32_t start, int32_t type); + +/* Security related methods */ +void setSASVerified(const std::string& callID); +void resetSASVerified(const std::string& callID); +void setConfirmGoClear(const std::string& callID); +void requestGoClear(const std::string& callID); +void acceptEnrollment(const std::string& callID, bool accepted); + +/* Instant messaging */ +void sendTextMessage(const std::string& callID, const std::string& message); +void sendTextMessage(const std::string& callID, const std::string& message, const std::string& from); + +} // namespace DRing + +#endif//CALLMANAGERI_H diff --git a/daemon/src/dring/configurationmanager_interface.h b/daemon/src/dring/configurationmanager_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..e5847313f81c91ba72af0de9638749f43a4f8453 --- /dev/null +++ b/daemon/src/dring/configurationmanager_interface.h @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2004-2015 Savoir-Faire Linux Inc. + * Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com> + * Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com> + * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> + * Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#ifndef CONFIGURATIONMANAGERI_H +#define CONFIGURATIONMANAGERI_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <vector> +#include <map> +#include <string> +#include <functional> +#include <tuple> + +#include "dring.h" + +namespace DRing { + +// Configuration signal type definitions +struct ConfigurationSignal { + struct VolumeChanged { + constexpr static const char* name = "VolumeChanged"; + using cb_type = void(const std::string& /*device*/, double /*value*/); + }; + struct AccountsChanged { + constexpr static const char* name = "AccountsChanged"; + using cb_type = void(void); + }; + struct HistoryChanged { + constexpr static const char* name = "HistoryChanged"; + using cb_type = void(void); + }; + struct StunStatusFailed { + constexpr static const char* name = "StunStatusFailed"; + using cb_type = void(const std::string& /*account_id*/); + }; + struct RegistrationStateChanged { + constexpr static const char* name = "RegistrationStateChanged"; + using cb_type = void(const std::string& /*account_id*/, int /*state*/); + }; + struct SipRegistrationStateChanged { + constexpr static const char* name = "SipRegistrationStateChanged"; + using cb_type = void(const std::string& /*account_id*/, const std::string& /*state*/, int /*code*/); + }; + struct VolatileDetailsChanged { + constexpr static const char* name = "VolatileDetailsChanged"; + using cb_type = void(const std::string& /*account_id*/, const std::map<std::string, std::string>& /* details */); + }; + struct Error { + constexpr static const char* name = "Error"; + using cb_type = void(int /*alert*/); + }; +}; + + +void registerConfHandlers(const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&); + +std::map<std::string, std::string> getAccountDetails(const std::string& accountID); +std::map<std::string, std::string> getVolatileAccountDetails(const std::string& accountID); +void setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details); +std::map<std::string, std::string> getAccountTemplate(); +std::string addAccount(const std::map<std::string, std::string>& details); +void removeAccount(const std::string& accoundID); +std::vector<std::string> getAccountList(); +void sendRegister(const std::string& accoundID, bool enable); +void registerAllAccounts(void); + +std::map<std::string, std::string> getTlsDefaultSettings(); + +std::vector<int32_t> getAudioCodecList(); +std::vector<std::string> getSupportedTlsMethod(); +std::vector<std::string> getSupportedCiphers(const std::string& accountID); +std::vector<std::string> getAudioCodecDetails(int32_t payload); +std::vector<int32_t> getActiveAudioCodecList(const std::string& accountID); + +void setActiveAudioCodecList(const std::vector<std::string>& list, const std::string& accountID); + +std::vector<std::string> getAudioPluginList(); +void setAudioPlugin(const std::string& audioPlugin); +std::vector<std::string> getAudioOutputDeviceList(); +void setAudioOutputDevice(int32_t index); +void setAudioInputDevice(int32_t index); +void setAudioRingtoneDevice(int32_t index); +std::vector<std::string> getAudioInputDeviceList(); +std::vector<std::string> getCurrentAudioDevicesIndex(); +int32_t getAudioInputDeviceIndex(const std::string& name); +int32_t getAudioOutputDeviceIndex(const std::string& name); +std::string getCurrentAudioOutputPlugin(); +bool getNoiseSuppressState(); +void setNoiseSuppressState(bool state); + +bool isAgcEnabled(); +void setAgcState(bool enabled); + +void muteDtmf(bool mute); +bool isDtmfMuted(); + +bool isCaptureMuted(); +void muteCapture(bool mute); +bool isPlaybackMuted(); +void mutePlayback(bool mute); + +std::string getAudioManager(); +bool setAudioManager(const std::string& api); + +int32_t isIax2Enabled(); +std::string getRecordPath(); +void setRecordPath(const std::string& recPath); +bool getIsAlwaysRecording(); +void setIsAlwaysRecording(bool rec); + +void setHistoryLimit(int32_t days); +int32_t getHistoryLimit(); +void clearHistory(); + +void setAccountsOrder(const std::string& order); + +std::map<std::string, std::string> getHookSettings(); +void setHookSettings(const std::map<std::string, std::string>& settings); + +std::vector<std::map<std::string, std::string>> getHistory(); + +std::map<std::string, std::string> getTlsSettings(); +void setTlsSettings(const std::map<std::string, std::string>& details); +std::map<std::string, std::string> getIp2IpDetails(); + +std::vector<std::map<std::string, std::string>> getCredentials(const std::string& accountID); +void setCredentials(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details); + +std::string getAddrFromInterfaceName(const std::string& interface); + +std::vector<std::string> getAllIpInterface(); +std::vector<std::string> getAllIpInterfaceByName(); + +std::map<std::string, std::string> getShortcuts(); +void setShortcuts(const std::map<std::string, std::string> &shortcutsMap); + +void setVolume(const std::string& device, double value); +double getVolume(const std::string& device); + +/* + * Security + */ +std::map<std::string, std::string> validateCertificate(const std::string& accountId, + const std::string& certificate, const std::string& privateKey); +std::map<std::string, std::string> getCertificateDetails(const std::string& certificate); + +} // namespace DRing + +#endif //CONFIGURATIONMANAGERI_H diff --git a/daemon/src/dring/dring.h b/daemon/src/dring/dring.h index dd5081df3d70201ea906f7ba6941222caa1d1ad8..818fa0183425265d2834705d678db00d80628695 100644 --- a/daemon/src/dring/dring.h +++ b/daemon/src/dring/dring.h @@ -1,6 +1,7 @@ /* - * Copyright (C) 2014 Savoir-Faire Linux Inc. + * Copyright (C) 2014-2015 Savoir-Faire Linux Inc. * Author: Philippe Proulx <philippe.proulx@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,8 +28,8 @@ * shall include the source code for the parts of OpenSSL used as well * as that of the covered work. */ -#ifndef RING_H -#define RING_H +#ifndef DRING_H +#define DRING_H #ifdef HAVE_CONFIG_H #include "config.h" @@ -38,97 +39,104 @@ #include <functional> #include <string> #include <map> +#include <memory> +#include <type_traits> -const char * -ring_version(); +namespace DRing { -/* presence events */ -struct ring_pres_ev_handlers -{ - std::function<void (const std::string& /*remote*/)> on_new_server_subscription_request; - std::function<void (const std::string& /*account_id*/, const std::string& /*error*/, const std::string& /*msg*/)> on_server_error; - std::function<void (const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*status*/, const std::string& /*line_status*/)> on_new_buddy_notification; - std::function<void (const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*state*/)> on_subscription_state_change; -}; - -/* configuration events */ -struct ring_config_ev_handlers -{ - std::function<void (const std::string& /*device*/, double /*value*/)> on_volume_change; - std::function<void ()> on_accounts_change; - std::function<void ()> on_history_change; - std::function<void (const std::string& /*account_id*/)> on_stun_status_fail; - std::function<void (const std::string& /*account_id*/, int /*state*/)> on_registration_state_change; - std::function<void (const std::string& /*account_id*/, const std::string& /*state*/, int /*code*/)> on_sip_registration_state_change; - std::function<void (const std::string& /*account_id*/, const std::map<std::string, std::string>& /* details */)> on_volatile_details_change; - std::function<void (int /*alert*/)> on_error; -}; +enum class EventHandlerKey { CALL, CONFIG, PRESENCE, VIDEO }; -/* call events */ -struct ring_call_ev_handlers -{ - std::function<void (const std::string& /*call_id*/, const std::string& /*state*/)> on_state_change; - std::function<void ()> on_transfer_fail; - std::function<void ()> on_transfer_success; - std::function<void (const std::string& /*path*/)> on_record_playback_stopped; - std::function<void (const std::string& /*call_id*/, int /*nd_msg*/)> on_voice_mail_notify; - std::function<void (const std::string& /*id*/, const std::string& /*from*/, const std::string& /*msg*/)> on_incoming_message; - std::function<void (const std::string& /*account_id*/, const std::string& /*call_id*/, const std::string& /*from*/)> on_incoming_call; - std::function<void (const std::string& /*id*/, const std::string& /*filename*/)> on_record_playback_filepath; - std::function<void (const std::string& /*conf_id*/)> on_conference_created; - std::function<void (const std::string& /*conf_id*/, const std::string& /*state*/)> on_conference_changed; - std::function<void (const std::string& /*filepath*/, int /*position*/, int /*scale*/)> on_update_playback_scale; - std::function<void (const std::string& /*conf_id*/)> on_conference_remove; - std::function<void (const std::string& /*account_id*/, const std::string& /*call_id*/, const std::string& /*to*/)> on_new_call; - std::function<void (const std::string& /*call_id*/, const std::string& /*state*/, int /*code*/)> on_sip_call_state_change; - std::function<void (const std::string& /*call_id*/, int /*state*/)> on_record_state_change; - std::function<void (const std::string& /*call_id*/)> on_secure_sdes_on; - std::function<void (const std::string& /*call_id*/)> on_secure_sdes_off; - std::function<void (const std::string& /*call_id*/, const std::string& /*cipher*/)> on_secure_zrtp_on; - std::function<void (const std::string& /*call_id*/)> on_secure_zrtp_off; - std::function<void (const std::string& /*call_id*/, const std::string& /*sas*/, int /*verified*/)> on_show_sas; - std::function<void (const std::string& /*call_id*/)> on_zrtp_not_supp_other; - std::function<void (const std::string& /*call_id*/, const std::string& /*reason*/, const std::string& /*severity*/)> on_zrtp_negotiation_fail; - std::function<void (const std::string& /*call_id*/, const std::map<std::string, int>& /*stats*/)> on_rtcp_receive_report; +/* error codes returned by functions of this API */ +enum class InitResult { + SUCCESS=0, + ERR_MANAGER_INIT, }; -/* video events */ -#ifdef RING_VIDEO -struct ring_video_ev_handlers -{ - std::function<void ()> on_device_event; - std::function<void (const std::string& /*id*/, const std::string& /*shm_path*/, int /*w*/, int /*h*/, bool /*is_mixer*/)> on_start_decoding; - std::function<void (const std::string& /*id*/, const std::string& /*shm_path*/, bool /*is_mixer*/)> on_stop_decoding; +/* flags for initialization */ +enum InitFlag { + DRING_FLAG_DEBUG=1, + DRING_FLAG_CONSOLE_LOG=2, }; -#endif /* RING_VIDEO */ -#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +/* External Callback Dynamic Utilities + * + * The library provides to users a way to be acknowledged + * when daemon's objects have a state change. + * The user is aware of this changement wen the deamon calls + * a user-given callback. + * Daemon handles many of these callbacks, one per event type. + * The user registers his callback when he calls daemon DRing:init(). + * Each callback has its own function signature. + * To keep ABI compatibility we don't let user directly provides + * his callbacks as it or through a structure. + * This way bring ABI violation if we need to change the order + * and/or the existance of any callback type. + * Thus the user have to pass them using following template classes + * and functions, that wraps user-callback in a generic and ABI-compatible way. + */ -/* all handlers */ -struct ring_ev_handlers -{ - ring_call_ev_handlers call_ev_handlers; - ring_config_ev_handlers config_ev_handlers; - ring_pres_ev_handlers pres_ev_handlers; +/* Generic class to transit user callbacks to daemon library. + * Used conjointly with std::shared_ptr to hide the concrete class. + * See CallbackWrapper template for details. + */ +class CallbackWrapperBase {}; -#ifdef RING_VIDEO - ring_video_ev_handlers video_ev_handlers; -#endif /* RING_VIDEO */ +/* Concrete class of CallbackWrapperBase. + * This class wraps callbacks of a specific signature. + * Also used to obtain the user callback from a CallbackWrapperBase shared ptr. + * + * This class is CopyConstructible, CopyAssignable, MoveConstructible + * and MoveAssignable. + */ +template <typename TProto> +class CallbackWrapper : public CallbackWrapperBase { + private: + using TFunc = std::function<TProto>; + TFunc cb_; // The user-callback + + public: + // Empty wrapper: no callback associated. + // Used to initialize internal callback arrays. + CallbackWrapper() noexcept {} + + // Create and initialize a wrapper to given callback. + CallbackWrapper(TFunc&& func) noexcept { + cb_ = std::forward<TFunc>(func); + } + + // Create and initialize a wrapper from a generic CallbackWrapperBase + // shared pointer. + // Note: the given callback is copied into internal storage. + CallbackWrapper(std::shared_ptr<CallbackWrapperBase> p) noexcept { + if (p) + cb_ = ((CallbackWrapper<TProto>*)p.get())->cb_; + } + + // Return user-callback reference. + // The returned std::function can be null-initialized if no callback + // has been set. + const constexpr TFunc& operator *() const noexcept { + return cb_; + } + + // Return boolean true value if a non-null callback has been set + explicit constexpr operator bool() const noexcept { + return static_cast<bool>(cb_); + } }; -#pragma GCC diagnostic warning "-Wmissing-field-initializers" +// Return an exportable callback object. +// This object is a std::pair of a string and a CallbackWrapperBase shared_ptr. +// This last wraps given callback in a ABI-compatible way. +// Note: this version accepts callback as a rvalue. +template <typename Ts> +std::pair<std::string, std::shared_ptr<CallbackWrapperBase>> +exportable_callback(std::function<typename Ts::cb_type>&& func) { + return std::make_pair((const std::string&)Ts::name, std::make_shared<CallbackWrapper<typename Ts::cb_type>>(std::forward<std::function<typename Ts::cb_type>>(func))); +} -/* error codes returned by functions of this API */ -enum ring_error { - RING_ERR_MANAGER_INIT, - RING_ERR_UNKNOWN, -}; - -/* flags for initialization */ -enum ring_init_flag { - RING_FLAG_DEBUG = 1, - RING_FLAG_CONSOLE_LOG = 2, -}; +/* Return the library version */ +const char* version() noexcept; /** * Initializes libring. @@ -137,152 +145,21 @@ enum ring_init_flag { * @param flags Flags to customize this initialization * @returns 0 if successful or a negative error code */ -int ring_init(struct ring_ev_handlers* ev_handlers, enum ring_init_flag flags); +InitResult +init(const std::map<EventHandlerKey, + std::map<std::string, std::shared_ptr<CallbackWrapperBase>>>& ev_handlers, + enum InitFlag flags); /** * Finalizes libring, freeing any resource allocated by the library. */ -void ring_fini(void); +void fini(void) noexcept; /** - * Poll for SIP/IAX events + * Poll for Daemon events */ -void ring_poll_events(void); - -/* call API */ -bool ring_call_place(const std::string& account_id, const std::string& call_id, const std::string& to); -bool ring_call_refuse(const std::string& call_id); -bool ring_call_accept(const std::string& call_id); -bool ring_call_hang_up(const std::string& call_id); -bool ring_call_hold(const std::string& call_id); -bool ring_call_unhold(const std::string& call_id); -bool ring_call_transfer(const std::string& call_id, const std::string& to); -bool ring_call_attended_transfer(const std::string& transfer_id, const std::string& target_id); -std::map<std::string, std::string> ring_call_get_call_details(const std::string& call_id); -std::vector<std::string> ring_call_get_call_list(void); -void ring_call_remove_conference(const std::string& conf_id); -bool ring_call_join_participant(const std::string& sel_call_id, const std::string& drag_call_id); -void ring_call_create_conf_from_participant_list(const std::vector<std::string>& participants); -bool ring_call_is_conference_participant(const std::string& call_id); -bool ring_call_add_participant(const std::string& call_id, const std::string& conf_id); -bool ring_call_add_main_participant(const std::string& conf_id); -bool ring_call_detach_participant(const std::string& call_id); -bool ring_call_join_conference(const std::string& sel_conf_id, const std::string& drag_conf_id); -bool ring_call_hang_up_conference(const std::string& conf_id); -bool ring_call_hold_conference(const std::string& conf_id); -bool ring_call_unhold_conference(const std::string& conf_id); -std::vector<std::string> ring_call_get_conference_list(void); -std::vector<std::string> ring_call_get_participant_list(const std::string& conf_id); -std::vector<std::string> ring_call_get_display_names(const std::string& conf_id); -std::string ring_call_get_conference_id(const std::string& call_id); -std::map<std::string, std::string> ring_call_get_conference_details(const std::string& call_id); -bool ring_call_play_recorded_file(const std::string& path); -void ring_call_stop_recorded_file(const std::string& path); -bool ring_call_toggle_recording(const std::string& call_id); -void ring_call_set_recording(const std::string& call_id); -void ring_call_record_playback_seek(double pos); -bool ring_call_is_recording(const std::string& call_id); -std::string ring_call_get_current_audio_codec_name(const std::string& call_id); -void ring_call_play_dtmf(const std::string& key); -void ring_call_start_tone(int start, int type); -void ring_call_set_sas_verified(const std::string& call_id); -void ring_call_reset_sas_verified(const std::string& call_id); -void ring_call_set_confirm_go_clear(const std::string& call_id); -void ring_call_request_go_clear(const std::string& call_id); -void ring_call_accept_enrollment(const std::string& call_id, bool accepted); -void ring_call_send_text_message(const std::string& call_id, const std::string& message); - -/* configuration API */ -std::map<std::string, std::string> ring_config_get_account_details(const std::string& account_id); -std::map<std::string, std::string> ring_config_get_volatile_account_details(const std::string& account_id); -void ring_config_set_account_details(const std::string& account_id, const std::map<std::string, std::string>& details); -std::map<std::string, std::string> ring_config_get_account_template(void); -std::string ring_config_add_account(const std::map<std::string, std::string>& details); -void ring_config_remove_account(const std::string& account_id); -std::vector<std::string> ring_config_get_account_list(void); -void ring_config_send_register(const std::string& account_id, bool enable); -void ring_config_register_all_accounts(void); -std::map<std::string, std::string> ring_config_get_tls_default_settings(void); -std::vector<int> ring_config_get_audio_codec_list(void); -std::vector<std::string> ring_config_get_supported_tls_method(void); -std::vector<std::string> ring_config_get_supported_ciphers(const std::string& account_id); -std::vector<std::string> ring_config_get_audio_codec_details(int payload); -std::vector<int> ring_config_get_active_audio_codec_list(const std::string& account_id); -void ring_config_set_active_audio_codec_list(const std::vector<std::string>& list, const std::string& account_id); -std::vector<std::string> ring_config_get_audio_plugin_list(void); -void ring_config_set_audio_plugin(const std::string& audio_plugin); -std::vector<std::string> ring_config_get_audio_output_device_list(); -void ring_config_set_audio_output_device(int index); -void ring_config_set_audio_input_device(int index); -void ring_config_set_audio_ringtone_device(int index); -std::vector<std::string> ring_config_get_audio_input_device_list(void); -std::vector<std::string> ring_config_get_current_audio_devices_index(void); -int ring_config_get_audio_input_device_index(const std::string& name); -int ring_config_get_audio_output_device_index(const std::string& name); -std::string ring_config_get_current_audio_output_plugin(void); -bool ring_config_get_noise_suppress_state(void); -void ring_config_set_noise_suppress_state(bool state); -bool ring_config_is_agc_enabled(void); -void ring_config_enable_agc(bool enabled); -void ring_config_mute_dtmf(bool mute); -bool ring_config_is_dtmf_muted(void); -bool ring_config_is_capture_muted(void); -void ring_config_mute_capture(bool mute); -bool ring_config_is_playback_muted(void); -void ring_config_mute_playback(int mute); -std::string ring_config_get_audio_manager(void); -bool ring_config_set_audio_manager(const std::string& api); -std::vector<std::string> ring_config_get_supported_audio_managers(void); -int ring_config_is_iax2_enabled(void); -std::string ring_config_get_record_path(void); -void ring_config_set_record_path(const std::string& path); -bool ring_config_is_always_recording(void); -void ring_config_set_always_recording(bool rec); -void ring_config_set_history_limit(int days); -int ring_config_get_history_limit(void); -void ring_config_clear_history(void); -void ring_config_set_accounts_order(const std::string& order); -std::map<std::string, std::string> ring_config_get_hook_settings(void); -void ring_config_set_hook_settings(const std::map<std::string, std::string>& settings); -std::vector<std::map<std::string, std::string>> ring_config_get_history(void); -std::map<std::string, std::string> ring_config_get_tls_settings(); -std::map<std::string, std::string> ring_config_validate_certificate(const std::string& accountId, - const std::string& certificate, const std::string& private_key); -std::map<std::string, std::string> ring_config_get_certificate_details(const std::string& certificate); -void ring_config_set_tls_settings(const std::map< std::string, std::string >& settings); -std::map<std::string, std::string> ring_config_get_ip2ip_details(void); -std::vector<std::map<std::string, std::string>> ring_config_get_credentials(const std::string& account_id); -void ring_config_set_credentials(const std::string& account_id, const std::vector<std::map<std::string, std::string>>& details); -std::string ring_config_get_addr_from_interface_name(const std::string& interface); -std::vector<std::string> ring_config_get_all_ip_interface(void); -std::vector<std::string> ring_config_get_all_ip_interface_by_name(void); -std::map<std::string, std::string> ring_config_get_shortcuts(); -void ring_config_set_shortcuts(const std::map<std::string, std::string>& shortcuts); -void ring_config_set_volume(const std::string& device, double value); -double ring_config_get_volume(const std::string& device); - -/* presence API */ -void ring_pres_publish(const std::string& account_id, int status, const std::string& note); -void ring_pres_answer_server_request(const std::string& uri, int flag); -void ring_pres_subscribe_buddy(const std::string& account_id, const std::string& uri, int flag); -std::vector<std::map<std::string, std::string>> ring_pres_get_subscriptions(const std::string& account_id); -void ring_pres_set_subscriptions(const std::string& account_id, const std::vector<std::string>& uris); +void poll_events(void); -/* video API */ -#ifdef RING_VIDEO -std::vector<std::map<std::string, std::string>> ring_video_get_codecs(const std::string& account_id); -void ring_video_set_codecs(const std::string& account_id, const std::vector<std::map<std::string, std::string>>& details); -std::vector<std::string> ring_video_get_device_list(void); -std::map<std::string, std::map<std::string, std::vector<std::string>>> ring_video_get_capabilities(const std::string& name); -std::map<std::string, std::string> ring_video_get_settings(const std::string& name); -void ring_video_set_default_device(const std::string& dev); -std::string ring_video_get_default_device(void); -std::string ring_video_get_current_codec_name(const std::string& call_id); -void ring_video_start_camera(void); -void ring_video_stop_camera(void); -bool ring_video_switch_input(const std::string& resource); -bool ring_video_is_camera_started(void); -void ring_video_apply_settings(const std::string& name, const std::map<std::string, std::string>& settings); -#endif /* RING_VIDEO */ +} // namespace DRing -#endif /* RING_H */ +#endif /* DRING_H */ diff --git a/daemon/src/dring/presencemanager_interface.h b/daemon/src/dring/presencemanager_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..36c5b47e2c3d1bae1e8bc12d6c6ac6b0e0e1ffb0 --- /dev/null +++ b/daemon/src/dring/presencemanager_interface.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2013 Savoir-Faire Linux Inc. + * Author: Patrick Keroulas <patrick.keroulas@savoirfairelinux.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#ifndef PRESENCEMANAGERI_H +#define PRESENCEMANAGERI_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <vector> +#include <map> +#include <string> +#include <functional> + +#include "dring.h" + +namespace DRing { + +// Presence signal type definitions +struct PresenceSignal { + struct NewServerSubscriptionRequest { + constexpr static const char* name = "NewServerSubscriptionRequest"; + using cb_type = void(const std::string& /*remote*/); + }; + struct ServerError { + constexpr static const char* name = "ServerError"; + using cb_type = void(const std::string& /*account_id*/, const std::string& /*error*/, const std::string& /*msg*/); + }; + struct NewBuddyNotification { + constexpr static const char* name = "NewBuddyNotification"; + using cb_type = void(const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*status*/, const std::string& /*line_status*/); + }; + struct SubscriptionStateChanged { + constexpr static const char* name = "SubscriptionStateChanged"; + using cb_type = void(const std::string& /*account_id*/, const std::string& /*buddy_uri*/, int /*state*/); + }; +}; + +void registerPresHandlers(const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&); + +/* Presence subscription/Notification. */ +void publish(const std::string& accountID, bool status, const std::string& note); +void answerServerRequest(const std::string& uri, bool flag); +void subscribeBuddy(const std::string& accountID, const std::string& uri, bool flag); +std::vector<std::map<std::string, std::string>> getSubscriptions(const std::string& accountID); +void setSubscriptions(const std::string& accountID, const std::vector<std::string>& uris); + +} // namespace DRing + +#endif //PRESENCEMANAGERI_H diff --git a/daemon/src/dring/videomanager_interface.h b/daemon/src/dring/videomanager_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..5f683e9f5817fe4021ebae1cdd02f784be5a0b5b --- /dev/null +++ b/daemon/src/dring/videomanager_interface.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2012-2014 Savoir-Faire Linux Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Additional permission under GNU GPL version 3 section 7: + * + * If you modify this program, or any covered work, by linking or + * combining it with the OpenSSL project's OpenSSL library (or a + * modified version of that library), containing parts covered by the + * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc. + * grants you additional permission to convey the resulting work. + * Corresponding Source for a non-source form of such a combination + * shall include the source code for the parts of OpenSSL used as well + * as that of the covered work. + */ + +#ifndef VIDEOMANAGERI_H_ +#define VIDEOMANAGERI_H_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <memory> // for weak/shared_ptr +#include <vector> +#include <atomic> +#include <map> +#include <string> + +#include "dring.h" + +namespace DRing { + +using VideoCapabilities = std::map<std::string, std::map<std::string, std::vector<std::string>>>; + +// Video signal type definitions +struct VideoSignal { + struct DeviceEvent { + constexpr static const char* name = "DeviceEvent"; + using cb_type = void(void); + }; + struct DecodingStarted { + constexpr static const char* name = "DecodingStarted"; + using cb_type = void(const std::string& /*id*/, const std::string& /*shm_path*/, int /*w*/, int /*h*/, bool /*is_mixer*/id); + }; + struct DecodingStopped { + constexpr static const char* name = "DecodingStopped"; + using cb_type = void(const std::string& /*id*/, const std::string& /*shm_path*/, bool /*is_mixer*/); + }; +}; + +void registerVideoHandlers(const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&); + +std::vector<std::map<std::string, std::string>> getCodecs(const std::string& accountID); +void setCodecs(const std::string& accountID, const std::vector<std::map<std::string, std::string>>& details); +std::vector<std::string> getDeviceList(); +VideoCapabilities getCapabilities(const std::string& name); +std::map<std::string, std::string> getSettings(const std::string& name); +void applySettings(const std::string& name, const std::map<std::string, std::string>& settings); +void setDefaultDevice(const std::string& name); +std::string getDefaultDevice(); +std::string getCurrentCodecName(const std::string& callID); +void startCamera(); +void stopCamera(); +bool hasCameraStarted(); +bool switchInput(const std::string& resource); +bool switchToCamera(); + +} // namespace DRing + +#endif // VIDEOMANAGERI_H_ diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index ac55958ab8520157970fa70726cabf1ff2b5ef83..cb709ce9ace601d50029c47ebba5ef146c1bc4f2 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -6,7 +6,7 @@ * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> * Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@savoirfairelinux.com> - * Author : Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -71,10 +71,6 @@ #include "history/history.h" #include "manager.h" -#include "client/configurationmanager.h" -#include "client/callmanager.h" -#include "client/presencemanager.h" - #ifdef RING_VIDEO #include "client/videomanager.h" #endif @@ -82,6 +78,8 @@ #include "conference.h" #include "ice_transport.h" +#include "client/signal.h" + #include <cerrno> #include <algorithm> #include <ctime> @@ -160,12 +158,7 @@ ManagerImpl::ManagerImpl() : , preferences(), voipPreferences(), hookPreference(), audioPreference(), shortcutPreferences(), hasTriedToRegister_(false), audioCodecFactory(*pluginManager_), - callManager_(new CallManager), configurationManager_(new ConfigurationManager), - presenceManager_(new PresenceManager) -#ifdef RING_VIDEO - , videoManager_(new VideoManager) -#endif - , currentCallMutex_(), dtmfKey_(), dtmfBuf_(0, AudioFormat::MONO()), + currentCallMutex_(), dtmfKey_(), dtmfBuf_(0, AudioFormat::MONO()), toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(), waitingCalls_(), waitingCallsMutex_(), path_() , ringbufferpool_(new RingBufferPool) @@ -182,32 +175,6 @@ ManagerImpl::ManagerImpl() : ManagerImpl::~ManagerImpl() {} -CallManager* -ManagerImpl::getCallManager() -{ - return callManager_.get(); -} - -ConfigurationManager* -ManagerImpl::getConfigurationManager() -{ - return configurationManager_.get(); -} - -PresenceManager* -ManagerImpl::getPresenceManager() -{ - return presenceManager_.get(); -} - -#ifdef RING_VIDEO -VideoManager* -ManagerImpl::getVideoManager() -{ - return videoManager_.get(); -} -#endif - bool ManagerImpl::parseConfiguration() { @@ -314,7 +281,7 @@ ManagerImpl::setPath(const std::string &path) } void -ManagerImpl::finish() +ManagerImpl::finish() noexcept { bool expected = false; if (not finished_.compare_exchange_strong(expected, true)) @@ -525,7 +492,8 @@ ManagerImpl::answerCall(const std::string& call_id) if (audioPreference.getIsAlwaysRecording()) toggleRecordingCall(call_id); - getCallManager()->callStateChanged(call_id, "CURRENT"); + //callStateChanged(call_id, "CURRENT"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "CURRENT"); return result; } @@ -550,7 +518,7 @@ ManagerImpl::hangupCall(const std::string& callId) stopTone(); RING_DBG("Send call state change (HUNGUP) for id %s", callId.c_str()); - getCallManager()->callStateChanged(callId, "HUNGUP"); + emitSignal<DRing::CallSignal::StateChange>(callId, "HUNGUP"); /* We often get here when the call was hungup before being created */ auto call = getCallFromCallID(callId); @@ -641,7 +609,7 @@ ManagerImpl::onHoldCall(const std::string& callId) if (current_call_id == callId) unsetCurrentCall(); - getCallManager()->callStateChanged(callId, "HOLD"); + emitSignal<DRing::CallSignal::StateChange>(callId, "HOLD"); return result; } @@ -679,7 +647,7 @@ ManagerImpl::offHoldCall(const std::string& callId) return false; } - getCallManager()->callStateChanged(callId, "UNHOLD"); + emitSignal<DRing::CallSignal::StateChange>(callId, "UNHOLD"); if (isConferenceParticipant(callId)) switchCall(getCallFromCallID(call->getConfId())); @@ -714,13 +682,13 @@ ManagerImpl::transferCall(const std::string& callId, const std::string& to) void ManagerImpl::transferFailed() { - getCallManager()->transferFailed(); + emitSignal<DRing::CallSignal::TransferFailed>(); } void ManagerImpl::transferSucceeded() { - getCallManager()->transferSucceeded(); + transferSucceeded(); } bool @@ -754,7 +722,7 @@ ManagerImpl::refuseCall(const std::string& id) removeWaitingCall(id); - getCallManager()->callStateChanged(id, "HUNGUP"); + emitSignal<DRing::CallSignal::StateChange>(id, "HUNGUP"); // Disconnect streams removeStream(*call); @@ -775,7 +743,7 @@ ManagerImpl::createConference(const std::string& id1, const std::string& id2) // Add conference to map conferenceMap_.insert(std::make_pair(conf->getConfID(), conf)); - getCallManager()->conferenceCreated(conf->getConfID()); + emitSignal<DRing::CallSignal::ConferenceCreated>(conf->getConfID()); return conf; } @@ -797,7 +765,7 @@ ManagerImpl::removeConference(const std::string& conference_id) return; } - getCallManager()->conferenceRemoved(conference_id); + emitSignal<DRing::CallSignal::ConferenceRemoved>(conference_id); // We now need to bind the audio to the remain participant @@ -857,7 +825,7 @@ ManagerImpl::holdConference(const std::string& id) conf->setState(isRec ? Conference::HOLD_REC : Conference::HOLD); - getCallManager()->conferenceChanged(conf->getConfID(), conf->getStateStr()); + emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr()); return true; } @@ -890,7 +858,7 @@ ManagerImpl::unHoldConference(const std::string& id) conf->setState(isRec ? Conference::ACTIVE_ATTACHED_REC : Conference::ACTIVE_ATTACHED); - getCallManager()->conferenceChanged(conf->getConfID(), conf->getStateStr()); + emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr()); return true; } @@ -1020,7 +988,7 @@ ManagerImpl::addMainParticipant(const std::string& conference_id) else RING_WARN("Invalid conference state while adding main participant"); - getCallManager()->conferenceChanged(conference_id, conf->getStateStr()); + emitSignal<DRing::CallSignal::ConferenceChanged>(conference_id, conf->getStateStr()); } switchCall(getCallFromCallID(conference_id)); @@ -1164,7 +1132,7 @@ ManagerImpl::createConfFromParticipantList(const std::vector< std::string > &par if (!callSuccess) conf->remove(generatedCallID); else { - getCallManager()->newCallCreated(account, generatedCallID, tostr); + emitSignal<DRing::CallSignal::NewCallCreated>(account, generatedCallID, tostr); successCounter++; } } @@ -1172,7 +1140,7 @@ ManagerImpl::createConfFromParticipantList(const std::vector< std::string > &par // Create the conference if and only if at least 2 calls have been successfully created if (successCounter >= 2) { conferenceMap_[conf->getConfID()] = conf; - getCallManager()->conferenceCreated(conf->getConfID()); + emitSignal<DRing::CallSignal::ConferenceCreated>(conf->getConfID()); conf->setRecordingFormat(ringbufferpool_->getInternalAudioFormat()); } } @@ -1234,8 +1202,7 @@ ManagerImpl::detachParticipant(const std::string& call_id) else RING_WARN("Undefined behavior, invalid conference state in detach participant"); - getCallManager()->conferenceChanged(conf->getConfID(), - conf->getStateStr()); + emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr()); unsetCurrentCall(); } @@ -1268,7 +1235,7 @@ ManagerImpl::removeParticipant(const std::string& call_id) removeStream(*call); - getCallManager()->conferenceChanged(conf->getConfID(), conf->getStateStr()); + emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr()); processRemainingParticipants(*conf); } @@ -1444,7 +1411,7 @@ ManagerImpl::saveConfig() hookPreference.serialize(out); audioPreference.serialize(out); #ifdef RING_VIDEO - getVideoManager()->getVideoDeviceMonitor().serialize(out); + getVideoDeviceMonitor().serialize(out); #endif shortcutPreferences.serialize(out); @@ -1574,7 +1541,7 @@ ManagerImpl::incomingCall(Call &call, const std::string& accountId) std::string from("<" + number + ">"); - getCallManager()->incomingCall(accountId, callID, call.getDisplayName() + " " + from); + emitSignal<DRing::CallSignal::IncomingCall>(accountId, callID, call.getDisplayName() + " " + from); } //THREAD=VoIP @@ -1605,10 +1572,10 @@ ManagerImpl::incomingMessage(const std::string& callID, } // in case of a conference we must notify client using conference id - getCallManager()->incomingMessage(conf->getConfID(), from, message); + incomingMessage(conf->getConfID(), from, message); } else - getCallManager()->incomingMessage(callID, from, message); + incomingMessage(callID, from, message); } //THREAD=VoIP @@ -1697,7 +1664,7 @@ ManagerImpl::peerAnsweredCall(Call& call) if (audioPreference.getIsAlwaysRecording()) toggleRecordingCall(call_id); - getCallManager()->callStateChanged(call_id, "CURRENT"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "CURRENT"); } //THREAD=VoIP Call=Outgoing @@ -1710,7 +1677,7 @@ ManagerImpl::peerRingingCall(Call& call) if (isCurrentCall(call)) ringback(); - getCallManager()->callStateChanged(call_id, "RINGING"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "RINGING"); } //THREAD=VoIP Call=Outgoing/Ingoing @@ -1731,7 +1698,7 @@ ManagerImpl::peerHungupCall(Call& call) call.peerHungup(); saveHistory(); - getCallManager()->callStateChanged(call_id, "HUNGUP"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "HUNGUP"); checkAudio(); removeWaitingCall(call_id); @@ -1747,7 +1714,7 @@ ManagerImpl::callBusy(Call& call) { const auto call_id = call.getCallId(); - getCallManager()->callStateChanged(call_id, "BUSY"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "BUSY"); if (isCurrentCall(call)) { playATone(Tone::TONE_BUSY); @@ -1764,7 +1731,7 @@ ManagerImpl::callFailure(Call& call) { const auto call_id = call.getCallId(); - getCallManager()->callStateChanged(call_id, "FAILURE"); + emitSignal<DRing::CallSignal::StateChange>(call_id, "FAILURE"); if (isCurrentCall(call)) { playATone(Tone::TONE_BUSY); @@ -1786,7 +1753,7 @@ void ManagerImpl::startVoiceMessageNotification(const std::string& accountId, int nb_msg) { - getCallManager()->voiceMailNotify(accountId, nb_msg); + emitSignal<DRing::CallSignal::VoiceMailNotify>(accountId, nb_msg); } /** @@ -1833,7 +1800,7 @@ ManagerImpl::stopTone() if (audiofile_) { std::string filepath(audiofile_->getFilePath()); - getCallManager()->recordPlaybackStopped(filepath); + emitSignal<DRing::CallSignal::RecordPlaybackStopped>(filepath); audiofile_.reset(); } } @@ -1926,7 +1893,7 @@ ManagerImpl::playRingtone(const std::string& accountID) std::lock_guard<std::mutex> m(toneMutex_); if (audiofile_) { - getCallManager()->recordPlaybackStopped(audiofile_->getFilePath()); + emitSignal<DRing::CallSignal::RecordPlaybackStopped>(audiofile_->getFilePath()); audiofile_.reset(); } @@ -2145,8 +2112,8 @@ ManagerImpl::toggleRecordingCall(const std::string& id) } const bool result = rec->toggleRecording(); - getCallManager()->recordPlaybackFilepath(id, rec->getFilename()); - getCallManager()->recordingStateChanged(id, result); + emitSignal<DRing::CallSignal::RecordPlaybackFilepath>(id, rec->getFilename()); + emitSignal<DRing::CallSignal::RecordingStateChanged>(id, result); return result; } @@ -2178,7 +2145,7 @@ ManagerImpl::startRecordedFilePlayback(const std::string& filepath) std::lock_guard<std::mutex> m(toneMutex_); if (audiofile_) { - getCallManager()->recordPlaybackStopped(audiofile_->getFilePath()); + emitSignal<DRing::CallSignal::RecordPlaybackStopped>(audiofile_->getFilePath()); audiofile_.reset(); } @@ -2217,7 +2184,7 @@ void ManagerImpl::stopRecordedFilePlayback(const std::string& filepath) std::lock_guard<std::mutex> m(toneMutex_); audiofile_.reset(); } - getCallManager()->recordPlaybackStopped(filepath); + emitSignal<DRing::CallSignal::RecordPlaybackStopped>(filepath); } void ManagerImpl::setHistoryLimit(int days) @@ -2477,7 +2444,7 @@ ManagerImpl::setAccountDetails(const std::string& accountID, account->doUnregister(); // Update account details to the client side - getConfigurationManager()->accountsChanged(); + emitSignal<DRing::ConfigurationSignal::AccountsChanged>(); }); } @@ -2522,7 +2489,7 @@ ManagerImpl::addAccount(const std::map<std::string, std::string>& details) saveConfig(); - getConfigurationManager()->accountsChanged(); + emitSignal<DRing::ConfigurationSignal::AccountsChanged>(); return newAccountID; } @@ -2545,7 +2512,7 @@ void ManagerImpl::removeAccount(const std::string& accountID) saveConfig(); - getConfigurationManager()->accountsChanged(); + emitSignal<DRing::ConfigurationSignal::AccountsChanged>(); } bool @@ -2630,8 +2597,7 @@ ManagerImpl::loadAccountMap(const YAML::Node &node) int errorCount = 0; try { #ifdef RING_VIDEO - VideoManager *controls(getVideoManager()); - controls->getVideoDeviceMonitor().unserialize(node); + getVideoDeviceMonitor().unserialize(node); #endif } catch (const YAML::Exception &e) { RING_ERR("%s: No video node in config file", e.what()); @@ -2743,7 +2709,7 @@ ManagerImpl::saveHistory() if (!history_.save()) RING_ERR("Could not save history!"); else - getConfigurationManager()->historyChanged(); + emitSignal<DRing::ConfigurationSignal::AccountsChanged>(); } void diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 41e3daaa11e2853596ea9e560ccec3eca9b1d4da..ec943c945b292ba1881865d50251731018d18942 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -73,12 +73,6 @@ class PluginManager; class AudioFile; class DTMF; class TelephoneTone; -class ConfigurationManager; -class PresenceManager; -class CallManager; -#ifdef RING_VIDEO -class VideoManager; -#endif /** To send multiple string */ typedef std::list<std::string> TokenList; @@ -101,13 +95,6 @@ class ManagerImpl { ManagerImpl(); ~ManagerImpl(); - std::unique_ptr<ConfigurationManager> configurationManager_; - std::unique_ptr<CallManager> callManager_; - std::unique_ptr<PresenceManager> presenceManager_; - -#ifdef RING_VIDEO - std::unique_ptr<VideoManager> videoManager_; -#endif /** * General preferences configuration */ @@ -148,7 +135,7 @@ class ManagerImpl { /* * Terminate all threads and exit DBus loop */ - void finish(); + void finish() noexcept; /** * Accessor to audiodriver. @@ -881,14 +868,6 @@ class ManagerImpl { */ bool hasCurrentCall() const; - CallManager* getCallManager(); - ConfigurationManager* getConfigurationManager(); - PresenceManager* getPresenceManager(); - -#ifdef RING_VIDEO - VideoManager * getVideoManager(); -#endif - std::vector<std::map<std::string, std::string> > getHistory(); void clearHistory(); diff --git a/daemon/src/media/audio/alsa/alsalayer.cpp b/daemon/src/media/audio/alsa/alsalayer.cpp index 698883a97cac7e958d41bca7eed853206b813304..05e3733972735747a162c7b4d2deb26700894923 100644 --- a/daemon/src/media/audio/alsa/alsalayer.cpp +++ b/daemon/src/media/audio/alsa/alsalayer.cpp @@ -34,7 +34,7 @@ #include "logger.h" #include "manager.h" #include "noncopyable.h" -#include "client/configurationmanager.h" +#include "client/signal.h" #include "audio/ringbufferpool.h" #include "audio/ringbuffer.h" #include "audio/resampler.h" @@ -103,18 +103,18 @@ void AlsaThread::initAudioLayer(void) alsa_->is_capture_open_ = alsa_->openDevice(&alsa_->captureHandle_, pcmc, SND_PCM_STREAM_CAPTURE); if (not alsa_->is_capture_open_) - Manager::instance().getConfigurationManager()->errorAlert(ALSA_CAPTURE_DEVICE); + emitSignal<DRing::ConfigurationSignal::Error>(ALSA_CAPTURE_DEVICE); } if (not alsa_->is_playback_open_) { alsa_->is_playback_open_ = alsa_->openDevice(&alsa_->playbackHandle_, pcmp, SND_PCM_STREAM_PLAYBACK); if (not alsa_->is_playback_open_) - Manager::instance().getConfigurationManager()->errorAlert(ALSA_PLAYBACK_DEVICE); + emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE); if (alsa_->getIndexPlayback() != alsa_->getIndexRingtone()) if (!alsa_->openDevice(&alsa_->ringtoneHandle_, pcmr, SND_PCM_STREAM_PLAYBACK)) - Manager::instance().getConfigurationManager()->errorAlert(ALSA_PLAYBACK_DEVICE); + emitSignal<DRing::ConfigurationSignal::Error>(ALSA_PLAYBACK_DEVICE); } alsa_->hardwareFormatAvailable(alsa_->getFormat()); diff --git a/daemon/src/media/audio/sound/audiofile.cpp b/daemon/src/media/audio/sound/audiofile.cpp index 010d74b5b164e79b0c8692a2ee075359b4adf9f7..f4622b46285f6e60a8569d45765bf8cb8a472939 100644 --- a/daemon/src/media/audio/sound/audiofile.cpp +++ b/daemon/src/media/audio/sound/audiofile.cpp @@ -40,8 +40,8 @@ #include "audiofile.h" #include "audio/resampler.h" -#include "client/callmanager.h" #include "manager.h" +#include "client/signal.h" #include "logger.h" @@ -58,10 +58,10 @@ AudioFile::onBufferFinish() return; } - if ((updatePlaybackScale_ % 5) == 0) { - CallManager *cm = Manager::instance().getCallManager(); - cm->updatePlaybackScale(filepath_, pos_ / divisor, buffer_->frames() / divisor); - } + if ((updatePlaybackScale_ % 5) == 0) + emitSignal<DRing::CallSignal::UpdatePlaybackScale>(filepath_, + (unsigned)(pos_ / divisor), + (unsigned)(buffer_->frames() / divisor)); updatePlaybackScale_++; } diff --git a/daemon/src/media/video/v4l2/video_device_impl.cpp b/daemon/src/media/video/v4l2/video_device_impl.cpp index 9b804e50c1a5bdfc8bac75af32b2970d51fdf6c2..4b6cb6e00e11830de6cfb0e9411ef57c60f2d817 100644 --- a/daemon/src/media/video/v4l2/video_device_impl.cpp +++ b/daemon/src/media/video/v4l2/video_device_impl.cpp @@ -567,10 +567,10 @@ VideoDevice::getSettings() const return deviceImpl_->getSettings(); } -VideoCapabilities +DRing::VideoCapabilities VideoDevice::getCapabilities() const { - VideoCapabilities cap; + DRing::VideoCapabilities cap; for (const auto& chan : deviceImpl_->getChannelList()) for (const auto& size : deviceImpl_->getSizeList(chan)) diff --git a/daemon/src/media/video/video_device.h b/daemon/src/media/video/video_device.h index 47ec3bc40e38b6e3d3bf02054a3357ea1a048275..16d35310670007c0599b50d18d43620a2d10524d 100644 --- a/daemon/src/media/video/video_device.h +++ b/daemon/src/media/video/video_device.h @@ -35,10 +35,10 @@ #include <memory> #include <string> #include <vector> +#include "videomanager_interface.h" namespace ring { namespace video { -typedef std::map<std::string, std::map<std::string, std::vector<std::string>>> VideoCapabilities; typedef std::map<std::string, std::string> VideoSettings; // FIXME move VideoSettings in video_base since video_decoder (and encoder?) may use it. @@ -73,7 +73,7 @@ public: * '800x448': ['15'], * '960x540': ['10']}} */ - VideoCapabilities getCapabilities() const; + DRing::VideoCapabilities getCapabilities() const; /* * Get the string/string map of settings for the device. diff --git a/daemon/src/media/video/video_device_monitor.cpp b/daemon/src/media/video/video_device_monitor.cpp index 3e1a450626070c398eaf4b1c398a22116aaaf2d2..87696d870a93c733d7282a39fbe9983402528e4d 100644 --- a/daemon/src/media/video/video_device_monitor.cpp +++ b/daemon/src/media/video/video_device_monitor.cpp @@ -37,6 +37,7 @@ #include "manager.h" #include "client/videomanager.h" +#include "client/signal.h" #include "config/yamlparser.h" #include "logger.h" #include "video_device_monitor.h" @@ -61,13 +62,13 @@ VideoDeviceMonitor::getDeviceList() const return names; } -VideoCapabilities +DRing::VideoCapabilities VideoDeviceMonitor::getCapabilities(const string& name) const { const auto iter = findDeviceByName(name); if (iter == devices_.end()) - return VideoCapabilities(); + return DRing::VideoCapabilities(); return iter->getCapabilities(); } @@ -158,8 +159,7 @@ notify() RING_WARN("Manager not initialized yet"); return; } - - Manager::instance().getVideoManager()->deviceEvent(); + emitSignal<DRing::VideoSignal::DeviceEvent>(); } void diff --git a/daemon/src/media/video/video_device_monitor.h b/daemon/src/media/video/video_device_monitor.h index 29b38de0a8830ee8874ed8c27b97e8ac0386b648..4faa1edb7737a18f2e6c3b6ddff5562e9c3a1aa9 100644 --- a/daemon/src/media/video/video_device_monitor.h +++ b/daemon/src/media/video/video_device_monitor.h @@ -58,7 +58,7 @@ class VideoDeviceMonitor : public Serializable std::vector<std::string> getDeviceList() const; - VideoCapabilities getCapabilities(const std::string& name) const; + DRing::VideoCapabilities getCapabilities(const std::string& name) const; VideoSettings getSettings(const std::string& name); void applySettings(const std::string& name, VideoSettings settings); diff --git a/daemon/src/media/video/video_input.cpp b/daemon/src/media/video/video_input.cpp index 6854db9452d05baf547a41053656223091e3639f..30ffd513ebcf2423bc1ad84f7f73c7d84206a5a5 100644 --- a/daemon/src/media/video/video_input.cpp +++ b/daemon/src/media/video/video_input.cpp @@ -37,6 +37,7 @@ #include "media_decoder.h" #include "manager.h" #include "client/videomanager.h" +#include "client/signal.h" #include "logger.h" #include <map> @@ -91,8 +92,8 @@ void VideoInput::process() if (newDecoderCreated) { /* Signal the client about the new sink */ - Manager::instance().getVideoManager()->startedDecoding(sinkID_, sink_.openedName(), - decoder_->getWidth(), decoder_->getHeight(), false); + emitSignal<DRing::VideoSignal::DecodingStarted>(sinkID_, sink_.openedName(), + decoder_->getWidth(), decoder_->getHeight(), false); RING_DBG("LOCAL: shm sink <%s> started: size = %dx%d", sink_.openedName().c_str(), decoder_->getWidth(), decoder_->getHeight()); @@ -176,9 +177,7 @@ VideoInput::deleteDecoder() if (not decoder_) return; - Manager::instance().getVideoManager()->stoppedDecoding(sinkID_, - sink_.openedName(), - false); + emitSignal<DRing::VideoSignal::DecodingStopped>(sinkID_, sink_.openedName(), false); flushFrames(); delete decoder_; decoder_ = nullptr; @@ -187,8 +186,7 @@ VideoInput::deleteDecoder() bool VideoInput::initCamera(const std::string& device) { - std::map<std::string, std::string> map = - Manager::instance().getVideoManager()->getSettings(device); + std::map<std::string, std::string> map = DRing::getSettings(device); if (map.empty()) return false; diff --git a/daemon/src/media/video/video_mixer.cpp b/daemon/src/media/video/video_mixer.cpp index ea7dbd86b246a7c84774978ad38525151a7fda5d..95a864c036c90d4f7ba088925e14763d985984b4 100644 --- a/daemon/src/media/video/video_mixer.cpp +++ b/daemon/src/media/video/video_mixer.cpp @@ -33,6 +33,7 @@ #include "video_mixer.h" #include "logger.h" #include "client/videomanager.h" +#include "client/signal.h" #include "manager.h" #include "logger.h" @@ -50,10 +51,9 @@ VideoMixer::VideoMixer(const std::string &id) : , loop_([]{return true;}, std::bind(&VideoMixer::process, this), []{}) { // Local video camera is the main participant - auto videoCtrl = Manager::instance().getVideoManager(); - videoLocal_ = videoCtrl->getVideoCamera(); + videoLocal_ = getVideoCamera(); if (videoLocal_) { - videoCtrl->switchToCamera(); + DRing::switchToCamera(); videoLocal_->attach(this); } loop_.start(); @@ -189,7 +189,7 @@ void VideoMixer::start_sink() { if (sink_.start()) { if (this->attach(&sink_)) { - Manager::instance().getVideoManager()->startedDecoding(id_, sink_.openedName(), width_, height_, true); + emitSignal<DRing::VideoSignal::DecodingStarted>(id_, sink_.openedName(), width_, height_, true); RING_DBG("MX: shm sink <%s> started: size = %dx%d", sink_.openedName().c_str(), width_, height_); } @@ -200,7 +200,7 @@ void VideoMixer::start_sink() void VideoMixer::stop_sink() { if (this->detach(&sink_)) { - Manager::instance().getVideoManager()->stoppedDecoding(id_, sink_.openedName(), true); + emitSignal<DRing::VideoSignal::DecodingStopped>(id_, sink_.openedName(), true); sink_.stop(); } } diff --git a/daemon/src/media/video/video_receive_thread.cpp b/daemon/src/media/video/video_receive_thread.cpp index 9cd8493a4e6321af72fbc98dc29239b1b87cab0b..75ffcc49a44235675ac18e6f6b6e3e61bff4a8ed 100644 --- a/daemon/src/media/video/video_receive_thread.cpp +++ b/daemon/src/media/video/video_receive_thread.cpp @@ -36,6 +36,7 @@ #include "manager.h" #include "client/videomanager.h" #include "logger.h" +#include "client/signal.h" #include <unistd.h> #include <map> @@ -149,7 +150,7 @@ void VideoReceiveThread::process() void VideoReceiveThread::cleanup() { if (detach(&sink_)) - Manager::instance().getVideoManager()->stoppedDecoding(id_, sink_.openedName(), false); + emitSignal<DRing::VideoSignal::DecodingStopped>(id_, sink_.openedName(), false); sink_.stop(); if (videoDecoder_) @@ -223,7 +224,7 @@ void VideoReceiveThread::enterConference() return; if (detach(&sink_)) { - Manager::instance().getVideoManager()->stoppedDecoding(id_, sink_.openedName(), false); + emitSignal<DRing::VideoSignal::DecodingStopped>(id_, sink_.openedName(), false); RING_DBG("RX: shm sink <%s> detached", sink_.openedName().c_str()); } } @@ -235,7 +236,7 @@ void VideoReceiveThread::exitConference() if (dstWidth_ > 0 && dstHeight_ > 0) { if (attach(&sink_)) { - Manager::instance().getVideoManager()->startedDecoding(id_, sink_.openedName(), dstWidth_, dstHeight_, false); + emitSignal<DRing::VideoSignal::DecodingStarted>(id_, sink_.openedName(), dstWidth_, dstHeight_, false); RING_DBG("RX: shm sink <%s> started: size = %dx%d", sink_.openedName().c_str(), dstWidth_, dstHeight_); } diff --git a/daemon/src/media/video/video_rtp_session.cpp b/daemon/src/media/video/video_rtp_session.cpp index ea73d238299a1ec79d5fa8be9b87f8ae03046b38..61fd45a52bebf3ef47889c1feb6d36d1711c7711 100644 --- a/daemon/src/media/video/video_rtp_session.cpp +++ b/daemon/src/media/video/video_rtp_session.cpp @@ -189,10 +189,9 @@ void VideoRtpSession::start(int localPort) if (conference_) setupConferenceVideoPipeline(conference_); else if (sender_) { - auto videoCtrl = Manager::instance().getVideoManager(); - videoLocal_ = videoCtrl->getVideoCamera(); + videoLocal_ = getVideoCamera(); if (videoLocal_ and videoLocal_->attach(sender_.get())) - videoCtrl->switchToCamera(); + DRing::switchToCamera(); } else { videoLocal_.reset(); } @@ -217,10 +216,9 @@ void VideoRtpSession::start(std::unique_ptr<IceSocket> rtp_sock, if (conference_) setupConferenceVideoPipeline(conference_); else if (sender_) { - auto videoCtrl = Manager::instance().getVideoManager(); - videoLocal_ = videoCtrl->getVideoCamera(); + videoLocal_ = getVideoCamera(); if (videoLocal_ and videoLocal_->attach(sender_.get())) - videoCtrl->switchToCamera(); + DRing::switchToCamera(); } else { videoLocal_.reset(); } diff --git a/daemon/src/ring_api.cpp b/daemon/src/ring_api.cpp index a58f2bfacdae37f276ab5a6f8477f2f12e5084b5..a7320b300f2c218aafc5bd915efb6038a8f4a15f 100644 --- a/daemon/src/ring_api.cpp +++ b/daemon/src/ring_api.cpp @@ -1,6 +1,7 @@ /* - * Copyright (C) 2014 Savoir-Faire Linux Inc. + * Copyright (C) 2014-2015 Savoir-Faire Linux Inc. * Author: Philippe Proulx <philippe.proulx@savoirfairelinux.com> + * Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,58 +37,34 @@ #include "config.h" #endif +#include "libav_utils.h" #include "manager.h" #include "managerimpl.h" #include "logger.h" #include "dring.h" -#include "client/callmanager.h" -#include "client/configurationmanager.h" -#include "client/presencemanager.h" +#include "callmanager_interface.h" +#include "configurationmanager_interface.h" +#include "presencemanager_interface.h" #ifdef RING_VIDEO #include "client/videomanager.h" #endif // RING_VIDEO -static ring::CallManager* getCallManager() -{ - return ring::Manager::instance().getCallManager(); -} - -static ring::ConfigurationManager* getConfigurationManager() -{ - return ring::Manager::instance().getConfigurationManager(); -} - -static ring::PresenceManager* getPresenceManager() -{ - return ring::Manager::instance().getPresenceManager(); -} - -#ifdef RING_VIDEO -static ring::VideoManager* getVideoManager() -{ - return ring::Manager::instance().getVideoManager(); -} -#endif // RING_VIDEO +namespace DRing { -const char * -ring_version() +const char* +version() noexcept { return PACKAGE_VERSION; } -int ring_init(ring_ev_handlers* ev_handlers, enum ring_init_flag flags) +InitResult +init(const std::map<EventHandlerKey, std::map<std::string, std::shared_ptr<CallbackWrapperBase>>>& ev_handlers, + enum InitFlag flags) { - // User handlers of library events - // FIXME: static evil - static ring_ev_handlers evHandlers_; - - // Copy user event handlers - evHandlers_ = *ev_handlers; - // Handle flags - setDebugMode(flags & RING_FLAG_DEBUG); - setConsoleLog(flags & RING_FLAG_CONSOLE_LOG); + setDebugMode(flags & DRING_FLAG_DEBUG); + setConsoleLog(flags & DRING_FLAG_CONSOLE_LOG); // Create manager try { @@ -97,673 +74,51 @@ int ring_init(ring_ev_handlers* ev_handlers, enum ring_init_flag flags) assert(!manager); manager = &(ring::Manager::instance()); } catch (...) { - return -RING_ERR_MANAGER_INIT; + return InitResult::ERR_MANAGER_INIT; } + ring::libav_utils::sfl_avcodec_init(); // Register user event handlers - getCallManager()->registerEvHandlers(&evHandlers_.call_ev_handlers); - getConfigurationManager()->registerEvHandlers(&evHandlers_.config_ev_handlers); - getPresenceManager()->registerEvHandlers(&evHandlers_.pres_ev_handlers); - + for ( const auto &entry : ev_handlers ) { + switch(entry.first) { + case EventHandlerKey::CALL: + ::DRing::registerCallHandlers(entry.second); + break; + case EventHandlerKey::CONFIG: + ::DRing::registerConfHandlers(entry.second); + break; + case EventHandlerKey::PRESENCE: + ::DRing::registerPresHandlers(entry.second); + break; + case EventHandlerKey::VIDEO: #ifdef RING_VIDEO - getVideoManager()->registerEvHandlers(&evHandlers_.video_ev_handlers); -#endif // RING_VIDEO + ::DRing::registerVideoHandlers(entry.second); +#else + RING_ERR("Error linking video handler: daemon has no video support"); +#endif + break; + } + } // Initialize manager now try { ring::Manager::instance().init(""); } catch (...) { - return -RING_ERR_MANAGER_INIT; + return InitResult::ERR_MANAGER_INIT; } - return 0; + return InitResult::SUCCESS; } -void ring_fini(void) +void fini(void) noexcept { // Finish manager ring::Manager::instance().finish(); } -void ring_poll_events() +void poll_events() { ring::Manager::instance().pollEvents(); } -bool ring_call_place(const std::string& account_id, const std::string& call_id, const std::string& to) -{ - return getCallManager()->placeCall(account_id, call_id, to); -} - -bool ring_call_refuse(const std::string& call_id) -{ - return getCallManager()->refuse(call_id); -} - -bool ring_call_accept(const std::string& call_id) -{ - return getCallManager()->accept(call_id); -} - -bool ring_call_hang_up(const std::string& call_id) -{ - return getCallManager()->hangUp(call_id); -} - -bool ring_call_hold(const std::string& call_id) -{ - return getCallManager()->hold(call_id); -} - -bool ring_call_unhold(const std::string& call_id) -{ - return getCallManager()->unhold(call_id); -} - -bool ring_call_transfer(const std::string& call_id, const std::string& to) -{ - return getCallManager()->transfer(call_id, to); -} - -bool ring_call_attended_transfer(const std::string& transfer_id, const std::string& target_id) -{ - return getCallManager()->attendedTransfer(transfer_id, target_id); -} - -std::map<std::string, std::string> ring_call_get_call_details(const std::string& call_id) -{ - return getCallManager()->getCallDetails(call_id); -} - -std::vector<std::string> ring_call_get_call_list(void) -{ - return getCallManager()->getCallList(); -} - -void ring_call_remove_conference(const std::string& conf_id) -{ - getCallManager()->removeConference(conf_id); -} - -bool ring_call_join_participant(const std::string& sel_call_id, const std::string& drag_call_id) -{ - return getCallManager()->joinParticipant(sel_call_id, drag_call_id); -} - -void ring_call_create_conf_from_participant_list(const std::vector<std::string>& participants) -{ - getCallManager()->createConfFromParticipantList(participants); -} - -bool ring_call_is_conference_participant(const std::string& call_id) -{ - return getCallManager()->isConferenceParticipant(call_id); -} - -bool ring_call_add_participant(const std::string& call_id, const std::string& conf_id) -{ - return getCallManager()->addParticipant(call_id, conf_id); -} - -bool ring_call_add_main_participant(const std::string& conf_id) -{ - return getCallManager()->addMainParticipant(conf_id); -} - -bool ring_call_detach_participant(const std::string& call_id) -{ - return getCallManager()->detachParticipant(call_id); -} - -bool ring_call_join_conference(const std::string& sel_conf_id, const std::string& drag_conf_id) -{ - return getCallManager()->joinConference(sel_conf_id, drag_conf_id); -} - -bool ring_call_hang_up_conference(const std::string& conf_id) -{ - return getCallManager()->hangUpConference(conf_id); -} - -bool ring_call_hold_conference(const std::string& conf_id) -{ - return getCallManager()->holdConference(conf_id); -} - -bool ring_call_unhold_conference(const std::string& conf_id) -{ - return getCallManager()->unholdConference(conf_id); -} - -std::vector<std::string> ring_call_get_conference_list(void) -{ - return getCallManager()->getConferenceList(); -} - -std::vector<std::string> ring_call_get_participant_list(const std::string& conf_id) -{ - return getCallManager()->getParticipantList(conf_id); -} - -std::vector<std::string> ring_call_get_display_names(const std::string& conf_id) -{ - return getCallManager()->getDisplayNames(conf_id); -} - -std::string ring_call_get_conference_id(const std::string& call_id) -{ - return getCallManager()->getConferenceId(call_id); -} - -std::map<std::string, std::string> ring_call_get_conference_details(const std::string& call_id) -{ - return getCallManager()->getConferenceDetails(call_id); -} - -bool ring_call_play_recorded_file(const std::string& path) -{ - return getCallManager()->startRecordedFilePlayback(path); -} - -void ring_call_stop_recorded_file(const std::string& path) -{ - getCallManager()->stopRecordedFilePlayback(path); -} - -bool ring_call_toggle_recording(const std::string& call_id) -{ - return getCallManager()->toggleRecording(call_id); -} - -void ring_call_set_recording(const std::string& call_id) -{ - getCallManager()->setRecording(call_id); -} - -void ring_call_record_playback_seek(double pos) -{ - getCallManager()->recordPlaybackSeek(pos); -} - -bool ring_call_is_recording(const std::string& call_id) -{ - return getCallManager()->getIsRecording(call_id); -} - -std::string ring_call_get_current_audio_codec_name(const std::string& call_id) -{ - return getCallManager()->getCurrentAudioCodecName(call_id); -} - -void ring_call_play_dtmf(const std::string& key) -{ - getCallManager()->playDTMF(key); -} - -void ring_call_start_tone(int start, int type) -{ - getCallManager()->startTone(start, type); -} - -void ring_call_set_sas_verified(const std::string& call_id) -{ - getCallManager()->setSASVerified(call_id); -} - -void ring_call_reset_sas_verified(const std::string& call_id) -{ - getCallManager()->resetSASVerified(call_id); -} - -void ring_call_set_confirm_go_clear(const std::string& call_id) -{ - getCallManager()->setConfirmGoClear(call_id); -} - -void ring_call_request_go_clear(const std::string& call_id) -{ - getCallManager()->requestGoClear(call_id); -} - -void ring_call_accept_enrollment(const std::string& call_id, bool accepted) -{ - getCallManager()->acceptEnrollment(call_id, accepted); -} - -void ring_call_send_text_message(const std::string& call_id, const std::string& message) -{ - getCallManager()->sendTextMessage(call_id, message); -} - -std::map<std::string, std::string> ring_config_get_account_details(const std::string& account_id) -{ - return getConfigurationManager()->getAccountDetails(account_id); -} - -std::map<std::string, std::string> ring_config_get_volatile_account_details(const std::string& account_id) -{ - return getConfigurationManager()->getVolatileAccountDetails(account_id); -} - -void ring_config_set_account_details(const std::string& account_id, const std::map<std::string, std::string>& details) -{ - getConfigurationManager()->setAccountDetails(account_id, details); -} - -std::map<std::string, std::string> ring_config_get_account_template(void) -{ - return getConfigurationManager()->getAccountTemplate(); -} - -std::string ring_config_add_account(const std::map<std::string, std::string>& details) -{ - return getConfigurationManager()->addAccount(details); -} - -void ring_config_remove_account(const std::string& account_id) -{ - getConfigurationManager()->removeAccount(account_id); -} - -std::vector<std::string> ring_config_get_account_list(void) -{ - return getConfigurationManager()->getAccountList(); -} - -void ring_config_send_register(const std::string& account_id, bool enable) -{ - getConfigurationManager()->sendRegister(account_id, enable); -} - -void ring_config_register_all_accounts(void) -{ - getConfigurationManager()->registerAllAccounts(); -} - -std::map<std::string, std::string> ring_config_get_tls_default_settings(void) -{ - return getConfigurationManager()->getTlsSettingsDefault(); -} - -std::vector<int> ring_config_get_audio_codec_list(void) -{ - return getConfigurationManager()->getAudioCodecList(); -} - -std::vector<std::string> ring_config_get_supported_tls_method(void) -{ - return getConfigurationManager()->getSupportedTlsMethod(); -} - -std::vector<std::string> ring_config_get_supported_ciphers(const std::string& account_id) -{ - return getConfigurationManager()->getSupportedCiphers(account_id); -} - -std::vector<std::string> ring_config_get_audio_codec_details(int payload) -{ - return getConfigurationManager()->getAudioCodecDetails(payload); -} - -std::vector<int> ring_config_get_active_audio_codec_list(const std::string& account_id) -{ - return getConfigurationManager()->getActiveAudioCodecList(account_id); -} - -void ring_config_set_active_audio_codec_list(const std::vector<std::string>& list, const std::string& account_id) -{ - getConfigurationManager()->setActiveAudioCodecList(list, account_id); -} - -std::vector<std::string> ring_config_get_audio_plugin_list(void) -{ - return getConfigurationManager()->getAudioPluginList(); -} - -void ring_config_set_audio_plugin(const std::string& audio_plugin) -{ - getConfigurationManager()->setAudioPlugin(audio_plugin); -} - -std::vector<std::string> ring_config_get_audio_output_device_list() -{ - return getConfigurationManager()->getAudioOutputDeviceList(); -} - -void ring_config_set_audio_output_device(int index) -{ - getConfigurationManager()->setAudioOutputDevice(index); -} - -void ring_config_set_audio_input_device(int index) -{ - getConfigurationManager()->setAudioInputDevice(index); -} - -void ring_config_set_audio_ringtone_device(int index) -{ - getConfigurationManager()->setAudioRingtoneDevice(index); -} - -std::vector<std::string> ring_config_get_audio_input_device_list(void) -{ - return getConfigurationManager()->getAudioInputDeviceList(); -} - -std::vector<std::string> ring_config_get_current_audio_devices_index(void) -{ - return getConfigurationManager()->getCurrentAudioDevicesIndex(); -} - -int ring_config_get_audio_input_device_index(const std::string& name) -{ - return getConfigurationManager()->getAudioInputDeviceIndex(name); -} - -int ring_config_get_audio_output_device_index(const std::string& name) -{ - return getConfigurationManager()->getAudioOutputDeviceIndex(name); -} - -std::string ring_config_get_current_audio_output_plugin(void) -{ - return getConfigurationManager()->getCurrentAudioOutputPlugin(); -} - -bool ring_config_get_noise_suppress_state(void) -{ - return getConfigurationManager()->getNoiseSuppressState(); -} - -void ring_config_set_noise_suppress_state(bool state) -{ - getConfigurationManager()->setNoiseSuppressState(state); -} - -bool ring_config_is_agc_enabled(void) -{ - return getConfigurationManager()->isAgcEnabled(); -} - -void ring_config_enable_agc(bool enabled) -{ - getConfigurationManager()->setAgcState(enabled); -} - -void ring_config_mute_dtmf(bool mute) -{ - getConfigurationManager()->muteDtmf(mute); -} - -bool ring_config_is_dtmf_muted(void) -{ - return getConfigurationManager()->isDtmfMuted(); -} - -bool ring_config_is_capture_muted(void) -{ - return getConfigurationManager()->isCaptureMuted(); -} - -void ring_config_mute_capture(bool mute) -{ - getConfigurationManager()->muteCapture(mute); -} - -bool ring_config_is_playback_muted(void) -{ - return getConfigurationManager()->isPlaybackMuted(); -} - -void ring_config_mute_playback(int mute) -{ - getConfigurationManager()->mutePlayback(mute); -} - -std::string ring_config_get_audio_manager(void) -{ - return getConfigurationManager()->getAudioManager(); -} - -bool ring_config_set_audio_manager(const std::string& api) -{ - return getConfigurationManager()->setAudioManager(api); -} - -std::vector<std::string> ring_config_get_supported_audio_managers(void) -{ - return { -#if HAVE_ALSA - ALSA_API_STR, -#endif -#if HAVE_PULSE - PULSEAUDIO_API_STR, -#endif -#if HAVE_JACK - JACK_API_STR, -#endif - }; -} - -int ring_config_is_iax2_enabled(void) -{ - return getConfigurationManager()->isIax2Enabled(); -} - -std::string ring_config_get_record_path(void) -{ - return getConfigurationManager()->getRecordPath(); -} - -void ring_config_set_record_path(const std::string& path) -{ - getConfigurationManager()->setRecordPath(path); -} - -bool ring_config_is_always_recording(void) -{ - return getConfigurationManager()->getIsAlwaysRecording(); -} - -void ring_config_set_always_recording(bool rec) -{ - getConfigurationManager()->setIsAlwaysRecording(rec); -} - -void ring_config_set_history_limit(int days) -{ - getConfigurationManager()->setHistoryLimit(days); -} - -int ring_config_get_history_limit(void) -{ - return getConfigurationManager()->getHistoryLimit(); -} - -void ring_config_clear_history(void) -{ - getConfigurationManager()->clearHistory(); -} - -void ring_config_set_accounts_order(const std::string& order) -{ - getConfigurationManager()->setAccountsOrder(order); -} - -std::map<std::string, std::string> ring_config_get_hook_settings(void) -{ - return getConfigurationManager()->getHookSettings(); -} - -void ring_config_set_hook_settings(const std::map<std::string, std::string>& settings) -{ - getConfigurationManager()->setHookSettings(settings); -} - -std::vector<std::map<std::string, std::string>> ring_config_get_history(void) -{ - return getConfigurationManager()->getHistory(); -} - -std::map<std::string, std::string> ring_config_get_tls_settings() -{ - return getConfigurationManager()->getTlsSettings(); -} - -void ring_config_set_tls_settings(const std::map< std::string, std::string >& settings) -{ - getConfigurationManager()->setTlsSettings(settings); -} - -std::map<std::string, std::string> ring_config_get_ip2ip_details(void) -{ - return getConfigurationManager()->getIp2IpDetails(); -} - -std::vector<std::map<std::string, std::string>> ring_config_get_credentials(const std::string& account_id) -{ - return getConfigurationManager()->getCredentials(account_id); -} - -void ring_config_set_credentials(const std::string& account_id, const std::vector<std::map<std::string, std::string>>& details) -{ - getConfigurationManager()->setCredentials(account_id, details); -} - -std::string ring_config_get_addr_from_interface_name(const std::string& interface) -{ - return getConfigurationManager()->getAddrFromInterfaceName(interface); -} - -std::vector<std::string> ring_config_get_all_ip_interface(void) -{ - return getConfigurationManager()->getAllIpInterface(); -} - -std::vector<std::string> ring_config_get_all_ip_interface_by_name(void) -{ - return getConfigurationManager()->getAllIpInterfaceByName(); -} - -std::map<std::string, std::string> ring_config_get_shortcuts() -{ - return getConfigurationManager()->getShortcuts(); -} - -void ring_config_set_shortcuts(const std::map<std::string, std::string>& shortcuts) -{ - getConfigurationManager()->setShortcuts(shortcuts); -} - -void ring_config_set_volume(const std::string& device, double value) -{ - getConfigurationManager()->setVolume(device, value); -} - -double ring_config_get_volume(const std::string& device) -{ - return getConfigurationManager()->getVolume(device); -} - -std::map<std::string, std::string> ring_config_validate_certificate(const std::string& accountId, const std::string& certificate, const std::string& private_key) -{ - return getConfigurationManager()->validateCertificate(accountId,certificate,private_key); -} - -std::map<std::string, std::string> ring_config_get_certificate_details(const std::string& certificate) -{ - return getConfigurationManager()->getCertificateDetails(certificate); -} - -void ring_pres_publish(const std::string& account_id, int status, const std::string& note) -{ - getPresenceManager()->publish(account_id, status, note); -} - -void ring_pres_answer_server_request(const std::string& uri, int flag) -{ - getPresenceManager()->answerServerRequest(uri, flag); -} - -void ring_pres_subscribe_buddy(const std::string& account_id, const std::string& uri, int flag) -{ - getPresenceManager()->subscribeBuddy(account_id, uri, flag); -} - -std::vector<std::map<std::string, std::string>> ring_pres_get_subscriptions(const std::string& account_id) -{ - return getPresenceManager()->getSubscriptions(account_id); -} - -void ring_pres_set_subscriptions(const std::string& account_id, const std::vector<std::string>& uris) -{ - getPresenceManager()->setSubscriptions(account_id, uris); -} - -#ifdef RING_VIDEO -std::vector<std::map<std::string, std::string>> ring_video_get_codecs(const std::string& account_id) -{ - return getVideoManager()->getCodecs(account_id); -} - -void ring_video_set_codecs(const std::string& account_id, const std::vector<std::map<std::string, std::string>>& details) -{ - getVideoManager()->setCodecs(account_id, details); -} - -std::vector<std::string> ring_video_get_device_list(void) -{ - return getVideoManager()->getDeviceList(); -} - -std::map<std::string, std::string> ring_video_get_settings(const std::string& name) -{ - return getVideoManager()->getSettings(name); -} - -void ring_video_set_default_device(const std::string& dev) -{ - getVideoManager()->setDefaultDevice(dev); -} - -std::string ring_video_get_default_device(void) -{ - return getVideoManager()->getDefaultDevice(); -} - -std::string ring_video_get_current_codec_name(const std::string& call_id) -{ - return getVideoManager()->getCurrentCodecName(call_id); -} - -void ring_video_start_camera(void) -{ - getVideoManager()->startCamera(); -} - -void ring_video_stop_camera(void) -{ - getVideoManager()->stopCamera(); -} - -bool ring_video_switch_input(const std::string& resource) -{ - return getVideoManager()->switchInput(resource); -} - -bool ring_video_is_camera_started(void) -{ - return getVideoManager()->hasCameraStarted(); -} - -void ring_video_apply_settings(const std::string& name, const std::map<std::string, std::string>& settings) -{ - getVideoManager()->applySettings(name, settings); -} - -std::map<std::string, std::map<std::string, std::vector<std::string>>> ring_video_get_capabilities(const std::string& name) -{ - return getVideoManager()->getCapabilities(name); -} - -#endif // RING_VIDEO +} // namespace DRing diff --git a/daemon/src/ringdht/ringaccount.cpp b/daemon/src/ringdht/ringaccount.cpp index 18a733098170f85ff692f791c150a9fdadec460a..277e7b20c9a3db7584faa9c032b386e7e6f0796a 100644 --- a/daemon/src/ringdht/ringaccount.cpp +++ b/daemon/src/ringdht/ringaccount.cpp @@ -47,7 +47,7 @@ #include "array_size.h" -#include "client/configurationmanager.h" +#include "client/signal.h" #include "account_schema.h" #include "logger.h" diff --git a/daemon/src/sip/pres_sub_client.cpp b/daemon/src/sip/pres_sub_client.cpp index 6f60e3d132725631c82515f1117f6229dad11129..c61a06d14da73688a9faa53f1004d7d4cf41dfd8 100644 --- a/daemon/src/sip/pres_sub_client.cpp +++ b/daemon/src/sip/pres_sub_client.cpp @@ -46,13 +46,12 @@ #include "array_size.h" #include "pres_sub_client.h" -#include "client/presencemanager.h" -#include "client/configurationmanager.h" #include "sipaccount.h" #include "sippresence.h" #include "sipvoiplink.h" #include "sip_utils.h" #include "manager.h" +#include "client/signal.h" #include "logger.h" @@ -92,7 +91,7 @@ PresSubClient::pres_client_evsub_on_state(pjsip_evsub *sub, pjsip_event *event) if (state == PJSIP_EVSUB_STATE_ACCEPTED) { pres_client->enable(true); - Manager::instance().getPresenceManager()->subscriptionStateChanged( + emitSignal<DRing::PresenceSignal::SubscriptionStateChanged>( pres->getAccount()->getAccountID(), pres_client->getURI().c_str(), PJ_TRUE); @@ -103,7 +102,7 @@ PresSubClient::pres_client_evsub_on_state(pjsip_evsub *sub, pjsip_event *event) int resub_delay = -1; pj_strdup_with_null(pres_client->pool_, &pres_client->term_reason_, pjsip_evsub_get_termination_reason(sub)); - Manager::instance().getPresenceManager()->subscriptionStateChanged( + emitSignal<DRing::PresenceSignal::SubscriptionStateChanged>( pres->getAccount()->getAccountID(), pres_client->getURI().c_str(), PJ_FALSE); @@ -162,7 +161,7 @@ PresSubClient::pres_client_evsub_on_state(pjsip_evsub *sub, pjsip_event *event) * 2) change the support field in the account schema if the pres_sub's server * is the same as the account's server */ - Manager::instance().getPresenceManager()->serverError( + emitSignal<DRing::PresenceSignal::ServerError>( pres_client->getPresence()->getAccount()->getAccountID(), error, msg); diff --git a/daemon/src/sip/pres_sub_server.cpp b/daemon/src/sip/pres_sub_server.cpp index 3908be50e9365ee9cf4303e88d87f3e4d3179351..6a5edf4c01272f85f46cf9dd1785d6e93df24608 100644 --- a/daemon/src/sip/pres_sub_server.cpp +++ b/daemon/src/sip/pres_sub_server.cpp @@ -36,9 +36,9 @@ #include "sipvoiplink.h" #include "manager.h" #include "sippresence.h" -#include "client/presencemanager.h" #include "logger.h" #include "pres_sub_server.h" +#include "client/signal.h" namespace ring { @@ -188,8 +188,7 @@ PresSubServer::pres_on_rx_subscribe_request(pjsip_rx_data *rdata) PresSubServer *presSubServer = new PresSubServer(pres, sub, remote, dlg); pjsip_evsub_set_mod_data(sub, pres->getModId(), presSubServer); // Notify the client. - Manager::instance().getPresenceManager()->newServerSubscriptionRequest(presSubServer->remote_); - + emitSignal<DRing::PresenceSignal::NewServerSubscriptionRequest>(presSubServer->remote_); pres->addPresSubServer(presSubServer); /* Capture the value of Expires header. */ diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp index 0caf57a71585807ba49ebe8a89e0cd46f4f98d2c..ea6fb2889799090f6e9048db1e7c0f9fcb6142c3 100644 --- a/daemon/src/sip/sipaccount.cpp +++ b/daemon/src/sip/sipaccount.cpp @@ -48,7 +48,6 @@ #include "call_factory.h" #include "sippresence.h" -#include "client/configurationmanager.h" #include <yaml-cpp/yaml.h> @@ -56,6 +55,7 @@ #include "config/yamlparser.h" #include "logger.h" #include "manager.h" +#include "client/signal.h" #ifdef RING_VIDEO #include "libav_utils.h" @@ -1132,8 +1132,8 @@ SIPAccount::onRegister(pjsip_regc_cbparam *param) if (param->code && description) { std::string state(description->ptr, description->slen); - Manager::instance().getConfigurationManager()->sipRegistrationStateChanged(getAccountID(), state, param->code); - Manager::instance().getConfigurationManager()->volatileAccountDetailsChanged(accountID_, getVolatileAccountDetails()); + emitSignal<DRing::ConfigurationSignal::SipRegistrationStateChanged>(getAccountID(), state, param->code); + emitSignal<DRing::ConfigurationSignal::VolatileDetailsChanged>(accountID_, getVolatileAccountDetails()); std::pair<int, std::string> details(param->code, state); // TODO: there id a race condition for this ressource when closing the application setRegistrationStateDetailed(details); @@ -1841,7 +1841,7 @@ SIPAccount::supportPresence(int function, bool enabled) enablePresence(false); Manager::instance().saveConfig(); - Manager::instance().getConfigurationManager()->accountsChanged(); + emitSignal<DRing::ConfigurationSignal::AccountsChanged>(); } MatchRank diff --git a/daemon/src/sip/sipaccountbase.cpp b/daemon/src/sip/sipaccountbase.cpp index 868ae10c9ca92ba062c2cf722d7b1c086daf77da..880b1050071466de6c22c5ad6cb2fda61473d3ca 100644 --- a/daemon/src/sip/sipaccountbase.cpp +++ b/daemon/src/sip/sipaccountbase.cpp @@ -37,12 +37,13 @@ #endif #include "account_schema.h" -#include "client/configurationmanager.h" #include "manager.h" #include "config/yamlparser.h" #include <yaml-cpp/yaml.h> +#include "client/signal.h" + namespace ring { bool SIPAccountBase::portsInUse_[HALF_MAX_PORT]; @@ -277,7 +278,7 @@ SIPAccountBase::onTransportStateChanged(pjsip_transport_state state, const pjsip // Notify the client of the new transport state if (currentStatus != transportStatus_) - Manager::instance().getConfigurationManager()->volatileAccountDetailsChanged(accountID_, getVolatileAccountDetails()); + emitSignal<DRing::ConfigurationSignal::VolatileDetailsChanged>(accountID_, getVolatileAccountDetails()); } void diff --git a/daemon/src/sip/sipcall.cpp b/daemon/src/sip/sipcall.cpp index 11027bee8051d37714036283514dd6a2b8d5a04f..b43eee0c482549320902162080d39a486c9c85e5 100644 --- a/daemon/src/sip/sipcall.cpp +++ b/daemon/src/sip/sipcall.cpp @@ -3,8 +3,8 @@ * Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com> * Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com> * Author: Yan Morin <yan.morin@savoirfairelinux.com> - * Author : Laurielle Lea <laurielle.lea@savoirfairelinux.com> - * Author : Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> + * Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -45,7 +45,6 @@ #include "upnp/upnp_control.h" #include "audio/audiortp/avformat_rtp_session.h" -#include "client/callmanager.h" #if HAVE_INSTANT_MESSAGING #include "im/instant_messaging.h" @@ -53,21 +52,12 @@ #ifdef RING_VIDEO #include "video/video_rtp_session.h" -#include "client/videomanager.h" +#include "dring/videomanager_interface.h" #include <chrono> #endif namespace ring { -#ifdef RING_VIDEO -static video::VideoSettings -getSettings() -{ - const auto videoman = Manager::instance().getVideoManager(); - return videoman->getSettings(videoman->getDefaultDevice()); -} -#endif - static constexpr int DEFAULT_ICE_INIT_TIMEOUT {10}; // seconds static constexpr int DEFAULT_ICE_NEGO_TIMEOUT {60}; // seconds @@ -123,7 +113,7 @@ SIPCall::SIPCall(SIPAccountBase& account, const std::string& id, Call::CallType , avformatrtp_(new AVFormatRtpSession(id, *new std::map<std::string, std::string>)) #ifdef RING_VIDEO // The ID is used to associate video streams to calls - , videortp_(id, getSettings()) + , videortp_(id, ::DRing::getSettings(DRing::getDefaultDevice())) #endif , sdp_(new Sdp(id)) { diff --git a/daemon/src/sip/sippresence.cpp b/daemon/src/sip/sippresence.cpp index 222ed6e4fea9750ec8ef1176cce64994ac0a683d..bf5201741ef1315fcbf1a0f744f3de642b4e2441 100644 --- a/daemon/src/sip/sippresence.cpp +++ b/daemon/src/sip/sippresence.cpp @@ -35,13 +35,12 @@ #include <sstream> #include "logger.h" #include "manager.h" -#include "client/presencemanager.h" -#include "client/configurationmanager.h" #include "sipaccount.h" #include "sip_utils.h" #include "pres_sub_server.h" #include "pres_sub_client.h" #include "sipvoiplink.h" +#include "client/signal.h" #define MAX_N_SUB_SERVER 50 #define MAX_N_SUB_CLIENT 50 @@ -205,7 +204,7 @@ void SIPPresence::reportPresSubClientNotification(const std::string& uri, pjsip_ note_ = note; } // report status to client signal - Manager::instance().getPresenceManager()->newBuddyNotification(acc_ID, uri, status->info[0].basic_open, note); + emitSignal<DRing::PresenceSignal::NewBuddyNotification>(acc_ID, uri, status->info[0].basic_open, note); } void SIPPresence::subscribeClient(const std::string& uri, bool flag) @@ -381,7 +380,7 @@ SIPPresence::publish_cb(struct pjsip_publishc_cbparam *param) char errmsg[PJ_ERR_MSG_SIZE]; pj_strerror(param->status, errmsg, sizeof(errmsg)); RING_ERR("Client (PUBLISH) failed, status=%d, msg=%s", param->status, errmsg); - Manager::instance().getPresenceManager()->serverError( + emitSignal<DRing::PresenceSignal::ServerError>( pres->getAccount()->getAccountID(), error, errmsg); @@ -395,7 +394,7 @@ SIPPresence::publish_cb(struct pjsip_publishc_cbparam *param) } else if ((param->code == PJSIP_SC_BAD_EVENT) || (param->code == PJSIP_SC_NOT_IMPLEMENTED)){ //489 or 501 RING_WARN("Client (PUBLISH) failed (%s)",error.c_str()); - Manager::instance().getPresenceManager()->serverError( + emitSignal<DRing::PresenceSignal::ServerError>( pres->getAccount()->getAccountID(), error, "Publish not supported."); diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index fa1491c9a5b09e7ee333c4bb40103461b4b3d7fc..68c0a959ba6d24d4e9b35d36120efd28db267063 100644 --- a/daemon/src/sip/siptransport.cpp +++ b/daemon/src/sip/siptransport.cpp @@ -36,7 +36,6 @@ #include "ringdht/sip_transport_ice.h" -#include "client/configurationmanager.h" #include "array_size.h" #include "intrin.h" #include "sipvoiplink.h" diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index b7b78398076e9dad7be0cd6dd6f873e51fbcb230..7ec1d6c702687eb7b7589449823c6fc914871d84 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -4,7 +4,7 @@ * Author: Yun Liu <yun.liu@savoirfairelinux.com> * Author: Pierre-Luc Bacon <pierre-luc.bacon@savoirfairelinux.com> * Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com> - * Author : Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> + * Author: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -62,8 +62,7 @@ #include "client/videomanager.h" #endif -#include "client/callmanager.h" -#include "client/configurationmanager.h" +#include "client/signal.h" #include "pres_sub_server.h" @@ -818,8 +817,7 @@ invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event *ev) const pj_str_t * description = pjsip_get_status_text(statusCode); std::string desc(description->ptr, description->slen); - CallManager *cm = Manager::instance().getCallManager(); - cm->sipCallStateChanged(call->getCallId(), desc, statusCode); + emitSignal<DRing::CallSignal::SipCallStateChanged>(call->getCallId(), desc, statusCode); } } diff --git a/daemon/test/accounttest.cpp b/daemon/test/accounttest.cpp index 39f7a27bdf045f8dab4dc7a3438f28dd09610d8c..e8c359c7bf8754649fa279e7ff9011b8486ff912 100644 --- a/daemon/test/accounttest.cpp +++ b/daemon/test/accounttest.cpp @@ -30,11 +30,12 @@ #include <cppunit/extensions/HelperMacros.h> #include <map> + #include "account.h" #include "account_schema.h" #include "accounttest.h" #include "manager.h" -#include "client/configurationmanager.h" +#include "configurationmanager_interface.h" #include "logger.h" namespace ring { namespace test { @@ -43,18 +44,17 @@ void AccountTest::TestAddRemove() { RING_DBG("-------------------- %s --------------------\n", __PRETTY_FUNCTION__); - std::map<std::string, std::string> details(Manager::instance().getConfigurationManager()->getAccountTemplate()); + auto details = DRing::getAccountTemplate(); details[Conf::CONFIG_ACCOUNT_TYPE] = "SIP"; details[Conf::CONFIG_ACCOUNT_ENABLE] = "false"; details[Conf::CONFIG_LOCAL_INTERFACE] = "default"; details[Conf::CONFIG_LOCAL_PORT] = "5060"; - std::string accountId = Manager::instance().addAccount(details); + auto accountId = Manager::instance().addAccount(details); CPPUNIT_ASSERT(not accountId.empty()); CPPUNIT_ASSERT(Manager::instance().hasAccount(accountId)); Manager::instance().removeAccount(accountId); - CPPUNIT_ASSERT(!Manager::instance().hasAccount(accountId)); }