Skip to content
Snippets Groups Projects
Commit 143c62f5 authored by Aline Gondim Santos's avatar Aline Gondim Santos Committed by Sébastien Blin
Browse files

plugin: toggle callmediahandler with callID

Change-Id: I4620a3a2704ea9bca661f00e0f7e6da55f2cb909
parent 34e26e2a
No related branches found
No related tags found
No related merge requests found
...@@ -37,8 +37,7 @@ DRING_PUBLIC bool loadPlugin(const std::string& path); ...@@ -37,8 +37,7 @@ DRING_PUBLIC bool loadPlugin(const std::string& path);
DRING_PUBLIC bool unloadPlugin(const std::string& path); DRING_PUBLIC bool unloadPlugin(const std::string& path);
DRING_PUBLIC void togglePlugin(const std::string& path, bool toggle); DRING_PUBLIC void togglePlugin(const std::string& path, bool toggle);
DRING_PUBLIC std::map<std::string,std::string> getPluginDetails(const std::string& path); DRING_PUBLIC std::map<std::string,std::string> getPluginDetails(const std::string& path);
DRING_PUBLIC std::vector<std::map<std::string, std::string>> getPluginPreferences( DRING_PUBLIC std::vector<std::map<std::string,std::string>> getPluginPreferences(const std::string& path);
const std::string& path);
DRING_PUBLIC bool setPluginPreference(const std::string& path, DRING_PUBLIC bool setPluginPreference(const std::string& path,
const std::string& key, const std::string& key,
const std::string& value); const std::string& value);
...@@ -54,4 +53,4 @@ DRING_PUBLIC std::map<std::string, std::string> getCallMediaHandlerDetails(const ...@@ -54,4 +53,4 @@ DRING_PUBLIC std::map<std::string, std::string> getCallMediaHandlerDetails(const
DRING_PUBLIC bool getPluginsEnabled(); DRING_PUBLIC bool getPluginsEnabled();
DRING_PUBLIC void setPluginsEnabled(bool state); DRING_PUBLIC void setPluginsEnabled(bool state);
DRING_PUBLIC std::map<std::string,std::string> getCallMediaHandlerStatus(); DRING_PUBLIC std::map<std::string,std::string> getCallMediaHandlerStatus();
} // namespace DRing }
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#pragma once #pragma once
// Utils // Utils
#include "noncopyable.h" #include "noncopyable.h"
#include "logger.h"
#include "manager.h"
// Plugin Manager // Plugin Manager
#include "pluginmanager.h" #include "pluginmanager.h"
#include "streamdata.h" #include "streamdata.h"
...@@ -33,12 +35,6 @@ using MediaHandlerPtr = std::unique_ptr<MediaHandler>; ...@@ -33,12 +35,6 @@ using MediaHandlerPtr = std::unique_ptr<MediaHandler>;
using CallMediaHandlerPtr = std::unique_ptr<CallMediaHandler>; using CallMediaHandlerPtr = std::unique_ptr<CallMediaHandler>;
using AVSubjectSPtr = std::weak_ptr<Observable<AVFrame*>>; using AVSubjectSPtr = std::weak_ptr<Observable<AVFrame*>>;
struct MediaHandlerToggled
{
std::string name = "";
std::string state = "false";
};
class CallServicesManager class CallServicesManager
{ {
public: public:
...@@ -79,8 +75,24 @@ public: ...@@ -79,8 +75,24 @@ public:
{ {
// This guarantees unicity of subjects by id // This guarantees unicity of subjects by id
callAVsubjects.push_back(std::make_pair(data, subject)); callAVsubjects.push_back(std::make_pair(data, subject));
auto inserted = callAVsubjects.back(); }
notifyAllAVSubject(inserted.first, inserted.second);
void clearAVSubject(const std::string& callID)
{
for (auto it = callAVsubjects.begin(); it != callAVsubjects.end();) {
if (it->first.id == callID) {
it = callAVsubjects.erase(it);
} else {
++it;
}
}
for (auto& callMediaHandler : callMediaHandlers) {
if (mediaHandlerToggled_[getCallHandlerId(callMediaHandler.second)] == callID) {
callMediaHandler.first = false;
callMediaHandler.second->detach();
mediaHandlerToggled_[getCallHandlerId(callMediaHandler.second)] = "";
}
}
} }
/** /**
...@@ -137,17 +149,36 @@ public: ...@@ -137,17 +149,36 @@ public:
*/ */
void toggleCallMediaHandler(const std::string& id, const bool toggle) void toggleCallMediaHandler(const std::string& id, const bool toggle)
{ {
std::string callID = Manager::instance().getCurrentCallId();
if (toggle) {
for (auto& pair : mediaHandlerToggled_) {
if (pair.second == callID && pair.first != id) {
toggleCallMediaHandler(pair.first, false);
}
}
}
if (id.empty())
return;
auto find = mediaHandlerToggled_.find(id);
if (find == mediaHandlerToggled_.end())
mediaHandlerToggled_[id] = "";
for (auto it = callAVsubjects.begin(); it != callAVsubjects.end(); ++it) {
if (it->first.id == callID) {
for (auto& pair : callMediaHandlers) { for (auto& pair : callMediaHandlers) {
if (pair.second && getCallHandlerId(pair.second) == id) { if (pair.second && getCallHandlerId(pair.second) == id) {
pair.first = toggle; pair.first = toggle;
if (pair.first) { if (pair.first) {
mediaHandlerToggled_.name = id; mediaHandlerToggled_[id] = callID;
mediaHandlerToggled_.state = "true"; listAvailableSubjects(callID, pair.second);
listAvailableSubjects(pair.second);
} else { } else {
pair.second->detach(); pair.second->detach();
mediaHandlerToggled_.name = ""; mediaHandlerToggled_[id] = "";
mediaHandlerToggled_.state = "false"; }
}
} }
} }
} }
...@@ -170,13 +201,21 @@ public: ...@@ -170,13 +201,21 @@ public:
std::map<std::string, std::string> getCallMediaHandlerStatus() std::map<std::string, std::string> getCallMediaHandlerStatus()
{ {
return {{"name", mediaHandlerToggled_.name}, {"state", mediaHandlerToggled_.state}}; for (auto& pair : mediaHandlerToggled_) {
if (pair.second == Manager::instance().getCurrentCallId()) {
return {{"name", pair.first}};
}
}
return {{"name", ""}};
} }
void setPreference(const std::string& key, const std::string& value, const std::string& scopeStr) void setPreference(const std::string& key, const std::string& value, const std::string& scopeStr)
{ {
for (auto& pair : callMediaHandlers) { for (auto& pair : callMediaHandlers) {
if (pair.second && scopeStr.find(pair.second->getCallMediaHandlerDetails()["name"]) != std::string::npos) { if (pair.second
&& scopeStr.find(pair.second->getCallMediaHandlerDetails()["name"])
!= std::string::npos) {
pair.second->setPreferenceAttribute(key, value); pair.second->setPreferenceAttribute(key, value);
} }
} }
...@@ -198,14 +237,28 @@ private: ...@@ -198,14 +237,28 @@ private:
} }
} }
void cleanCallAVSubjects()
{
// remove subjects from not available calls callAVsubjects
for (auto it = callAVsubjects.begin(); it != callAVsubjects.end();) {
std::vector<std::string> callids = jami::Manager::instance().getCallList();
if (std::find(callids.begin(), callids.end(), it->first.id) == callids.end()) {
it = callAVsubjects.erase(it);
} else {
++it;
}
}
}
/** /**
* @brief listAvailableSubjects * @brief listAvailableSubjects
* @param callMediaHandlerPtr * @param callMediaHandlerPtr
* This functions lets the call media handler component know which subjects are available * This functions lets the call media handler component know which subjects are available
*/ */
void listAvailableSubjects(CallMediaHandlerPtr& callMediaHandlerPtr) void listAvailableSubjects(const std::string& callID, CallMediaHandlerPtr& callMediaHandlerPtr)
{ {
for (auto it = callAVsubjects.begin(); it != callAVsubjects.end(); ++it) { for (auto it = callAVsubjects.begin(); it != callAVsubjects.end(); ++it) {
if (it->first.id == callID)
notifyAVSubject(callMediaHandlerPtr, it->first, it->second); notifyAVSubject(callMediaHandlerPtr, it->first, it->second);
} }
} }
...@@ -234,6 +287,7 @@ private: ...@@ -234,6 +287,7 @@ private:
* whenever there is a new CallAVSubject like a video receive * whenever there is a new CallAVSubject like a video receive
*/ */
std::list<std::pair<bool, CallMediaHandlerPtr>> callMediaHandlers; std::list<std::pair<bool, CallMediaHandlerPtr>> callMediaHandlers;
/** /**
* @brief callAVsubjects * @brief callAVsubjects
* When there is a SIPCall, CallAVSubjects are created there * When there is a SIPCall, CallAVSubjects are created there
...@@ -243,7 +297,7 @@ private: ...@@ -243,7 +297,7 @@ private:
*/ */
std::list<std::pair<const StreamData, AVSubjectSPtr>> callAVsubjects; std::list<std::pair<const StreamData, AVSubjectSPtr>> callAVsubjects;
MediaHandlerToggled mediaHandlerToggled_; std::map<std::string, std::string> mediaHandlerToggled_;
}; };
} // namespace jami } // namespace jami
...@@ -337,7 +337,11 @@ JamiPluginManager::unloadPlugin(const std::string& rootPath) ...@@ -337,7 +337,11 @@ JamiPluginManager::unloadPlugin(const std::string& rootPath)
void void
JamiPluginManager::togglePlugin(const std::string& rootPath, bool toggle) JamiPluginManager::togglePlugin(const std::string& rootPath, bool toggle)
{ {
try { //This function should not be used as is
//One should modify it to perform plugin install followed by load
//rootPath should be the jplpath!
try
{
std::string soPath = getPluginDetails(rootPath).at("soPath"); std::string soPath = getPluginDetails(rootPath).at("soPath");
// remove the previous plugin object if it was registered // remove the previous plugin object if it was registered
pm_.destroyPluginComponents(soPath); pm_.destroyPluginComponents(soPath);
......
...@@ -1188,6 +1188,12 @@ SIPCall::stopAllMedia() ...@@ -1188,6 +1188,12 @@ SIPCall::stopAllMedia()
#ifdef ENABLE_VIDEO #ifdef ENABLE_VIDEO
videortp_->stop(); videortp_->stop();
#endif #endif
#ifdef ENABLE_PLUGIN
jami::Manager::instance()
.getJamiPluginManager()
.getCallServicesManager()
.clearAVSubject(getCallId());
#endif
} }
void void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment