From 406a0b523cc129bf9b8a6ad04a4ef98c02bd6529 Mon Sep 17 00:00:00 2001
From: Eloi BAIL <eloi.bail@savoirfairelinux.com>
Date: Wed, 18 Mar 2015 16:50:16 -0400
Subject: [PATCH] daemon: add of dbus API setCodecDetails

Refs #68805

Change-Id: Ic997485ff22c8cf9465b7ff661dc1c9bcbca2f9c
---
 .../dbus/configurationmanager-introspec.xml   |  9 +++++
 daemon/bin/dbus/dbusconfigurationmanager.cpp  |  7 ++++
 daemon/bin/dbus/dbusconfigurationmanager.h    |  1 +
 daemon/src/client/configurationmanager.cpp    | 34 +++++++++++++++++++
 .../dring/configurationmanager_interface.h    |  1 +
 daemon/src/media/media_codec.cpp              | 28 +++++++++++++++
 daemon/src/media/media_codec.h                |  2 ++
 7 files changed, 82 insertions(+)

diff --git a/daemon/bin/dbus/configurationmanager-introspec.xml b/daemon/bin/dbus/configurationmanager-introspec.xml
index 1bebf00e83..ca19ba2646 100644
--- a/daemon/bin/dbus/configurationmanager-introspec.xml
+++ b/daemon/bin/dbus/configurationmanager-introspec.xml
@@ -382,6 +382,15 @@
            </arg>
        </method>
 
+       <method name="setCodecDetails" tp:name-for-bindings="setCodecDetails">
+           <arg type="b" name="result" direction="out"></arg>
+           <arg type="s" name="accountID" direction="in"></arg>
+           <arg type="u" name="codecId" direction="in"></arg>
+           <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="MapStringString"/>
+           <arg type="a{ss}" name="details" direction="in" tp:type="String_String_Map">
+           </arg>
+       </method>
+
        <method name="getActiveCodecList" tp:name-for-bindings="getActiveCodecList">
            <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorUInt"/>
            <arg type="s" name="accountID" direction="in">
diff --git a/daemon/bin/dbus/dbusconfigurationmanager.cpp b/daemon/bin/dbus/dbusconfigurationmanager.cpp
index 5099912e05..0587b7251e 100644
--- a/daemon/bin/dbus/dbusconfigurationmanager.cpp
+++ b/daemon/bin/dbus/dbusconfigurationmanager.cpp
@@ -121,6 +121,13 @@ DBusConfigurationManager::getCodecDetails(const std::string& accountID, const un
     return DRing::getCodecDetails(accountID, codecId);
 }
 
+auto
+DBusConfigurationManager::setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details)
+-> decltype(DRing::setCodecDetails(accountID, codecId, details))
+{
+    return DRing::setCodecDetails(accountID, codecId, details);
+}
+
 auto
 DBusConfigurationManager::getActiveCodecList(const std::string& accountID) -> decltype(DRing::getActiveCodecList(accountID))
 {
diff --git a/daemon/bin/dbus/dbusconfigurationmanager.h b/daemon/bin/dbus/dbusconfigurationmanager.h
index 4ebba7a264..7368abb518 100644
--- a/daemon/bin/dbus/dbusconfigurationmanager.h
+++ b/daemon/bin/dbus/dbusconfigurationmanager.h
@@ -79,6 +79,7 @@ class DBusConfigurationManager :
         std::vector<unsigned> getCodecList();
         std::vector<std::string> getSupportedTlsMethod();
         std::map<std::string, std::string> getCodecDetails(const std::string& accountID, const unsigned& codecId);
+        bool setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details);
         std::vector<unsigned> getActiveCodecList(const std::string& accountID);
         void setActiveCodecList(const std::string& accountID, const std::vector<unsigned>& list);
         std::vector<std::string> getAudioPluginList();
diff --git a/daemon/src/client/configurationmanager.cpp b/daemon/src/client/configurationmanager.cpp
index 792b9c96fc..2fa897440d 100644
--- a/daemon/src/client/configurationmanager.cpp
+++ b/daemon/src/client/configurationmanager.cpp
@@ -289,6 +289,40 @@ getSupportedCiphers(const std::string& accountID)
 }
 
 
