From b616ca1e864f7530b9dfce4c38f9d24a9f0809c9 Mon Sep 17 00:00:00 2001 From: Aleksandar Donchev Date: Fri, 10 Feb 2017 11:12:42 +0100 Subject: * many database observers can be registred now by the database handler. Signed-off-by: Christian Linke --- AudioManagerCore/CMakeLists.txt | 1 - AudioManagerCore/include/CAmCommandSender.h | 13 +- AudioManagerCore/include/CAmDatabaseHandlerMap.h | 168 ++++++---- AudioManagerCore/include/CAmDatabaseObserver.h | 87 ----- AudioManagerCore/include/CAmRouter.h | 6 +- AudioManagerCore/include/CAmRoutingSender.h | 5 +- AudioManagerCore/include/IAmDatabaseHandler.h | 34 +- AudioManagerCore/src/CAmCommandSender.cpp | 94 +++++- AudioManagerCore/src/CAmDatabaseHandlerMap.cpp | 325 +++++++++++-------- AudioManagerCore/src/CAmDatabaseObserver.cpp | 241 -------------- AudioManagerCore/src/CAmRouter.cpp | 1 + AudioManagerCore/src/CAmRoutingSender.cpp | 253 ++++++++------- .../CAmControlInterfaceTest.cpp | 6 +- .../CAmControlInterfaceTest.h | 3 - .../test/AmMapHandlerTest/CAmMapHandlerTest.cpp | 352 ++++++++++++++------- .../test/AmMapHandlerTest/CAmMapHandlerTest.h | 20 +- .../AmMapHandlerTest/CAmTestDatabaseObserver.cpp | 129 ++++---- .../AmMapHandlerTest/CAmTestDatabaseObserver.h | 53 ++++ .../test/AmMapHandlerTest/MockDatabaseObserver.h | 2 +- .../test/AmRouterMapTest/CAmRouterMapTest.cpp | 8 +- .../test/AmRouterMapTest/CAmRouterMapTest.h | 2 - .../test/AmRouterTest/CAmRouterTest.cpp | 8 +- AudioManagerCore/test/AmRouterTest/CAmRouterTest.h | 2 - .../CAmRoutingInterfaceTest.cpp | 6 +- .../CAmRoutingInterfaceTest.h | 2 - AudioManagerCore/test/CMakeLists.txt | 2 +- AudioManagerDaemon/src/main.cpp | 12 +- 27 files changed, 953 insertions(+), 882 deletions(-) delete mode 100644 AudioManagerCore/include/CAmDatabaseObserver.h delete mode 100644 AudioManagerCore/src/CAmDatabaseObserver.cpp create mode 100644 AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.h diff --git a/AudioManagerCore/CMakeLists.txt b/AudioManagerCore/CMakeLists.txt index 464a934..7be36e9 100644 --- a/AudioManagerCore/CMakeLists.txt +++ b/AudioManagerCore/CMakeLists.txt @@ -46,7 +46,6 @@ set(AUDIOMAN_CORE_SRCS_CXX src/CAmCommandSender.cpp src/CAmControlReceiver.cpp src/CAmControlSender.cpp - src/CAmDatabaseObserver.cpp src/CAmRoutingReceiver.cpp src/CAmRoutingSender.cpp src/CAmRouter.cpp diff --git a/AudioManagerCore/include/CAmCommandSender.h b/AudioManagerCore/include/CAmCommandSender.h index 82363de..caa72ad 100644 --- a/AudioManagerCore/include/CAmCommandSender.h +++ b/AudioManagerCore/include/CAmCommandSender.h @@ -29,21 +29,24 @@ #endif #include "IAmCommand.h" +#include "CAmDatabaseHandlerMap.h" +#include "CAmSerializer.h" namespace am { class CAmCommandReceiver; +class CAmCommandSender; /** * This class is used to send data to the CommandInterface. * All loaded plugins will be called when a callback is invoked. */ -class CAmCommandSender +class CAmCommandSender: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { public: - CAmCommandSender(const std::vector& listOfPluginDirectories); + CAmCommandSender(const std::vector& listOfPluginDirectories, CAmSocketHandler *iSocketHandler); ~CAmCommandSender(); am_Error_e startupInterfaces(CAmCommandReceiver* iCommandReceiver); void setCommandReady(); @@ -78,14 +81,18 @@ public: friend class IAmCommandBackdoor; //this is to get access to the loaded plugins and be able to exchange the interfaces #endif private: + void unloadLibraries(void); //!< unload the shared libraries std::vector mListInterfaces; //!< list of all interfaces std::vector mListLibraryHandles; //!< list of all library handles. This information is used to unload the plugins correctly. std::vector mListLibraryNames; //!< list of all library names. This information is used for getListPlugins. - + CAmCommandReceiver *mCommandReceiver; + CAmSerializer mSerializer; }; + + } #endif /* COMMANDSENDER_H_ */ diff --git a/AudioManagerCore/include/CAmDatabaseHandlerMap.h b/AudioManagerCore/include/CAmDatabaseHandlerMap.h index 05443b1..3909b05 100644 --- a/AudioManagerCore/include/CAmDatabaseHandlerMap.h +++ b/AudioManagerCore/include/CAmDatabaseHandlerMap.h @@ -74,6 +74,51 @@ class CAmDatabaseHandlerMap : public IAmDatabaseHandler public: CAmDatabaseHandlerMap(); virtual ~CAmDatabaseHandlerMap(); + + /** + * Database observer. + */ + struct AmDatabaseObserverCallbacks: public IAmDatabaseObserver + { + protected: + std::function dboNumberOfSinkClassesChanged; + std::function dboNumberOfSourceClassesChanged; + std::function dboNewSink; + std::function dboNewSource; + std::function dboNewDomain; + std::function dboNewGateway; + std::function dboNewConverter; + std::function dboNewCrossfader; + std::function dboNewMainConnection; + std::function dboRemovedMainConnection; + std::function dboRemovedSink; + std::function dboRemovedSource; + std::function dboRemoveDomain; + std::function dboRemoveGateway; + std::function dboRemoveConverter; + std::function dboRemoveCrossfader; + std::function dboMainConnectionStateChanged; + std::function dboMainSinkSoundPropertyChanged; + std::function dboMainSourceSoundPropertyChanged; + std::function dboSinkAvailabilityChanged; + std::function dboSourceAvailabilityChanged; + std::function dboVolumeChanged; + std::function dboSinkMuteStateChanged; + std::functiondboSystemPropertyChanged; + std::functiondboTimingInformationChanged; + std::function& , const bool )>dboSinkUpdated; + std::function& , const bool )>dboSourceUpdated; + std::function dboSinkMainNotificationConfigurationChanged; + std::function dboSourceMainNotificationConfigurationChanged; + public: + friend class CAmDatabaseHandlerMap; + AmDatabaseObserverCallbacks():IAmDatabaseObserver(), mpDatabaseHandler(nullptr) {} + virtual ~AmDatabaseObserverCallbacks(){ if(mpDatabaseHandler) mpDatabaseHandler->unregisterObserver(this);} + protected: + CAmDatabaseHandlerMap *mpDatabaseHandler; + + }; + am_Error_e enterDomainDB(const am_Domain_s& domainData, am_domainID_t& domainID); am_Error_e enterMainConnectionDB(const am_MainConnection_s& mainConnectionData, am_mainConnectionID_t& connectionID); am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID); @@ -196,7 +241,6 @@ public: bool existConverter(const am_converterID_t converterID) const; bool existSinkClass(const am_sinkClass_t sinkClassID) const; bool existSourceClass(const am_sourceClass_t sourceClassID) const; - void registerObserver(CAmDatabaseObserver *iObserver); bool sourceVisible(const am_sourceID_t sourceID) const; bool sinkVisible(const am_sinkID_t sinkID) const; bool isComponentConnected(const am_Gateway_s & gateway) const; @@ -206,6 +250,11 @@ public: am_Error_e enumerateSinks(std::function cb) const; am_Error_e enumerateGateways(std::function cb) const; am_Error_e enumerateConverters(std::function cb) const; + + bool registerObserver(IAmDatabaseObserver * iObserver); + bool unregisterObserver(IAmDatabaseObserver * iObserver); + unsigned countObservers(); + /** * The following structures extend the base structures with the field 'reserved'. */ @@ -276,55 +325,55 @@ public: AM_SUBCLASS_COPY_OP_END()\ AM_SUBCLASS_OP(Subclass, Class)\ - +private: AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Domain_Database_s,am_Domain_s) - AM_SUBCLASS_END(CAmDomain) + AM_SUBCLASS_END(AmDomain) AM_TYPEDEF_SUBCLASS_SOUND_PROPERTIES_BEGIN(am_Sink_Database_s,am_Sink_s) void getSinkType(am_SinkType_s & sinkType) const;\ - AM_SUBCLASS_END(CAmSink) + AM_SUBCLASS_END(AmSink) AM_TYPEDEF_SUBCLASS_SOUND_PROPERTIES_BEGIN(am_Source_Database_s,am_Source_s) void getSourceType(am_SourceType_s & sourceType) const;\ - AM_SUBCLASS_END(CAmSource) + AM_SUBCLASS_END(AmSource) AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Connection_Database_s,am_Connection_s) - AM_SUBCLASS_END(CAmConnection) + AM_SUBCLASS_END(AmConnection) /** * The following structures extend the base structures with print capabilities. */ AM_TYPEDEF_SUBCLASS_BEGIN(am_MainConnection_Database_s, am_MainConnection_s) void getMainConnectionType(am_MainConnectionType_s & connectionType) const;\ - AM_SUBCLASS_END(CAmMainConnection) + AM_SUBCLASS_END(AmMainConnection) AM_TYPEDEF_SUBCLASS_BEGIN(am_SourceClass_Database_s, am_SourceClass_s) - AM_SUBCLASS_END(CAmSourceClass) + AM_SUBCLASS_END(AmSourceClass) AM_TYPEDEF_SUBCLASS_BEGIN(am_SinkClass_Database_s, am_SinkClass_s) - AM_SUBCLASS_END(CAmSinkClass) + AM_SUBCLASS_END(AmSinkClass) AM_TYPEDEF_SUBCLASS_BEGIN(am_Gateway_Database_s, am_Gateway_s) - AM_SUBCLASS_END(CAmGateway) + AM_SUBCLASS_END(AmGateway) AM_TYPEDEF_SUBCLASS_BEGIN(am_Converter_Database_s, am_Converter_s) - AM_SUBCLASS_END(CAmConverter) + AM_SUBCLASS_END(AmConverter) AM_TYPEDEF_SUBCLASS_BEGIN(am_Crossfader_Database_s, am_Crossfader_s) - AM_SUBCLASS_END(CAmCrossfader) - - private: - typedef std::unordered_map CAmMapDomain; - typedef std::unordered_map CAmMapSourceClass; - typedef std::unordered_map CAmMapSinkClass; - typedef std::unordered_map CAmMapSink; - typedef std::unordered_map CAmMapSource; - typedef std::unordered_map CAmMapGateway; - typedef std::unordered_map CAmMapConverter; - typedef std::unordered_map CAmMapCrossfader; - typedef std::unordered_map CAmMapConnection; - typedef std::unordered_map CAmMapMainConnection; - typedef std::vector CAmVectorSystemProperties; + AM_SUBCLASS_END(AmCrossfader) + + + typedef std::unordered_map AmMapDomain; + typedef std::unordered_map AmMapSourceClass; + typedef std::unordered_map AmMapSinkClass; + typedef std::unordered_map AmMapSink; + typedef std::unordered_map AmMapSource; + typedef std::unordered_map AmMapGateway; + typedef std::unordered_map AmMapConverter; + typedef std::unordered_map AmMapCrossfader; + typedef std::unordered_map AmMapConnection; + typedef std::unordered_map AmMapMainConnection; + typedef std::vector AmVectorSystemProperties; /** * The following structure groups the map objects needed for the implementation. * Every map object is coupled with an identifier, which hold the current value. @@ -332,46 +381,46 @@ public: * The IDs can be increased through the method increaseID(...), which follows the AudioManager logic. * For more information about the static and dynamic IDs, please see the documentation. */ - typedef struct CAmMappedData + struct AmMappedData { /** * The structure encapsulates the id boundary and the current id value. * It defines a range within the id can vary. */ - struct am_Identifier_s + struct AmIdentifier { int16_t mMin; //!< min possible value int16_t mMax; //!< max possible value int16_t mCurrentValue; //!< current value - am_Identifier_s():mMin(DYNAMIC_ID_BOUNDARY), mMax(SHRT_MAX), mCurrentValue(mMin){}; - am_Identifier_s(const int16_t & min, const int16_t & max):mMin(min), mMax(max), mCurrentValue(mMin){assert(min::const_iterator iter = t.begin(); for(; iter!=t.end(); iter++) - CAmMappedData::print(iter->second, output); + AmMappedData::print(iter->second, output); } private: - template bool getNextConnectionID(int16_t & resultID, am_Identifier_s & sourceID, + template bool getNextConnectionID(int16_t & resultID, AmIdentifier & sourceID, const std::unordered_map & map); - } CAmMappedData; + }; + /* * Helper methods. */ @@ -469,9 +519,9 @@ public: } ); } - CAmDatabaseObserver *mpDatabaseObserver; //!< pointer to the Observer ListConnectionFormat mListConnectionFormat; //!< list of connection formats - CAmMappedData mMappedData; //!< Internal structure encapsulating all the maps used in this class + AmMappedData mMappedData; //!< Internal structure encapsulating all the maps used in this class + std::vector mDatabaseObservers; #ifdef UNIT_TEST public: diff --git a/AudioManagerCore/include/CAmDatabaseObserver.h b/AudioManagerCore/include/CAmDatabaseObserver.h deleted file mode 100644 index 7d18be4..0000000 --- a/AudioManagerCore/include/CAmDatabaseObserver.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * SPDX license identifier: MPL-2.0 - * - * Copyright (C) 2012, BMW AG - * - * This file is part of GENIVI Project AudioManager. - * - * Contributions are licensed to the GENIVI Alliance under one or more - * Contribution License Agreements. - * - * \copyright - * This Source Code Form is subject to the terms of the - * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with - * this file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * - * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012 - * - * \file CAmDatabaseObserver.h - * For further information see http://www.genivi.org/. - * - */ - -#ifndef DATABASEOBSERVER_H_ -#define DATABASEOBSERVER_H_ - -#include "audiomanagertypes.h" -#include -#include "CAmSerializer.h" - -namespace am -{ - -class CAmTelnetServer; -class CAmCommandSender; -class CAmRoutingSender; -class CAmSocketHandler; - -/** - * This class observes the Database and notifies other classes about important events, mainly the CommandSender. - */ -class CAmDatabaseObserver -{ -public: - CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler); - CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler, CAmTelnetServer *iTelnetServer); - ~CAmDatabaseObserver(); - void numberOfSinkClassesChanged(); - void numberOfSourceClassesChanged(); - void newSink(const am_Sink_s& sink); - void newSource(const am_Source_s& source); - void newDomain(const am_Domain_s& domain); - void newGateway(const am_Gateway_s& gateway); - void newConverter(const am_Converter_s& coverter); - void newCrossfader(const am_Crossfader_s& crossfader); - void newMainConnection(const am_MainConnectionType_s& mainConnection); - void removedMainConnection(const am_mainConnectionID_t mainConnection); - void removedSink(const am_sinkID_t sinkID, const bool visible); - void removedSource(const am_sourceID_t sourceID, const bool visible); - void removeDomain(const am_domainID_t domainID); - void removeGateway(const am_gatewayID_t gatewayID); - void removeConverter(const am_converterID_t converterID); - void removeCrossfader(const am_crossfaderID_t crossfaderID); - void mainConnectionStateChanged(const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState); - void mainSinkSoundPropertyChanged(const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty); - void mainSourceSoundPropertyChanged(const am_sourceID_t sourceID, const am_MainSoundProperty_s& SoundProperty); - void sinkAvailabilityChanged(const am_sinkID_t sinkID, const am_Availability_s& availability); - void sourceAvailabilityChanged(const am_sourceID_t sourceID, const am_Availability_s& availability); - void volumeChanged(const am_sinkID_t sinkID, const am_mainVolume_t volume); - void sinkMuteStateChanged(const am_sinkID_t sinkID, const am_MuteState_e muteState); - void systemPropertyChanged(const am_SystemProperty_s& SystemProperty); - void timingInformationChanged(const am_mainConnectionID_t mainConnection, const am_timeSync_t time); - void sinkUpdated(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible); - void sourceUpdated(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible); - void sinkMainNotificationConfigurationChanged(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); - void sourceMainNotificationConfigurationChanged(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); - -private: - CAmCommandSender *mCommandSender; //!< pointer to the comandSender - CAmRoutingSender* mRoutingSender; //!< pointer to the routingSender - CAmTelnetServer* mTelnetServer; //!< pointer to the telnetserver - CAmSerializer mSerializer; //!< serializer to handle the CommandInterface via the mainloop -}; - -} - -#endif /* DATABASEOBSERVER_H_ */ diff --git a/AudioManagerCore/include/CAmRouter.h b/AudioManagerCore/include/CAmRouter.h index 1242824..7543abc 100644 --- a/AudioManagerCore/include/CAmRouter.h +++ b/AudioManagerCore/include/CAmRouter.h @@ -31,7 +31,7 @@ #include #include "audiomanagertypes.h" #include "CAmGraph.h" -#include "IAmDatabaseHandler.h" +#include "CAmDatabaseHandlerMap.h" namespace am @@ -151,7 +151,7 @@ class CAmControlSender; /** * Implements an autorouting algorithm for connecting sinks and sources via different audio domains. */ -class CAmRouter +class CAmRouter: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { IAmDatabaseHandler* mpDatabaseHandler; //!< pointer to database handler CAmControlSender* mpControlSender; //!< pointer the controlsender - is used to retrieve information for the optimal route @@ -281,7 +281,7 @@ public: /** * Find the shortest path between given source and sink. This method should be called only after 'load' has been called. - * This method do not pay attention on the parameter mMaxAllowedCycles and go through all possible paths. + * This method do not pay attention on the parameter mMaxAllowedCycles and goes through all possible paths. * * @param source start point. * @param sink end point. diff --git a/AudioManagerCore/include/CAmRoutingSender.h b/AudioManagerCore/include/CAmRoutingSender.h index 8804d90..8d8a063 100644 --- a/AudioManagerCore/include/CAmRoutingSender.h +++ b/AudioManagerCore/include/CAmRoutingSender.h @@ -32,16 +32,17 @@ #include "../test/IAmRoutingBackdoor.h" #endif +#include "CAmDatabaseHandlerMap.h" + namespace am { class CAmRoutingReceiver; -class IAmDatabaseHandler; /** * Implements the RoutingSendInterface. Loads all plugins and dispatches calls to the plugins */ -class CAmRoutingSender +class CAmRoutingSender: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks { public: CAmRoutingSender(const std::vector& listOfPluginDirectories, IAmDatabaseHandler* databaseHandler); diff --git a/AudioManagerCore/include/IAmDatabaseHandler.h b/AudioManagerCore/include/IAmDatabaseHandler.h index aa275db..f4fe8a1 100644 --- a/AudioManagerCore/include/IAmDatabaseHandler.h +++ b/AudioManagerCore/include/IAmDatabaseHandler.h @@ -30,18 +30,14 @@ #include #include #include +#include +#include +#include #include "audiomanagerconfig.h" namespace am { -class CAmDatabaseObserver; -class CAmRoutingTree; -class CAmRoutingTreeItem; - - -//enum { DYNAMIC_ID_BOUNDARY = 100 }; //!< the value below is reserved for staticIDs, the value above will be assigned to dynamically registered items - //todo: check the enum values before entering & changing in the database. //todo: change asserts for dynamic boundary checks into failure answers.# //todo: check autoincrement boundary and set to 16bit limits @@ -59,8 +55,12 @@ typedef std::map > ListConnectionFormat; //!< class IAmDatabaseHandler { public: - IAmDatabaseHandler () {}; - virtual ~IAmDatabaseHandler () {}; + IAmDatabaseHandler (){} + virtual ~IAmDatabaseHandler (){} + + /** + * The following interface methods must be implemented by the subclass. + */ virtual am_Error_e enterDomainDB(const am_Domain_s& domainData, am_domainID_t& domainID) = 0; virtual am_Error_e enterMainConnectionDB(const am_MainConnection_s& mainConnectionData, am_mainConnectionID_t& connectionID) = 0; virtual am_Error_e enterSinkDB(const am_Sink_s& sinkData, am_sinkID_t& sinkID) = 0; @@ -117,7 +117,7 @@ public: virtual am_Error_e getSourceVolume(const am_sourceID_t sourceID, am_volume_t& volume) const = 0; virtual am_Error_e getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_CustomSoundPropertyType_t propertyType, int16_t& value) const = 0; virtual am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_CustomSoundPropertyType_t propertyType, int16_t& value) const = 0; - virtual am_Error_e getListSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundproperties) const =0; + virtual am_Error_e getListSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundproperties) const =0; virtual am_Error_e getListSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSoundproperties) const =0; virtual am_Error_e getMainSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_CustomMainSoundPropertyType_t propertyType, int16_t& value) const = 0; virtual am_Error_e getMainSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_CustomMainSoundPropertyType_t propertyType, int16_t& value) const = 0; @@ -166,7 +166,6 @@ public: virtual am_Error_e changeConverterDB(const am_converterID_t converterID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix) = 0; virtual am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration) = 0; virtual am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration) = 0; - virtual bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const = 0; virtual bool existCrossFader(const am_crossfaderID_t crossfaderID) const = 0; virtual bool existConnection(const am_Connection_s & connection) const = 0; @@ -181,7 +180,6 @@ public: virtual bool existGateway(const am_gatewayID_t gatewayID) const = 0; virtual bool existSinkClass(const am_sinkClass_t sinkClassID) const = 0; virtual bool existSourceClass(const am_sourceClass_t sourceClassID) const = 0; - virtual void registerObserver(CAmDatabaseObserver *iObserver) = 0; virtual bool sourceVisible(const am_sourceID_t sourceID) const = 0; virtual bool sinkVisible(const am_sinkID_t sinkID) const = 0; virtual bool isComponentConnected(const am_Gateway_s & gateway) const = 0; @@ -192,7 +190,19 @@ public: virtual am_Error_e enumerateSinks(std::function cb) const = 0 ; virtual am_Error_e enumerateGateways(std::function cb) const = 0 ; virtual am_Error_e enumerateConverters(std::function cb) const = 0 ; + /** + * Database observer protocol + */ + class IAmDatabaseObserver + { + public: + IAmDatabaseObserver() {} + virtual ~IAmDatabaseObserver(){} + }; + virtual bool registerObserver(IAmDatabaseObserver * iObserver) = 0; + virtual bool unregisterObserver(IAmDatabaseObserver * iObserver) = 0; + virtual unsigned countObservers() = 0; }; diff --git a/AudioManagerCore/src/CAmCommandSender.cpp b/AudioManagerCore/src/CAmCommandSender.cpp index 2e60109..ea0d749 100644 --- a/AudioManagerCore/src/CAmCommandSender.cpp +++ b/AudioManagerCore/src/CAmCommandSender.cpp @@ -51,11 +51,13 @@ namespace am (*iter)->__VA_ARGS__; \ } -CAmCommandSender::CAmCommandSender(const std::vector& listOfPluginDirectories) : +CAmCommandSender::CAmCommandSender(const std::vector& listOfPluginDirectories, CAmSocketHandler *iSocketHandler) : + CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks(), mListInterfaces(), // mListLibraryHandles(), // mListLibraryNames(), // - mCommandReceiver() + mCommandReceiver(), + mSerializer(iSocketHandler) { if (listOfPluginDirectories.empty()) { @@ -159,6 +161,93 @@ CAmCommandSender::CAmCommandSender(const std::vector& listOfPluginD mListLibraryHandles.push_back(tempLibHandle); mListLibraryNames.push_back(iter->c_str()); } + + dboNewMainConnection = [&](const am_MainConnectionType_s& mainConnection) { + mSerializer.asyncCall(this, &CAmCommandSender::cbNewMainConnection, mainConnection); + }; + dboRemovedMainConnection = [&](const am_mainConnectionID_t mainConnection) { + mSerializer.asyncCall(this, &CAmCommandSender::cbRemovedMainConnection, mainConnection); + }; + dboNewSink = [&](const am_Sink_s& sink) { + if (sink.visible) + { + am_SinkType_s s; + s.availability = sink.available; + s.muteState = sink.muteState; + s.name = sink.name; + s.sinkClassID = sink.sinkClassID; + s.sinkID = sink.sinkID; + s.volume = sink.mainVolume; + mSerializer.asyncCall(this, &CAmCommandSender::cbNewSink, s); + } + }; + dboNewSource = [&](const am_Source_s& source) { + if (source.visible) + { + am_SourceType_s s; + s.availability = source.available; + s.name = source.name; + s.sourceClassID = source.sourceClassID; + s.sourceID = source.sourceID; + mSerializer.asyncCall(this, &CAmCommandSender::cbNewSource, s); + } + }; + + dboRemovedSink = [&](const am_sinkID_t sinkID, const bool visible) { + if (visible) + mSerializer.asyncCall(this, &CAmCommandSender::cbRemovedSink, sinkID); + }; + dboRemovedSource = [&](const am_sourceID_t sourceID, const bool visible) { + if (visible) + mSerializer.asyncCall(this, &CAmCommandSender::cbRemovedSource, sourceID); + }; + dboNumberOfSinkClassesChanged = [&]() { + mSerializer.asyncCall(this, &CAmCommandSender::cbNumberOfSinkClassesChanged); + }; + dboNumberOfSourceClassesChanged = [&]() { + mSerializer.asyncCall(this, &CAmCommandSender::cbNumberOfSourceClassesChanged); + }; + dboMainConnectionStateChanged = [&](const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState) { + mSerializer.asyncCall(this, &CAmCommandSender::cbMainConnectionStateChanged, connectionID, connectionState); + }; + dboMainSinkSoundPropertyChanged = [&](const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty) { + mSerializer.asyncCall(this, &CAmCommandSender::cbMainSinkSoundPropertyChanged, sinkID, SoundProperty); + }; + dboMainSourceSoundPropertyChanged = [&](const am_sourceID_t sourceID, const am_MainSoundProperty_s& SoundProperty) { + mSerializer.asyncCall(this, &CAmCommandSender::cbMainSourceSoundPropertyChanged, sourceID, SoundProperty); + }; + dboSinkAvailabilityChanged = [&](const am_sinkID_t sinkID, const am_Availability_s & availability) { + mSerializer.asyncCall(this, &CAmCommandSender::cbSinkAvailabilityChanged, sinkID, availability); + }; + dboSourceAvailabilityChanged = [&](const am_sourceID_t sourceID, const am_Availability_s & availability) { + mSerializer.asyncCall(this, &CAmCommandSender::cbSourceAvailabilityChanged, sourceID, availability); + }; + dboVolumeChanged = [&](const am_sinkID_t sinkID, const am_mainVolume_t volume) { + mSerializer.asyncCall(this, &CAmCommandSender::cbVolumeChanged, sinkID, volume); + }; + dboSinkMuteStateChanged = [&](const am_sinkID_t sinkID, const am_MuteState_e muteState) { + mSerializer.asyncCall(this, &CAmCommandSender::cbSinkMuteStateChanged, sinkID, muteState); + }; + dboSystemPropertyChanged = [&](const am_SystemProperty_s& SystemProperty) { + mSerializer.asyncCall(this, &CAmCommandSender::cbSystemPropertyChanged, SystemProperty); + }; + dboTimingInformationChanged = [&](const am_mainConnectionID_t mainConnection, const am_timeSync_t time) { + mSerializer.asyncCall(this, &CAmCommandSender::cbTimingInformationChanged, mainConnection, time); + }; + dboSinkUpdated = [&](const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible) { + if (visible) + mSerializer.asyncCall >(this, &CAmCommandSender::cbSinkUpdated, sinkID, sinkClassID, listMainSoundProperties); + }; + dboSourceUpdated = [&](const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible) { + if (visible) + mSerializer.asyncCall >(this, &CAmCommandSender::cbSinkUpdated, sourceID, sourceClassID, listMainSoundProperties); + }; + dboSinkMainNotificationConfigurationChanged = [&](const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) { + mSerializer.asyncCall (this, &CAmCommandSender::cbSinkMainNotificationConfigurationChanged, sinkID, mainNotificationConfiguration); + }; + dboSourceMainNotificationConfigurationChanged = [&](const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) { + mSerializer.asyncCall(this, &CAmCommandSender::cbSourceMainNotificationConfigurationChanged, sourceID, mainNotificationConfiguration); + }; } CAmCommandSender::~CAmCommandSender() @@ -366,4 +455,5 @@ void CAmCommandSender::unloadLibraries(void) } mListLibraryHandles.clear(); } + } diff --git a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp index fa7f5fc..83419b9 100644 --- a/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp +++ b/AudioManagerCore/src/CAmDatabaseHandlerMap.cpp @@ -30,7 +30,6 @@ #include #include #include "CAmDatabaseHandlerMap.h" -#include "CAmDatabaseObserver.h" #include "CAmRouter.h" #include "CAmDltWrapper.h" @@ -56,6 +55,30 @@ (true) #endif +#define NOTIFY_OBSERVERS(CALL)\ + for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ + if(nextObserver->CALL)\ + nextObserver->CALL(); + +#define NOTIFY_OBSERVERS1(CALL, ARG1)\ + for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ + if(nextObserver->CALL)\ + nextObserver->CALL(ARG1); + +#define NOTIFY_OBSERVERS2(CALL, ARG1, ARG2)\ + for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ + if(nextObserver->CALL)\ + nextObserver->CALL(ARG1, ARG2); + +#define NOTIFY_OBSERVERS3(CALL, ARG1, ARG2, ARG3)\ + for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ + if(nextObserver->CALL)\ + nextObserver->CALL(ARG1, ARG2, ARG3); + +#define NOTIFY_OBSERVERS4(CALL, ARG1, ARG2, ARG3, ARG4)\ + for(AmDatabaseObserverCallbacks * nextObserver: mDatabaseObservers)\ + if(nextObserver->CALL)\ + nextObserver->CALL(ARG1, ARG2, ARG3, ARG4); namespace am { @@ -117,7 +140,7 @@ template const TReturn * objectMatchingPr /* Domain */ -void CAmDatabaseHandlerMap::CAmDomain::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmDomain::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Domain(" << name.c_str() << ") id(" << domainID << ")" << std::endl << @@ -133,7 +156,7 @@ void CAmDatabaseHandlerMap::CAmDomain::getDescription (std::string & outString) /* Source */ -void CAmDatabaseHandlerMap::CAmSource::getSourceType(am_SourceType_s & sourceType) const +void CAmDatabaseHandlerMap::AmSource::getSourceType(am_SourceType_s & sourceType) const { sourceType.name = name; sourceType.sourceClassID = sourceClassID; @@ -141,7 +164,7 @@ void CAmDatabaseHandlerMap::CAmSource::getSourceType(am_SourceType_s & sourceTyp sourceType.sourceID = sourceID; } -void CAmDatabaseHandlerMap::CAmSource::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmSource::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Source(" << name.c_str() << ") id(" << sourceID << ")" << std::endl << @@ -179,7 +202,7 @@ void CAmDatabaseHandlerMap::CAmSource::getDescription (std::string & outString) /* Sink */ -void CAmDatabaseHandlerMap::CAmSink::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmSink::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Sink(" << name.c_str() << ") id(" << sinkID << ")" << std::endl << @@ -215,7 +238,7 @@ void CAmDatabaseHandlerMap::CAmSink::getDescription (std::string & outString) co outString = fmt.str(); } -void CAmDatabaseHandlerMap::CAmSink::getSinkType(am_SinkType_s & sinkType) const +void CAmDatabaseHandlerMap::AmSink::getSinkType(am_SinkType_s & sinkType) const { sinkType.name = name; sinkType.sinkID = sinkID; @@ -227,7 +250,7 @@ void CAmDatabaseHandlerMap::CAmSink::getSinkType(am_SinkType_s & sinkType) const /* Connection */ -void CAmDatabaseHandlerMap::CAmConnection::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmConnection::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Connection id(" << connectionID << ") " << std::endl << @@ -241,7 +264,7 @@ void CAmDatabaseHandlerMap::CAmConnection::getDescription (std::string & outStri /* Main Connection */ -void CAmDatabaseHandlerMap::CAmMainConnection::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmMainConnection::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "MainConnection id(" << mainConnectionID << ") " << std::endl << @@ -268,7 +291,7 @@ void CAmDatabaseHandlerMap::am_MainConnection_Database_s::getMainConnectionType( /* Source Class */ -void CAmDatabaseHandlerMap::CAmSourceClass::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmSourceClass::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Source class(" << name.c_str() << ") id(" << sourceClassID << ")\n" << @@ -282,7 +305,7 @@ void CAmDatabaseHandlerMap::CAmSourceClass::getDescription (std::string & outStr /* Sink Class */ -void CAmDatabaseHandlerMap::CAmSinkClass::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmSinkClass::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Sink class(" << name.c_str() << ") id(" << sinkClassID << ")\n" << @@ -297,7 +320,7 @@ void CAmDatabaseHandlerMap::CAmSinkClass::getDescription (std::string & outStrin /* Gateway */ -void CAmDatabaseHandlerMap::CAmGateway::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmGateway::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Gateway(" << name.c_str() << ") id(" << gatewayID << ")\n" << @@ -322,9 +345,34 @@ void CAmDatabaseHandlerMap::CAmGateway::getDescription (std::string & outString) outString = fmt.str(); } +/* Converter */ + +void CAmDatabaseHandlerMap::AmConverter::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Converter(" << name.c_str() << ") id(" << converterID << ")\n" << + "sinkID(" << sinkID << + ") sourceID(" << sourceID << + ") domainSinkID(" << domainID << + ") listSourceFormats ("; + std::for_each(listSourceFormats.begin(), listSourceFormats.end(), [&](const am_CustomConnectionFormat_t & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ") listSinkFormats ("; + std::for_each(listSinkFormats.begin(), listSinkFormats.end(), [&](const am_CustomConnectionFormat_t & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ") convertionMatrix ("; + std::for_each(convertionMatrix.begin(), convertionMatrix.end(), [&](const bool & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + /* Crossfader */ -void CAmDatabaseHandlerMap::CAmCrossfader::getDescription (std::string & outString) const +void CAmDatabaseHandlerMap::AmCrossfader::getDescription (std::string & outString) const { std::ostringstream fmt; fmt << "Crossfader(" << name.c_str() << ") id(" << crossfaderID << ")\n" << @@ -336,7 +384,7 @@ void CAmDatabaseHandlerMap::CAmCrossfader::getDescription (std::string & outStri outString = fmt.str(); } -bool CAmDatabaseHandlerMap::CAmMappedData::increaseID(int16_t & resultID, am_Identifier_s & sourceID, +bool CAmDatabaseHandlerMap::AmMappedData::increaseID(int16_t & resultID, AmIdentifier & sourceID, int16_t const desiredStaticID = 0) { if( desiredStaticID > 0 && desiredStaticID < sourceID.mMin ) @@ -356,7 +404,7 @@ bool CAmDatabaseHandlerMap::CAmMappedData::increaseID(int16_t & resultID, am_Ide } } -template bool CAmDatabaseHandlerMap::CAmMappedData::getNextConnectionID(int16_t & resultID, am_Identifier_s & sourceID, +template bool CAmDatabaseHandlerMap::AmMappedData::getNextConnectionID(int16_t & resultID, AmIdentifier & sourceID, const std::unordered_map & map) { TMapKey nextID; @@ -393,27 +441,28 @@ template bool CAmDatabaseHandlerMap::CAmMapp return true; } -bool CAmDatabaseHandlerMap::CAmMappedData::increaseMainConnectionID(int16_t & resultID) +bool CAmDatabaseHandlerMap::AmMappedData::increaseMainConnectionID(int16_t & resultID) { return getNextConnectionID(resultID, mCurrentMainConnectionID, mMainConnectionMap); } -bool CAmDatabaseHandlerMap::CAmMappedData::increaseConnectionID(int16_t & resultID) +bool CAmDatabaseHandlerMap::AmMappedData::increaseConnectionID(int16_t & resultID) { return getNextConnectionID(resultID, mCurrentConnectionID, mConnectionMap); } -CAmDatabaseHandlerMap::CAmDatabaseHandlerMap(): mFirstStaticSink(true), // - mFirstStaticSource(true), // - mFirstStaticGateway(true), // - mFirstStaticConverter(true), // - mFirstStaticSinkClass(true), // - mFirstStaticSourceClass(true), // - mFirstStaticCrossfader(true), // - mpDatabaseObserver(NULL), // - mListConnectionFormat(), // - mMappedData() +CAmDatabaseHandlerMap::CAmDatabaseHandlerMap(): IAmDatabaseHandler(), + mFirstStaticSink(true), // + mFirstStaticSource(true), // + mFirstStaticGateway(true), // + mFirstStaticConverter(true), // + mFirstStaticSinkClass(true), // + mFirstStaticSourceClass(true), // + mFirstStaticCrossfader(true), // + mListConnectionFormat(), // + mMappedData(), + mDatabaseObservers() { logVerbose(__METHOD_NAME__,"Init "); } @@ -421,7 +470,8 @@ CAmDatabaseHandlerMap::CAmDatabaseHandlerMap(): mFirstStaticSink(true), // CAmDatabaseHandlerMap::~CAmDatabaseHandlerMap() { logVerbose(__METHOD_NAME__,"Destroy"); - mpDatabaseObserver = NULL; + for(AmDatabaseObserverCallbacks * ptr: mDatabaseObservers) + ptr->mpDatabaseHandler=nullptr; } am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID) @@ -442,7 +492,7 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, return (E_NOT_POSSIBLE); } //first check for a reserved domain - am_Domain_s const *reservedDomain = objectMatchingPredicate(mMappedData.mDomainMap, [&](const CAmDomain & obj){ + am_Domain_s const *reservedDomain = objectMatchingPredicate(mMappedData.mDomainMap, [&](const AmDomain & obj){ return domainData.name.compare(obj.name)==0; }); @@ -456,8 +506,9 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, mMappedData.mDomainMap[nextID].domainID = nextID; mMappedData.mDomainMap[nextID].reserved = 0; logVerbose("DatabaseHandler::enterDomainDB entered reserved domain with name=", domainData.name, "busname=", domainData.busname, "nodename=", domainData.nodename, "reserved ID:", domainID); - if (mpDatabaseObserver) - mpDatabaseObserver->newDomain(mMappedData.mDomainMap[nextID]); + + NOTIFY_OBSERVERS1(dboNewDomain, mMappedData.mDomainMap[nextID]) + return (E_OK); } else @@ -468,8 +519,9 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, mMappedData.mDomainMap[nextID] = domainData; mMappedData.mDomainMap[nextID].domainID = nextID; logVerbose("DatabaseHandler::enterDomainDB entered new domain with name=", domainData.name, "busname=", domainData.busname, "nodename=", domainData.nodename, "assigned ID:", domainID); - if (mpDatabaseObserver) - mpDatabaseObserver->newDomain(mMappedData.mDomainMap[nextID]); + + NOTIFY_OBSERVERS1(dboNewDomain, mMappedData.mDomainMap[nextID]) + return (E_OK); } else @@ -543,12 +595,14 @@ am_Error_e CAmDatabaseHandlerMap::enterMainConnectionDB(const am_MainConnection_ delay = calculateDelayForRoute(mainConnectionData.listConnectionID); logVerbose("DatabaseHandler::enterMainConnectionDB entered new mainConnection with sourceID", mainConnectionData.sourceID, "sinkID:", mainConnectionData.sinkID, "delay:", delay, "assigned ID:", connectionID); - if (mpDatabaseObserver) + + if (mDatabaseObservers.size()) { - am_MainConnectionType_s mainConnection; - mMappedData.mMainConnectionMap[nextID].getMainConnectionType(mainConnection); - mpDatabaseObserver->newMainConnection(mainConnection); - mpDatabaseObserver->mainConnectionStateChanged(connectionID, mMappedData.mMainConnectionMap[nextID].connectionState); + am_MainConnectionType_s mainConnection; + mMappedData.mMainConnectionMap[nextID].getMainConnectionType(mainConnection); + + NOTIFY_OBSERVERS1(dboNewMainConnection, mainConnection) + NOTIFY_OBSERVERS2(dboMainConnectionStateChanged, connectionID, mMappedData.mMainConnectionMap[nextID].connectionState) } //finally, we update the delay value for the maintable @@ -615,7 +669,7 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkDB(const am_Sink_s & sinkData, am_sin am_sinkID_t temp_SinkID = 0; am_sinkID_t temp_SinkIndex = 0; //if sinkID is zero and the first Static Sink was already entered, the ID is created - am_Sink_s const *reservedDomain = objectMatchingPredicate(mMappedData.mSinkMap, [&](const CAmSink & obj){ + am_Sink_s const *reservedDomain = objectMatchingPredicate(mMappedData.mSinkMap, [&](const AmSink & obj){ return true==obj.reserved && obj.name.compare(sinkData.name)==0; }); if( NULL!=reservedDomain ) @@ -654,11 +708,9 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkDB(const am_Sink_s & sinkData, am_sin am_Sink_s & sink = mMappedData.mSinkMap[temp_SinkID]; logVerbose("DatabaseHandler::enterSinkDB entered new sink with name", sink.name, "domainID:", sink.domainID, "classID:", sink.sinkClassID, "volume:", sink.volume, "assigned ID:", sink.sinkID); - if (mpDatabaseObserver != NULL) - { - sink.sinkID=sinkID; - mpDatabaseObserver->newSink(sink); - } + sink.sinkID=sinkID; + NOTIFY_OBSERVERS1(dboNewSink, sink) + return (E_OK); } @@ -744,8 +796,8 @@ am_Error_e CAmDatabaseHandlerMap::enterCrossfaderDB(const am_Crossfader_s & cros crossfaderID = temp_CrossfaderID; logVerbose("DatabaseHandler::enterCrossfaderDB entered new crossfader with name=", crossfaderData.name, "sinkA= ", crossfaderData.sinkID_A, "sinkB=", crossfaderData.sinkID_B, "source=", crossfaderData.sourceID, "assigned ID:", crossfaderID); - if (mpDatabaseObserver) - mpDatabaseObserver->newCrossfader(mMappedData.mCrossfaderMap[temp_CrossfaderIndex]); + NOTIFY_OBSERVERS1(dboNewCrossfader, mMappedData.mCrossfaderMap[temp_CrossfaderIndex]) + return (E_OK); } @@ -819,8 +871,8 @@ am_Error_e CAmDatabaseHandlerMap::enterGatewayDB(const am_Gateway_s & gatewayDat gatewayID = temp_GatewayID; logVerbose("DatabaseHandler::enterGatewayDB entered new gateway with name", gatewayData.name, "sourceID:", gatewayData.sourceID, "sinkID:", gatewayData.sinkID, "assigned ID:", gatewayID); - if (mpDatabaseObserver) - mpDatabaseObserver->newGateway(mMappedData.mGatewayMap[temp_GatewayIndex]); + + NOTIFY_OBSERVERS1(dboNewGateway, mMappedData.mGatewayMap[temp_GatewayIndex]) return (E_OK); } @@ -905,24 +957,24 @@ am_Error_e CAmDatabaseHandlerMap::enterConverterDB(const am_Converter_s & conver converterID = tempID; logVerbose("DatabaseHandler::enterConverterDB entered new converter with name", converterData.name, "sourceID:", converterData.sourceID, "sinkID:", converterData.sinkID, "assigned ID:", converterID); - if (mpDatabaseObserver) - mpDatabaseObserver->newConverter(mMappedData.mConverterMap[tempIndex]); + NOTIFY_OBSERVERS1(dboNewConverter, mMappedData.mConverterMap[tempIndex]) + return (E_OK); } void CAmDatabaseHandlerMap::dump( std::ostream & output ) const { output << std::endl << "****************** DUMP START ******************" << std::endl; - CAmMappedData::printMap(mMappedData.mDomainMap, output); - CAmMappedData::printMap(mMappedData.mSourceMap, output); - CAmMappedData::printMap(mMappedData.mSinkMap, output); - CAmMappedData::printMap(mMappedData.mSourceClassesMap, output); - CAmMappedData::printMap(mMappedData.mSinkClassesMap, output); - CAmMappedData::printMap(mMappedData.mConnectionMap, output); - CAmMappedData::printMap(mMappedData.mMainConnectionMap, output); - CAmMappedData::printMap(mMappedData.mCrossfaderMap, output); - CAmMappedData::printMap(mMappedData.mGatewayMap, output); - CAmVectorSystemProperties::const_iterator iter = mMappedData.mSystemProperties.begin(); + AmMappedData::printMap(mMappedData.mDomainMap, output); + AmMappedData::printMap(mMappedData.mSourceMap, output); + AmMappedData::printMap(mMappedData.mSinkMap, output); + AmMappedData::printMap(mMappedData.mSourceClassesMap, output); + AmMappedData::printMap(mMappedData.mSinkClassesMap, output); + AmMappedData::printMap(mMappedData.mConnectionMap, output); + AmMappedData::printMap(mMappedData.mMainConnectionMap, output); + AmMappedData::printMap(mMappedData.mCrossfaderMap, output); + AmMappedData::printMap(mMappedData.mGatewayMap, output); + AmVectorSystemProperties::const_iterator iter = mMappedData.mSystemProperties.begin(); output << "System properties" << "\n"; for(; iter!=mMappedData.mSystemProperties.end(); iter++) output << "[type:" << iter->type << " value:" << iter->value << "]"; @@ -981,7 +1033,7 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s & sourceData, bool isFirstStatic = sourceData.sourceID == 0 && mFirstStaticSource; am_sourceID_t temp_SourceID = 0; am_sourceID_t temp_SourceIndex = 0; - CAmSource const *reservedSource = objectMatchingPredicate(mMappedData.mSourceMap, [&](const CAmSource & obj){ + AmSource const *reservedSource = objectMatchingPredicate(mMappedData.mSourceMap, [&](const AmSource & obj){ return true==obj.reserved && obj.name.compare(sourceData.name)==0; }); if( NULL != reservedSource ) @@ -1020,8 +1072,8 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s & sourceData, logVerbose("DatabaseHandler::enterSourceDB entered new source with name", sourceData.name, "domainID:", sourceData.domainID, "classID:", sourceData.sourceClassID, "visible:", sourceData.visible, "assigned ID:", sourceID); - if (mpDatabaseObserver) - mpDatabaseObserver->newSource(mMappedData.mSourceMap[temp_SourceIndex]); + NOTIFY_OBSERVERS1(dboNewSource, mMappedData.mSourceMap[temp_SourceIndex]) + return (E_OK); } @@ -1124,8 +1176,7 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkClassDB(const am_SinkClass_s & sinkCl //todo:change last_insert implementations for multithreaded usage... logVerbose("DatabaseHandler::enterSinkClassDB entered new sinkClass"); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSinkClassesChanged(); + NOTIFY_OBSERVERS(dboNumberOfSinkClassesChanged) return (E_OK); } @@ -1192,8 +1243,8 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceClassDB(am_sourceClass_t & sourceCl logVerbose("DatabaseHandler::enterSourceClassDB entered new sourceClass"); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSourceClassesChanged(); + NOTIFY_OBSERVERS(dboNumberOfSourceClassesChanged) + return (E_OK); } @@ -1260,8 +1311,7 @@ am_Error_e CAmDatabaseHandlerMap::changeMainConnectionStateDB(const am_mainConne DB_COND_UPDATE_RIE(mMappedData.mMainConnectionMap[mainconnectionID].connectionState, connectionState); logVerbose("DatabaseHandler::changeMainConnectionStateDB changed mainConnectionState of MainConnection:", mainconnectionID, "to:", connectionState); - if (mpDatabaseObserver) - mpDatabaseObserver->mainConnectionStateChanged(mainconnectionID, connectionState); + NOTIFY_OBSERVERS2(dboMainConnectionStateChanged, mainconnectionID, connectionState) return (E_OK); } @@ -1277,8 +1327,7 @@ am_Error_e CAmDatabaseHandlerMap::changeSinkMainVolumeDB(const am_mainVolume_t m logVerbose("DatabaseHandler::changeSinkMainVolumeDB changed mainVolume of sink:", sinkID, "to:", mainVolume); - if (mpDatabaseObserver) - mpDatabaseObserver->volumeChanged(sinkID, mainVolume); + NOTIFY_OBSERVERS2(dboVolumeChanged, sinkID, mainVolume) return (E_OK); } @@ -1301,8 +1350,10 @@ am_Error_e CAmDatabaseHandlerMap::changeSinkAvailabilityDB(const am_Availability logVerbose("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); - if (mpDatabaseObserver && sinkVisible(sinkID)) - mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); + if (sinkVisible(sinkID)) + { + NOTIFY_OBSERVERS2(dboSinkAvailabilityChanged,sinkID, availability) + } return (E_OK); } @@ -1346,8 +1397,7 @@ am_Error_e CAmDatabaseHandlerMap::changeSinkMuteStateDB(const am_MuteState_e mut logVerbose("DatabaseHandler::changeSinkMuteStateDB changed sinkMuteState of sink:", sinkID, "to:", muteState); - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMuteStateChanged(sinkID, muteState); + NOTIFY_OBSERVERS2(dboSinkMuteStateChanged, sinkID, muteState) return (E_OK); } @@ -1374,8 +1424,7 @@ am_Error_e CAmDatabaseHandlerMap::changeMainSinkSoundPropertyDB(const am_MainSou } logVerbose("DatabaseHandler::changeMainSinkSoundPropertyDB changed MainSinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); - if (mpDatabaseObserver) - mpDatabaseObserver->mainSinkSoundPropertyChanged(sinkID, soundProperty); + NOTIFY_OBSERVERS2(dboMainSinkSoundPropertyChanged, sinkID, soundProperty) return (E_OK); } @@ -1402,8 +1451,7 @@ am_Error_e CAmDatabaseHandlerMap::changeMainSourceSoundPropertyDB(const am_MainS logVerbose("DatabaseHandler::changeMainSourceSoundPropertyDB changed MainSinkSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); - if (mpDatabaseObserver) - mpDatabaseObserver->mainSourceSoundPropertyChanged(sourceID, soundProperty); + NOTIFY_OBSERVERS2(dboMainSourceSoundPropertyChanged, sourceID, soundProperty) return (E_OK); } @@ -1425,8 +1473,10 @@ am_Error_e CAmDatabaseHandlerMap::changeSourceAvailabilityDB(const am_Availabili logVerbose("DatabaseHandler::changeSourceAvailabilityDB changed changeSourceAvailabilityDB of source:", sourceID, "to:", availability.availability, "Reason:", availability.availabilityReason); - if (mpDatabaseObserver && sourceVisible(sourceID)) - mpDatabaseObserver->sourceAvailabilityChanged(sourceID, availability); + if (sourceVisible(sourceID)) + { + NOTIFY_OBSERVERS2(dboSourceAvailabilityChanged, sourceID, availability) + } return (E_OK); } @@ -1441,8 +1491,7 @@ am_Error_e CAmDatabaseHandlerMap::changeSystemPropertyDB(const am_SystemProperty logVerbose("DatabaseHandler::changeSystemPropertyDB changed system property"); - if (mpDatabaseObserver) - mpDatabaseObserver->systemPropertyChanged(property); + NOTIFY_OBSERVERS1(dboSystemPropertyChanged, property) return (E_OK); } @@ -1459,11 +1508,10 @@ am_Error_e CAmDatabaseHandlerMap::removeMainConnectionDB(const am_mainConnection mMappedData.mMainConnectionMap.erase(mainConnectionID); logVerbose("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); - if (mpDatabaseObserver) - { - mpDatabaseObserver->mainConnectionStateChanged(mainConnectionID, CS_DISCONNECTED); - mpDatabaseObserver->removedMainConnection(mainConnectionID); - } + + NOTIFY_OBSERVERS2(dboMainConnectionStateChanged, mainConnectionID, CS_DISCONNECTED) + NOTIFY_OBSERVERS1(dboRemovedMainConnection, mainConnectionID) + return (E_OK); } @@ -1483,8 +1531,7 @@ am_Error_e CAmDatabaseHandlerMap::removeSinkDB(const am_sinkID_t sinkID) //if visible is true then delete SinkMainSoundProperty and SinkMainNotificationConfiguration ???? logVerbose("DatabaseHandler::removeSinkDB removed:", sinkID); - if (mpDatabaseObserver != NULL) - mpDatabaseObserver->removedSink(sinkID, visible); + NOTIFY_OBSERVERS2(dboRemovedSink, sinkID, visible) return (E_OK); } @@ -1506,8 +1553,7 @@ am_Error_e CAmDatabaseHandlerMap::removeSourceDB(const am_sourceID_t sourceID) //if visible is true then delete SourceMainSoundProperty and SourceMainNotificationConfiguration ???? logVerbose("DatabaseHandler::removeSourceDB removed:", sourceID); - if (mpDatabaseObserver) - mpDatabaseObserver->removedSource(sourceID, visible); + NOTIFY_OBSERVERS2(dboRemovedSource, sourceID, visible) return (E_OK); } @@ -1523,8 +1569,7 @@ am_Error_e CAmDatabaseHandlerMap::removeGatewayDB(const am_gatewayID_t gatewayID mMappedData.mGatewayMap.erase(gatewayID); logVerbose("DatabaseHandler::removeGatewayDB removed:", gatewayID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeGateway(gatewayID); + NOTIFY_OBSERVERS1(dboRemoveGateway, gatewayID) return (E_OK); } @@ -1540,8 +1585,7 @@ am_Error_e CAmDatabaseHandlerMap::removeConverterDB(const am_converterID_t conve mMappedData.mConverterMap.erase(converterID); logVerbose("DatabaseHandler::removeConverterDB removed:", converterID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeConverter(converterID); + NOTIFY_OBSERVERS1(dboRemoveConverter, converterID) return (E_OK); } @@ -1556,8 +1600,8 @@ am_Error_e CAmDatabaseHandlerMap::removeCrossfaderDB(const am_crossfaderID_t cro mMappedData.mCrossfaderMap.erase(crossfaderID); logVerbose("DatabaseHandler::removeCrossfaderDB removed:", crossfaderID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeCrossfader(crossfaderID); + NOTIFY_OBSERVERS1(dboRemoveCrossfader, crossfaderID) + return (E_OK); } @@ -1572,8 +1616,8 @@ am_Error_e CAmDatabaseHandlerMap::removeDomainDB(const am_domainID_t domainID) mMappedData.mDomainMap.erase(domainID); logVerbose("DatabaseHandler::removeDomainDB removed:", domainID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeDomain(domainID); + NOTIFY_OBSERVERS1(dboRemoveDomain, domainID) + return (E_OK); } @@ -1589,9 +1633,7 @@ am_Error_e CAmDatabaseHandlerMap::removeSinkClassDB(const am_sinkClass_t sinkCla mMappedData.mSinkClassesMap.erase(sinkClassID); logVerbose("DatabaseHandler::removeSinkClassDB removed:", sinkClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSinkClassesChanged(); - + NOTIFY_OBSERVERS(dboNumberOfSinkClassesChanged) return (E_OK); } @@ -1606,8 +1648,7 @@ am_Error_e CAmDatabaseHandlerMap::removeSourceClassDB(const am_sourceClass_t sou mMappedData.mSourceClassesMap.erase(sourceClassID); logVerbose("DatabaseHandler::removeSourceClassDB removed:", sourceClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSourceClassesChanged(); + NOTIFY_OBSERVERS(dboNumberOfSourceClassesChanged) return (E_OK); } @@ -1825,7 +1866,7 @@ am_Error_e CAmDatabaseHandlerMap::getListSourcesOfDomain(const am_domainID_t dom logWarning(__METHOD_NAME__,"domainID must exist"); return (E_NON_EXISTENT); } - CAmMapSource::const_iterator elementIterator = mMappedData.mSourceMap.begin(); + AmMapSource::const_iterator elementIterator = mMappedData.mSourceMap.begin(); for (;elementIterator != mMappedData.mSourceMap.end(); ++elementIterator) { if (0==elementIterator->second.reserved && domainID==elementIterator->second.domainID) @@ -1844,12 +1885,12 @@ am_Error_e CAmDatabaseHandlerMap::getListCrossfadersOfDomain(const am_domainID_t return (E_NON_EXISTENT); } - CAmMapSource::const_iterator sourceIterator = mMappedData.mSourceMap.begin(); + AmMapSource::const_iterator sourceIterator = mMappedData.mSourceMap.begin(); for (;sourceIterator != mMappedData.mSourceMap.end(); ++sourceIterator) { if (domainID==sourceIterator->second.domainID) { - CAmMapCrossfader::const_iterator elementIterator = mMappedData.mCrossfaderMap.begin(); + AmMapCrossfader::const_iterator elementIterator = mMappedData.mCrossfaderMap.begin(); for (;elementIterator != mMappedData.mCrossfaderMap.end(); ++elementIterator) { if ( sourceIterator->second.sourceID==elementIterator->second.sourceID ) @@ -1871,7 +1912,7 @@ am_Error_e CAmDatabaseHandlerMap::getListGatewaysOfDomain(const am_domainID_t do return (E_NON_EXISTENT); } - CAmMapGateway::const_iterator elementIterator = mMappedData.mGatewayMap.begin(); + AmMapGateway::const_iterator elementIterator = mMappedData.mGatewayMap.begin(); for (;elementIterator != mMappedData.mGatewayMap.end(); ++elementIterator) { if (domainID==elementIterator->second.controlDomainID) @@ -1889,7 +1930,7 @@ am_Error_e CAmDatabaseHandlerMap::getListConvertersOfDomain(const am_domainID_t return (E_NON_EXISTENT); } - CAmMapConverter::const_iterator elementIterator = mMappedData.mConverterMap.begin(); + AmMapConverter::const_iterator elementIterator = mMappedData.mConverterMap.begin(); for (;elementIterator != mMappedData.mConverterMap.end(); ++elementIterator) { if (domainID==elementIterator->second.domainID) @@ -1902,7 +1943,7 @@ am_Error_e CAmDatabaseHandlerMap::getListMainConnections(std::vectorsecond); @@ -1915,7 +1956,7 @@ am_Error_e CAmDatabaseHandlerMap::getListDomains(std::vector & list { listDomains.clear(); - CAmMapDomain::const_iterator elementIterator = mMappedData.mDomainMap.begin(); + AmMapDomain::const_iterator elementIterator = mMappedData.mDomainMap.begin(); for (;elementIterator != mMappedData.mDomainMap.end(); ++elementIterator) { if( 0==elementIterator->second.reserved ) @@ -1929,7 +1970,7 @@ am_Error_e CAmDatabaseHandlerMap::getListConnections(std::vectorsecond.reserved ) @@ -1943,7 +1984,7 @@ am_Error_e CAmDatabaseHandlerMap::getListConnectionsReserved(std::vectorsecond.reserved ) @@ -2205,8 +2246,7 @@ am_Error_e CAmDatabaseHandlerMap::changeDelayMainConnection(const am_timeSync_t return E_NON_EXISTENT; } DB_COND_UPDATE_RIE(mMappedData.mMainConnectionMap[connectionID].delay, delay); - if (mpDatabaseObserver) - mpDatabaseObserver->timingInformationChanged(connectionID, delay); + NOTIFY_OBSERVERS2(dboTimingInformationChanged, connectionID, delay) return (E_OK); } @@ -2263,7 +2303,7 @@ bool CAmDatabaseHandlerMap::existSourceName(const std::string & name) const bool CAmDatabaseHandlerMap::existSink(const am_sinkID_t sinkID) const { bool returnVal = false; - CAmMapSink::const_iterator elementIterator = mMappedData.mSinkMap.begin(); + AmMapSink::const_iterator elementIterator = mMappedData.mSinkMap.begin(); for (;elementIterator != mMappedData.mSinkMap.end(); ++elementIterator) { if( 0==elementIterator->second.reserved && @@ -2429,7 +2469,7 @@ am_Error_e CAmDatabaseHandlerMap::changeConnectionTimingInformation(const am_con //first get all route tables for all mainconnections am_Error_e error = E_OK; - CAmMapMainConnection::const_iterator iter = mMappedData.mMainConnectionMap.begin(); + AmMapMainConnection::const_iterator iter = mMappedData.mMainConnectionMap.begin(); for(; iter != mMappedData.mMainConnectionMap.end(); ++iter) { const am_MainConnection_s & mainConnection = iter->second; @@ -2477,11 +2517,6 @@ am_timeSync_t CAmDatabaseHandlerMap::calculateMainConnectionDelay(const am_mainC * registers the Observer at the Database * @param iObserver pointer to the observer */ -void CAmDatabaseHandlerMap::registerObserver(CAmDatabaseObserver *iObserver) -{ - assert(iObserver!=NULL); - mpDatabaseObserver = iObserver; -} /** * gives information about the visibility of a source @@ -3038,10 +3073,8 @@ am_Error_e CAmDatabaseHandlerMap::changeSourceDB(const am_sourceID_t sourceID, c { logVerbose("DatabaseHandler::changeSource changed changeSource of source:", sourceID); - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sourceUpdated(sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)); - } + NOTIFY_OBSERVERS4(dboSourceUpdated, sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)) + } return (E_OK); @@ -3109,10 +3142,7 @@ am_Error_e CAmDatabaseHandlerMap::changeSinkDB(const am_sinkID_t sinkID, const a { logVerbose("DatabaseHandler::changeSink changed changeSink of sink:", sinkID); - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sinkUpdated(sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)); - } + NOTIFY_OBSERVERS4(dboSinkUpdated, sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)) } return (E_OK); @@ -3179,8 +3209,8 @@ am_Error_e CAmDatabaseHandlerMap::changeMainSinkNotificationConfigurationDB(cons logVerbose("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMainNotificationConfigurationChanged(sinkID, mainNotificationConfiguration); + NOTIFY_OBSERVERS2(dboSinkMainNotificationConfigurationChanged, sinkID, mainNotificationConfiguration) + return (E_OK); } @@ -3198,8 +3228,8 @@ am_Error_e CAmDatabaseHandlerMap::changeMainSourceNotificationConfigurationDB(co logVerbose("DatabaseHandler::changeMainSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - if (mpDatabaseObserver) - mpDatabaseObserver->sourceMainNotificationConfigurationChanged(sourceID, mainNotificationConfiguration); + NOTIFY_OBSERVERS2(dboSourceMainNotificationConfigurationChanged, sourceID, mainNotificationConfiguration) + return (E_OK); } @@ -3358,4 +3388,31 @@ am_Error_e CAmDatabaseHandlerMap::enumerateConverters(std::function(iObserver)), dynamic_cast(iObserver)->mpDatabaseHandler = + nullptr; + return true; + } + return false; +} +bool CAmDatabaseHandlerMap::unregisterObserver(IAmDatabaseObserver * iObserver) { + assert(iObserver!=NULL); + auto it = std::find(mDatabaseObservers.begin(), mDatabaseObservers.end(), + iObserver); + if (it != mDatabaseObservers.end()) { + mDatabaseObservers.erase(it), dynamic_cast(iObserver)->mpDatabaseHandler = + nullptr; + return true; + } + return false; +} + +unsigned CAmDatabaseHandlerMap::countObservers() { + return mDatabaseObservers.size(); +} + } diff --git a/AudioManagerCore/src/CAmDatabaseObserver.cpp b/AudioManagerCore/src/CAmDatabaseObserver.cpp deleted file mode 100644 index d9ced92..0000000 --- a/AudioManagerCore/src/CAmDatabaseObserver.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/** - * SPDX license identifier: MPL-2.0 - * - * Copyright (C) 2012, BMW AG - * - * This file is part of GENIVI Project AudioManager. - * - * Contributions are licensed to the GENIVI Alliance under one or more - * Contribution License Agreements. - * - * \copyright - * This Source Code Form is subject to the terms of the - * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with - * this file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * - * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012 - * - * \file CAmDatabaseObserver.cpp - * For further information see http://www.genivi.org/. - * - */ - -#include "CAmDatabaseObserver.h" -#include -#include -#include -#include -#include -#include "CAmCommandSender.h" -#include "CAmRoutingSender.h" -#include "CAmDltWrapper.h" -#include "CAmSerializer.h" - -namespace am { - -CAmDatabaseObserver::CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler) : - mCommandSender(iCommandSender), // - mRoutingSender(iRoutingSender), // - mTelnetServer(NULL), // - mSerializer(iSocketHandler) // -{ - assert(mCommandSender!=0); - assert(mRoutingSender!=0); - assert(iSocketHandler!=0); -} - -CAmDatabaseObserver::CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler, CAmTelnetServer *iTelnetServer) : - mCommandSender(iCommandSender), // - mRoutingSender(iRoutingSender), // - mTelnetServer(iTelnetServer), // - mSerializer(iSocketHandler) // -{ - assert(mTelnetServer!=0); - assert(mCommandSender!=0); - assert(mRoutingSender!=0); - assert(iSocketHandler!=0); -} - -CAmDatabaseObserver::~CAmDatabaseObserver() -{ -} - -void CAmDatabaseObserver::newMainConnection(const am_MainConnectionType_s& mainConnection) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbNewMainConnection, mainConnection); -} - -void CAmDatabaseObserver::removedMainConnection(const am_mainConnectionID_t mainConnection) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbRemovedMainConnection, mainConnection); -} - -void CAmDatabaseObserver::newSink(const am_Sink_s& sink) -{ - mRoutingSender->addSinkLookup(sink); - if (sink.visible) - { - am_SinkType_s s; - s.availability = sink.available; - s.muteState = sink.muteState; - s.name = sink.name; - s.sinkClassID = sink.sinkClassID; - s.sinkID = sink.sinkID; - s.volume = sink.mainVolume; - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbNewSink, s); - } -} - -void CAmDatabaseObserver::newSource(const am_Source_s& source) -{ - mRoutingSender->addSourceLookup(source); - if (source.visible) - { - am_SourceType_s s; - s.availability = source.available; - s.name = source.name; - s.sourceClassID = source.sourceClassID; - s.sourceID = source.sourceID; - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbNewSource, s); - } -} - -void CAmDatabaseObserver::newDomain(const am_Domain_s& domain) -{ - mRoutingSender->addDomainLookup(domain); -} - -void CAmDatabaseObserver::newGateway(const am_Gateway_s& gateway) -{ - (void) gateway; - //todo: implement something -} - -void CAmDatabaseObserver::newConverter(const am_Converter_s& coverter) -{ - (void) coverter; - //todo: implement something -} - -void CAmDatabaseObserver::newCrossfader(const am_Crossfader_s& crossfader) -{ - mRoutingSender->addCrossfaderLookup(crossfader); -} - -void CAmDatabaseObserver::removedSink(const am_sinkID_t sinkID, const bool visible) -{ - mRoutingSender->removeSinkLookup(sinkID); - - if (visible) - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbRemovedSink, sinkID); -} - -void CAmDatabaseObserver::removedSource(const am_sourceID_t sourceID, const bool visible) -{ - mRoutingSender->removeSourceLookup(sourceID); - - if (visible) - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbRemovedSource, sourceID); -} - -void CAmDatabaseObserver::removeDomain(const am_domainID_t domainID) -{ - mRoutingSender->removeDomainLookup(domainID); -} - -void CAmDatabaseObserver::removeGateway(const am_gatewayID_t gatewayID) -{ - (void) gatewayID; - //todo: implement something? -} - -void CAmDatabaseObserver::removeConverter(const am_converterID_t converterID) -{ - (void) converterID; - //todo: implement something? -} - -void CAmDatabaseObserver::removeCrossfader(const am_crossfaderID_t crossfaderID) -{ - mRoutingSender->removeCrossfaderLookup(crossfaderID); -} - -void CAmDatabaseObserver::numberOfSinkClassesChanged() -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbNumberOfSinkClassesChanged); -} - -void CAmDatabaseObserver::numberOfSourceClassesChanged() -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbNumberOfSourceClassesChanged); -} - -void CAmDatabaseObserver::mainConnectionStateChanged(const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbMainConnectionStateChanged, connectionID, connectionState); -} - -void CAmDatabaseObserver::mainSinkSoundPropertyChanged(const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbMainSinkSoundPropertyChanged, sinkID, SoundProperty); -} - -void CAmDatabaseObserver::mainSourceSoundPropertyChanged(const am_sourceID_t sourceID, const am_MainSoundProperty_s & SoundProperty) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbMainSourceSoundPropertyChanged, sourceID, SoundProperty); -} - -void CAmDatabaseObserver::sinkAvailabilityChanged(const am_sinkID_t sinkID, const am_Availability_s & availability) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbSinkAvailabilityChanged, sinkID, availability); -} - -void CAmDatabaseObserver::sourceAvailabilityChanged(const am_sourceID_t sourceID, const am_Availability_s & availability) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbSourceAvailabilityChanged, sourceID, availability); -} - -void CAmDatabaseObserver::volumeChanged(const am_sinkID_t sinkID, const am_mainVolume_t volume) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbVolumeChanged, sinkID, volume); -} - -void CAmDatabaseObserver::sinkMuteStateChanged(const am_sinkID_t sinkID, const am_MuteState_e muteState) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbSinkMuteStateChanged, sinkID, muteState); -} - -void CAmDatabaseObserver::systemPropertyChanged(const am_SystemProperty_s& SystemProperty) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbSystemPropertyChanged, SystemProperty); -} - -void CAmDatabaseObserver::timingInformationChanged(const am_mainConnectionID_t mainConnection, const am_timeSync_t time) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbTimingInformationChanged, mainConnection, time); -} - -void CAmDatabaseObserver::sinkUpdated(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible) -{ - if (visible) - mSerializer.asyncCall >(mCommandSender, &CAmCommandSender::cbSinkUpdated, sinkID, sinkClassID, listMainSoundProperties); -} - -void CAmDatabaseObserver::sourceUpdated(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible) -{ - if (visible) - mSerializer.asyncCall >(mCommandSender, &CAmCommandSender::cbSinkUpdated, sourceID, sourceClassID, listMainSoundProperties); -} - -void CAmDatabaseObserver::sinkMainNotificationConfigurationChanged(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - mSerializer.asyncCall (mCommandSender, &CAmCommandSender::cbSinkMainNotificationConfigurationChanged, sinkID, mainNotificationConfiguration); -} - -void CAmDatabaseObserver::sourceMainNotificationConfigurationChanged(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - mSerializer.asyncCall(mCommandSender, &CAmCommandSender::cbSourceMainNotificationConfigurationChanged, sourceID, mainNotificationConfiguration); -} - -} diff --git a/AudioManagerCore/src/CAmRouter.cpp b/AudioManagerCore/src/CAmRouter.cpp index 002bd9d..5edd6d5 100644 --- a/AudioManagerCore/src/CAmRouter.cpp +++ b/AudioManagerCore/src/CAmRouter.cpp @@ -54,6 +54,7 @@ template void getMergeConnectionFormats(const X * element, CAmRouter::CAmRouter(IAmDatabaseHandler* iDatabaseHandler, CAmControlSender* iSender) : + CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks(), mpDatabaseHandler(iDatabaseHandler), // mpControlSender(iSender), mOnlyFreeConversionNodes(false), diff --git a/AudioManagerCore/src/CAmRoutingSender.cpp b/AudioManagerCore/src/CAmRoutingSender.cpp index fc0953f..0e25e68 100644 --- a/AudioManagerCore/src/CAmRoutingSender.cpp +++ b/AudioManagerCore/src/CAmRoutingSender.cpp @@ -45,133 +45,160 @@ namespace am #define __METHOD_NAME__ std::string (std::string("CAmRoutingSender::") + __func__) -CAmRoutingSender::CAmRoutingSender(const std::vector& listOfPluginDirectories, IAmDatabaseHandler* databaseHandler) : - mHandleCount(0), // - mlistActiveHandles(), // - mListInterfaces(), // - mMapConnectionInterface(), // - mMapCrossfaderInterface(), // - mMapDomainInterface(), // - mMapSinkInterface(), // - mMapSourceInterface(), // - mpRoutingReceiver(), // - mpDatabaseHandler(databaseHandler) -{ +CAmRoutingSender::CAmRoutingSender( + const std::vector& listOfPluginDirectories, + IAmDatabaseHandler* databaseHandler) : + mHandleCount(0), // + mlistActiveHandles(), // + mListInterfaces(), // + mMapConnectionInterface(), // + mMapCrossfaderInterface(), // + mMapDomainInterface(), // + mMapSinkInterface(), // + mMapSourceInterface(), // + mpRoutingReceiver(), // + mpDatabaseHandler(databaseHandler) { + + if (listOfPluginDirectories.empty()) { + logError(__METHOD_NAME__,"List of routingplugins is empty"); + } - if (listOfPluginDirectories.empty()) - { - logError(__METHOD_NAME__,"List of routingplugins is empty"); - } + std::vector sharedLibraryNameList; + std::vector::const_iterator dirIter = listOfPluginDirectories.begin(); + std::vector::const_iterator dirIterEnd = listOfPluginDirectories.end(); - std::vector sharedLibraryNameList; - std::vector::const_iterator dirIter = listOfPluginDirectories.begin(); - std::vector::const_iterator dirIterEnd = listOfPluginDirectories.end(); + // search communicator plugins in configured directories + for (; dirIter < dirIterEnd; ++dirIter) + { + const char* directoryName = dirIter->c_str(); + logInfo(__METHOD_NAME__,"Searching for HookPlugins in", directoryName); + DIR *directory = opendir(directoryName); - // search communicator plugins in configured directories - for (; dirIter < dirIterEnd; ++dirIter) - { - const char* directoryName = dirIter->c_str(); - logInfo(__METHOD_NAME__,"Searching for HookPlugins in", directoryName); - DIR *directory = opendir(directoryName); + if (!directory) + { + logError(__METHOD_NAME__,"Error opening directory: ", directoryName); + continue; + } - if (!directory) - { - logError(__METHOD_NAME__,"Error opening directory: ", directoryName); - continue; - } + // iterate content of directory + struct dirent *itemInDirectory = 0; + while ((itemInDirectory = readdir(directory))) + { + unsigned char entryType = itemInDirectory->d_type; + std::string entryName = itemInDirectory->d_name; + std::string fullName = *dirIter + "/" + entryName; + + bool regularFile = (entryType == DT_REG || entryType == DT_LNK); + bool sharedLibExtension = ("so" == entryName.substr(entryName.find_last_of(".") + 1)); + + // Handle cases where readdir() could not determine the file type + if (entryType == DT_UNKNOWN) { + struct stat buf; + + if (stat(fullName.c_str(), &buf)) { + logInfo(__METHOD_NAME__,"Failed to stat file: ", entryName, errno); + continue; + } + + regularFile = S_ISREG(buf.st_mode); + } + + if (regularFile && sharedLibExtension) + { + logInfo(__METHOD_NAME__,"adding file: ", entryName); + std::string name(directoryName); + sharedLibraryNameList.push_back(name + "/" + entryName); + } + else + { + logInfo(__METHOD_NAME__, "plugin search ignoring file :", entryName); + } + } - // iterate content of directory - struct dirent *itemInDirectory = 0; - while ((itemInDirectory = readdir(directory))) - { - unsigned char entryType = itemInDirectory->d_type; - std::string entryName = itemInDirectory->d_name; - std::string fullName = *dirIter + "/" + entryName; - - bool regularFile = (entryType == DT_REG || entryType == DT_LNK); - bool sharedLibExtension = ("so" == entryName.substr(entryName.find_last_of(".") + 1)); - - // Handle cases where readdir() could not determine the file type - if (entryType == DT_UNKNOWN) { - struct stat buf; - - if (stat(fullName.c_str(), &buf)) { - logInfo(__METHOD_NAME__,"Failed to stat file: ", entryName, errno); - continue; - } - - regularFile = S_ISREG(buf.st_mode); - } - - if (regularFile && sharedLibExtension) - { - logInfo(__METHOD_NAME__,"adding file: ", entryName); - std::string name(directoryName); - sharedLibraryNameList.push_back(name + "/" + entryName); - } - else - { - logInfo(__METHOD_NAME__, "plugin search ignoring file :", entryName); - } - } + closedir(directory); + } - closedir(directory); - } + // iterate all communicator plugins and start them + std::vector::iterator iter = sharedLibraryNameList.begin(); + std::vector::iterator iterEnd = sharedLibraryNameList.end(); + + for (; iter != iterEnd; ++iter) + { + logInfo(__METHOD_NAME__,"try loading: ", *iter); - // iterate all communicator plugins and start them - std::vector::iterator iter = sharedLibraryNameList.begin(); - std::vector::iterator iterEnd = sharedLibraryNameList.end(); + IAmRoutingSend* (*createFunc)(); + void* tempLibHandle = NULL; + createFunc = getCreateFunction(*iter, tempLibHandle); - for (; iter != iterEnd; ++iter) - { - logInfo(__METHOD_NAME__,"try loading: ", *iter); + if (!createFunc) + { + logError(__METHOD_NAME__,"Entry point of RoutingPlugin not found"); + continue; + } - IAmRoutingSend* (*createFunc)(); - void* tempLibHandle = NULL; - createFunc = getCreateFunction(*iter, tempLibHandle); + IAmRoutingSend* router = createFunc(); - if (!createFunc) - { - logError(__METHOD_NAME__,"Entry point of RoutingPlugin not found"); - continue; - } + if (!router) + { + logError(__METHOD_NAME__,"initialization of plugin ",*iter,"failed. Entry Function not callable"); + dlclose(tempLibHandle); + continue; + } - IAmRoutingSend* router = createFunc(); + InterfaceNamePairs routerInterface; + routerInterface.routingInterface = router; - if (!router) - { - logError(__METHOD_NAME__,"initialization of plugin ",*iter,"failed. Entry Function not callable"); - dlclose(tempLibHandle); - continue; - } + //check libversion + std::string version, cVersion(RoutingVersion); + router->getInterfaceVersion(version); + uint16_t minorVersion, majorVersion, cMinorVersion, cMajorVersion; + std::istringstream(version.substr(0, 1)) >> majorVersion; + std::istringstream(version.substr(2, 1)) >> minorVersion; + std::istringstream(cVersion.substr(0, 1)) >> cMajorVersion; + std::istringstream(cVersion.substr(2, 1)) >> cMinorVersion; - InterfaceNamePairs routerInterface; - routerInterface.routingInterface = router; - - //check libversion - std::string version, cVersion(RoutingVersion); - router->getInterfaceVersion(version); - uint16_t minorVersion, majorVersion, cMinorVersion, cMajorVersion; - std::istringstream(version.substr(0, 1)) >> majorVersion; - std::istringstream(version.substr(2, 1)) >> minorVersion; - std::istringstream(cVersion.substr(0, 1)) >> cMajorVersion; - std::istringstream(cVersion.substr(2, 1)) >> cMinorVersion; - - - - if (majorVersion < cMajorVersion || ((majorVersion == cMajorVersion) && (minorVersion > cMinorVersion))) - { - logError(__METHOD_NAME__,"Routing initialization failed. Version of Interface to old"); - dlclose(tempLibHandle); - continue; - } + if (majorVersion < cMajorVersion || ((majorVersion == cMajorVersion) && (minorVersion > cMinorVersion))) + { + logError(__METHOD_NAME__,"Routing initialization failed. Version of Interface to old"); + dlclose(tempLibHandle); + continue; + } - //here, the busname is saved together with the interface. Later The domains will register with the name and sinks, sources etc with the domain.... - router->returnBusName(routerInterface.busName); - assert(!routerInterface.busName.empty()); - mListInterfaces.push_back(routerInterface); - mListLibraryHandles.push_back(tempLibHandle); - } + //here, the busname is saved together with the interface. Later The domains will register with the name and sinks, sources etc with the domain.... + router->returnBusName(routerInterface.busName); + assert(!routerInterface.busName.empty()); + mListInterfaces.push_back(routerInterface); + mListLibraryHandles.push_back(tempLibHandle); + } + + dboNewSink = [&](const am_Sink_s& sink) { + addSinkLookup(sink); + }; + dboNewSource = [&](const am_Source_s& source) { + addSourceLookup(source); + }; + dboNewDomain = [&](const am_Domain_s& domain) { + addDomainLookup(domain); + }; + //todo: newGateway implement something + //todo: newConverter implement something + dboNewCrossfader = [&](const am_Crossfader_s& crossfader) { + addCrossfaderLookup(crossfader); + }; + dboRemovedSink = [&](const am_sinkID_t sinkID, const bool visible) { + removeSinkLookup(sinkID); + }; + dboRemovedSource = [&](const am_sourceID_t sourceID, const bool visible) { + removeSourceLookup(sourceID); + }; + dboRemoveDomain = [&](const am_domainID_t domainID) { + removeDomainLookup(domainID); + }; + //todo: removeGateway implement something + //todo: removeConverter implement something + dboRemoveCrossfader = [&](const am_crossfaderID_t crossfaderID) { + removeCrossfaderLookup(crossfaderID); + }; } CAmRoutingSender::~CAmRoutingSender() diff --git a/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.cpp b/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.cpp index 9c09deb..27ed2b6 100644 --- a/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.cpp +++ b/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.cpp @@ -51,7 +51,7 @@ CAmControlInterfaceTest::CAmControlInterfaceTest() : plistRoutingPluginDirs(), // pDatabaseHandler(), // pRoutingSender(plistRoutingPluginDirs,dynamic_cast( &pDatabaseHandler )), //RoutingReceiver - pCommandSender(plistCommandPluginDirs), // + pCommandSender(plistCommandPluginDirs, &pSocketHandler), // pMockControlInterface(), // pMockRoutingInterface(), // pRoutingInterfaceBackdoor(), // @@ -59,11 +59,11 @@ CAmControlInterfaceTest::CAmControlInterfaceTest() : pControlInterfaceBackdoor(), // pControlSender(), // pRouter(&pDatabaseHandler,&pControlSender), // - pDatabaseObserver(&pCommandSender, &pRoutingSender, &pSocketHandler), // pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender, &pSocketHandler, &pRouter), // pRoutingReceiver(&pDatabaseHandler, &pRoutingSender, &pControlSender, &pSocketHandler) { - pDatabaseHandler.registerObserver(&pDatabaseObserver); + pDatabaseHandler.registerObserver(&pRoutingSender); + pDatabaseHandler.registerObserver(&pCommandSender); pControlInterfaceBackdoor.replaceController(&pControlSender, &pMockControlInterface); pRoutingInterfaceBackdoor.injectInterface(&pRoutingSender, &pMockRoutingInterface, "mock"); diff --git a/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.h b/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.h index 3e645fb..9ebcec7 100644 --- a/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.h +++ b/AudioManagerCore/test/AmControlInterfaceTest/CAmControlInterfaceTest.h @@ -26,11 +26,9 @@ #include "gtest/gtest.h" #include "gmock/gmock.h" -//#include "CAmDatabaseHandlerSQLite.h" #include "CAmDatabaseHandlerMap.h" #include "CAmControlReceiver.h" #include "CAmRoutingReceiver.h" -#include "CAmDatabaseObserver.h" #include "CAmControlSender.h" #include "CAmRoutingSender.h" #include "CAmRouter.h" @@ -65,7 +63,6 @@ public: IAmControlBackdoor pControlInterfaceBackdoor; CAmControlSender pControlSender; CAmRouter pRouter; - CAmDatabaseObserver pDatabaseObserver; CAmControlReceiver pControlReceiver; CAmRoutingReceiver pRoutingReceiver; CAmCommonFunctions pCF; diff --git a/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.cpp b/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.cpp index 559764d..fe2f68a 100644 --- a/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.cpp +++ b/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.cpp @@ -47,18 +47,18 @@ TCLAP::SwitchArg enableDebug ("V","logDlt","print DLT logs to stdout or dlt-daem CAmMapBasicTest::CAmMapBasicTest() : + pDatabaseHandler(), // plistRoutingPluginDirs(), // plistCommandPluginDirs(), // - pSocketHandler(),// - pDatabaseHandler(), // + pSocketHandler(),// pRoutingSender(plistRoutingPluginDirs,dynamic_cast( &pDatabaseHandler )), // - pCommandSender(plistCommandPluginDirs), // + pCommandSender(plistCommandPluginDirs, &pSocketHandler), // pRoutingInterfaceBackdoor(), // pCommandInterfaceBackdoor(), // pControlSender(), // pRouter(&pDatabaseHandler, &pControlSender), // pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender, &pSocketHandler, &pRouter), // - pCF() + pCF() { } @@ -96,7 +96,8 @@ void CAmMapBasicTest::createMainConnectionSetup(am_mainConnectionID_t & mainConn connection.delay = -1; connection.connectionFormat = CF_GENIVI_ANALOG; connection.connectionID = 0; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,forgetSource)); ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(connection,connectionID)); @@ -114,6 +115,9 @@ void CAmMapBasicTest::createMainConnectionSetup(am_mainConnectionID_t & mainConn mainConnection.delay = -1; //enter mainconnection in database + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newMainConnection(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterMainConnectionDB(mainConnection,mainConnectionID)); ASSERT_NE(0, mainConnectionID); @@ -135,10 +139,8 @@ void CAmMapBasicTest::createMainConnectionSetup(am_mainConnectionID_t & mainConn void CAmMapBasicTest::SetUp() { - ::testing::FLAGS_gmock_verbose = "error"; - - am_Domain_s domain; - pCF.createDomain(domain); + am_Domain_s domain; + pCF.createDomain(domain); am_domainID_t forgetDomain; am_sinkClass_t forgetSinkClassID; am_SinkClass_s sinkClass; @@ -149,6 +151,9 @@ void CAmMapBasicTest::SetUp() sourceClass.name="TestSourceClass"; sourceClass.sourceClassID=1; domain.domainID=4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,forgetDomain)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkClassDB(sinkClass,forgetSinkClassID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceClassDB(forgetSourceClassID,sourceClass)); @@ -156,16 +161,16 @@ void CAmMapBasicTest::SetUp() void CAmMapBasicTest::TearDown() { - ::testing::FLAGS_gmock_verbose = "warning"; + Mock::VerifyAndClearExpectations(MockDatabaseObserver::getMockObserverObject()); } CAmMapHandlerTest::CAmMapHandlerTest() : pMockInterface(), // - pObserver(&pCommandSender,&pRoutingSender, &pSocketHandler) + mMockObserver() { - pDatabaseHandler.registerObserver(&pObserver); + pDatabaseHandler.registerObserver(&mMockObserver); pDatabaseHandler.setConnectionIDRange(1, TEST_MAX_CONNECTION_ID); pDatabaseHandler.setMainConnectionIDRange(1, TEST_MAX_MAINCONNECTION_ID); pDatabaseHandler.setSinkIDRange(DYNAMIC_ID_BOUNDARY, DYNAMIC_ID_BOUNDARY+TEST_MAX_SINK_ID); @@ -174,6 +179,7 @@ CAmMapHandlerTest::CAmMapHandlerTest() : CAmMapHandlerTest::~CAmMapHandlerTest() { + pDatabaseHandler.unregisterObserver(&mMockObserver); } TEST_F(CAmMapHandlerTest,getMainConnectionInfo) @@ -200,7 +206,8 @@ TEST_F(CAmMapHandlerTest,getSinkInfo) pCF.createSink(staticSink); staticSink.sinkID = 4; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(3); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(staticSink,staticSinkID)) << "ERROR: database error"; ASSERT_EQ(staticSink.sinkID,staticSinkID) @@ -270,7 +277,8 @@ TEST_F(CAmMapHandlerTest,getSourceInfo) staticSource.sourceID = 4; staticSource.name = "Static"; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(3); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(staticSource,staticSourceID)) << "ERROR: database error"; ASSERT_EQ(staticSource.sourceID,staticSourceID) @@ -344,7 +352,7 @@ TEST_F(CAmMapHandlerTest, peekSourceID) sourceClass.name = sourceName; sourceClass.sourceClassID = 0; sourceClass.listClassProperties.push_back(classProperty); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); //first we peek without an existing class ASSERT_EQ(E_NON_EXISTENT, pDatabaseHandler.peekSourceClassID(sourceName,sourceClassID)); @@ -368,7 +376,7 @@ TEST_F(CAmMapHandlerTest, peekSinkID) sinkClass.name = sinkName; sinkClass.sinkClassID = 0; sinkClass.listClassProperties.push_back(classProperty); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); //first we peek without an existing class ASSERT_EQ(E_NON_EXISTENT, pDatabaseHandler.peekSinkClassID(sinkName,sinkClassID)); @@ -392,7 +400,9 @@ TEST_F(CAmMapHandlerTest,crossfaders) pCF.createSink(sinkB); sinkB.name = "sinkB"; pCF.createSource(source); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newCrossfader(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sinkA,sinkAID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sinkB,sinkBID)); @@ -419,9 +429,6 @@ TEST_F(CAmMapHandlerTest,crossfaders) TEST_F(CAmMapHandlerTest,crossfadersGetFromDomain) { - - - am_Crossfader_s crossfader; am_crossfaderID_t crossfaderID; am_Sink_s sinkA, sinkB; @@ -435,6 +442,12 @@ TEST_F(CAmMapHandlerTest,crossfadersGetFromDomain) pCF.createDomain(domain); sinkB.name = "sinkB"; pCF.createSource(source); + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newCrossfader(_)).Times(1); + ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); source.domainID = domainID; sinkA.domainID = domainID; @@ -469,7 +482,7 @@ TEST_F(CAmMapHandlerTest,sourceState) source.sourceState = SS_OFF; //prepare the test - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); //change the source state @@ -489,7 +502,7 @@ TEST_F(CAmMapHandlerTest,sourceInterruptState) source.interruptState = IS_OFF; //prepare the test - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); //change the source interrupt state @@ -509,7 +522,7 @@ TEST_F(CAmMapHandlerTest,sinkVolumeChange) sink.volume = 23; //prepare the test - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); //change the volume and check the read out @@ -527,7 +540,7 @@ TEST_F(CAmMapHandlerTest,sourceVolumeChange) source.volume = 23; //prepare test - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); //change the volume and check the read out @@ -543,9 +556,8 @@ TEST_F(CAmMapHandlerTest, peekSource) am_sourceID_t sourceID, source2ID, source3ID; am_Source_s source; pCF.createSource(source); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); //peek a source that does not exits - ASSERT_EQ(E_OK, pDatabaseHandler.peekSource(std::string("newsource"),sourceID)); //make sure it is not in the list @@ -591,7 +603,7 @@ TEST_F(CAmMapHandlerTest, peekSourceDouble) pCF.createSource(source); //peek a source that does not exits - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.peekSource(std::string("newsource"),sourceID)); //peek a second source that does not exits @@ -626,7 +638,7 @@ TEST_F(CAmMapHandlerTest, peekSink) pCF.createSink(sink); //peek a sink that does not exits - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.peekSink(std::string("newsink"),sinkID)); //make sure it is not in the list @@ -668,7 +680,7 @@ TEST_F(CAmMapHandlerTest, peekSinkDouble) pCF.createSink(sink); //peek a sink that does not exits - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.peekSink(std::string("newsink"),sinkID)); //peek again @@ -712,6 +724,7 @@ TEST_F(CAmMapHandlerTest,changeConnectionTimingInformationCheckMainConnection) std::vector::iterator iteratorConnectionList = connectionList.begin(); for (; iteratorConnectionList < connectionList.end(); ++iteratorConnectionList) { + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_,_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.changeConnectionTimingInformation(iteratorConnectionList->connectionID,24)); } @@ -732,7 +745,10 @@ TEST_F(CAmMapHandlerTest,changeConnectionTimingInformation) pCF.createConnection(connection); pCF.createSink(sink); pCF.createSource(source); - + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(sink,sinkid)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(source,sourceid)); @@ -769,7 +785,8 @@ TEST_F(CAmMapHandlerTest,getSinkClassOfSink) sinkClass.listClassProperties = classPropertyList; pCF.createSink(sink); sink.sinkClassID = 4; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); //prepare test ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); @@ -808,7 +825,9 @@ TEST_F(CAmMapHandlerTest,getSourceClassOfSource) sourceClass.listClassProperties = classPropertyList; pCF.createSource(source); source.sourceClassID=8; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); @@ -838,7 +857,7 @@ TEST_F(CAmMapHandlerTest,removeSourceClass) sourceClass.name = "test"; sourceClass.sourceClassID = 3; sourceClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSourceClasses(sourceClassList)); @@ -870,7 +889,7 @@ TEST_F(CAmMapHandlerTest,updateSourceClass) changedClass = sourceClass; changedClass.listClassProperties[1].value = 6; changedPropertyList = changedClass.listClassProperties; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); changedClass.sourceClassID = sourceClassID; ASSERT_EQ(E_OK, pDatabaseHandler.getListSourceClasses(sourceClassList)); @@ -901,7 +920,7 @@ TEST_F(CAmMapHandlerTest,enterSourceClass) sourceClass.sourceClassID = 0; sourceClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSourceClasses(sourceClassList)); ASSERT_EQ(sourceClassList[0].name, sourceClass.name); @@ -926,7 +945,7 @@ TEST_F(CAmMapHandlerTest,enterSourceClassStatic) sourceClass.sourceClassID = 3; sourceClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSourceClasses(sourceClassList)); ASSERT_EQ(sourceClassList[0].name, sourceClass.name); @@ -950,7 +969,7 @@ TEST_F(CAmMapHandlerTest,removeSinkClass) sinkClass.name = "test"; sinkClass.sinkClassID = 0; sinkClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSinkClasses(sinkClassList)); @@ -982,7 +1001,7 @@ TEST_F(CAmMapHandlerTest,updateSinkClass) changedClass = sinkClass; changedClass.listClassProperties[1].value = 6; changedPropertyList = changedClass.listClassProperties; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); changedClass.sinkClassID = sinkClassID; ASSERT_EQ(E_OK, pDatabaseHandler.getListSinkClasses(sinkClassList)); @@ -1012,7 +1031,7 @@ TEST_F(CAmMapHandlerTest,enterSinkClass) sinkClass.name = "test"; sinkClass.sinkClassID = 0; sinkClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSinkClasses(sinkClassList)); @@ -1038,7 +1057,7 @@ TEST_F(CAmMapHandlerTest,enterSinkClassStatic) sinkClass.sinkClassID = 4; sinkClass.listClassProperties = classPropertyList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSinkClasses(sinkClassList)); ASSERT_EQ(sinkClassList[0].name, sinkClass.name); @@ -1054,6 +1073,7 @@ TEST_F(CAmMapHandlerTest, changeSystemProperty) systemProperty.type = SYP_UNKNOWN; systemProperty.value = 33; listSystemProperties.push_back(systemProperty); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), systemPropertyChanged(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSystemProperties(listSystemProperties)); systemProperty.value = 444; ASSERT_EQ(E_OK, pDatabaseHandler.changeSystemPropertyDB(systemProperty)); @@ -1088,7 +1108,7 @@ TEST_F(CAmMapHandlerTest,enterSourcesCorrect) staticSource.sourceID = 4; staticSource.name = "Static"; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(3); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(staticSource,staticSourceID)) << "ERROR: database error"; ASSERT_EQ(staticSource.sourceID,staticSourceID) @@ -1142,6 +1162,8 @@ TEST_F(CAmMapHandlerTest, changeSinkMuteState) am_sinkID_t sinkID; pCF.createSink(sink); am_MuteState_e muteState = MS_MUTED; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), sinkMuteStateChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); @@ -1159,6 +1181,8 @@ TEST_F(CAmMapHandlerTest, changeSourceMainSoundProperty) am_MainSoundProperty_s property; property.type = MSP_UNKNOWN; property.value = 33; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainSourceSoundPropertyChanged(_, _)).Times(2); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); @@ -1191,7 +1215,8 @@ TEST_F(CAmMapHandlerTest, changeSinkMainSoundProperty) property.type = MSP_UNKNOWN; property.value = 33; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainSinkSoundPropertyChanged(_, _)).Times(2); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeMainSinkSoundPropertyDB(property,sinkID)); @@ -1222,7 +1247,7 @@ TEST_F(CAmMapHandlerTest, changeSourceSoundProperty) am_SoundProperty_s property; property.type = SP_GENIVI_MID; property.value = 33; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeSourceSoundPropertyDB(property,sourceID)); @@ -1254,7 +1279,7 @@ TEST_F(CAmMapHandlerTest, changeSinkSoundProperty) property.type = SP_GENIVI_MID; property.value = 33; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeSinkSoundPropertyDB(property,sinkID)); @@ -1283,6 +1308,7 @@ TEST_F(CAmMapHandlerTest, peekDomain) am_domainID_t domainID; am_domainID_t domain2ID; pCF.createDomain(domain); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.peekDomain(std::string("newdomain"),domainID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListDomains(listDomains)); ASSERT_FALSE(listDomains.empty()); @@ -1302,6 +1328,7 @@ TEST_F(CAmMapHandlerTest, peekDomainFirstEntered) am_domainID_t domain2ID; pCF.createDomain(domain); domain.name = "newdomain"; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); ASSERT_EQ(E_OK, pDatabaseHandler.peekDomain(std::string("newdomain"),domain2ID)); ASSERT_EQ(domainID, domain2ID); @@ -1316,6 +1343,7 @@ TEST_F(CAmMapHandlerTest, changeDomainState) am_domainID_t domainID; pCF.createDomain(domain); am_DomainState_e newState = DS_INDEPENDENT_STARTUP; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain(_)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeDomainStateDB(newState,domainID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListDomains(listDomains)); @@ -1328,7 +1356,7 @@ TEST_F(CAmMapHandlerTest, changeMainConnectionState) am_MainConnection_s mainConnection; std::vector listMainConnections; createMainConnectionSetup(mainConnectionID, mainConnection); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.changeMainConnectionStateDB(1,CS_DISCONNECTING)); ASSERT_EQ(E_OK, pDatabaseHandler.getListMainConnections(listMainConnections)); ASSERT_EQ(CS_DISCONNECTING, listMainConnections[0].connectionState); @@ -1343,7 +1371,8 @@ TEST_F(CAmMapHandlerTest, changeSinkAvailability) am_Availability_s availability; availability.availability = A_UNKNOWN; availability.availabilityReason = AR_GENIVI_TEMPERATURE; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), sinkAvailabilityChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeSinkAvailabilityDB(availability,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSinks(listSinks)); @@ -1361,7 +1390,8 @@ TEST_F(CAmMapHandlerTest, changeSourceAvailability) availability.availability = A_UNKNOWN; availability.availabilityReason = AR_GENIVI_TEMPERATURE; source.visible = true; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), sourceAvailabilityChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeSourceAvailabilityDB(availability,sourceID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSources(listSources)); @@ -1376,7 +1406,7 @@ TEST_F(CAmMapHandlerTest,changeMainConnectionRoute) std::vector originalList; std::vector newList; createMainConnectionSetup(mainConnectionID, mainConnection); - + //fill the connection database am_Connection_s connection; am_Source_s source; @@ -1405,12 +1435,15 @@ TEST_F(CAmMapHandlerTest,changeMainConnectionRoute) source.name = "source" + int2string(i + 30); source.domainID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,forgetSource)); ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(connection,connectionID)); listConnectionID.push_back(connectionID); } - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.getListMainConnections(originalList)); ASSERT_EQ(E_OK, pDatabaseHandler.changeMainConnectionRouteDB(mainConnectionID,listConnectionID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListMainConnections(newList)); @@ -1424,7 +1457,8 @@ TEST_F(CAmMapHandlerTest,changeMainSinkVolume) am_mainVolume_t newVol = 20; std::vector listSinks; pCF.createSink(sink); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), volumeChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.changeSinkMainVolumeDB(newVol,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListSinks(listSinks)); @@ -1438,7 +1472,7 @@ TEST_F(CAmMapHandlerTest,getMainSourceSoundProperties) pCF.createSource(source); std::vector mainSoundProperties = source.listMainSoundProperties; std::vector listMainSoundProperties; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListMainSourceSoundProperties(sourceID,listMainSoundProperties)); ASSERT_TRUE(std::equal(mainSoundProperties.begin(),mainSoundProperties.end(),listMainSoundProperties.begin(),equalMainSoundProperty)); @@ -1451,7 +1485,7 @@ TEST_F(CAmMapHandlerTest,getMainSinkSoundProperties) pCF.createSink(sink); std::vector mainSoundProperties = sink.listMainSoundProperties; std::vector listMainSoundProperties; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListMainSinkSoundProperties(sinkID,listMainSoundProperties)); ASSERT_TRUE(std::equal(mainSoundProperties.begin(),mainSoundProperties.end(),listMainSoundProperties.begin(),equalMainSoundProperty)); @@ -1470,7 +1504,7 @@ TEST_F(CAmMapHandlerTest,getMainSources) source1.visible = false; std::vector listMainSources; std::vector listSources; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); source.sourceID = sourceID; ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source1,sourceID)); @@ -1499,7 +1533,7 @@ TEST_F(CAmMapHandlerTest,getMainSinks) sink1.visible = false; std::vector listMainSinks; std::vector listSinks; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); sink.sinkID = sinkID; ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink1,sinkID)); @@ -1521,7 +1555,7 @@ TEST_F(CAmMapHandlerTest,getVisibleMainConnections) am_mainConnectionID_t mainConnectionID; am_MainConnection_s mainConnection; createMainConnectionSetup(mainConnectionID, mainConnection); - + std::vector listVisibleMainConnections; std::vector listMainConnections; ASSERT_EQ(E_OK, pDatabaseHandler.getListVisibleMainConnections(listVisibleMainConnections)); @@ -1552,7 +1586,8 @@ TEST_F(CAmMapHandlerTest,getListSourcesOfDomain) domain.domainID=0; domain.name="dynDomain"; sourceCheckList.push_back(1); //sink.sinkID); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(2); ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(source,sourceID)) << "ERROR: database error"; @@ -1582,6 +1617,8 @@ TEST_F(CAmMapHandlerTest,getListSinksOfDomain) domain.domainID=0; domain.name="dyndomain"; sinkCheckList.push_back(1); //sink.sinkID); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(2); ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(sink,sinkID)) @@ -1606,7 +1643,10 @@ TEST_F(CAmMapHandlerTest,getListGatewaysOfDomain) am_Sink_s sink; am_Source_s source; std::vector gatewayList, gatewayCheckList; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newGateway( _)).Times(2); pCF.createDomain(domain); domain.domainID=0; domain.name="dyndomain"; @@ -1679,6 +1719,12 @@ TEST_F(CAmMapHandlerTest,getListConvertersOfDomain) pCF.createDomain(domain); domain.domainID=6; domain.name="sdfsd"; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newConverter( _)).Times(2); + ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain,domainID)); am_sinkID_t sinkID1; @@ -1743,6 +1789,10 @@ TEST_F(CAmMapHandlerTest,removeDomain) am_domainID_t domainID; std::vector listDomains; pCF.createDomain(domain); + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removeDomain( _)).Times(1); + ASSERT_EQ(E_OK,pDatabaseHandler.enterDomainDB(domain,domainID)) << "ERROR: database error"; ASSERT_EQ(E_OK,pDatabaseHandler.removeDomainDB(domainID)) @@ -1766,6 +1816,11 @@ TEST_F(CAmMapHandlerTest,removeGateway) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newGateway( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removeGateway( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); @@ -1792,6 +1847,12 @@ TEST_F(CAmMapHandlerTest,removeConverter) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newConverter( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removeConverter( _)).Times(1); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterConverterDB(converter,converterID)) @@ -1810,6 +1871,9 @@ TEST_F(CAmMapHandlerTest,removeSink) std::vector listSinks; pCF.createSink(sink); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedSink(_, _)).Times(1); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(sink,sinkID)) << "ERROR: database error"; ASSERT_EQ(E_OK,pDatabaseHandler.removeSinkDB(sinkID)) @@ -1826,7 +1890,10 @@ TEST_F(CAmMapHandlerTest,removeSource) am_sourceID_t sourceID; std::vector listSources; pCF.createSource(source); - + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedSource(_, _)).Times(1); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(source,sourceID)) << "ERROR: database error"; ASSERT_EQ(E_OK,pDatabaseHandler.removeSourceDB(sourceID)) @@ -1841,7 +1908,8 @@ TEST_F(CAmMapHandlerTest, removeMainConnection) am_mainConnectionID_t mainConnectionID; am_MainConnection_s mainConnection; createMainConnectionSetup(mainConnectionID, mainConnection); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedMainConnection(_)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(1); ASSERT_EQ(E_OK,pDatabaseHandler.removeMainConnectionDB(mainConnectionID)) << "ERROR: database error"; } @@ -1895,6 +1963,11 @@ TEST_F(CAmMapHandlerTest,registerGatewayCorrect) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newGateway( _)).Times(3); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterGatewayDB(gateway,gatewayID)) @@ -1954,6 +2027,11 @@ TEST_F(CAmMapHandlerTest,registerConverterCorrect) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newConverter( _)).Times(3); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterConverterDB(gateway,gatewayID)) @@ -2015,6 +2093,11 @@ TEST_F(CAmMapHandlerTest,getGatewayInfo) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newGateway( _)).Times(3); + ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterGatewayDB(gateway,gatewayID)) @@ -2079,6 +2162,9 @@ TEST_F(CAmMapHandlerTest,getConverterInfo) pCF.createSource(source); sink.sinkID = 1; source.sourceID = 2; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newConverter( _)).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source,sourceID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterConverterDB(gateway,gatewayID)) @@ -2133,8 +2219,8 @@ TEST_F(CAmMapHandlerTest,enterSinkThatAlreadyExistFail) pCF.createSink(staticSink); staticSink.sinkID = 43; staticSink.name = "Static"; - - + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(staticSink,staticSinkID)) << "ERROR: database error"; ASSERT_EQ(staticSink.sinkID,staticSinkID) @@ -2156,6 +2242,7 @@ TEST_F(CAmMapHandlerTest,enterSourcesThatAlreadyExistFail) pCF.createSource(staticSource); staticSource.sourceID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(staticSource,staticSourceID)) << "ERROR: database error"; @@ -2176,6 +2263,8 @@ TEST_F(CAmMapHandlerTest,registerDomainCorrect) am_Domain_s domain; am_domainID_t domainID = 0; pCF.createDomain(domain); + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); ASSERT_EQ(E_OK,pDatabaseHandler.enterDomainDB(domain,domainID)) << "ERROR: database error"; @@ -2204,6 +2293,7 @@ TEST_F(CAmMapHandlerTest,registerDomainPredefined) am_domainID_t domainID = 10; pCF.createDomain(domain); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(1); ASSERT_EQ(E_OK,pDatabaseHandler.enterDomainDB(domain,domainID)) << "ERROR: database error"; ASSERT_NE(10,domainID) @@ -2240,11 +2330,14 @@ TEST_F(CAmMapHandlerTest,registerConnectionCorrect) sink.sinkID=connection.sinkID; pCF.createSource(source); source.sourceID=connection.sourceID; + + + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(sink,sinkID)); ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(source,sourceID)); - - ASSERT_EQ(E_OK,pDatabaseHandler.enterConnectionDB(connection,connectionID)) << "ERROR: database error"; ASSERT_NE(0,connectionID) @@ -2283,6 +2376,7 @@ TEST_F(CAmMapHandlerTest,enterSinksCorrect) pCF.createSink(staticSink); staticSink.sinkID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(3); ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(staticSink,staticSinkID)) << "ERROR: database error"; @@ -2341,6 +2435,7 @@ TEST_F(CAmMapHandlerTest,enterNotificationConfigurationCorrect) notify.status=NS_CHANGE; notify.parameter=25; testSinkData.listNotificationConfigurations.push_back(notify); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(testSinkData,sinkID)) @@ -2377,6 +2472,7 @@ TEST_F(CAmMapHandlerTest,enterMainNotificationConfigurationCorrect) notify.parameter=25; testSinkData.listMainNotificationConfigurations.push_back(notify); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(testSinkData,sinkID)) @@ -2405,8 +2501,10 @@ TEST_F(CAmMapHandlerTest,removeNotificationsSink) notify.parameter=25; testSinkData.listMainNotificationConfigurations.push_back(notify); - - //enter the sink in the database + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedSink(_, _)).Times(1); + + //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(testSinkData,sinkID)) << "ERROR: database error"; @@ -2437,6 +2535,9 @@ TEST_F(CAmMapHandlerTest,removeNotificationsSource) testSourceData.listMainNotificationConfigurations.push_back(notify); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedSource(_, _)).Times(1); + //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(testSourceData,sourceID)) << "ERROR: database error"; @@ -2475,7 +2576,7 @@ TEST_F(CAmMapHandlerTest,getMainNotificationsSink) notify1.parameter=5; testSinkData.listMainNotificationConfigurations.push_back(notify1); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(testSinkData,sinkID)) << "ERROR: database error"; @@ -2510,7 +2611,7 @@ TEST_F(CAmMapHandlerTest,getMainNotificationsSources) notify1.parameter=5; testSourceData.listMainNotificationConfigurations.push_back(notify1); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(testSourceData,sourceID)) << "ERROR: database error"; @@ -2531,7 +2632,8 @@ TEST_F(CAmMapHandlerTest,changeMainNotificationsSources) am_sourceID_t sourceID; std::vector listSources; std::vectorreturnList,returnList1; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), sourceMainNotificationConfigurationChanged(_, _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSourceDB(testSourceData,sourceID)) << "ERROR: database error"; @@ -2572,7 +2674,8 @@ TEST_F(CAmMapHandlerTest,changeMainNotificationsSink) am_sinkID_t sinkID; std::vector listSinks; std::vectorreturnList,returnList1; - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), sinkMainNotificationConfigurationChanged(_, _)).Times(1); //enter the sink in the database ASSERT_EQ(E_OK,pDatabaseHandler.enterSinkDB(testSinkData,sinkID)) << "ERROR: database error"; @@ -2617,7 +2720,7 @@ TEST_F(CAmMapHandlerTest, peekDomain_2) ASSERT_EQ(E_OK, pDatabaseHandler.getListDomains(listDomains)); ASSERT_TRUE(listDomains.size()==1); ASSERT_EQ(domainID, DYNAMIC_ID_BOUNDARY); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newDomain( _)).Times(2); domain2.name = "anotherdomain"; ASSERT_EQ(E_OK, pDatabaseHandler.enterDomainDB(domain2,domain2ID)); ASSERT_EQ(E_OK, pDatabaseHandler.getListDomains(listDomains)); @@ -2654,6 +2757,8 @@ TEST_F(CAmMapHandlerTest, connectionIDBoundary) source.sourceID = 0; source.name = "source" + int2string(i); source.domainID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source, forgetSource)); connection.sinkID = forgetSink; @@ -2683,6 +2788,8 @@ TEST_F(CAmMapHandlerTest, connectionIDBoundary) sink.name="77"; source.sourceID=77; source.name="77"; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source, forgetSource)); ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(connection,connectionID)); @@ -2713,16 +2820,18 @@ TEST_F(CAmMapHandlerTest, mainConnectionIDBoundary) source.sourceID = 0; source.name = "source" + int2string(i); source.domainID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source, forgetSource)); connection.sinkID = forgetSink; connection.sourceID = forgetSource; if( i < TEST_MAX_CONNECTION_ID ) { - ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(connection,connectionID)); - ASSERT_EQ(E_OK, pDatabaseHandler.changeConnectionFinal(connectionID)); - ASSERT_EQ(i, connectionID); - connectionIDList.push_back(i); + ASSERT_EQ(E_OK, pDatabaseHandler.enterConnectionDB(connection,connectionID)); + ASSERT_EQ(E_OK, pDatabaseHandler.changeConnectionFinal(connectionID)); + ASSERT_EQ(i, connectionID); + connectionIDList.push_back(i); } } std::vector connectionList; @@ -2744,9 +2853,16 @@ TEST_F(CAmMapHandlerTest, mainConnectionIDBoundary) { mainConnection.sinkID = DYNAMIC_ID_BOUNDARY + i; mainConnection.sourceID = DYNAMIC_ID_BOUNDARY + i; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newMainConnection( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterMainConnectionDB(mainConnection,mainConnectionID)); ASSERT_EQ(i, mainConnectionID); } + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newMainConnection( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_, _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedMainConnection(_)).Times(2); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(3); ASSERT_EQ(E_OK, pDatabaseHandler.removeMainConnectionDB(10)); ASSERT_EQ(E_OK, pDatabaseHandler.removeMainConnectionDB(12)); ASSERT_EQ(E_OK, pDatabaseHandler.enterMainConnectionDB(mainConnection,mainConnectionID)); @@ -2757,6 +2873,11 @@ TEST_F(CAmMapHandlerTest, mainConnectionIDBoundary) sink.name="77"; source.sourceID=77; source.name="77"; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newMainConnection( _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(_, _)).Times(1); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(_, _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, forgetSink)); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceDB(source, forgetSource)); ASSERT_EQ(E_OK, pDatabaseHandler.enterMainConnectionDB(mainConnection,mainConnectionID)); @@ -2775,11 +2896,12 @@ TEST_F(CAmMapHandlerTest, increaseID) sink.sinkID = 0; sink.name = "sink" + int2string(i); sink.domainID = 4; + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink( _)).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkDB(sink, sinkID)); ASSERT_EQ(DYNAMIC_ID_BOUNDARY+i, sinkID); } ASSERT_EQ(E_UNKNOWN, pDatabaseHandler.enterSinkDB(sink, sinkID)); - + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), removedSink(_,_)).Times(2); ASSERT_EQ(E_OK, pDatabaseHandler.removeSinkDB(DYNAMIC_ID_BOUNDARY+10)); ASSERT_EQ(E_OK, pDatabaseHandler.removeSinkDB(DYNAMIC_ID_BOUNDARY+12)); @@ -2788,17 +2910,6 @@ TEST_F(CAmMapHandlerTest, increaseID) ASSERT_EQ(E_UNKNOWN, pDatabaseHandler.enterSinkDB(sink, sinkID)); } - -CAmMapHandlerObserverCallbacksTest::CAmMapHandlerObserverCallbacksTest() : - mMockObserver(&pCommandSender, &pRoutingSender, &pSocketHandler) -{ - pDatabaseHandler.registerObserver(&mMockObserver); -} - -CAmMapHandlerObserverCallbacksTest::~CAmMapHandlerObserverCallbacksTest() -{ -} - MATCHER_P(IsDomainDataEqualTo, value, "") { auto lh = arg; return lh.domainID == value.domainID && @@ -2809,7 +2920,30 @@ MATCHER_P(IsDomainDataEqualTo, value, "") { lh.state == value.state; } -TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_removeDomain) +TEST_F(CAmMapHandlerTest, dbo_addAndRemoveObservers) +{ + CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks observer1; + CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks observer2; + ASSERT_EQ(pDatabaseHandler.registerObserver(&observer1), true); + ASSERT_EQ(pDatabaseHandler.countObservers(), 2); + ASSERT_EQ(pDatabaseHandler.registerObserver(&observer2), true); + ASSERT_EQ(pDatabaseHandler.countObservers(), 3); + + pDatabaseHandler.unregisterObserver(&observer1); + ASSERT_EQ(pDatabaseHandler.countObservers(), 2); + pDatabaseHandler.unregisterObserver(&observer2); + ASSERT_EQ(pDatabaseHandler.countObservers(), 1); + pDatabaseHandler.unregisterObserver(&observer2); + ASSERT_EQ(pDatabaseHandler.countObservers(), 1); + + ASSERT_EQ(pDatabaseHandler.registerObserver(&observer2), true); + ASSERT_EQ(pDatabaseHandler.registerObserver(&observer2), false); + ASSERT_EQ(pDatabaseHandler.countObservers(), 2); + pDatabaseHandler.unregisterObserver(&observer2); + ASSERT_EQ(pDatabaseHandler.countObservers(), 1); +} + +TEST_F(CAmMapHandlerTest, dbo_peek_enter_removeDomain) { std::vector listDomains; am_Domain_s domain; @@ -2844,7 +2978,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_removeDomain) EXPECT_TRUE(Mock::VerifyAndClearExpectations(MockDatabaseObserver::getMockObserverObject())); } -TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_update_removeSource) +TEST_F(CAmMapHandlerTest, dbo_peek_enter_update_removeSource) { std::vector listSources; am_sourceID_t sourceID; @@ -2909,7 +3043,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_update_removeSource) EXPECT_TRUE(Mock::VerifyAndClearExpectations(MockDatabaseObserver::getMockObserverObject())); } -TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_update_removeSink) +TEST_F(CAmMapHandlerTest, dbo_peek_enter_update_removeSink) { std::vector listSinks; am_sinkID_t sinkID; @@ -2973,7 +3107,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peek_enter_update_removeSink) EXPECT_TRUE(Mock::VerifyAndClearExpectations(MockDatabaseObserver::getMockObserverObject())); } -TEST_F(CAmMapHandlerObserverCallbacksTest, peekSourceClassID) +TEST_F(CAmMapHandlerTest, dbo_peekSourceClassID) { std::string sourceName("myClassID"); am_sourceClass_t sourceClassID, peekID; @@ -2989,7 +3123,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peekSourceClassID) ASSERT_EQ(E_NON_EXISTENT, pDatabaseHandler.peekSourceClassID(sourceName,sourceClassID)); //now we enter the class into the database - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(13); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSourceClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSourceClassDB(sourceClassID,sourceClass)); //first we peek without an existing class @@ -2997,7 +3131,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peekSourceClassID) ASSERT_EQ(sourceClassID, peekID); } -TEST_F(CAmMapHandlerObserverCallbacksTest, peekSinkClassID) +TEST_F(CAmMapHandlerTest, dbo_peekSinkClassID) { std::string sinkName("myClassID"); am_sinkClass_t sinkClassID, peekID; @@ -3013,7 +3147,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peekSinkClassID) ASSERT_EQ(E_NON_EXISTENT, pDatabaseHandler.peekSinkClassID(sinkName,sinkClassID)); //now we enter the class into the database - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(12); + EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), numberOfSinkClassesChanged()).Times(1); ASSERT_EQ(E_OK, pDatabaseHandler.enterSinkClassDB(sinkClass,sinkClassID)); //first we peek without an existing class @@ -3021,7 +3155,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, peekSinkClassID) ASSERT_EQ(sinkClassID, peekID); } -TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeGateway) +TEST_F(CAmMapHandlerTest, dbo_enter_removeGateway) { //initialize gateway std::vector returnList; @@ -3056,7 +3190,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeGateway) ASSERT_EQ(E_OK,pDatabaseHandler.removeGatewayDB(gatewayID2))<< "ERROR: database error"; } -TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeConverter) +TEST_F(CAmMapHandlerTest, dbo_enter_removeConverter) { //initialize gateway std::vector returnList; @@ -3091,7 +3225,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeConverter) ASSERT_EQ(E_OK,pDatabaseHandler.removeConverterDB(gatewayID2))<< "ERROR: database error"; } -TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeCrossfader) +TEST_F(CAmMapHandlerTest, dbo_enter_removeCrossfader) { am_Crossfader_s crossfader; am_crossfaderID_t crossfaderID; @@ -3125,19 +3259,11 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, enter_removeCrossfader) ASSERT_EQ(E_OK,pDatabaseHandler.removeCrossfaderDB(crossfaderID))<< "ERROR: database error"; } -TEST_F(CAmMapHandlerObserverCallbacksTest, enter_update_removeMainConnection) +TEST_F(CAmMapHandlerTest, dbo_enter_update_removeMainConnection) { am_mainConnectionID_t mainConnectionID; am_MainConnection_s mainConnection; - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSink(_)).Times(9); - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newSource(_)).Times(9); - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), newMainConnection(Field(&am_MainConnectionType_s::mainConnectionID, 1))).Times(1); - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), mainConnectionStateChanged(1, CS_CONNECTED)).Times(1); -#ifndef WITH_DATABASE_CHANGE_CHECK - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(1, _)).Times(1); -#else - EXPECT_CALL(*MockDatabaseObserver::getMockObserverObject(), timingInformationChanged(1, _)).Times(0); -#endif + createMainConnectionSetup(mainConnectionID, mainConnection); //change delay of first connection @@ -3161,7 +3287,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, enter_update_removeMainConnection) ASSERT_EQ(E_OK,pDatabaseHandler.removeMainConnectionDB(mainConnectionID)) << "ERROR: database error"; } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeSinkAvailability) +TEST_F(CAmMapHandlerTest, dbo_changeSinkAvailability) { std::vector listSinks; am_Sink_s sink; @@ -3187,7 +3313,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, changeSinkAvailability) #endif } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeSourceAvailability) +TEST_F(CAmMapHandlerTest, dbo_changeSourceAvailability) { std::vector listSources; am_Source_s source; @@ -3214,7 +3340,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, changeSourceAvailability) #endif } -TEST_F(CAmMapHandlerObserverCallbacksTest,changeMainSinkVolume) +TEST_F(CAmMapHandlerTest, dbo_changeMainSinkVolume) { am_Sink_s sink; am_sinkID_t sinkID; @@ -3236,7 +3362,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest,changeMainSinkVolume) #endif } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeSinkMuteState) +TEST_F(CAmMapHandlerTest, dbo_changeSinkMuteState) { std::vector listSinks; am_Sink_s sink; @@ -3258,7 +3384,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, changeSinkMuteState) #endif } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeSystemProperty) +TEST_F(CAmMapHandlerTest, dbo_changeSystemProperty) { std::vector listSystemProperties, listReturn; am_SystemProperty_s systemProperty; @@ -3282,7 +3408,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, changeSystemProperty) #endif } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeMainNotificationsSink) +TEST_F(CAmMapHandlerTest, dbo_changeMainNotificationsSink) { am_Sink_s testSinkData; pCF.createSink(testSinkData); @@ -3329,7 +3455,7 @@ TEST_F(CAmMapHandlerObserverCallbacksTest, changeMainNotificationsSink) ASSERT_EQ(E_OK,pDatabaseHandler.changeMainSinkNotificationConfigurationDB(sinkID,notify2)); } -TEST_F(CAmMapHandlerObserverCallbacksTest, changeMainNotificationsSources) +TEST_F(CAmMapHandlerTest, dbo_changeMainNotificationsSources) { am_Source_s testSourceData; diff --git a/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.h b/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.h index e3cc0ef..32add3d 100644 --- a/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.h +++ b/AudioManagerCore/test/AmMapHandlerTest/CAmMapHandlerTest.h @@ -33,16 +33,17 @@ #include "CAmDatabaseHandlerMap.h" #include "CAmControlReceiver.h" #include "CAmControlSender.h" -#include "CAmDatabaseObserver.h" +#include "CAmTestDatabaseObserver.h" #include "CAmRoutingSender.h" #include "CAmRouter.h" #include "CAmControlSender.h" +#include "MockDatabaseObserver.h" #include "../IAmControlBackdoor.h" #include "../IAmCommandBackdoor.h" #include "../CAmCommonFunctions.h" #include "../MockIAmControlSend.h" #include "../MockIAmCommandSend.h" -#include "MockDatabaseObserver.h" + namespace am { @@ -50,15 +51,15 @@ namespace am class CAmMapBasicTest : public ::testing::Test { public: - CAmMapBasicTest(); + CAmMapBasicTest(); ~CAmMapBasicTest(); + CAmSocketHandler pSocketHandler; std::vector plistRoutingPluginDirs; std::vector plistCommandPluginDirs; CAmRoutingSender pRoutingSender; CAmCommandSender pCommandSender; IAmRoutingBackdoor pRoutingInterfaceBackdoor; IAmCommandBackdoor pCommandInterfaceBackdoor; - CAmSocketHandler pSocketHandler; CAmDatabaseHandlerMap pDatabaseHandler; CAmControlSender pControlSender; CAmRouter pRouter; @@ -75,18 +76,9 @@ public: CAmMapHandlerTest(); ~CAmMapHandlerTest(); MockIAmCommandSend pMockInterface; - CAmDatabaseObserver pObserver; + CAmDatabaseObserver mMockObserver; }; -class CAmMapHandlerObserverCallbacksTest : public CAmMapBasicTest -{ -public: - CAmMapHandlerObserverCallbacksTest(); - ~CAmMapHandlerObserverCallbacksTest(); - CAmDatabaseObserver mMockObserver; -}; - - } #endif /* MAPHANDLERTEST_H_ */ diff --git a/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.cpp b/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.cpp index a035cee..ddf0abb 100644 --- a/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.cpp +++ b/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.cpp @@ -21,78 +21,75 @@ * */ -#include "CAmDatabaseObserver.h" +#include "CAmTestDatabaseObserver.h" #include "MockDatabaseObserver.h" namespace am { -CAmDatabaseObserver::CAmDatabaseObserver(CAmCommandSender *iCommandSender, CAmRoutingSender *iRoutingSender, CAmSocketHandler *iSocketHandler) : -mCommandSender(iCommandSender), // -mRoutingSender(iRoutingSender), // -mTelnetServer(NULL), // -mSerializer(iSocketHandler) // -{} +CAmDatabaseObserver::CAmDatabaseObserver() +{ + dboNumberOfSinkClassesChanged = [&]() + { MockDatabaseObserver::getMockObserverObject()->numberOfSinkClassesChanged(); }; + dboNumberOfSourceClassesChanged = [&]() + { MockDatabaseObserver::getMockObserverObject()->numberOfSourceClassesChanged(); }; + dboNewSink = [&](const am_Sink_s& sink) + { MockDatabaseObserver::getMockObserverObject()->newSink(sink); }; + dboNewSource = [&](const am_Source_s& source) + { MockDatabaseObserver::getMockObserverObject()->newSource(source); }; + dboNewDomain = [&](const am_Domain_s& domain) + { MockDatabaseObserver::getMockObserverObject()->newDomain(domain); }; + dboNewGateway = [&](const am_Gateway_s& gateway) + { MockDatabaseObserver::getMockObserverObject()->newGateway(gateway); }; + dboNewConverter = [&](const am_Converter_s& coverter) + { MockDatabaseObserver::getMockObserverObject()->newConverter(coverter); }; + dboNewCrossfader = [&](const am_Crossfader_s& crossfader) + { MockDatabaseObserver::getMockObserverObject()->newCrossfader(crossfader); }; + dboNewMainConnection = [&](const am_MainConnectionType_s& mainConnection) + { MockDatabaseObserver::getMockObserverObject()->newMainConnection(mainConnection); }; + dboRemovedMainConnection = [&](const am_mainConnectionID_t mainConnection) + { MockDatabaseObserver::getMockObserverObject()->removedMainConnection(mainConnection); }; + dboRemovedSink = [&](const am_sinkID_t sinkID, const bool visible) + { MockDatabaseObserver::getMockObserverObject()->removedSink(sinkID, visible); }; + dboRemovedSource = [&](const am_sourceID_t sourceID, const bool visible) + { MockDatabaseObserver::getMockObserverObject()->removedSource(sourceID, visible); }; + dboRemoveDomain = [&](const am_domainID_t domainID) + { MockDatabaseObserver::getMockObserverObject()->removeDomain(domainID); }; + dboRemoveGateway = [&](const am_gatewayID_t gatewayID) + { MockDatabaseObserver::getMockObserverObject()->removeGateway(gatewayID); }; + dboRemoveConverter = [&](const am_converterID_t converterID) + { MockDatabaseObserver::getMockObserverObject()->removeConverter(converterID); }; + dboRemoveCrossfader = [&](const am_crossfaderID_t crossfaderID) + { MockDatabaseObserver::getMockObserverObject()->removeCrossfader(crossfaderID); }; + dboMainConnectionStateChanged = [&](const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState) + { MockDatabaseObserver::getMockObserverObject()->mainConnectionStateChanged(connectionID, connectionState); }; + dboMainSinkSoundPropertyChanged = [&](const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty) + { MockDatabaseObserver::getMockObserverObject()->mainSinkSoundPropertyChanged(sinkID, SoundProperty); }; + dboMainSourceSoundPropertyChanged = [&](const am_sourceID_t sourceID, const am_MainSoundProperty_s& SoundProperty) + { MockDatabaseObserver::getMockObserverObject()->mainSourceSoundPropertyChanged(sourceID, SoundProperty); }; + dboSinkAvailabilityChanged = [&](const am_sinkID_t sinkID, const am_Availability_s& availability) + { MockDatabaseObserver::getMockObserverObject()->sinkAvailabilityChanged(sinkID, availability); }; + dboSourceAvailabilityChanged = [&](const am_sourceID_t sourceID, const am_Availability_s& availability) + { MockDatabaseObserver::getMockObserverObject()->sourceAvailabilityChanged(sourceID, availability); }; + dboVolumeChanged = [&](const am_sinkID_t sinkID, const am_mainVolume_t volume) + { MockDatabaseObserver::getMockObserverObject()->volumeChanged(sinkID, volume); }; + dboSinkMuteStateChanged = [&](const am_sinkID_t sinkID, const am_MuteState_e muteState) + { MockDatabaseObserver::getMockObserverObject()->sinkMuteStateChanged(sinkID, muteState); }; + dboSystemPropertyChanged = [&](const am_SystemProperty_s& SystemProperty) + { MockDatabaseObserver::getMockObserverObject()->systemPropertyChanged(SystemProperty); }; + dboTimingInformationChanged = [&](const am_mainConnectionID_t mainConnection, const am_timeSync_t time) + { MockDatabaseObserver::getMockObserverObject()->timingInformationChanged(mainConnection,time); }; + dboSinkUpdated = [&](const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible) + { MockDatabaseObserver::getMockObserverObject()->sinkUpdated(sinkID,sinkClassID,listMainSoundProperties, visible); }; + dboSourceUpdated = [&](const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible) + { MockDatabaseObserver::getMockObserverObject()->sourceUpdated(sourceID,sourceClassID,listMainSoundProperties, visible); }; + dboSinkMainNotificationConfigurationChanged = [&](const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) + { MockDatabaseObserver::getMockObserverObject()->sinkMainNotificationConfigurationChanged(sinkID,mainNotificationConfiguration); }; + dboSourceMainNotificationConfigurationChanged = [&](const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) + { MockDatabaseObserver::getMockObserverObject()->sourceMainNotificationConfigurationChanged(sourceID,mainNotificationConfiguration); }; -CAmDatabaseObserver::~CAmDatabaseObserver() {} +} +CAmDatabaseObserver::~CAmDatabaseObserver() {} -void CAmDatabaseObserver::numberOfSinkClassesChanged() -{ MockDatabaseObserver::getMockObserverObject()->numberOfSinkClassesChanged(); } -void CAmDatabaseObserver::numberOfSourceClassesChanged() -{ MockDatabaseObserver::getMockObserverObject()->numberOfSourceClassesChanged(); } -void CAmDatabaseObserver::newSink(const am_Sink_s& sink) -{ MockDatabaseObserver::getMockObserverObject()->newSink(sink); } -void CAmDatabaseObserver::newSource(const am_Source_s& source) -{ MockDatabaseObserver::getMockObserverObject()->newSource(source); } -void CAmDatabaseObserver::newDomain(const am_Domain_s& domain) -{ MockDatabaseObserver::getMockObserverObject()->newDomain(domain); } -void CAmDatabaseObserver::newGateway(const am_Gateway_s& gateway) -{ MockDatabaseObserver::getMockObserverObject()->newGateway(gateway); } -void CAmDatabaseObserver::newConverter(const am_Converter_s& coverter) -{ MockDatabaseObserver::getMockObserverObject()->newConverter(coverter); } -void CAmDatabaseObserver::newCrossfader(const am_Crossfader_s& crossfader) -{ MockDatabaseObserver::getMockObserverObject()->newCrossfader(crossfader); } -void CAmDatabaseObserver::newMainConnection(const am_MainConnectionType_s& mainConnection) -{ MockDatabaseObserver::getMockObserverObject()->newMainConnection(mainConnection); } -void CAmDatabaseObserver::removedMainConnection(const am_mainConnectionID_t mainConnection) -{ MockDatabaseObserver::getMockObserverObject()->removedMainConnection(mainConnection); } -void CAmDatabaseObserver::removedSink(const am_sinkID_t sinkID, const bool visible) -{ MockDatabaseObserver::getMockObserverObject()->removedSink(sinkID, visible); } -void CAmDatabaseObserver::removedSource(const am_sourceID_t sourceID, const bool visible) -{ MockDatabaseObserver::getMockObserverObject()->removedSource(sourceID, visible); } -void CAmDatabaseObserver::removeDomain(const am_domainID_t domainID) -{ MockDatabaseObserver::getMockObserverObject()->removeDomain(domainID); } -void CAmDatabaseObserver::removeGateway(const am_gatewayID_t gatewayID) -{ MockDatabaseObserver::getMockObserverObject()->removeGateway(gatewayID); } -void CAmDatabaseObserver::removeConverter(const am_converterID_t converterID) -{ MockDatabaseObserver::getMockObserverObject()->removeConverter(converterID); } -void CAmDatabaseObserver::removeCrossfader(const am_crossfaderID_t crossfaderID) -{ MockDatabaseObserver::getMockObserverObject()->removeCrossfader(crossfaderID); } -void CAmDatabaseObserver::mainConnectionStateChanged(const am_mainConnectionID_t connectionID, const am_ConnectionState_e connectionState) -{ MockDatabaseObserver::getMockObserverObject()->mainConnectionStateChanged(connectionID, connectionState); } -void CAmDatabaseObserver::mainSinkSoundPropertyChanged(const am_sinkID_t sinkID, const am_MainSoundProperty_s& SoundProperty) -{ MockDatabaseObserver::getMockObserverObject()->mainSinkSoundPropertyChanged(sinkID, SoundProperty); } -void CAmDatabaseObserver::mainSourceSoundPropertyChanged(const am_sourceID_t sourceID, const am_MainSoundProperty_s& SoundProperty) -{ MockDatabaseObserver::getMockObserverObject()->mainSourceSoundPropertyChanged(sourceID, SoundProperty); } -void CAmDatabaseObserver::sinkAvailabilityChanged(const am_sinkID_t sinkID, const am_Availability_s& availability) -{ MockDatabaseObserver::getMockObserverObject()->sinkAvailabilityChanged(sinkID, availability); } -void CAmDatabaseObserver::sourceAvailabilityChanged(const am_sourceID_t sourceID, const am_Availability_s& availability) -{ MockDatabaseObserver::getMockObserverObject()->sourceAvailabilityChanged(sourceID, availability); } -void CAmDatabaseObserver::volumeChanged(const am_sinkID_t sinkID, const am_mainVolume_t volume) -{ MockDatabaseObserver::getMockObserverObject()->volumeChanged(sinkID, volume); } -void CAmDatabaseObserver::sinkMuteStateChanged(const am_sinkID_t sinkID, const am_MuteState_e muteState) -{ MockDatabaseObserver::getMockObserverObject()->sinkMuteStateChanged(sinkID, muteState); } -void CAmDatabaseObserver::systemPropertyChanged(const am_SystemProperty_s& SystemProperty) -{ MockDatabaseObserver::getMockObserverObject()->systemPropertyChanged(SystemProperty); } -void CAmDatabaseObserver::timingInformationChanged(const am_mainConnectionID_t mainConnection, const am_timeSync_t time) -{ MockDatabaseObserver::getMockObserverObject()->timingInformationChanged(mainConnection,time); } -void CAmDatabaseObserver::sinkUpdated(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listMainSoundProperties, const bool visible) -{ MockDatabaseObserver::getMockObserverObject()->sinkUpdated(sinkID,sinkClassID,listMainSoundProperties, visible); } -void CAmDatabaseObserver::sourceUpdated(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listMainSoundProperties, const bool visible) -{ MockDatabaseObserver::getMockObserverObject()->sourceUpdated(sourceID,sourceClassID,listMainSoundProperties, visible); } -void CAmDatabaseObserver::sinkMainNotificationConfigurationChanged(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ MockDatabaseObserver::getMockObserverObject()->sinkMainNotificationConfigurationChanged(sinkID,mainNotificationConfiguration); } -void CAmDatabaseObserver::sourceMainNotificationConfigurationChanged(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ MockDatabaseObserver::getMockObserverObject()->sourceMainNotificationConfigurationChanged(sourceID,mainNotificationConfiguration); } } diff --git a/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.h b/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.h new file mode 100644 index 0000000..12ba32e --- /dev/null +++ b/AudioManagerCore/test/AmMapHandlerTest/CAmTestDatabaseObserver.h @@ -0,0 +1,53 @@ +/** + * SPDX license identifier: MPL-2.0 + * + * Copyright (C) 2012, BMW AG + * + * This file is part of GENIVI Project AudioManager. + * + * Contributions are licensed to the GENIVI Alliance under one or more + * Contribution License Agreements. + * + * \copyright + * This Source Code Form is subject to the terms of the + * Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * + * \author Christian Linke, christian.linke@bmw.de BMW 2011,2012 + * + * \file CAmDatabaseObserver.h + * For further information see http://www.genivi.org/. + * + */ + +#ifndef DATABASEOBSERVER_H_ +#define DATABASEOBSERVER_H_ + +#include "audiomanagertypes.h" +#include +#include +#include +#include "CAmDatabaseHandlerMap.h" + + +namespace am +{ + + +/** + * This class observes the Database and notifies other classes about important events, mainly the CommandSender. + */ + +class CAmDatabaseObserver: public CAmDatabaseHandlerMap::AmDatabaseObserverCallbacks +{ +public: + explicit CAmDatabaseObserver(); + ~CAmDatabaseObserver(); + +private: +}; + +} + +#endif /* DATABASEOBSERVER_H_ */ diff --git a/AudioManagerCore/test/AmMapHandlerTest/MockDatabaseObserver.h b/AudioManagerCore/test/AmMapHandlerTest/MockDatabaseObserver.h index da1b3b4..82e1ea4 100644 --- a/AudioManagerCore/test/AmMapHandlerTest/MockDatabaseObserver.h +++ b/AudioManagerCore/test/AmMapHandlerTest/MockDatabaseObserver.h @@ -27,7 +27,7 @@ #include "gtest/gtest.h" #include "gmock/gmock.h" -#include "CAmDatabaseObserver.h" +#include "CAmTestDatabaseObserver.h" class CAmCommandSender; class CAmRoutingSender; diff --git a/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.cpp b/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.cpp index d656373..fbba011 100644 --- a/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.cpp +++ b/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.cpp @@ -41,16 +41,16 @@ CAmRouterMapTest::CAmRouterMapTest() : pDatabaseHandler(), pRouter(&pDatabaseHandler, &pControlSender), // pRoutingSender(plistRoutingPluginDirs,dynamic_cast( &pDatabaseHandler )), // - pCommandSender(plistCommandPluginDirs), // + pCommandSender(plistCommandPluginDirs, &pSocketHandler), // pMockInterface(), // pMockControlInterface(), // pRoutingInterfaceBackdoor(), // pCommandInterfaceBackdoor(), // pControlInterfaceBackdoor(), // - pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender,&pSocketHandler, &pRouter), // - pObserver(&pCommandSender, &pRoutingSender, &pSocketHandler) + pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender,&pSocketHandler, &pRouter) { - pDatabaseHandler.registerObserver(&pObserver); + pDatabaseHandler.registerObserver(&pRoutingSender); + pDatabaseHandler.registerObserver(&pCommandSender); pCommandInterfaceBackdoor.injectInterface(&pCommandSender, &pMockInterface); pControlInterfaceBackdoor.replaceController(&pControlSender, &pMockControlInterface); } diff --git a/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.h b/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.h index a3cead1..879f47c 100644 --- a/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.h +++ b/AudioManagerCore/test/AmRouterMapTest/CAmRouterMapTest.h @@ -34,7 +34,6 @@ #include "CAmDatabaseHandlerMap.h" #include "CAmControlReceiver.h" #include "CAmControlSender.h" -#include "CAmDatabaseObserver.h" #include "CAmRoutingSender.h" #include "CAmRouter.h" #include "CAmSocketHandler.h" @@ -67,7 +66,6 @@ public: IAmCommandBackdoor pCommandInterfaceBackdoor; IAmControlBackdoor pControlInterfaceBackdoor; CAmControlReceiver pControlReceiver; - CAmDatabaseObserver pObserver; CAmCommonFunctions pCF; void SetUp(); void TearDown(); diff --git a/AudioManagerCore/test/AmRouterTest/CAmRouterTest.cpp b/AudioManagerCore/test/AmRouterTest/CAmRouterTest.cpp index b4ab247..ea1f452 100644 --- a/AudioManagerCore/test/AmRouterTest/CAmRouterTest.cpp +++ b/AudioManagerCore/test/AmRouterTest/CAmRouterTest.cpp @@ -38,16 +38,16 @@ CAmRouterTest::CAmRouterTest() : pDatabaseHandler(), pRouter(&pDatabaseHandler, &pControlSender), // pRoutingSender(plistRoutingPluginDirs,dynamic_cast( &pDatabaseHandler )), // - pCommandSender(plistCommandPluginDirs), // + pCommandSender(plistCommandPluginDirs, &pSocketHandler), // pMockInterface(), // pMockControlInterface(), // pRoutingInterfaceBackdoor(), // pCommandInterfaceBackdoor(), // pControlInterfaceBackdoor(), // - pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender,&pSocketHandler, &pRouter), // - pObserver(&pCommandSender, &pRoutingSender, &pSocketHandler) + pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender,&pSocketHandler, &pRouter) { - pDatabaseHandler.registerObserver(&pObserver); + pDatabaseHandler.registerObserver(&pRoutingSender); + pDatabaseHandler.registerObserver(&pCommandSender); pCommandInterfaceBackdoor.injectInterface(&pCommandSender, &pMockInterface); pControlInterfaceBackdoor.replaceController(&pControlSender, &pMockControlInterface); } diff --git a/AudioManagerCore/test/AmRouterTest/CAmRouterTest.h b/AudioManagerCore/test/AmRouterTest/CAmRouterTest.h index 4a4e35b..ad3ed68 100644 --- a/AudioManagerCore/test/AmRouterTest/CAmRouterTest.h +++ b/AudioManagerCore/test/AmRouterTest/CAmRouterTest.h @@ -35,7 +35,6 @@ #include "CAmDatabaseHandlerMap.h" #include "CAmControlReceiver.h" #include "CAmControlSender.h" -#include "CAmDatabaseObserver.h" #include "CAmRoutingSender.h" #include "CAmRouter.h" #include "CAmSocketHandler.h" @@ -68,7 +67,6 @@ public: IAmCommandBackdoor pCommandInterfaceBackdoor; IAmControlBackdoor pControlInterfaceBackdoor; CAmControlReceiver pControlReceiver; - CAmDatabaseObserver pObserver; CAmCommonFunctions pCF; void SetUp(); void TearDown(); diff --git a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp index 2a166cf..2cd2b55 100644 --- a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp +++ b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.cpp @@ -35,17 +35,17 @@ CAmRoutingInterfaceTest::CAmRoutingInterfaceTest() : pSocketHandler(), // pDatabaseHandler(), // pRoutingSender(plistRoutingPluginDirs,dynamic_cast( &pDatabaseHandler )), // - pCommandSender(plistCommandPluginDirs), // + pCommandSender(plistCommandPluginDirs, &pSocketHandler), // pControlSender(), // pRouter(&pDatabaseHandler, &pControlSender), // pMockInterface(), // pRoutingInterfaceBackdoor(), // pCommandInterfaceBackdoor(), // pControlReceiver(&pDatabaseHandler, &pRoutingSender, &pCommandSender, &pSocketHandler, &pRouter), // - pObserver(&pCommandSender, &pRoutingSender, &pSocketHandler), // pRoutingReceiver(&pDatabaseHandler, &pRoutingSender, &pControlSender, &pSocketHandler) { - pDatabaseHandler.registerObserver(&pObserver); + pDatabaseHandler.registerObserver(&pRoutingSender); + pDatabaseHandler.registerObserver(&pCommandSender); pRoutingInterfaceBackdoor.unloadPlugins(&pRoutingSender); pRoutingInterfaceBackdoor.injectInterface(&pRoutingSender, &pMockInterface, "mock"); pControlInterfaceBackdoor.replaceController(&pControlSender, &pMockControlInterface); diff --git a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.h b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.h index 6233c17..78497ca 100644 --- a/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.h +++ b/AudioManagerCore/test/AmRoutingInterfaceTest/CAmRoutingInterfaceTest.h @@ -33,7 +33,6 @@ #include "CAmControlReceiver.h" #include "CAmRoutingReceiver.h" #include "CAmControlSender.h" -#include "CAmDatabaseObserver.h" #include "CAmRouter.h" #include "../IAmRoutingBackdoor.h" #include "../IAmCommandBackdoor.h" @@ -66,7 +65,6 @@ public: IAmCommandBackdoor pCommandInterfaceBackdoor; IAmControlBackdoor pControlInterfaceBackdoor; CAmControlReceiver pControlReceiver; - CAmDatabaseObserver pObserver; CAmCommonFunctions pCF; void SetUp(); void TearDown(); diff --git a/AudioManagerCore/test/CMakeLists.txt b/AudioManagerCore/test/CMakeLists.txt index 47658b4..4459e14 100644 --- a/AudioManagerCore/test/CMakeLists.txt +++ b/AudioManagerCore/test/CMakeLists.txt @@ -21,7 +21,7 @@ cmake_minimum_required(VERSION 3.0) set(EXECUTABLE_OUTPUT_PATH ${TEST_EXECUTABLE_OUTPUT_PATH}) #make aunt google stop complaining -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNIT_TEST=1 -DDLT_CONTEXT=AudioManager -Wno-unused-local-typedefs -lz -ldl") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNIT_TEST=1 -DDLT_CONTEXT=AudioManager -Wno-unused-local-typedefs -lz -ldl -g -O0") add_subdirectory (AmControlInterfaceTest) add_subdirectory (AmMapHandlerTest) diff --git a/AudioManagerDaemon/src/main.cpp b/AudioManagerDaemon/src/main.cpp index 6f5c273..26d7cea 100755 --- a/AudioManagerDaemon/src/main.cpp +++ b/AudioManagerDaemon/src/main.cpp @@ -55,7 +55,6 @@ #include "CAmRoutingReceiver.h" #include "CAmCommandReceiver.h" #include "CAmControlReceiver.h" -#include "CAmDatabaseObserver.h" #include "CAmDltWrapper.h" #include "CAmSocketHandler.h" #include "CAmCommandLineSingleton.h" @@ -284,10 +283,10 @@ void mainProgram(int argc, char *argv[]) //later when the plugins are started, the commandline is already parsed and the objects defined before can be used to get the neccesary information CAmDatabaseHandlerMap iDatabaseHandler; - IAmDatabaseHandler *pDatabaseHandler = dynamic_cast( &iDatabaseHandler ); + IAmDatabaseHandler *pDatabaseHandler = dynamic_cast( &iDatabaseHandler ); CAmRoutingSender iRoutingSender(listRoutingPluginDirs,pDatabaseHandler); - CAmCommandSender iCommandSender(listCommandPluginDirs); + CAmCommandSender iCommandSender(listCommandPluginDirs, &iSocketHandler); CAmControlSender iControlSender(controllerPlugin.getValue(),&iSocketHandler); try @@ -332,11 +331,10 @@ CAmRouter iRouter(pDatabaseHandler, &iControlSender); #endif /*WITH_DBUS_WRAPPER*/ CAmControlReceiver iControlReceiver(pDatabaseHandler,&iRoutingSender,&iCommandSender,&iSocketHandler, &iRouter); -CAmDatabaseObserver iObserver(&iCommandSender,&iRoutingSender, &iSocketHandler); - - -iDatabaseHandler.registerObserver(&iObserver); +iDatabaseHandler.registerObserver(&iRoutingSender); +iDatabaseHandler.registerObserver(&iCommandSender); +iDatabaseHandler.registerObserver(&iRouter); //startup all the Plugins and Interfaces //at this point, commandline arguments can be parsed iControlSender.startupController(&iControlReceiver); -- cgit v1.2.1