From 67b6d070bdea90463aab419d516186f498ebc6d6 Mon Sep 17 00:00:00 2001 From: Aleksandar Donchev Date: Tue, 3 Sep 2013 18:09:49 +0200 Subject: * AmMapHanlderTest - added tests for the callbacks in CAmDatabaseObserver. * An object ID added to the response whenever E_ALREADY_EXISTS is returned in CAmDatabasehandlerMap Signed-off-by: Christian Linke --- AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp | 150 +++++++++++++---------- 1 file changed, 88 insertions(+), 62 deletions(-) (limited to 'AudioManagerDaemon/src') diff --git a/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp b/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp index 3e83cc5..505aa96 100644 --- a/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp +++ b/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp @@ -94,6 +94,27 @@ struct CAmComparatorFlag } }; +/** + * \brief Returns an object matching predicate. + * + * Convenient method for searching in a given map. + * + * @param map Map reference. + * @param comparator Search predicate. + * @return NULL or pointer to the found object. + */ +template const TReturn * objectMatchingPredicate(const std::unordered_map & map, + std::function & comparator) +{ + typename std::unordered_map::const_iterator elementIterator = map.begin(); + for (;elementIterator != map.end(); ++elementIterator) + { + if( comparator(elementIterator->second) ) + return &elementIterator->second; + } + return NULL; +} + /** * \brief Returns the first object matching criteria. * @@ -111,17 +132,10 @@ TMapObjectType const * findFirstObjectMatchingCriteria(const std::unordered_map< TComparator & aComparator, void *context = NULL) { - typename std::unordered_map::const_iterator it = aMap.begin(); - TMapObjectType const * result = NULL; - for (; it != aMap.end(); ++it) - { - if (aComparator(it->second, aComparisonArgument, context)) - { - result = &it->second; - break; - } - } - return result; + std::function comparator = [&](const TMapObjectType & object)->bool{ + return aComparator(object, aComparisonArgument, context); + }; + return objectMatchingPredicate(aMap, comparator); } /* Domain */ @@ -425,12 +439,12 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, assert(!domainData.name.empty()); assert(!domainData.busname.empty()); assert(domainData.state>=DS_UNKNOWN && domainData.state<=DS_MAX); - //first check for a reserved domain CAmComparator comparator; am_Domain_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mDomainMap, domainData.name, comparator); int16_t nextID = 0; + if( NULL != reservedDomain ) { nextID = reservedDomain->domainID; @@ -438,9 +452,7 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, mMappedData.mDomainMap[nextID] = domainData; mMappedData.mDomainMap[nextID].domainID = nextID; mMappedData.mDomainMap[nextID].reserved = 0; - logInfo("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]); return (E_OK); @@ -452,9 +464,7 @@ am_Error_e CAmDatabaseHandlerMap::enterDomainDB(const am_Domain_s & domainData, domainID = nextID; mMappedData.mDomainMap[nextID] = domainData; mMappedData.mDomainMap[nextID].domainID = nextID; - logInfo("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]); return (E_OK); @@ -512,21 +522,17 @@ am_Error_e CAmDatabaseHandlerMap::enterMainConnectionDB(const am_MainConnection_ //now check the connectionTable for all connections in the route. IF connectionID exist delay = calculateDelayForRoute(mainConnectionData.listConnectionID); - + mMappedData.mMainConnectionMap[nextID].delay = delay; logInfo("DatabaseHandler::enterMainConnectionDB entered new mainConnection with sourceID", mainConnectionData.sourceID, "sinkID:", mainConnectionData.sinkID, "delay:", delay, "assigned ID:", connectionID); if (mpDatabaseObserver) { am_MainConnectionType_s mainConnection; - mainConnection.mainConnectionID = connectionID; - mainConnection.connectionState = mainConnectionData.connectionState; - mainConnection.delay = delay; - mainConnection.sinkID = mainConnectionData.sinkID; - mainConnection.sourceID = mainConnectionData.sourceID; + mMappedData.mMainConnectionMap[nextID].getMainConnectionType(mainConnection); mpDatabaseObserver->newMainConnection(mainConnection); - mpDatabaseObserver->mainConnectionStateChanged(connectionID, mainConnectionData.connectionState); + mpDatabaseObserver->mainConnectionStateChanged(connectionID, mMappedData.mMainConnectionMap[nextID].connectionState); } - mMappedData.mMainConnectionMap[nextID].delay = delay; + //finally, we update the delay value for the maintable if (delay == 0) delay = -1; @@ -586,7 +592,10 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkDB(const am_Sink_s & sinkData, am_sin { //check if the ID already exists if (existSinkNameOrID(sinkData.sinkID, sinkData.name)) + { + sinkID = sinkData.sinkID; return (E_ALREADY_EXISTS); + } } result = insertSinkDB(sinkData, temp_SinkID); if( false == result ) @@ -601,7 +610,7 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkDB(const am_Sink_s & sinkData, am_sin mMappedData.mSinkMap[temp_SinkIndex].sinkID = temp_SinkID; sinkID = temp_SinkID; - am_Sink_s sink = mMappedData.mSinkMap[temp_SinkID]; + am_Sink_s & sink = mMappedData.mSinkMap[temp_SinkID]; logInfo("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) @@ -646,7 +655,10 @@ am_Error_e CAmDatabaseHandlerMap::enterCrossfaderDB(const am_Crossfader_s & cros { //check if the ID already exists if (existcrossFader(crossfaderData.crossfaderID)) + { + crossfaderID = crossfaderData.crossfaderID; return (E_ALREADY_EXISTS); + } } result = insertCrossfaderDB(crossfaderData, temp_CrossfaderID); if( false == result ) @@ -659,14 +671,12 @@ am_Error_e CAmDatabaseHandlerMap::enterCrossfaderDB(const am_Crossfader_s & cros mFirstStaticCrossfader = false; } - mMappedData.mCrossfaderMap[temp_CrossfaderIndex].crossfaderID = temp_CrossfaderID; + mMappedData.mCrossfaderMap[temp_CrossfaderIndex].crossfaderID = temp_CrossfaderID; crossfaderID = temp_CrossfaderID; logInfo("DatabaseHandler::enterCrossfaderDB entered new crossfader with name=", crossfaderData.name, "sinkA= ", crossfaderData.sinkID_A, "sinkB=", crossfaderData.sinkID_B, "source=", crossfaderData.sourceID, "assigned ID:", crossfaderID); - am_Crossfader_s crossfader(crossfaderData); - crossfader.crossfaderID = crossfaderID; if (mpDatabaseObserver) - mpDatabaseObserver->newCrossfader(crossfader); + mpDatabaseObserver->newCrossfader(mMappedData.mCrossfaderMap[temp_CrossfaderIndex]); return (E_OK); } @@ -713,7 +723,10 @@ am_Error_e CAmDatabaseHandlerMap::enterGatewayDB(const am_Gateway_s & gatewayDat { //check if the ID already exists if (existGateway(gatewayData.gatewayID)) + { + gatewayID = gatewayData.gatewayID; return (E_ALREADY_EXISTS); + } } result = insertGatewayDB(gatewayData, temp_GatewayID); if( false == result ) @@ -729,10 +742,8 @@ am_Error_e CAmDatabaseHandlerMap::enterGatewayDB(const am_Gateway_s & gatewayDat gatewayID = temp_GatewayID; logInfo("DatabaseHandler::enterGatewayDB entered new gateway with name", gatewayData.name, "sourceID:", gatewayData.sourceID, "sinkID:", gatewayData.sinkID, "assigned ID:", gatewayID); - am_Gateway_s gateway = gatewayData; - gateway.gatewayID = gatewayID; if (mpDatabaseObserver) - mpDatabaseObserver->newGateway(gateway); + mpDatabaseObserver->newGateway(mMappedData.mGatewayMap[temp_GatewayIndex]); return (E_OK); } @@ -804,7 +815,10 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s & sourceData, { //check if the ID already exists if (existSourceNameOrID(sourceData.sourceID, sourceData.name)) + { + sourceID = sourceData.sourceID; return (E_ALREADY_EXISTS); + } } result = insertSourceDB(sourceData, temp_SourceID); if( false == result ) @@ -822,10 +836,8 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceDB(const am_Source_s & sourceData, logInfo("DatabaseHandler::enterSourceDB entered new source with name", sourceData.name, "domainID:", sourceData.domainID, "classID:", sourceData.sourceClassID, "visible:", sourceData.visible, "assigned ID:", sourceID); - am_Source_s source = sourceData; - source.sourceID = sourceID; if (mpDatabaseObserver) - mpDatabaseObserver->newSource(source); + mpDatabaseObserver->newSource(mMappedData.mSourceMap[temp_SourceIndex]); return (E_OK); } @@ -884,7 +896,10 @@ am_Error_e CAmDatabaseHandlerMap::enterSinkClassDB(const am_SinkClass_s & sinkCl { //check if the ID already exists if (existSinkClass(sinkClass.sinkClassID)) + { + sinkClassID = sinkClass.sinkClassID; return (E_ALREADY_EXISTS); + } } result = insertSinkClassDB(sinkClass, temp_SinkClassID); if( false == result ) @@ -937,7 +952,10 @@ am_Error_e CAmDatabaseHandlerMap::enterSourceClassDB(am_sourceClass_t & sourceCl { //check if the ID already exists if (existSourceClass(sourceClass.sourceClassID)) + { + sourceClassID = sourceClass.sourceClassID; return (E_ALREADY_EXISTS); + } } result = insertSourceClassDB(temp_SourceClassID, sourceClass); if( false == result ) @@ -1042,7 +1060,7 @@ am_Error_e CAmDatabaseHandlerMap::changeSinkAvailabilityDB(const am_Availability logInfo("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); - if (mpDatabaseObserver && sourceVisible(sinkID)) + if (mpDatabaseObserver && sinkVisible(sinkID)) mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); return (E_OK); } @@ -1789,7 +1807,8 @@ am_Error_e CAmDatabaseHandlerMap::changeDelayMainConnection(const am_timeSync_t if (!existMainConnection(connectionID)) return (E_NON_EXISTENT); mMappedData.mMainConnectionMap[connectionID].delay = delay; - + if (mpDatabaseObserver) + mpDatabaseObserver->timingInformationChanged(connectionID, delay); return (E_OK); } @@ -1825,18 +1844,7 @@ bool CAmDatabaseHandlerMap::existSource(const am_sourceID_t sourceID) const */ bool CAmDatabaseHandlerMap::existSourceNameOrID(const am_sourceID_t sourceID, const std::string & name) const { - bool returnVal = false; - CAmMapSource::const_iterator elementIterator = mMappedData.mSourceMap.begin(); - for (;elementIterator != mMappedData.mSourceMap.end(); ++elementIterator) - { - if( 0==elementIterator->second.reserved && - (sourceID==elementIterator->second.sourceID || name.compare(elementIterator->second.name)==0)) - { - returnVal = true; - break; - } - } - return (returnVal); + return sourceWithNameOrID(sourceID, name); } /** @@ -1870,6 +1878,36 @@ bool CAmDatabaseHandlerMap::existSink(const am_sinkID_t sinkID) const return (returnVal); } +/** + * returns source with given ID or the name if exists + * @param sourceID the ID + * @param name the name + * @return source structure if exists. + */ +const CAmDatabaseHandlerMap::am_Source_Database_s * CAmDatabaseHandlerMap::sourceWithNameOrID(const am_sourceID_t sourceID, const std::string & name) const +{ + std::function comparator = [&](const CAmDatabaseHandlerMap::am_Source_Database_s & source)->bool{ + return ( 0==source.reserved && + (sourceID==source.sourceID || name.compare(source.name)==0)); + }; + return objectMatchingPredicate(mMappedData.mSourceMap, comparator); +} + +/** + * returns sink with given ID or the name if exists + * @param sinkID the ID + * @param name the name + * @return sink structure if exists. + */ +const CAmDatabaseHandlerMap::am_Sink_Database_s * CAmDatabaseHandlerMap::sinkWithNameOrID(const am_sinkID_t sinkID, const std::string & name) const +{ + std::function comparator = [&](const CAmDatabaseHandlerMap::am_Sink_Database_s & sink)->bool{ + return ( 0==sink.reserved && + (sinkID==sink.sinkID || name.compare(sink.name)==0)); + }; + return objectMatchingPredicate(mMappedData.mSinkMap, comparator); +} + /** * checks if a sink with the ID or the name exists * @param sinkID the ID @@ -1878,19 +1916,7 @@ bool CAmDatabaseHandlerMap::existSink(const am_sinkID_t sinkID) const */ bool CAmDatabaseHandlerMap::existSinkNameOrID(const am_sinkID_t sinkID, const std::string & name) const { - bool returnVal = false; - CAmMapSink::const_iterator elementIterator = mMappedData.mSinkMap.begin(); - for (;elementIterator != mMappedData.mSinkMap.end(); ++elementIterator) - { - if( 0==elementIterator->second.reserved && - (sinkID==elementIterator->second.sinkID || name.compare(elementIterator->second.name)==0)) - { - returnVal = true; - break; - } - } - - return (returnVal); + return sinkWithNameOrID( sinkID, name)!=NULL; } /** -- cgit v1.2.1