+bool
+setCodecDetails(const std::string& accountID,
+                const unsigned& codecId,
+                const  std::map<std::string, std::string>& details)
+{
+    auto acc = ring::Manager::instance().getAccount(accountID);
+    if (!acc) {
+        RING_ERR("Could not find account %s. can not set codec details"
+                , accountID.c_str());
+        return false;
+    }
+
+    auto codec = acc->searchCodecById(codecId, ring::MEDIA_ALL);
+    if (!codec) {
+        RING_ERR("can not find codec %d", codecId);
+        return false;
+
+    }
+    if (codec->systemCodecInfo.mediaType & ring::MEDIA_AUDIO) {
+        if (auto foundCodec = std::static_pointer_cast<ring::AccountAudioCodecInfo>(codec)) {
+            foundCodec->setCodecSpecifications(details);
+            return true;
+        }
+    }
+
+    if (codec->systemCodecInfo.mediaType & ring::MEDIA_VIDEO) {
+        if (auto foundCodec = std::static_pointer_cast<ring::AccountVideoCodecInfo>(codec)) {
+            foundCodec->setCodecSpecifications(details);
+            return true;
+        }
+    }
+    return false;
+}
+
 std::map<std::string, std::string>
 getCodecDetails(const std::string& accountID, const unsigned& codecId)
 {
diff --git a/daemon/src/dring/configurationmanager_interface.h b/daemon/src/dring/configurationmanager_interface.h
index 71db74f5e7..9bdf42a2e4 100644
--- a/daemon/src/dring/configurationmanager_interface.h
+++ b/daemon/src/dring/configurationmanager_interface.h
@@ -63,6 +63,7 @@ std::vector<unsigned> getCodecList();
 std::vector<std::string> getSupportedTlsMethod();
 std::vector<std::string> getSupportedCiphers(const std::string& accountID);
 std::map<std::string, std::string> getCodecDetails(const std::string& accountID, const unsigned& codecId);
+bool setCodecDetails(const std::string& accountID, const unsigned& codecId, const std::map<std::string, std::string>& details);
 std::vector<unsigned> getActiveCodecList(const std::string& accountID);
 
 void setActiveCodecList(const std::string& accountID, const std::vector<unsigned>& list);
diff --git a/daemon/src/media/media_codec.cpp b/daemon/src/media/media_codec.cpp
index e871734ab6..f870bc9407 100644
--- a/daemon/src/media/media_codec.cpp
+++ b/daemon/src/media/media_codec.cpp
@@ -165,6 +165,22 @@ AccountAudioCodecInfo::getCodecSpecifications()
         };
 }
 
+void
+AccountAudioCodecInfo::setCodecSpecifications(const std::map<std::string, std::string>& details)
+{
+    auto it = details.find(DRing::Account::ConfProperties::CodecInfo::BITRATE);
+    if (it != details.end())
+        bitrate = std::stoi(it->second);
+
+    it = details.find(DRing::Account::ConfProperties::CodecInfo::SAMPLE_RATE);
+    if (it != details.end())
+        audioformat.sample_rate = std::stoi(it->second);
+
+    it = details.find(DRing::Account::ConfProperties::CodecInfo::CHANNEL_NUMBER);
+    if (it != details.end())
+        audioformat.nb_channels = std::stoi(it->second);
+}
+
 bool
 AccountAudioCodecInfo::isPCMG722() const
 {
@@ -192,6 +208,18 @@ AccountVideoCodecInfo::getCodecSpecifications()
         };
 }
 
+void
+AccountVideoCodecInfo::setCodecSpecifications(const std::map<std::string, std::string>& details)
+{
+    auto it = details.find(DRing::Account::ConfProperties::CodecInfo::BITRATE);
+    if (it != details.end())
+        bitrate = stoi(it->second);
+
+    it = details.find(DRing::Account::ConfProperties::CodecInfo::FRAME_RATE);
+    if (it != details.end())
+        frameRate = stoi(it->second);
+}
+
 AccountVideoCodecInfo::~AccountVideoCodecInfo()
 {}
 
diff --git a/daemon/src/media/media_codec.h b/daemon/src/media/media_codec.h
index 343b05a9d1..5b2de4e6c3 100644
--- a/daemon/src/media/media_codec.h
+++ b/daemon/src/media/media_codec.h
@@ -152,6 +152,7 @@ struct AccountAudioCodecInfo : AccountCodecInfo
     ~AccountAudioCodecInfo();
 
     std::map<std::string, std::string>  getCodecSpecifications();
+    void setCodecSpecifications(const std::map<std::string, std::string>& details);
 
     /* account custom values */
     AudioFormat audioformat {AudioFormat::NONE()};
@@ -163,6 +164,7 @@ struct AccountVideoCodecInfo : AccountCodecInfo
     AccountVideoCodecInfo(const SystemVideoCodecInfo& sysCodecInfo);
     ~AccountVideoCodecInfo();
 
+    void setCodecSpecifications(const std::map<std::string, std::string>& details);
     std::map<std::string, std::string>  getCodecSpecifications();
 
     /* account custom values */
-- 
GitLab