+/*
+* Copyright © 2020 Samsung Electronics co., Ltd. All Rights Reserved.
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice (including the next
+* paragraph) shall be included in all copies or substantial portions of the
+* Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*/
+
+#include <DSSignalBroker.h>
+
+namespace display_server
+{
+
+std::mutex DSSignalBroker::__mutex;
+DSSignalBroker* DSSignalBroker::__signalBroker { nullptr };
+
+DSSignalBroker::DSSignalBroker(DSObject *parent)
+{
+}
+
+DSSignalBroker::~DSSignalBroker()
+{
+}
+
+DSSignalBroker *DSSignalBroker::getInstance()
+{
+ std::lock_guard<std::mutex> tLock(__mutex);
+
+ if (!__signalBroker)
+ {
+ __signalBroker = new DSSignalBroker(new DSObject);
+ DSLOG_INF("DSSignalBroker", "DSSignalBroker instance has been created !");
+ }
+
+ return __signalBroker;
+}
+
+void DSSignalBroker::releaseInstance()
+{
+ std::lock_guard<std::mutex> tLock(__mutex);
+
+ if (__signalBroker && __signalBroker->__signalHash.empty())
+ {
+ delete __signalBroker;
+ __signalBroker = nullptr;
+ DSLOG_INF("DSSignalBroker", "DSSignalBroker instance has been removed !");
+ }
+}
+
+bool DSSignalBroker::registerCallback(std::string signalStr, DSObject *slot, std::function<void(void *)> func)
+{
+ if (!__signalBroker) return false;
+
+ if (__signalBroker->__signalHash.find(signalStr) == __signalBroker->__signalHash.end())
+ {
+ DSLOG_INF("DSSignalBroker","registerCallback:: cannot find signal, add new one %s", signalStr.c_str());
+
+ __signalBroker->__signalHash[signalStr] = new DSSignal<void *>();
+ }
+
+ __signalBroker->__signalHash[signalStr]->connect(slot, func);
+
+ return true;
+}
+
+bool DSSignalBroker::deregisterCallback(std::string signalStr, DSObject *slot, std::function<void(void *)> func)
+{
+ if (!__signalBroker) return false;
+
+ if (__signalBroker->__signalHash.find(signalStr) == __signalBroker->__signalHash.end())
+ return false;
+
+ // TODO: have to impl disconnect method in DSSignal
+ //__signalBroker->__signalHash[signalStr]->disconnect(slot, func);
+
+ return true;
+}
+
+bool DSSignalBroker::emitSignal(std::string signalStr, void *arg)
+{
+ if (!__signalBroker) return false;
+
+ if (__signalBroker->__signalHash.find(signalStr) == __signalBroker->__signalHash.end())
+ {
+ DSLOG_INF("DSSignalBroker","emitSignal:: cannot find signal, add new one %s", signalStr.c_str());
+
+ __signalBroker->__signalHash[signalStr] = new DSSignal<void *>();
+ }
+
+ __signalBroker->__signalHash[signalStr]->emit(arg);
+
+ return true;
+}
+
+} // end of namespace display_server
\ No newline at end of file