From 9dfa70416411055a86a9fd7eba828c65bea48325 Mon Sep 17 00:00:00 2001 From: Aleksander Donchev Date: Wed, 10 Jul 2013 13:58:50 +0200 Subject: Renamed CAmDatabaseHandlerInterface to IAmDatabaseHandler, CAmDatabaseHandler to CAmDatabaseHandlerSQLite, CAmMapHandler to CAmDatabaseHandlerMap. std::map changed to std::unordered_map in CAmDatabaseHandlerMap. Added a cmake definition to the map handler configuration for preallocation of space in the source and sink maps. Signed-off-by: Christian Linke --- AudioManagerDaemon/include/CAmDatabaseHandler.h | 176 - .../include/CAmDatabaseHandlerInterface.h | 195 - .../include/CAmDatabaseHandlerSQLite.h | 176 + AudioManagerDaemon/include/CAmMapHandler.h | 316 -- AudioManagerDaemon/include/IAmDatabaseHandler.h | 195 + AudioManagerDaemon/src/CAmDatabaseHandler.cpp | 5042 -------------------- AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp | 2739 +++++++++++ .../src/CAmDatabaseHandlerSQLite.cpp | 5042 ++++++++++++++++++++ AudioManagerDaemon/src/CAmMapHandler.cpp | 2739 ----------- 9 files changed, 8152 insertions(+), 8468 deletions(-) delete mode 100644 AudioManagerDaemon/include/CAmDatabaseHandler.h delete mode 100644 AudioManagerDaemon/include/CAmDatabaseHandlerInterface.h create mode 100644 AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h delete mode 100644 AudioManagerDaemon/include/CAmMapHandler.h create mode 100644 AudioManagerDaemon/include/IAmDatabaseHandler.h delete mode 100644 AudioManagerDaemon/src/CAmDatabaseHandler.cpp create mode 100644 AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp create mode 100644 AudioManagerDaemon/src/CAmDatabaseHandlerSQLite.cpp delete mode 100644 AudioManagerDaemon/src/CAmMapHandler.cpp (limited to 'AudioManagerDaemon') diff --git a/AudioManagerDaemon/include/CAmDatabaseHandler.h b/AudioManagerDaemon/include/CAmDatabaseHandler.h deleted file mode 100644 index 1adc4d6..0000000 --- a/AudioManagerDaemon/include/CAmDatabaseHandler.h +++ /dev/null @@ -1,176 +0,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 Mueller, christian.ei.mueller@bmw.de BMW 2011,2012 - * - * \file CAmDatabaseHandler.h - * For further information see http://www.genivi.org/. - * - */ - -#ifndef DATABASEHANDLER_H_ -#define DATABASEHANDLER_H_ - -#include "CAmDatabaseHandlerInterface.h" -#include -#include - -namespace am -{ - -class CAmDatabaseObserver; -class CAmRoutingTree; -class CAmRoutingTreeItem; - -//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 -//todo: If the sink is part of a gateway, the listconnectionFormats is copied to the gatewayInformation. Check this statement for sinks & sources -//todo: exchange last_insert_row id to be more safe -//todo: create test to ensure uniqueness of names throughout the database -//todo: enforce the uniqueness of names - -/** - * This class handles and abstracts the database - */ -class CAmDatabaseHandler : public CAmDatabaseHandlerInterface -{ -private: - am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const; //!< calculates a new main connection delay - bool sqQuery(const std::string& query); //!< queries the database - bool openDatabase(); //!< opens the database - void createTables(); //!< creates all tables from the static table - sqlite3 *mpDatabase; //!< pointer to the database - std::string mPath; //!< path to the database - -public: - CAmDatabaseHandler(); - CAmDatabaseHandler(std::string databasePath); - ~CAmDatabaseHandler(); - 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); - am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); - am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); - am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); - am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID); - am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); - am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass); - am_Error_e enterSystemProperties(const std::vector& listSystemProperties); - am_Error_e changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID); - am_Error_e changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState); - am_Error_e changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID); - am_Error_e changeSinkAvailabilityDB(const am_Availability_s& availability, const am_sinkID_t sinkID); - am_Error_e changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID); - am_Error_e changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID); - am_Error_e changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sinkID_t sinkID); - am_Error_e changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sourceID_t sourceID); - am_Error_e changeSourceSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sourceID_t sourceID); - am_Error_e changeSinkSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sinkID_t sinkID); - am_Error_e changeSourceAvailabilityDB(const am_Availability_s& availability, const am_sourceID_t sourceID); - am_Error_e changeSystemPropertyDB(const am_SystemProperty_s& property); - am_Error_e changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID); - am_Error_e changeSinkClassInfoDB(const am_SinkClass_s& sinkClass); - am_Error_e changeSourceClassInfoDB(const am_SourceClass_s& sourceClass); - am_Error_e changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay); - am_Error_e changeConnectionFinal(const am_connectionID_t connectionID); - am_Error_e changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState); - am_Error_e changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume); - am_Error_e changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume); - am_Error_e changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink); - am_Error_e removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID); - am_Error_e removeSinkDB(const am_sinkID_t sinkID); - am_Error_e removeSourceDB(const am_sourceID_t sourceID); - am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); - am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); - am_Error_e removeDomainDB(const am_domainID_t domainID); - am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); - am_Error_e removeSourceClassDB(const am_sourceClass_t sourceClassID); - am_Error_e removeConnection(const am_connectionID_t connectionID); - am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const; - am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const; - am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; - am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; - am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; - am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; - am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const; - am_Error_e getSinkVolume(const am_sinkID_t sinkID, am_volume_t& volume) const; - am_Error_e getSourceVolume(const am_sourceID_t sourceID, am_volume_t& volume) const; - am_Error_e getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t& value) const; - am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t& value) const; - am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector& listSinkID) const; - am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector& listSourceID) const; - am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; - am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; - am_Error_e getListMainConnections(std::vector& listMainConnections) const; - am_Error_e getListDomains(std::vector& listDomains) const; - am_Error_e getListConnections(std::vector& listConnections) const; - am_Error_e getListSinks(std::vector& listSinks) const; - am_Error_e getListSources(std::vector& lisSources) const; - am_Error_e getListSourceClasses(std::vector& listSourceClasses) const; - am_Error_e getListCrossfaders(std::vector& listCrossfaders) const; - am_Error_e getListGateways(std::vector& listGateways) const; - am_Error_e getListSinkClasses(std::vector& listSinkClasses) const; - am_Error_e getListVisibleMainConnections(std::vector& listConnections) const; - am_Error_e getListMainSinks(std::vector& listMainSinks) const; - am_Error_e getListMainSources(std::vector& listMainSources) const; - am_Error_e getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundProperties) const; - am_Error_e getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSourceProperties) const; - am_Error_e getListSystemProperties(std::vector& listSystemProperties) const; - am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const; - am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const; - am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const; - am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const; - am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const; - am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const; - am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const; - am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const; - am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree); - am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID); - am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); - am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID); - am_Error_e peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID); - am_Error_e peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID); - am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); - am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); - am_Error_e getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations); - am_Error_e getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations); - am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); - am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); - am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix); - am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration); - am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration); - - bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const; - bool existcrossFader(const am_crossfaderID_t crossfaderID) const; - bool existConnection(const am_Connection_s & connection) const; - bool existConnectionID(const am_connectionID_t connectionID) const; - bool existSource(const am_sourceID_t sourceID) const; - bool existSourceNameOrID(const am_sourceID_t sourceID, const std::string& name) const; - bool existSourceName(const std::string& name) const; - bool existSink(const am_sinkID_t sinkID) const; - bool existSinkNameOrID(const am_sinkID_t sinkID, const std::string& name) const; - bool existSinkName(const std::string& name) const; - bool existDomain(const am_domainID_t domainID) const; - bool existGateway(const am_gatewayID_t gatewayID) 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; -}; - -} - -#endif /* DATABASEHANDLER_H_ */ diff --git a/AudioManagerDaemon/include/CAmDatabaseHandlerInterface.h b/AudioManagerDaemon/include/CAmDatabaseHandlerInterface.h deleted file mode 100644 index de50511..0000000 --- a/AudioManagerDaemon/include/CAmDatabaseHandlerInterface.h +++ /dev/null @@ -1,195 +0,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 Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2013 - * - * \file CAmDatabaseHandlerInterface.h - * For further information see http://www.genivi.org/. - * - */ - -#ifndef DATABASEHANDLERINTERFACE_H_ -#define DATABASEHANDLERINTERFACE_H_ - -#include "audiomanagertypes.h" -#include -#include -#include -#include - -namespace am -{ - -class CAmDatabaseObserver; -class CAmRoutingTree; -class CAmRoutingTreeItem; - -#define 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 -//todo: If the sink is part of a gateway, the listconnectionFormats is copied to the gatewayInformation. Check this statement for sinks & sources -//todo: exchange last_insert_row id to be more safe -//todo: create test to ensure uniqueness of names throughout the database -//todo: enforce the uniqueness of names - -typedef std::map > ListConnectionFormat; //!< type for list of connection formats - -/** - * This class handles and abstracts the database - */ - -class CAmDatabaseHandlerInterface -{ -protected: - virtual am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const = 0; //!< calculates a new main connection delay - CAmDatabaseObserver *mpDatabaseObserver; //!< pointer to the Observer - bool mFirstStaticSink; //!< bool for dynamic range handling - bool mFirstStaticSource; //!< bool for dynamic range handling - bool mFirstStaticGateway; //!< bool for dynamic range handling - bool mFirstStaticSinkClass; //!< bool for dynamic range handling - bool mFirstStaticSourceClass; //!< bool for dynamic range handling - bool mFirstStaticCrossfader; //!< bool for dynamic range handling - ListConnectionFormat mListConnectionFormat; //!< list of connection formats - -public: - CAmDatabaseHandlerInterface(): mpDatabaseObserver(NULL), // - mFirstStaticSink(true), // - mFirstStaticSource(true), // - mFirstStaticGateway(true), // - mFirstStaticSinkClass(true), // - mFirstStaticSourceClass(true), // - mFirstStaticCrossfader(true), // - mListConnectionFormat() - {}; - virtual ~CAmDatabaseHandlerInterface() {}; - - 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; - virtual am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID) = 0; - virtual am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID) = 0; - virtual am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID) = 0; - virtual am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) = 0; - virtual am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID) = 0; - virtual am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass) = 0; - virtual am_Error_e enterSystemProperties(const std::vector& listSystemProperties) = 0; - virtual am_Error_e changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) = 0; - virtual am_Error_e changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) = 0; - virtual am_Error_e changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) = 0; - virtual am_Error_e changeSinkAvailabilityDB(const am_Availability_s& availability, const am_sinkID_t sinkID) = 0; - virtual am_Error_e changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) = 0; - virtual am_Error_e changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) = 0; - virtual am_Error_e changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sinkID_t sinkID) = 0; - virtual am_Error_e changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sourceID_t sourceID) = 0; - virtual am_Error_e changeSourceSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sourceID_t sourceID) = 0; - virtual am_Error_e changeSinkSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sinkID_t sinkID) = 0; - virtual am_Error_e changeSourceAvailabilityDB(const am_Availability_s& availability, const am_sourceID_t sourceID) = 0; - virtual am_Error_e changeSystemPropertyDB(const am_SystemProperty_s& property) = 0; - virtual am_Error_e changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) = 0; - virtual am_Error_e changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) = 0; - virtual am_Error_e changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) = 0; - virtual am_Error_e changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) = 0; - virtual am_Error_e changeConnectionFinal(const am_connectionID_t connectionID) = 0; - virtual am_Error_e changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) = 0; - virtual am_Error_e changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) = 0; - virtual am_Error_e changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) = 0; - virtual am_Error_e changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) = 0; - virtual am_Error_e removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) = 0; - virtual am_Error_e removeSinkDB(const am_sinkID_t sinkID) = 0; - virtual am_Error_e removeSourceDB(const am_sourceID_t sourceID) = 0; - virtual am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID) = 0; - virtual am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID) = 0; - virtual am_Error_e removeDomainDB(const am_domainID_t domainID) = 0; - virtual am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID) = 0; - virtual am_Error_e removeSourceClassDB(const am_sourceClass_t sourceClassID) = 0; - virtual am_Error_e removeConnection(const am_connectionID_t connectionID) = 0; - virtual am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const = 0; - virtual am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const = 0; - virtual am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const = 0; - virtual am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const = 0; - virtual am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const = 0; - virtual am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const = 0; - virtual am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const = 0; - virtual am_Error_e getSinkVolume(const am_sinkID_t sinkID, am_volume_t& volume) const = 0; - 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_SoundPropertyType_e propertyType, int16_t& value) const = 0; - virtual am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t& value) const = 0; - virtual am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector& listSinkID) const = 0; - virtual am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector& listSourceID) const = 0; - virtual am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const = 0; - virtual am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const = 0; - virtual am_Error_e getListMainConnections(std::vector& listMainConnections) const = 0; - virtual am_Error_e getListDomains(std::vector& listDomains) const = 0; - virtual am_Error_e getListConnections(std::vector& listConnections) const = 0; - virtual am_Error_e getListSinks(std::vector& listSinks) const = 0; - virtual am_Error_e getListSources(std::vector& lisSources) const = 0; - virtual am_Error_e getListSourceClasses(std::vector& listSourceClasses) const = 0; - virtual am_Error_e getListCrossfaders(std::vector& listCrossfaders) const = 0; - virtual am_Error_e getListGateways(std::vector& listGateways) const = 0; - virtual am_Error_e getListSinkClasses(std::vector& listSinkClasses) const = 0; - virtual am_Error_e getListVisibleMainConnections(std::vector& listConnections) const = 0; - virtual am_Error_e getListMainSinks(std::vector& listMainSinks) const = 0; - virtual am_Error_e getListMainSources(std::vector& listMainSources) const = 0; - virtual am_Error_e getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundProperties) const = 0; - virtual am_Error_e getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSourceProperties) const = 0; - virtual am_Error_e getListSystemProperties(std::vector& listSystemProperties) const = 0; - virtual am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const = 0; - virtual am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const = 0; - virtual am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const = 0; - virtual am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const = 0; - virtual am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const = 0; - virtual am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const = 0; - virtual am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const = 0; - virtual am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const = 0; - virtual am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) = 0; - virtual am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID) = 0; - virtual am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID) = 0; - virtual am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID) = 0; - virtual am_Error_e peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID) = 0; - virtual am_Error_e peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID) = 0; - virtual am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) = 0; - virtual am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) = 0; - virtual am_Error_e getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) = 0; - virtual am_Error_e getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) = 0; - virtual am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; - virtual am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; - virtual am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, 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; - virtual bool existConnectionID(const am_connectionID_t connectionID) const = 0; - virtual bool existSource(const am_sourceID_t sourceID) const = 0; - virtual bool existSourceNameOrID(const am_sourceID_t sourceID, const std::string& name) const = 0; - virtual bool existSourceName(const std::string& name) const = 0; - virtual bool existSink(const am_sinkID_t sinkID) const = 0; - virtual bool existSinkNameOrID(const am_sinkID_t sinkID, const std::string& name) const = 0; - virtual bool existSinkName(const std::string& name) const = 0; - virtual bool existDomain(const am_domainID_t domainID) const = 0; - 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 void dump( std::ostream & output) { output << __FUNCTION__ << " not implemented!"; }; -}; - -} - -#endif /* DATABASEHANDLERINTERFACE_H_ */ diff --git a/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h b/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h new file mode 100644 index 0000000..1adc4d6 --- /dev/null +++ b/AudioManagerDaemon/include/CAmDatabaseHandlerSQLite.h @@ -0,0 +1,176 @@ +/** + * 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 Mueller, christian.ei.mueller@bmw.de BMW 2011,2012 + * + * \file CAmDatabaseHandler.h + * For further information see http://www.genivi.org/. + * + */ + +#ifndef DATABASEHANDLER_H_ +#define DATABASEHANDLER_H_ + +#include "CAmDatabaseHandlerInterface.h" +#include +#include + +namespace am +{ + +class CAmDatabaseObserver; +class CAmRoutingTree; +class CAmRoutingTreeItem; + +//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 +//todo: If the sink is part of a gateway, the listconnectionFormats is copied to the gatewayInformation. Check this statement for sinks & sources +//todo: exchange last_insert_row id to be more safe +//todo: create test to ensure uniqueness of names throughout the database +//todo: enforce the uniqueness of names + +/** + * This class handles and abstracts the database + */ +class CAmDatabaseHandler : public CAmDatabaseHandlerInterface +{ +private: + am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const; //!< calculates a new main connection delay + bool sqQuery(const std::string& query); //!< queries the database + bool openDatabase(); //!< opens the database + void createTables(); //!< creates all tables from the static table + sqlite3 *mpDatabase; //!< pointer to the database + std::string mPath; //!< path to the database + +public: + CAmDatabaseHandler(); + CAmDatabaseHandler(std::string databasePath); + ~CAmDatabaseHandler(); + 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); + am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); + am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); + am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); + am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID); + am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); + am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass); + am_Error_e enterSystemProperties(const std::vector& listSystemProperties); + am_Error_e changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID); + am_Error_e changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState); + am_Error_e changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID); + am_Error_e changeSinkAvailabilityDB(const am_Availability_s& availability, const am_sinkID_t sinkID); + am_Error_e changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID); + am_Error_e changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID); + am_Error_e changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sinkID_t sinkID); + am_Error_e changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sourceID_t sourceID); + am_Error_e changeSourceSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sourceID_t sourceID); + am_Error_e changeSinkSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sinkID_t sinkID); + am_Error_e changeSourceAvailabilityDB(const am_Availability_s& availability, const am_sourceID_t sourceID); + am_Error_e changeSystemPropertyDB(const am_SystemProperty_s& property); + am_Error_e changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID); + am_Error_e changeSinkClassInfoDB(const am_SinkClass_s& sinkClass); + am_Error_e changeSourceClassInfoDB(const am_SourceClass_s& sourceClass); + am_Error_e changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay); + am_Error_e changeConnectionFinal(const am_connectionID_t connectionID); + am_Error_e changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState); + am_Error_e changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume); + am_Error_e changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume); + am_Error_e changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink); + am_Error_e removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID); + am_Error_e removeSinkDB(const am_sinkID_t sinkID); + am_Error_e removeSourceDB(const am_sourceID_t sourceID); + am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); + am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); + am_Error_e removeDomainDB(const am_domainID_t domainID); + am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); + am_Error_e removeSourceClassDB(const am_sourceClass_t sourceClassID); + am_Error_e removeConnection(const am_connectionID_t connectionID); + am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const; + am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const; + am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; + am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; + am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; + am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; + am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const; + am_Error_e getSinkVolume(const am_sinkID_t sinkID, am_volume_t& volume) const; + am_Error_e getSourceVolume(const am_sourceID_t sourceID, am_volume_t& volume) const; + am_Error_e getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t& value) const; + am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t& value) const; + am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector& listSinkID) const; + am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector& listSourceID) const; + am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; + am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; + am_Error_e getListMainConnections(std::vector& listMainConnections) const; + am_Error_e getListDomains(std::vector& listDomains) const; + am_Error_e getListConnections(std::vector& listConnections) const; + am_Error_e getListSinks(std::vector& listSinks) const; + am_Error_e getListSources(std::vector& lisSources) const; + am_Error_e getListSourceClasses(std::vector& listSourceClasses) const; + am_Error_e getListCrossfaders(std::vector& listCrossfaders) const; + am_Error_e getListGateways(std::vector& listGateways) const; + am_Error_e getListSinkClasses(std::vector& listSinkClasses) const; + am_Error_e getListVisibleMainConnections(std::vector& listConnections) const; + am_Error_e getListMainSinks(std::vector& listMainSinks) const; + am_Error_e getListMainSources(std::vector& listMainSources) const; + am_Error_e getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundProperties) const; + am_Error_e getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSourceProperties) const; + am_Error_e getListSystemProperties(std::vector& listSystemProperties) const; + am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const; + am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const; + am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const; + am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const; + am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const; + am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const; + am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const; + am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const; + am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree); + am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID); + am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); + am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID); + am_Error_e peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID); + am_Error_e peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID); + am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); + am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); + am_Error_e getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations); + am_Error_e getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations); + am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); + am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); + am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix); + am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration); + am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration); + + bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const; + bool existcrossFader(const am_crossfaderID_t crossfaderID) const; + bool existConnection(const am_Connection_s & connection) const; + bool existConnectionID(const am_connectionID_t connectionID) const; + bool existSource(const am_sourceID_t sourceID) const; + bool existSourceNameOrID(const am_sourceID_t sourceID, const std::string& name) const; + bool existSourceName(const std::string& name) const; + bool existSink(const am_sinkID_t sinkID) const; + bool existSinkNameOrID(const am_sinkID_t sinkID, const std::string& name) const; + bool existSinkName(const std::string& name) const; + bool existDomain(const am_domainID_t domainID) const; + bool existGateway(const am_gatewayID_t gatewayID) 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; +}; + +} + +#endif /* DATABASEHANDLER_H_ */ diff --git a/AudioManagerDaemon/include/CAmMapHandler.h b/AudioManagerDaemon/include/CAmMapHandler.h deleted file mode 100644 index 510d368..0000000 --- a/AudioManagerDaemon/include/CAmMapHandler.h +++ /dev/null @@ -1,316 +0,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 Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2013 - * - * \file CAmMapHandler.h - * For further information see http://www.genivi.org/. - * - */ - -#ifndef MAPHANDLER_H_ -#define MAPHANDLER_H_ - -#include "CAmDatabaseHandlerInterface.h" -#include -#include -#include -#include -#include - - - -namespace am -{ - -#define AM_MAP std::unordered_map - -//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 -//todo: If the sink is part of a gateway, the listconnectionFormats is copied to the gatewayInformation. Check this statement for sinks & sources -//todo: exchange last_insert_row id to be more safe -//todo: create test to ensure uniqueness of names throughout the database -//todo: enforce the uniqueness of names - -/** - * This class handles and abstracts the database - */ -class CAmMapHandler : public CAmDatabaseHandlerInterface -{ -public: - CAmMapHandler(); - ~CAmMapHandler(); - 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); - am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID); - am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID); - am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID); - am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID); - am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID); - am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass); - am_Error_e enterSystemProperties(const std::vector& listSystemProperties); - am_Error_e changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID); - am_Error_e changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState); - am_Error_e changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID); - am_Error_e changeSinkAvailabilityDB(const am_Availability_s& availability, const am_sinkID_t sinkID); - am_Error_e changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID); - am_Error_e changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID); - am_Error_e changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sinkID_t sinkID); - am_Error_e changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sourceID_t sourceID); - am_Error_e changeSourceSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sourceID_t sourceID); - am_Error_e changeSinkSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sinkID_t sinkID); - am_Error_e changeSourceAvailabilityDB(const am_Availability_s& availability, const am_sourceID_t sourceID); - am_Error_e changeSystemPropertyDB(const am_SystemProperty_s& property); - am_Error_e changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID); - am_Error_e changeSinkClassInfoDB(const am_SinkClass_s& sinkClass); - am_Error_e changeSourceClassInfoDB(const am_SourceClass_s& sourceClass); - am_Error_e changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay); - am_Error_e changeConnectionFinal(const am_connectionID_t connectionID); - am_Error_e changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState); - am_Error_e changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume); - am_Error_e changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume); - am_Error_e changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink); - am_Error_e removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID); - am_Error_e removeSinkDB(const am_sinkID_t sinkID); - am_Error_e removeSourceDB(const am_sourceID_t sourceID); - am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID); - am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID); - am_Error_e removeDomainDB(const am_domainID_t domainID); - am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID); - am_Error_e removeSourceClassDB(const am_sourceClass_t sourceClassID); - am_Error_e removeConnection(const am_connectionID_t connectionID); - am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const; - am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const; - am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const; - am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const; - am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const; - am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const; - am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const; - am_Error_e getSinkVolume(const am_sinkID_t sinkID, am_volume_t& volume) const; - am_Error_e getSourceVolume(const am_sourceID_t sourceID, am_volume_t& volume) const; - am_Error_e getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t& value) const; - am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t& value) const; - am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector& listSinkID) const; - am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector& listSourceID) const; - am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; - am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const; - am_Error_e getListMainConnections(std::vector& listMainConnections) const; - am_Error_e getListDomains(std::vector& listDomains) const; - am_Error_e getListConnections(std::vector& listConnections) const; - am_Error_e getListSinks(std::vector& listSinks) const; - am_Error_e getListSources(std::vector& lisSources) const; - am_Error_e getListSourceClasses(std::vector& listSourceClasses) const; - am_Error_e getListCrossfaders(std::vector& listCrossfaders) const; - am_Error_e getListGateways(std::vector& listGateways) const; - am_Error_e getListSinkClasses(std::vector& listSinkClasses) const; - am_Error_e getListVisibleMainConnections(std::vector& listConnections) const; - am_Error_e getListMainSinks(std::vector& listMainSinks) const; - am_Error_e getListMainSources(std::vector& listMainSources) const; - am_Error_e getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundProperties) const; - am_Error_e getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSourceProperties) const; - am_Error_e getListSystemProperties(std::vector& listSystemProperties) const; - am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const; - am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const; - am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const; - am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const; - am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const; - am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const; - am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const; - am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const; - am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree); - am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID); - am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID); - am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID); - am_Error_e peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID); - am_Error_e peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID); - am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); - am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties); - am_Error_e getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations); - am_Error_e getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations); - am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration); - am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration); - am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix); - am_Error_e changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID,const am_NotificationConfiguration_s notificationConfiguration); - am_Error_e changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID,const am_NotificationConfiguration_s notificationConfiguration); - - bool existMainConnection(const am_mainConnectionID_t mainConnectionID) const; - bool existcrossFader(const am_crossfaderID_t crossfaderID) const; - bool existConnection(const am_Connection_s & connection) const; - bool existConnectionID(const am_connectionID_t connectionID) const; - bool existSource(const am_sourceID_t sourceID) const; - bool existSourceNameOrID(const am_sourceID_t sourceID, const std::string& name) const; - bool existSourceName(const std::string& name) const; - bool existSink(const am_sinkID_t sinkID) const; - bool existSinkNameOrID(const am_sinkID_t sinkID, const std::string& name) const; - bool existSinkName(const std::string& name) const; - bool existDomain(const am_domainID_t domainID) const; - bool existGateway(const am_gatewayID_t gatewayID) 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; - - void dump( std::ostream & output ); - template void print (const TPrintObject & t, std::ostream & output) const; - template void printMap (const AM_MAP & t, std::ostream & output) const; - /** - * The following structures extend the base structures with the field 'reserved'. - */ - -#define AM_TYPEDEF_SUBCLASS_BEGIN(Subclass, Class) \ - typedef struct Subclass : public Class\ - {\ - Subclass & operator=(const Subclass & anObject) \ - {\ - if (this != &anObject)\ - {\ - Class::operator=(anObject);\ - }\ - return *this;\ - };\ - Subclass & operator=(const Class & anObject)\ - {\ - if (this != &anObject)\ - Class::operator=(anObject);\ - return *this;\ - };\ - void getDescription (std::string & outString) const;\ - -#define AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(Subclass, Class) \ - typedef struct Subclass : public Class\ - {\ - bool reserved;\ - Subclass():Class(), reserved(false)\ - {};\ - Subclass & operator=(const Subclass & anObject)\ - {\ - if (this != &anObject)\ - {\ - Class::operator=(anObject);\ - reserved = anObject.reserved;\ - }\ - return *this;\ - };\ - Subclass & operator=(const Class & anObject)\ - {\ - if (this != &anObject)\ - Class::operator=(anObject);\ - return *this;\ - };\ - void getDescription (std::string & outString) const;\ - -#define AM_TYPEDEF_SUBCLASS_END(Typedef) } Typedef; \ - - AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Domain_Database_s,am_Domain_s) - AM_TYPEDEF_SUBCLASS_END(CAmDomain) - - AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Sink_Database_s,am_Sink_s) - void getSinkType(am_SinkType_s & sinkType) const;\ - AM_TYPEDEF_SUBCLASS_END(CAmSink) - - AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Source_Database_s,am_Source_s) - void getSourceType(am_SourceType_s & sourceType) const;\ - AM_TYPEDEF_SUBCLASS_END(CAmSource) - - AM_TYPEDEF_SUBCLASS_RESERVED_FLAG_BEGIN(am_Connection_Database_s,am_Connection_s) - AM_TYPEDEF_SUBCLASS_END(CAmConnection) - - /** - * 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_TYPEDEF_SUBCLASS_END(CAmMainConnection) - - AM_TYPEDEF_SUBCLASS_BEGIN(am_SourceClass_Database_s, am_SourceClass_s) - AM_TYPEDEF_SUBCLASS_END(CAmSourceClass) - - AM_TYPEDEF_SUBCLASS_BEGIN(am_SinkClass_Database_s, am_SinkClass_s) - AM_TYPEDEF_SUBCLASS_END(CAmSinkClass) - - AM_TYPEDEF_SUBCLASS_BEGIN(am_Gateway_Database_s, am_Gateway_s) - AM_TYPEDEF_SUBCLASS_END(CAmGateway) - - AM_TYPEDEF_SUBCLASS_BEGIN(am_Crossfader_Database_s, am_Crossfader_s) - AM_TYPEDEF_SUBCLASS_END(CAmCrossfader) - - private: - - typedef AM_MAP CAmMapDomain; - typedef AM_MAP CAmMapSourceClass; - typedef AM_MAP CAmMapSinkClass; - typedef AM_MAP CAmMapSink; - typedef AM_MAP CAmMapSource; - typedef AM_MAP CAmMapGateway; - typedef AM_MAP CAmMapCrossfader; - typedef AM_MAP CAmMapConnection; - typedef AM_MAP CAmMapMainConnection; - typedef std::vector CAmVectorSystemProperties; - typedef struct CAmMappedData - { - int16_t mCurrentDomainID; - int16_t mCurrentSourceClassesID; - int16_t mCurrentSinkClassesID; - int16_t mCurrentSinkID; - int16_t mCurrentSourceID; - int16_t mCurrentGatewayID; - int16_t mCurrentCrossfaderID; - int16_t mCurrentConnectionID; - int16_t mCurrentMainConnectionID; - int16_t mDefaultIDLimit; - - CAmVectorSystemProperties mSystemProperties; - CAmMapDomain mDomainMap; - CAmMapSourceClass mSourceClassesMap; - CAmMapSinkClass mSinkClassesMap; - CAmMapSink mSinkMap; - CAmMapSource mSourceMap; - CAmMapGateway mGatewayMap; - CAmMapCrossfader mCrossfaderMap; - CAmMapConnection mConnectionMap; - CAmMapMainConnection mMainConnectionMap; - - CAmMappedData(): //For Domain, MainConnections, Connections we don't have static IDs. - mCurrentDomainID(1), mCurrentSourceClassesID(DYNAMIC_ID_BOUNDARY), mCurrentSinkClassesID(DYNAMIC_ID_BOUNDARY), - mCurrentSinkID(DYNAMIC_ID_BOUNDARY), mCurrentSourceID(DYNAMIC_ID_BOUNDARY), mCurrentGatewayID(DYNAMIC_ID_BOUNDARY), - mCurrentCrossfaderID(DYNAMIC_ID_BOUNDARY), mCurrentConnectionID(1), mCurrentMainConnectionID(1), - mDefaultIDLimit(SHRT_MAX), - - mSystemProperties(), - mDomainMap(),mSourceClassesMap(), mSinkClassesMap(), mSinkMap(), mSourceMap(), - mGatewayMap(), mCrossfaderMap(), mConnectionMap(), mMainConnectionMap() - {}; - - bool increaseID(int16_t * resultID, int16_t * sourceID, - int16_t const desiredStaticID, int16_t const preferedStaticIDBoundary ); - } CAmMappedData; - - CAmMappedData mMappedData; - - am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const; //!< calculates a new main connection delay - int16_t calculateDelayForRoute(const std::vector& listConnectionID); - bool insertSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID); - bool insertCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID); - bool insertGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID); - bool insertSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID); - bool insertSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID); - bool insertSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass); -}; - -} - -#endif /* MAPHANDLER_H_ */ diff --git a/AudioManagerDaemon/include/IAmDatabaseHandler.h b/AudioManagerDaemon/include/IAmDatabaseHandler.h new file mode 100644 index 0000000..de50511 --- /dev/null +++ b/AudioManagerDaemon/include/IAmDatabaseHandler.h @@ -0,0 +1,195 @@ +/** + * 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 Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2013 + * + * \file CAmDatabaseHandlerInterface.h + * For further information see http://www.genivi.org/. + * + */ + +#ifndef DATABASEHANDLERINTERFACE_H_ +#define DATABASEHANDLERINTERFACE_H_ + +#include "audiomanagertypes.h" +#include +#include +#include +#include + +namespace am +{ + +class CAmDatabaseObserver; +class CAmRoutingTree; +class CAmRoutingTreeItem; + +#define 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 +//todo: If the sink is part of a gateway, the listconnectionFormats is copied to the gatewayInformation. Check this statement for sinks & sources +//todo: exchange last_insert_row id to be more safe +//todo: create test to ensure uniqueness of names throughout the database +//todo: enforce the uniqueness of names + +typedef std::map > ListConnectionFormat; //!< type for list of connection formats + +/** + * This class handles and abstracts the database + */ + +class CAmDatabaseHandlerInterface +{ +protected: + virtual am_timeSync_t calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const = 0; //!< calculates a new main connection delay + CAmDatabaseObserver *mpDatabaseObserver; //!< pointer to the Observer + bool mFirstStaticSink; //!< bool for dynamic range handling + bool mFirstStaticSource; //!< bool for dynamic range handling + bool mFirstStaticGateway; //!< bool for dynamic range handling + bool mFirstStaticSinkClass; //!< bool for dynamic range handling + bool mFirstStaticSourceClass; //!< bool for dynamic range handling + bool mFirstStaticCrossfader; //!< bool for dynamic range handling + ListConnectionFormat mListConnectionFormat; //!< list of connection formats + +public: + CAmDatabaseHandlerInterface(): mpDatabaseObserver(NULL), // + mFirstStaticSink(true), // + mFirstStaticSource(true), // + mFirstStaticGateway(true), // + mFirstStaticSinkClass(true), // + mFirstStaticSourceClass(true), // + mFirstStaticCrossfader(true), // + mListConnectionFormat() + {}; + virtual ~CAmDatabaseHandlerInterface() {}; + + 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; + virtual am_Error_e enterCrossfaderDB(const am_Crossfader_s& crossfaderData, am_crossfaderID_t& crossfaderID) = 0; + virtual am_Error_e enterGatewayDB(const am_Gateway_s& gatewayData, am_gatewayID_t& gatewayID) = 0; + virtual am_Error_e enterSourceDB(const am_Source_s& sourceData, am_sourceID_t& sourceID) = 0; + virtual am_Error_e enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) = 0; + virtual am_Error_e enterSinkClassDB(const am_SinkClass_s& sinkClass, am_sinkClass_t& sinkClassID) = 0; + virtual am_Error_e enterSourceClassDB(am_sourceClass_t& sourceClassID, const am_SourceClass_s& sourceClass) = 0; + virtual am_Error_e enterSystemProperties(const std::vector& listSystemProperties) = 0; + virtual am_Error_e changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) = 0; + virtual am_Error_e changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) = 0; + virtual am_Error_e changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) = 0; + virtual am_Error_e changeSinkAvailabilityDB(const am_Availability_s& availability, const am_sinkID_t sinkID) = 0; + virtual am_Error_e changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) = 0; + virtual am_Error_e changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) = 0; + virtual am_Error_e changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sinkID_t sinkID) = 0; + virtual am_Error_e changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s& soundProperty, const am_sourceID_t sourceID) = 0; + virtual am_Error_e changeSourceSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sourceID_t sourceID) = 0; + virtual am_Error_e changeSinkSoundPropertyDB(const am_SoundProperty_s& soundProperty, const am_sinkID_t sinkID) = 0; + virtual am_Error_e changeSourceAvailabilityDB(const am_Availability_s& availability, const am_sourceID_t sourceID) = 0; + virtual am_Error_e changeSystemPropertyDB(const am_SystemProperty_s& property) = 0; + virtual am_Error_e changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) = 0; + virtual am_Error_e changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) = 0; + virtual am_Error_e changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) = 0; + virtual am_Error_e changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) = 0; + virtual am_Error_e changeConnectionFinal(const am_connectionID_t connectionID) = 0; + virtual am_Error_e changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) = 0; + virtual am_Error_e changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) = 0; + virtual am_Error_e changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) = 0; + virtual am_Error_e changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) = 0; + virtual am_Error_e removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) = 0; + virtual am_Error_e removeSinkDB(const am_sinkID_t sinkID) = 0; + virtual am_Error_e removeSourceDB(const am_sourceID_t sourceID) = 0; + virtual am_Error_e removeGatewayDB(const am_gatewayID_t gatewayID) = 0; + virtual am_Error_e removeCrossfaderDB(const am_crossfaderID_t crossfaderID) = 0; + virtual am_Error_e removeDomainDB(const am_domainID_t domainID) = 0; + virtual am_Error_e removeSinkClassDB(const am_sinkClass_t sinkClassID) = 0; + virtual am_Error_e removeSourceClassDB(const am_sourceClass_t sourceClassID) = 0; + virtual am_Error_e removeConnection(const am_connectionID_t connectionID) = 0; + virtual am_Error_e getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s& classInfo) const = 0; + virtual am_Error_e getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s& sinkClass) const = 0; + virtual am_Error_e getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s& gatewayData) const = 0; + virtual am_Error_e getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s& sinkData) const = 0; + virtual am_Error_e getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s& sourceData) const = 0; + virtual am_Error_e getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s& crossfaderData) const = 0; + virtual am_Error_e getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s& mainConnectionData) const = 0; + virtual am_Error_e getSinkVolume(const am_sinkID_t sinkID, am_volume_t& volume) const = 0; + 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_SoundPropertyType_e propertyType, int16_t& value) const = 0; + virtual am_Error_e getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t& value) const = 0; + virtual am_Error_e getListSinksOfDomain(const am_domainID_t domainID, std::vector& listSinkID) const = 0; + virtual am_Error_e getListSourcesOfDomain(const am_domainID_t domainID, std::vector& listSourceID) const = 0; + virtual am_Error_e getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const = 0; + virtual am_Error_e getListGatewaysOfDomain(const am_domainID_t domainID, std::vector& listGatewaysID) const = 0; + virtual am_Error_e getListMainConnections(std::vector& listMainConnections) const = 0; + virtual am_Error_e getListDomains(std::vector& listDomains) const = 0; + virtual am_Error_e getListConnections(std::vector& listConnections) const = 0; + virtual am_Error_e getListSinks(std::vector& listSinks) const = 0; + virtual am_Error_e getListSources(std::vector& lisSources) const = 0; + virtual am_Error_e getListSourceClasses(std::vector& listSourceClasses) const = 0; + virtual am_Error_e getListCrossfaders(std::vector& listCrossfaders) const = 0; + virtual am_Error_e getListGateways(std::vector& listGateways) const = 0; + virtual am_Error_e getListSinkClasses(std::vector& listSinkClasses) const = 0; + virtual am_Error_e getListVisibleMainConnections(std::vector& listConnections) const = 0; + virtual am_Error_e getListMainSinks(std::vector& listMainSinks) const = 0; + virtual am_Error_e getListMainSources(std::vector& listMainSources) const = 0; + virtual am_Error_e getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector& listSoundProperties) const = 0; + virtual am_Error_e getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector& listSourceProperties) const = 0; + virtual am_Error_e getListSystemProperties(std::vector& listSystemProperties) const = 0; + virtual am_Error_e getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const = 0; + virtual am_Error_e getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const = 0; + virtual am_Error_e getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const = 0; + virtual am_Error_e getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t& delay) const = 0; + virtual am_Error_e getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t& domainID) const = 0; + virtual am_Error_e getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t& domainID) const = 0; + virtual am_Error_e getSoureState(const am_sourceID_t sourceID, am_SourceState_e& sourceState) const = 0; + virtual am_Error_e getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const = 0; + virtual am_Error_e getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) = 0; + virtual am_Error_e peekDomain(const std::string& name, am_domainID_t& domainID) = 0; + virtual am_Error_e peekSink(const std::string& name, am_sinkID_t& sinkID) = 0; + virtual am_Error_e peekSource(const std::string& name, am_sourceID_t& sourceID) = 0; + virtual am_Error_e peekSinkClassID(const std::string& name, am_sinkClass_t& sinkClassID) = 0; + virtual am_Error_e peekSourceClassID(const std::string& name, am_sourceClass_t& sourceClassID) = 0; + virtual am_Error_e changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) = 0; + virtual am_Error_e changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) = 0; + virtual am_Error_e getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) = 0; + virtual am_Error_e getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) = 0; + virtual am_Error_e changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; + virtual am_Error_e changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) = 0; + virtual am_Error_e changeGatewayDB(const am_gatewayID_t gatewayID, 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; + virtual bool existConnectionID(const am_connectionID_t connectionID) const = 0; + virtual bool existSource(const am_sourceID_t sourceID) const = 0; + virtual bool existSourceNameOrID(const am_sourceID_t sourceID, const std::string& name) const = 0; + virtual bool existSourceName(const std::string& name) const = 0; + virtual bool existSink(const am_sinkID_t sinkID) const = 0; + virtual bool existSinkNameOrID(const am_sinkID_t sinkID, const std::string& name) const = 0; + virtual bool existSinkName(const std::string& name) const = 0; + virtual bool existDomain(const am_domainID_t domainID) const = 0; + 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 void dump( std::ostream & output) { output << __FUNCTION__ << " not implemented!"; }; +}; + +} + +#endif /* DATABASEHANDLERINTERFACE_H_ */ diff --git a/AudioManagerDaemon/src/CAmDatabaseHandler.cpp b/AudioManagerDaemon/src/CAmDatabaseHandler.cpp deleted file mode 100644 index 1e72a4c..0000000 --- a/AudioManagerDaemon/src/CAmDatabaseHandler.cpp +++ /dev/null @@ -1,5042 +0,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 Mueller, christian.ei.mueller@bmw.de BMW 2011,2012 - * - * \file CAmDatabaseHandler.cpp - * For further information see http://www.genivi.org/. - * - */ - -#include "CAmDatabaseHandler.h" -#include -#include -#include -#include -#include -#include -#include "CAmDatabaseObserver.h" -#include "CAmRouter.h" -#include "shared/CAmDltWrapper.h" -#include - -namespace am -{ - -/** - * Macro to handle SQLITE errors on prepare - */ -#define MY_SQLITE_PREPARE_V2(db,zSql,nByte,ppStmt,pzTail) \ - if ((eCode = sqlite3_prepare_v2(db, zSql, nByte, ppStmt, pzTail))) \ - { \ - logError("CAmDatabaseHandler::my_sqlite_prepare_v2 on Command",zSql,"failed with errorCode:", eCode); \ - return (E_DATABASE_ERROR); \ - } - -#define MY_SQLITE_PREPARE_V2_BOOL(db,zSql,nByte,ppStmt,pzTail) \ - if ((eCode = sqlite3_prepare_v2(db, zSql, nByte, ppStmt, pzTail))) \ - { \ - logError("CAmDatabaseHandler::my_sqlite_prepare_v2_bool on Command",zSql,"failed with errorCode:", eCode); \ - return (false); \ - } - -/** - * Macro to handle SQLITE errors bind text - */ -#define MY_SQLITE_BIND_TEXT(query,index,text,size,static_) \ - if ((eCode = sqlite3_bind_text(query, index, text, size, static_))) \ - { \ - logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); \ - return (E_DATABASE_ERROR); \ - } - -/** - * Macro to handle SQLITE errors on bind int - */ -#define MY_SQLITE_BIND_INT(query, index, data) \ - if((eCode = sqlite3_bind_int(query, index, data))) \ - { \ - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); \ - return (E_DATABASE_ERROR); \ - } - -/** - * Macro to handle SQLITE errors on reset - */ -#define MY_SQLITE_RESET(query) \ - if((eCode = sqlite3_reset(query))) \ - { \ - logError("CAmDatabaseHandler::sqlite3_reset failed with errorCode:", eCode); \ - return (E_DATABASE_ERROR); \ - } - -/** - * Macro to handle SQLITE finalize - */ -#define MY_SQLITE_FINALIZE(query) \ - if((eCode = sqlite3_finalize(query))) \ - { \ - logError("CAmDatabaseHandler::sqlite3_finalize failed with errorCode:", eCode); \ - return (E_DATABASE_ERROR); \ - } - -#define MY_SQLITE_FINALIZE_BOOL(query) \ - if((eCode = sqlite3_finalize(query))) \ - { \ - logError("CAmDatabaseHandler::sqlite3_finalize failed with errorCode:", eCode); \ - return (true); \ - } - -#define DOMAIN_TABLE "Domains" //!< domain table -#define SOURCE_CLASS_TABLE "SourceClasses" //!< source class table -#define SINK_CLASS_TABLE "SinkClasses" //!< sink class table -#define SOURCE_TABLE "Sources" //!< source table -#define SINK_TABLE "Sinks" //!< sink table -#define GATEWAY_TABLE "Gateways" //!< gateway table -#define CROSSFADER_TABLE "Crossfaders" //!< crossfader table -#define CONNECTION_TABLE "Connections" //!< connection table -#define MAINCONNECTION_TABLE "MainConnections" //!< main connection table -#define SYSTEM_TABLE "SystemProperties" //!< system properties table -/** - * table that holds table informations - */ -const std::string databaseTables[] = -{ " Domains (domainID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), busname VARCHAR(50), nodename VARCHAR(50), early BOOL, complete BOOL, state INTEGER, reserved BOOL);", // - " SourceClasses (sourceClassID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50));", // - " SinkClasses (sinkClassID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50));", // - " Sources (sourceID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, domainID INTEGER, name VARCHAR(50), sourceClassID INTEGER, sourceState INTEGER, volume INTEGER, visible BOOL, availability INTEGER, availabilityReason INTEGER, interruptState INTEGER, reserved BOOL);", // - " Sinks (sinkID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), domainID INTEGER, sinkClassID INTEGER, volume INTEGER, visible BOOL, availability INTEGER, availabilityReason INTEGER, muteState INTEGER, mainVolume INTEGER, reserved BOOL);", // - " Gateways (gatewayID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), sinkID INTEGER, sourceID INTEGER, domainSinkID INTEGER, domainSourceID INTEGER, controlDomainID INTEGER);", // - " Crossfaders (crossfaderID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), sinkID_A INTEGER, sinkID_B INTEGER, sourceID INTEGER, hotSink INTEGER);", // - " Connections (connectionID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sourceID INTEGER, sinkID INTEGER, delay INTEGER, connectionFormat INTEGER, reserved BOOL);", // - " MainConnections (mainConnectionID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sourceID INTEGER, sinkID INTEGER, connectionState INTEGER, delay INTEGER);", // - " SystemProperties (type INTEGER PRIMARY KEY, value INTEGER);" }; - -/** - * template to converts T to std::string - * @param x T - * @return string - */ -template -inline std::string i2s(T const& x) -{ - std::ostringstream o; - o << x; - return (o.str()); -} - -CAmDatabaseHandler::CAmDatabaseHandler():CAmDatabaseHandlerInterface() -{ - mpDatabase = NULL; - mPath = std::string(""); -} - -CAmDatabaseHandler::CAmDatabaseHandler(std::string databasePath):CAmDatabaseHandlerInterface(), - mpDatabase(NULL), // - mPath(databasePath) -{ - - std::ifstream infile(mPath.c_str()); - - if (infile) - { - if(remove(mPath.c_str())==0) - { - logError("DatabaseHandler::DatabaseHandler Knocked down database failed !"); - } - logInfo("DatabaseHandler::DatabaseHandler Knocked down database"); - } - - bool dbOpen = openDatabase(); - if (!dbOpen) - { - logInfo("DatabaseHandler::DatabaseHandler problems opening the database!"); - } - - createTables(); -} - -CAmDatabaseHandler::~CAmDatabaseHandler() -{ - logInfo("Closed Database"); - sqlite3_close(mpDatabase); -} - -am_Error_e CAmDatabaseHandler::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID) -{ - assert(domainData.domainID==0); - assert(!domainData.name.empty()); - assert(!domainData.busname.empty()); - assert(domainData.state>=DS_UNKNOWN && domainData.state<=DS_MAX); - - //first check for a reserved domain - sqlite3_stmt* query = NULL; - int eCode = 0; - domainID=0; - std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, domainData.name.c_str(), domainData.name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - domainID = sqlite3_column_int(query, 0); - command = "UPDATE " + std::string(DOMAIN_TABLE) + " SET name=?, busname=?, nodename=?, early=?, complete=?, state=?, reserved=? WHERE domainID=" + i2s(sqlite3_column_int(query, 0)); - } - else if (eCode == SQLITE_DONE) - { - - command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (name, busname, nodename, early, complete, state, reserved) VALUES (?,?,?,?,?,?,?)"; - } - else - { - logError("DatabaseHandler::enterDomainDB SQLITE Step error code:", eCode); - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, domainData.name.c_str(), domainData.name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_TEXT(query, 2, domainData.busname.c_str(), domainData.busname.size(), SQLITE_STATIC) - MY_SQLITE_BIND_TEXT(query, 3, domainData.nodename.c_str(), domainData.nodename.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(query, 4, domainData.early) - MY_SQLITE_BIND_INT(query, 5, domainData.complete) - MY_SQLITE_BIND_INT(query, 6, domainData.state) - MY_SQLITE_BIND_INT(query, 7, 0) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterDomainDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - if (domainID==0) - domainID = sqlite3_last_insert_rowid(mpDatabase); - logInfo("DatabaseHandler::enterDomainDB entered new domain with name=", domainData.name, "busname=", domainData.busname, "nodename=", domainData.nodename, "assigned ID:", domainID); - - am_Domain_s domain = domainData; - domain.domainID = domainID; - if (mpDatabaseObserver) - mpDatabaseObserver->newDomain(domain); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID) -{ - assert(mainConnectionData.mainConnectionID==0); - assert(mainConnectionData.connectionState>=CS_UNKNOWN && mainConnectionData.connectionState<=CS_MAX); - assert(mainConnectionData.sinkID!=0); - assert(mainConnectionData.sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - int16_t delay = 0; - std::string command = "INSERT INTO " + std::string(MAINCONNECTION_TABLE) + "(sourceID, sinkID, connectionState, delay) VALUES (?,?,?,-1)"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, mainConnectionData.sourceID) - MY_SQLITE_BIND_INT(query, 2, mainConnectionData.sinkID) - MY_SQLITE_BIND_INT(query, 3, mainConnectionData.connectionState) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterMainConnectionDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - connectionID = sqlite3_last_insert_rowid(mpDatabase); - - //now check the connectionTable for all connections in the route. IF connectionID exist - command = "SELECT delay FROM " + std::string(CONNECTION_TABLE) + (" WHERE connectionID=?"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator elementIterator = mainConnectionData.listConnectionID.begin(); - for (; elementIterator < mainConnectionData.listConnectionID.end(); ++elementIterator) - { - MY_SQLITE_BIND_INT(query, 1, *elementIterator) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - int16_t temp_delay = sqlite3_column_int(query, 1); - if (temp_delay != -1 && delay != -1) - delay += temp_delay; - else - delay = -1; - } - else - { - logError("DatabaseHandler::enterMainConnectionDB did not find route for MainConnection: ", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - //now we create a table with references to the connections; - command = "CREATE TABLE MainConnectionRoute" + i2s(connectionID) + std::string("(connectionID INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO MainConnectionRoute" + i2s(connectionID) + "(connectionID) VALUES (?)"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator listConnectionIterator(mainConnectionData.listConnectionID.begin()); - for (; listConnectionIterator < mainConnectionData.listConnectionID.end(); ++listConnectionIterator) - { - MY_SQLITE_BIND_INT(query, 1, *listConnectionIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterMainConnectionDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - 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; - mpDatabaseObserver->newMainConnection(mainConnection); - mpDatabaseObserver->mainConnectionStateChanged(connectionID, mainConnectionData.connectionState); - } - - //finally, we update the delay value for the maintable - if (delay == 0) - delay = -1; - return (changeDelayMainConnection(delay, connectionID)); -} - -am_Error_e CAmDatabaseHandler::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) -{ - assert(sinkData.sinkID=MS_UNKNOWN && sinkData.muteState<=MS_MAX); - - sqlite3_stmt *query = NULL; - int eCode = 0; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=? AND reserved=1"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - command = "UPDATE " + std::string(SINK_TABLE) + " SET name=?, domainID=?, sinkClassID=?, volume=?, visible=?, availability=?, availabilityReason=?, muteState=?, mainVolume=?, reserved=? WHERE sinkID=" + i2s(sqlite3_column_int(query, 0)); - } - else if (eCode == SQLITE_DONE) - { - //if sinkID is zero and the first Static Sink was already entered, the ID is created - if (sinkData.sinkID == 0 && !mFirstStaticSink && !existSinkName(sinkData.name)) - { - command = "INSERT INTO " + std::string(SINK_TABLE) + "(name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, reserved) VALUES (?,?,?,?,?,?,?,?,?,?)"; - } - else - { - //check if the ID already exists - if (existSinkNameOrID(sinkData.sinkID, sinkData.name)) - { - MY_SQLITE_FINALIZE(query) - return (E_ALREADY_EXISTS); - } - command = "INSERT INTO " + std::string(SINK_TABLE) + "(name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, reserved, sinkID) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; - } - } - else - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(query, 2, sinkData.domainID) - MY_SQLITE_BIND_INT(query, 3, sinkData.sinkClassID) - MY_SQLITE_BIND_INT(query, 4, sinkData.volume) - MY_SQLITE_BIND_INT(query, 5, sinkData.visible) - MY_SQLITE_BIND_INT(query, 6, sinkData.available.availability) - MY_SQLITE_BIND_INT(query, 7, sinkData.available.availabilityReason) - MY_SQLITE_BIND_INT(query, 8, sinkData.muteState) - MY_SQLITE_BIND_INT(query, 9, sinkData.mainVolume) - MY_SQLITE_BIND_INT(query, 10, 0) - - //if the ID is not created, we add it to the query - if (sinkData.sinkID != 0) - { - MY_SQLITE_BIND_INT(query, 11, sinkData.sinkID) - } - - //if the first static sink is entered, we need to set it onto the boundary - else if (mFirstStaticSink) - { - MY_SQLITE_BIND_INT(query, 11, DYNAMIC_ID_BOUNDARY) - mFirstStaticSink = false; - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //now read back the sinkID - command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkID = sqlite3_column_int(query, 0); - } - else - { - sinkID = 0; - logError("DatabaseHandler::existSink database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - //now we need to create the additional tables: - command = "CREATE TABLE SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - command = "CREATE TABLE SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - command = "CREATE TABLE SinkNotificationConfiguration" + i2s(sinkID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = sinkData.listConnectionFormats.begin(); - for (; connectionFormatIterator < sinkData.listConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - //Fill SinkSoundProperties - command = "INSERT INTO SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator SoundPropertyIterator = sinkData.listSoundProperties.begin(); - for (; SoundPropertyIterator < sinkData.listSoundProperties.end(); ++SoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - //Fill NotificationConfigurations - command = "INSERT INTO SinkNotificationConfiguration" + i2s(sinkID) + std::string("(type,status,parameter) VALUES (?,?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator NotificationConfigurationIterator(sinkData.listNotificationConfigurations.begin()); - for (; NotificationConfigurationIterator < sinkData.listNotificationConfigurations.end(); ++NotificationConfigurationIterator) - { - MY_SQLITE_BIND_INT(query, 1, NotificationConfigurationIterator->type) - MY_SQLITE_BIND_INT(query, 2, NotificationConfigurationIterator->status) - MY_SQLITE_BIND_INT(query, 3, NotificationConfigurationIterator->parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - if (sinkData.visible == true) - { - command = "CREATE TABLE SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - //Fill MainSinkSoundProperties - command = "INSERT INTO SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainSoundPropertyIterator = sinkData.listMainSoundProperties.begin(); - for (; mainSoundPropertyIterator < sinkData.listMainSoundProperties.end(); ++mainSoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - //now we got MainNotificationConfigurations as well - command = "CREATE TABLE SinkMainNotificationConfiguration" + i2s(sinkID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO SinkMainNotificationConfiguration" + i2s(sinkID) + std::string("(type,status,parameter) VALUES (?,?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainNotificationConfigurationIterator(sinkData.listMainNotificationConfigurations.begin()); - for (; mainNotificationConfigurationIterator < sinkData.listMainNotificationConfigurations.end(); ++mainNotificationConfigurationIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainNotificationConfigurationIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainNotificationConfigurationIterator->status) - MY_SQLITE_BIND_INT(query, 3, mainNotificationConfigurationIterator->parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - logInfo("DatabaseHandler::enterSinkDB entered new sink with name", sinkData.name, "domainID:", sinkData.domainID, "classID:", sinkData.sinkClassID, "volume:", sinkData.volume, "assigned ID:", sinkID); - am_Sink_s sink = sinkData; - sink.sinkID = sinkID; - if (mpDatabaseObserver != NULL) - mpDatabaseObserver->newSink(sink); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) -{ - assert(crossfaderData.crossfaderID=HS_UNKNOWN && crossfaderData.hotSink<=HS_MAX); - assert(!crossfaderData.name.empty()); - assert(existSink(crossfaderData.sinkID_A)); - assert(existSink(crossfaderData.sinkID_B)); - assert(existSource(crossfaderData.sourceID)); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - //if gatewayData is zero and the first Static Sink was already entered, the ID is created - if (crossfaderData.crossfaderID == 0 && !mFirstStaticCrossfader) - { - command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink) VALUES (?,?,?,?,?)"; - } - else - { - //check if the ID already exists - if (existcrossFader(crossfaderData.crossfaderID)) - return (E_ALREADY_EXISTS); - command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink, crossfaderID) VALUES (?,?,?,?,?,?)"; - } - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - MY_SQLITE_BIND_TEXT(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(query, 2, crossfaderData.sinkID_A) - MY_SQLITE_BIND_INT(query, 3, crossfaderData.sinkID_B) - MY_SQLITE_BIND_INT(query, 4, crossfaderData.sourceID) - MY_SQLITE_BIND_INT(query, 5, crossfaderData.hotSink) - - //if the ID is not created, we add it to the query - if (crossfaderData.crossfaderID != 0) - { - MY_SQLITE_BIND_INT(query, 6, crossfaderData.crossfaderID) - } - - //if the first static sink is entered, we need to set it onto the boundary - else if (mFirstStaticCrossfader) - { - MY_SQLITE_BIND_INT(query, 6, DYNAMIC_ID_BOUNDARY) - mFirstStaticCrossfader = false; - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterCrossfaderDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //now read back the crossfaderID - command = "SELECT crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - crossfaderID = sqlite3_column_int(query, 0); - } - else - { - crossfaderID = 0; - logError("DatabaseHandler::enterCrossfaderDB database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - 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); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) -{ - assert(gatewayData.gatewayIDsqQuery(command)) - return (E_DATABASE_ERROR); - command = "CREATE TABLE GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO GatewaySourceFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = gatewayData.listSourceFormats.begin(); - for (; connectionFormatIterator < gatewayData.listSourceFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - command = "INSERT INTO GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - connectionFormatIterator = gatewayData.listSinkFormats.begin(); - for (; connectionFormatIterator < gatewayData.listSinkFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - 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); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) -{ - assert(sourceData.sourceID=SS_UNKNNOWN && sourceData.sourceState<=SS_MAX); - - sqlite3_stmt* query = NULL; - ; - int eCode = 0; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=? AND reserved=1"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - command = "UPDATE " + std::string(SOURCE_TABLE) + " SET name=?, domainID=?, sourceClassID=?, sourceState=?, volume=?, visible=?, availability=?, availabilityReason=?, interruptState=?, reserved=? WHERE sourceID=" + i2s(sqlite3_column_int(query, 0)); - } - else if (eCode == SQLITE_DONE) - { - //if sinkID is zero and the first Static Sink was already entered, the ID is created - if (sourceData.sourceID == 0 && !mFirstStaticSource && !existSourceName(sourceData.name)) - { - command = "INSERT INTO " + std::string(SOURCE_TABLE) + "(name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, reserved) VALUES (?,?,?,?,?,?,?,?,?,?)"; - } - else - { - //check if the ID already exists - if (existSourceNameOrID(sourceData.sourceID, sourceData.name)) - { - MY_SQLITE_FINALIZE(query) - return (E_ALREADY_EXISTS); - } - command = "INSERT INTO " + std::string(SOURCE_TABLE) + "(name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, reserved, sourceID) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; - } - } - else - { - logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(query, 2, sourceData.domainID) - MY_SQLITE_BIND_INT(query, 3, sourceData.sourceClassID) - MY_SQLITE_BIND_INT(query, 4, sourceData.sourceState) - MY_SQLITE_BIND_INT(query, 5, sourceData.volume) - MY_SQLITE_BIND_INT(query, 6, sourceData.visible) - MY_SQLITE_BIND_INT(query, 7, sourceData.available.availability) - MY_SQLITE_BIND_INT(query, 8, sourceData.available.availabilityReason) - MY_SQLITE_BIND_INT(query, 9, sourceData.interruptState) - MY_SQLITE_BIND_INT(query, 10, 0) - - //if the ID is not created, we add it to the query - if (sourceData.sourceID != 0) - { - MY_SQLITE_BIND_INT(query, 11, sourceData.sourceID) - } - - //if the first static sink is entered, we need to set it onto the boundary - else if (mFirstStaticSource) - { - MY_SQLITE_BIND_INT(query, 11, DYNAMIC_ID_BOUNDARY) - mFirstStaticSource = false; - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //now read back the sinkID - command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceID = sqlite3_column_int(query, 0); - } - else - { - sourceID = 0; - logError("DatabaseHandler::existSink database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - //now we need to create the additional tables: - command = "CREATE TABLE SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - command = "CREATE TABLE SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - command = "CREATE TABLE SourceNotificationConfiguration" + i2s(sourceID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = sourceData.listConnectionFormats.begin(); - for (; connectionFormatIterator != sourceData.listConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - //Fill SinkSoundProperties - command = "INSERT INTO SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator SoundPropertyIterator = sourceData.listSoundProperties.begin(); - for (; SoundPropertyIterator != sourceData.listSoundProperties.end(); ++SoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - //Fill NotificationConfigurations - command = "INSERT INTO SourceNotificationConfiguration" + i2s(sourceID) + std::string("(type,status,parameter) VALUES (?,?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator NotificationConfigurationIterator(sourceData.listNotificationConfigurations.begin()); - for (; NotificationConfigurationIterator < sourceData.listNotificationConfigurations.end(); ++NotificationConfigurationIterator) - { - MY_SQLITE_BIND_INT(query, 1, NotificationConfigurationIterator->type) - MY_SQLITE_BIND_INT(query, 2, NotificationConfigurationIterator->status) - MY_SQLITE_BIND_INT(query, 3, NotificationConfigurationIterator->parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - if (sourceData.visible == true) - { - command = "CREATE TABLE SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - //Fill MainSinkSoundProperties - command = "INSERT INTO SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainSoundPropertyIterator = sourceData.listMainSoundProperties.begin(); - for (; mainSoundPropertyIterator != sourceData.listMainSoundProperties.end(); ++mainSoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - - //now we got MainNotificationConfigurations as well - command = "CREATE TABLE SourceMainNotificationConfiguration" + i2s(sourceID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO SourceMainNotificationConfiguration" + i2s(sourceID) + std::string("(type,status,parameter) VALUES (?,?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainNotificationConfigurationIterator(sourceData.listMainNotificationConfigurations.begin()); - for (; mainNotificationConfigurationIterator != sourceData.listMainNotificationConfigurations.end(); ++mainNotificationConfigurationIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainNotificationConfigurationIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainNotificationConfigurationIterator->status) - MY_SQLITE_BIND_INT(query, 3, mainNotificationConfigurationIterator->parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - 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); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) -{ - assert(mainconnectionID!=0); - if (!existMainConnection(mainconnectionID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - int16_t delay = 0; - command = "SELECT delay FROM " + std::string(CONNECTION_TABLE) + (" WHERE connectionID=?"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator elementIterator = listConnectionID.begin(); - for (; elementIterator < listConnectionID.end(); ++elementIterator) - { - MY_SQLITE_BIND_INT(query, 1, *elementIterator) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - int16_t temp_delay = sqlite3_column_int(query, 1); - if (temp_delay != -1 && delay != -1) - delay += temp_delay; - else - delay = -1; - } - else - { - logError("DatabaseHandler::changeMainConnectionRouteDB did not find route for MainConnection: ", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - //now we delete the data in the table - command = "DELETE from MainConnectionRoute" + i2s(mainconnectionID); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO MainConnectionRoute" + i2s(mainconnectionID) + "(connectionID) VALUES (?)"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator listConnectionIterator(listConnectionID.begin()); - for (; listConnectionIterator != listConnectionID.end(); ++listConnectionIterator) - { - MY_SQLITE_BIND_INT(query, 1, *listConnectionIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainConnectionRouteDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - if (changeDelayMainConnection(delay,mainconnectionID)!=E_OK) - logError("DatabaseHandler::changeMainConnectionRouteDB error while changing mainConnectionDelay to ", delay); - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeMainConnectionRouteDB entered new route:", mainconnectionID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) -{ - assert(mainconnectionID!=0); - assert(connectionState>=CS_UNKNOWN && connectionState<=CS_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existMainConnection(mainconnectionID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(MAINCONNECTION_TABLE) + " SET connectionState=? WHERE mainConnectionID=" + i2s(mainconnectionID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, connectionState) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainConnectionStateDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeMainConnectionStateDB changed mainConnectionState of MainConnection:", mainconnectionID, "to:", connectionState); - - if (mpDatabaseObserver) - mpDatabaseObserver->mainConnectionStateChanged(mainconnectionID, connectionState); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SINK_TABLE) + " SET mainVolume=? WHERE sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, mainVolume) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSinkMainVolumeDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSinkMainVolumeDB changed mainVolume of sink:", sinkID, "to:", mainVolume); - - if (mpDatabaseObserver) - mpDatabaseObserver->volumeChanged(sinkID, mainVolume); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); - assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SINK_TABLE) + " SET availability=?, availabilityReason=? WHERE sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, availability.availability) - MY_SQLITE_BIND_INT(query, 2, availability.availabilityReason) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSinkAvailabilityDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - assert(sinkID!=0); - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); - - if (mpDatabaseObserver && sourceVisible(sinkID)) - mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) -{ - assert(domainID!=0); - assert(domainState>=DS_UNKNOWN && domainState<=DS_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(DOMAIN_TABLE) + " SET state=? WHERE domainID=" + i2s(domainID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, domainState) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changDomainStateDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changDomainStateDB changed domainState of domain:", domainID, "to:", domainState); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - assert(muteState>=MS_UNKNOWN && muteState<=MS_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SINK_TABLE) + " SET muteState=? WHERE sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, muteState) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSinkMuteStateDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - assert(sinkID!=0); - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSinkMuteStateDB changed sinkMuteState of sink:", sinkID, "to:", muteState); - - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMuteStateChanged(sinkID, muteState); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID) -{ - assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SinkMainSoundProperty" + i2s(sinkID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, soundProperty.value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSinkSoundPropertyDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - assert(sinkID!=0); - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeMainSinkSoundPropertyDB changed MainSinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); - if (mpDatabaseObserver) - mpDatabaseObserver->mainSinkSoundPropertyChanged(sinkID, soundProperty); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID) -{ - assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SourceMainSoundProperty" + i2s(sourceID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, soundProperty.value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSourceSoundPropertyDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeMainSourceSoundPropertyDB changed MainSinkSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); - - if (mpDatabaseObserver) - mpDatabaseObserver->mainSourceSoundPropertyChanged(sourceID, soundProperty); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID) -{ - assert(sourceID!=0); - assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); - assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SOURCE_TABLE) + " SET availability=?, availabilityReason=? WHERE sourceID=" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, availability.availability) - MY_SQLITE_BIND_INT(query, 2, availability.availabilityReason) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSourceAvailabilityDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeSourceAvailabilityDB changed changeSourceAvailabilityDB of source:", sourceID, "to:", availability.availability, "Reason:", availability.availabilityReason); - - if (mpDatabaseObserver && sourceVisible(sourceID)) - mpDatabaseObserver->sourceAvailabilityChanged(sourceID, availability); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSystemPropertyDB(const am_SystemProperty_s & property) -{ - assert(property.type>=SYP_UNKNOWN && property.type<=SYP_MAX); - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "UPDATE " + std::string(SYSTEM_TABLE) + " set value=? WHERE type=?"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, property.value) - MY_SQLITE_BIND_INT(query, 2, property.type) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSystemPropertyDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeSystemPropertyDB changed system property"); - - if (mpDatabaseObserver) - mpDatabaseObserver->systemPropertyChanged(property); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) -{ - assert(mainConnectionID!=0); - - if (!existMainConnection(mainConnectionID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); - std::string command1 = "DROP table MainConnectionRoute" + i2s(mainConnectionID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - if (!sqQuery(command1)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); - if (mpDatabaseObserver) - { - mpDatabaseObserver->mainConnectionStateChanged(mainConnectionID, CS_DISCONNECTED); - mpDatabaseObserver->removedMainConnection(mainConnectionID); - } - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeSinkDB(const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - bool visible = sinkVisible(sinkID); - - std::string command = "DELETE from " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); - std::string command1 = "DROP table SinkConnectionFormat" + i2s(sinkID); - std::string command2 = "DROP table SinkSoundProperty" + i2s(sinkID); - std::string command3 = "DROP table SinkMainSoundProperty" + i2s(sinkID); - std::string command4 = "DROP table SinkNotificationConfiguration" + i2s(sinkID); - std::string command5 = "DROP table SinkMainNotificationConfiguration" + i2s(sinkID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - if (!sqQuery(command1)) - return (E_DATABASE_ERROR); - if (!sqQuery(command2)) - return (E_DATABASE_ERROR); - if (!sqQuery(command4)) - return (E_DATABASE_ERROR); - if (visible) //only drop table if it ever existed - { - if (!sqQuery(command3)) - return (E_DATABASE_ERROR); - if (!sqQuery(command5)) - return (E_DATABASE_ERROR); - } - logInfo("DatabaseHandler::removeSinkDB removed:", sinkID); - - if (mpDatabaseObserver != NULL) - mpDatabaseObserver->removedSink(sinkID, visible); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeSourceDB(const am_sourceID_t sourceID) -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - bool visible = sourceVisible(sourceID); - - std::string command = "DELETE from " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); - std::string command1 = "DROP table SourceConnectionFormat" + i2s(sourceID); - std::string command2 = "DROP table SourceMainSoundProperty" + i2s(sourceID); - std::string command3 = "DROP table SourceSoundProperty" + i2s(sourceID); - std::string command4 = "DROP table SourceNotificationConfiguration" + i2s(sourceID); - std::string command5 = "DROP table SourceMainNotificationConfiguration" + i2s(sourceID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - if (!sqQuery(command1)) - return (E_DATABASE_ERROR); - if (!sqQuery(command3)) - return (E_DATABASE_ERROR); - if (!sqQuery(command4)) - return (E_DATABASE_ERROR); - - if(visible) - { - if (!sqQuery(command2)) - return (E_DATABASE_ERROR); - if (!sqQuery(command5)) - return (E_DATABASE_ERROR); - } - logInfo("DatabaseHandler::removeSourceDB removed:", sourceID); - if (mpDatabaseObserver) - mpDatabaseObserver->removedSource(sourceID, visible); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeGatewayDB(const am_gatewayID_t gatewayID) -{ - assert(gatewayID!=0); - - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeGatewayDB removed:", gatewayID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeGateway(gatewayID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeCrossfaderDB(const am_crossfaderID_t crossfaderID) -{ - assert(crossfaderID!=0); - - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeCrossfaderDB removed:", crossfaderID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeCrossfader(crossfaderID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeDomainDB(const am_domainID_t domainID) -{ - assert(domainID!=0); - - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(DOMAIN_TABLE) + " WHERE domainID=" + i2s(domainID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeDomainDB removed:", domainID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeDomain(domainID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeSinkClassDB(const am_sinkClass_t sinkClassID) -{ - assert(sinkClassID!=0); - - if (!existSinkClass(sinkClassID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + i2s(sinkClassID); - std::string command1 = "DROP table SinkClassProperties" + i2s(sinkClassID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - if (!sqQuery(command1)) - return (E_DATABASE_ERROR); - - logInfo("DatabaseHandler::removeSinkClassDB removed:", sinkClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSinkClassesChanged(); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeSourceClassDB(const am_sourceClass_t sourceClassID) -{ - assert(sourceClassID!=0); - - if (!existSourceClass(sourceClassID)) - { - return (E_NON_EXISTENT); - } - std::string command = "DELETE from " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + i2s(sourceClassID); - std::string command1 = "DROP table SourceClassProperties" + i2s(sourceClassID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - if (!sqQuery(command1)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeSourceClassDB removed:", sourceClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSourceClassesChanged(); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::removeConnection(const am_connectionID_t connectionID) -{ - assert(connectionID!=0); - - std::string command = "DELETE from " + std::string(CONNECTION_TABLE) + " WHERE connectionID=" + i2s(connectionID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - logInfo("DatabaseHandler::removeConnection removed:", connectionID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_ClassProperty_s propertyTemp; - std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + (i2s(sourceID)); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - classInfo.sourceClassID = sqlite3_column_int(query, 0); - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - command = "SELECT name FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + (i2s(classInfo.sourceClassID)); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - classInfo.name = std::string((const char*) sqlite3_column_text(query, 0)); - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //read out Properties - command = "SELECT classProperty, value FROM SourceClassProperties" + i2s(classInfo.sourceClassID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(query, 0); - propertyTemp.value = sqlite3_column_int(query, 1); - classInfo.listClassProperties.push_back(propertyTemp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s & sinkData) const -{ - - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qMainNotification = NULL, *qNotification = NULL; - int eCode = 0; - am_ConnectionFormat_e tempConnectionFormat; - am_SoundProperty_s tempSoundProperty; - am_MainSoundProperty_s tempMainSoundProperty; - am_NotificationConfiguration_s tempNotificationConfiguration,tempMainNotification; - std::string command = "SELECT name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 and sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkData.name = std::string((const char*) sqlite3_column_text(query, 0)); - sinkData.domainID = sqlite3_column_int(query, 1); - sinkData.sinkClassID = sqlite3_column_int(query, 2); - sinkData.volume = sqlite3_column_int(query, 3); - sinkData.visible = sqlite3_column_int(query, 4); - sinkData.available.availability = (am_Availability_e) sqlite3_column_int(query, 5); - sinkData.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 6); - sinkData.muteState = (am_MuteState_e) sqlite3_column_int(query, 7); - sinkData.mainVolume = sqlite3_column_int(query, 8); - sinkData.sinkID = sqlite3_column_int(query, 9); - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - sinkData.listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - //read out sound properties - std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SinkSoundProperty" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) - while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) - { - tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); - tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); - sinkData.listSoundProperties.push_back(tempSoundProperty); - } - - MY_SQLITE_FINALIZE(qSoundProperty) - - std::string notificationCommand = "SELECT type, status, parameter FROM SinkNotificationConfiguration" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) - - while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) - { - tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); - tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); - tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); - sinkData.listNotificationConfigurations.push_back(tempNotificationConfiguration); - } - MY_SQLITE_FINALIZE(qNotification) - - if (sinkData.visible) - { - - //read out MainSoundProperties - std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) - while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) - { - tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); - tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); - sinkData.listMainSoundProperties.push_back(tempMainSoundProperty); - } - - MY_SQLITE_FINALIZE(qMAinSoundProperty) - - std::string mainNotificationCommand = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) - - while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) - { - tempMainNotification.type = static_cast(sqlite3_column_int(qMainNotification, 0)); - tempMainNotification.status = static_cast(sqlite3_column_int(qMainNotification, 1)); - tempMainNotification.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); - sinkData.listMainNotificationConfigurations.push_back(tempMainNotification); - } - MY_SQLITE_FINALIZE(qMainNotification) - } - } - - else if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getSinkInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s & sourceData) const -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qMainNotification = NULL, *qNotification = NULL; - int eCode = 0; - am_ConnectionFormat_e tempConnectionFormat; - am_SoundProperty_s tempSoundProperty; - am_MainSoundProperty_s tempMainSoundProperty; - am_NotificationConfiguration_s tempNotificationConfiguration,tempMainNotification; - std::string command = "SELECT name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND sourceID=" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceData.name = std::string((const char*) sqlite3_column_text(query, 0)); - sourceData.domainID = sqlite3_column_int(query, 1); - sourceData.sourceClassID = sqlite3_column_int(query, 2); - sourceData.sourceState = (am_SourceState_e) sqlite3_column_int(query, 3); - sourceData.volume = sqlite3_column_int(query, 4); - sourceData.visible = sqlite3_column_int(query, 5); - sourceData.available.availability = (am_Availability_e) sqlite3_column_int(query, 6); - sourceData.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 7); - sourceData.interruptState = (am_InterruptState_e) sqlite3_column_int(query, 8); - sourceData.sourceID = sqlite3_column_int(query, 9); - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - sourceData.listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - //read out sound properties - std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SourceSoundProperty" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL); - while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) - { - tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); - tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); - sourceData.listSoundProperties.push_back(tempSoundProperty); - } - - MY_SQLITE_FINALIZE(qSoundProperty) - - std::string notificationCommand = "SELECT type, status, parameter FROM SourceNotificationConfiguration" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) - - while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) - { - tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); - tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); - tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); - sourceData.listNotificationConfigurations.push_back(tempNotificationConfiguration); - } - MY_SQLITE_FINALIZE(qNotification) - - if (sourceData.visible) - { - - //read out MainSoundProperties - std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) - while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) - { - tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); - tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); - sourceData.listMainSoundProperties.push_back(tempMainSoundProperty); - } - - MY_SQLITE_FINALIZE(qMAinSoundProperty) - - std::string mainNotificationCommand = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) - - while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) - { - tempMainNotification.type = static_cast(sqlite3_column_int(qMainNotification, 0)); - tempMainNotification.status = static_cast(sqlite3_column_int(qMainNotification, 1)); - tempMainNotification.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); - sourceData.listMainNotificationConfigurations.push_back(tempMainNotification); - } - MY_SQLITE_FINALIZE(qMainNotification) - - } - } - else if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getSourceInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e am::CAmDatabaseHandler::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s & mainConnectionData) const -{ - assert(mainConnectionID!=0); - if (!existMainConnection(mainConnectionID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt *query = NULL, *query1 = NULL; - int eCode = 0; - am_MainConnection_s temp; - std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); - std::string command1 = "SELECT connectionID FROM MainConnectionRoute"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - mainConnectionData.mainConnectionID = sqlite3_column_int(query, 0); - mainConnectionData.sourceID = sqlite3_column_int(query, 1); - mainConnectionData.sinkID = sqlite3_column_int(query, 2); - mainConnectionData.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); - mainConnectionData.delay = sqlite3_column_int(query, 4); - std::string statement = command1 + i2s(mainConnectionID); - MY_SQLITE_PREPARE_V2(mpDatabase, statement.c_str(), -1, &query1, NULL) - while ((eCode = sqlite3_step(query1)) == SQLITE_ROW) - { - mainConnectionData.listConnectionID.push_back(sqlite3_column_int(query1, 0)); - } - MY_SQLITE_FINALIZE(query1) - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getMainConnectionInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) -{ - assert(sinkClass.sinkClassID!=0); - assert(!sinkClass.listClassProperties.empty()); - - sqlite3_stmt* query = NULL; - int eCode = 0; - - //check if the ID already exists - if (!existSinkClass(sinkClass.sinkClassID)) - return (E_NON_EXISTENT); - - //fill ConnectionFormats - std::string command = "UPDATE SinkClassProperties" + i2s(sinkClass.sinkClassID) + " set value=? WHERE classProperty=?;"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator Iterator = sinkClass.listClassProperties.begin(); - for (; Iterator < sinkClass.listClassProperties.end(); ++Iterator) - { - MY_SQLITE_BIND_INT(query, 1, Iterator->value) - MY_SQLITE_BIND_INT(query, 2, Iterator->classProperty) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::setSinkClassInfoDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) -{ - assert(sourceClass.sourceClassID!=0); - assert(!sourceClass.listClassProperties.empty()); - - sqlite3_stmt* query = NULL; - int eCode = 0; - - //check if the ID already exists - if (!existSourceClass(sourceClass.sourceClassID)) - return (E_NON_EXISTENT); - - //fill ConnectionFormats - std::string command = "UPDATE SourceClassProperties" + i2s(sourceClass.sourceClassID) + " set value=? WHERE classProperty=?;"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator Iterator = sourceClass.listClassProperties.begin(); - for (; Iterator < sourceClass.listClassProperties.end(); ++Iterator) - { - MY_SQLITE_BIND_INT(query, 1, Iterator->value) - MY_SQLITE_BIND_INT(query, 2, Iterator->classProperty) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::setSinkClassInfoDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_ClassProperty_s propertyTemp; - std::string command = "SELECT sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + (i2s(sinkID)); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkClass.sinkClassID = sqlite3_column_int(query, 0); - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - command = "SELECT name FROM " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + (i2s(sinkClass.sinkClassID)); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkClass.name = std::string((const char*) sqlite3_column_text(query, 0)); - } - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //read out Properties - command = "SELECT classProperty, value FROM SinkClassProperties" + i2s(sinkClass.sinkClassID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(query, 0); - propertyTemp.value = sqlite3_column_int(query, 1); - sinkClass.listClassProperties.push_back(propertyTemp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const -{ - assert(gatewayID!=0); - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL, *qSinkConnectionFormat = NULL, *qSourceConnectionFormat = NULL; - int eCode = 0; - am_ConnectionFormat_e tempConnectionFormat; - std::string command = "SELECT name, sinkID, sourceID, domainSinkID, domainSourceID, controlDomainID, gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - gatewayData.name = std::string((const char*) sqlite3_column_text(query, 0)); - gatewayData.sinkID = sqlite3_column_int(query, 1); - gatewayData.sourceID = sqlite3_column_int(query, 2); - gatewayData.domainSinkID = sqlite3_column_int(query, 3); - gatewayData.domainSourceID = sqlite3_column_int(query, 4); - gatewayData.controlDomainID = sqlite3_column_int(query, 5); - gatewayData.gatewayID = sqlite3_column_int(query, 6); - - //convertionMatrix: - ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); - iter = mListConnectionFormat.find(gatewayData.gatewayID); - if (iter == mListConnectionFormat.end()) - { - logError("DatabaseHandler::getGatewayInfoDB database error with convertionFormat"); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - gatewayData.convertionMatrix = iter->second; - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM GatewaySourceFormat" + i2s(gatewayData.gatewayID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSourceConnectionFormat, NULL) - while ((eCode = sqlite3_step(qSourceConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSourceConnectionFormat, 0); - gatewayData.listSourceFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qSourceConnectionFormat) - - //read out sound properties - commandConnectionFormat = "SELECT soundFormat FROM GatewaySinkFormat" + i2s(gatewayData.gatewayID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSinkConnectionFormat, NULL) - while ((eCode = sqlite3_step(qSinkConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSinkConnectionFormat, 0); - gatewayData.listSinkFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qSinkConnectionFormat) - - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getGatewayInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); - -} - -am_Error_e CAmDatabaseHandler::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const -{ - assert(crossfaderID!=0); - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - crossfaderData.name = std::string((const char*) sqlite3_column_text(query, 0)); - crossfaderData.sinkID_A = sqlite3_column_int(query, 1); - crossfaderData.sinkID_B = sqlite3_column_int(query, 2); - crossfaderData.sourceID = sqlite3_column_int(query, 3); - crossfaderData.hotSink = static_cast(sqlite3_column_int(query, 4)); - crossfaderData.crossfaderID = sqlite3_column_int(query, 5); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getCrossfaderInfoDB SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSinksOfDomain(const am_domainID_t domainID, std::vector & listSinkID) const -{ - assert(domainID!=0); - listSinkID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_sinkID_t temp; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND domainID=" + (i2s(domainID)); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp = sqlite3_column_int(query, 0); - listSinkID.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSinksOfDomain SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSourcesOfDomain(const am_domainID_t domainID, std::vector & listSourceID) const -{ - assert(domainID!=0); - listSourceID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_sourceID_t temp; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND domainID=" + i2s(domainID); - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp = sqlite3_column_int(query, 0); - listSourceID.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourcesOfDomain SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector & listCrossfader) const -{ - assert(domainID!=0); - listCrossfader.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_crossfaderID_t temp; - - std::string command = "SELECT c.crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " c," + std::string(SOURCE_TABLE) + " s WHERE c.sourceID=s.sourceID AND s.domainID=" + i2s(domainID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp = sqlite3_column_int(query, 0); - listCrossfader.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListCrossfadersOfDomain SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); - -} - -am_Error_e CAmDatabaseHandler::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector & listGatewaysID) const -{ - assert(domainID!=0); - listGatewaysID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - sqlite3_stmt* query = NULL; - int eCode = 0; - am_gatewayID_t temp; - - std::string command = "SELECT gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE controlDomainID=" + i2s(domainID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp = sqlite3_column_int(query, 0); - listGatewaysID.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListGatewaysOfDomain SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainConnections(std::vector & listMainConnections) const -{ - listMainConnections.clear(); - sqlite3_stmt *query = NULL, *query1 = NULL; - int eCode = 0; - am_MainConnection_s temp; - std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE); - std::string command1 = "SELECT connectionID FROM MainConnectionRoute"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.mainConnectionID = sqlite3_column_int(query, 0); - temp.sourceID = sqlite3_column_int(query, 1); - temp.sinkID = sqlite3_column_int(query, 2); - temp.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); - temp.delay = sqlite3_column_int(query, 4); - std::string statement = command1 + i2s(temp.mainConnectionID); - MY_SQLITE_PREPARE_V2(mpDatabase, statement.c_str(), -1, &query1, NULL) - while ((eCode = sqlite3_step(query1)) == SQLITE_ROW) - { - temp.listConnectionID.push_back(sqlite3_column_int(query1, 0)); - } - listMainConnections.push_back(temp); - MY_SQLITE_FINALIZE(query1) - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListMainConnections SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListDomains(std::vector & listDomains) const -{ - listDomains.clear(); - sqlite3_stmt* query = NULL; - int eCode = 0; - am_Domain_s temp; - std::string command = "SELECT domainID, name, busname, nodename, early, complete, state FROM " + std::string(DOMAIN_TABLE) + " WHERE reserved=0"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.domainID = sqlite3_column_int(query, 0); - temp.name = std::string((const char*) sqlite3_column_text(query, 1)); - temp.busname = std::string((const char*) sqlite3_column_text(query, 2)); - temp.nodename = std::string((const char*) sqlite3_column_text(query, 3)); - temp.early = sqlite3_column_int(query, 4); - temp.complete = sqlite3_column_int(query, 5); - temp.state = (am_DomainState_e) sqlite3_column_int(query, 6); - listDomains.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListDomains SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListConnections(std::vector & listConnections) const -{ - listConnections.clear(); - sqlite3_stmt* query = NULL; - int eCode = 0; - am_Connection_s temp; - std::string command = "SELECT connectionID, sourceID, sinkID, delay, connectionFormat FROM " + std::string(CONNECTION_TABLE) + " WHERE reserved=0"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.connectionID = sqlite3_column_int(query, 0); - temp.sourceID = sqlite3_column_int(query, 1); - temp.sinkID = sqlite3_column_int(query, 2); - temp.delay = sqlite3_column_int(query, 3); - temp.connectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(query, 4); - listConnections.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListConnections SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSinks(std::vector & listSinks) const -{ - listSinks.clear(); - sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qNotificationConfiguration= NULL, *qMAinSoundProperty = NULL, *qMainNotificationConfiguration= NULL; - int eCode = 0; - am_Sink_s temp; - am_ConnectionFormat_e tempConnectionFormat; - am_SoundProperty_s tempSoundProperty; - am_MainSoundProperty_s tempMainSoundProperty; - am_NotificationConfiguration_s tempNotificationConfiguration; - am_NotificationConfiguration_s tempMainNotificationConfiguration; - std::string command = "SELECT name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.name = std::string((const char*) sqlite3_column_text(query, 0)); - temp.domainID = sqlite3_column_int(query, 1); - temp.sinkClassID = sqlite3_column_int(query, 2); - temp.volume = sqlite3_column_int(query, 3); - temp.visible = sqlite3_column_int(query, 4); - temp.available.availability = (am_Availability_e) sqlite3_column_int(query, 5); - temp.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 6); - temp.muteState = (am_MuteState_e) sqlite3_column_int(query, 7); - temp.mainVolume = sqlite3_column_int(query, 8); - temp.sinkID = sqlite3_column_int(query, 9); - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(temp.sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - temp.listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - //read out sound properties - std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SinkSoundProperty" + i2s(temp.sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) - while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) - { - tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); - tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); - temp.listSoundProperties.push_back(tempSoundProperty); - } - - MY_SQLITE_FINALIZE(qSoundProperty) - - //read out notifications - std::string commandNotificationConfiguration = "SELECT type, status, parameter FROM SinkNotificationConfiguration" + i2s(temp.sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandNotificationConfiguration.c_str(), -1, &qNotificationConfiguration, NULL) - while ((eCode = sqlite3_step(qNotificationConfiguration)) == SQLITE_ROW) - { - tempNotificationConfiguration.type = static_cast (sqlite3_column_int(qNotificationConfiguration, 0)); - tempNotificationConfiguration.status = static_cast (sqlite3_column_int(qNotificationConfiguration, 1)); - tempNotificationConfiguration.parameter = static_cast (sqlite3_column_int(qNotificationConfiguration, 2)); - temp.listNotificationConfigurations.push_back(tempNotificationConfiguration); - } - - MY_SQLITE_FINALIZE(qNotificationConfiguration) - - //read out MainSoundProperties if sink is visible - if(temp.visible) - { - std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(temp.sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) - while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) - { - tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); - tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); - temp.listMainSoundProperties.push_back(tempMainSoundProperty); - } - - MY_SQLITE_FINALIZE(qMAinSoundProperty) - - //and mainNotificationConfigurations - std::string commandMainNotificationConfiguration = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(temp.sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandMainNotificationConfiguration.c_str(), -1, &qMainNotificationConfiguration, NULL) - while ((eCode = sqlite3_step(qMainNotificationConfiguration)) == SQLITE_ROW) - { - tempMainNotificationConfiguration.type = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 0)); - tempMainNotificationConfiguration.status = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 1)); - tempMainNotificationConfiguration.parameter = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 2)); - temp.listMainNotificationConfigurations.push_back(tempMainNotificationConfiguration); - } - - MY_SQLITE_FINALIZE(qMainNotificationConfiguration) - } - - listSinks.push_back(temp); - temp.listConnectionFormats.clear(); - temp.listMainSoundProperties.clear(); - temp.listSoundProperties.clear(); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSinks SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSources(std::vector & listSources) const -{ - listSources.clear(); - sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qNotification(NULL), *qMainNotification(NULL); - int eCode = 0; - am_Source_s temp; - am_ConnectionFormat_e tempConnectionFormat; - am_SoundProperty_s tempSoundProperty; - am_MainSoundProperty_s tempMainSoundProperty; - am_NotificationConfiguration_s tempNotificationConfiguration; - std::string command = "SELECT name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.name = std::string((const char*) sqlite3_column_text(query, 0)); - temp.domainID = sqlite3_column_int(query, 1); - temp.sourceClassID = sqlite3_column_int(query, 2); - temp.sourceState = (am_SourceState_e) sqlite3_column_int(query, 3); - temp.volume = sqlite3_column_int(query, 4); - temp.visible = sqlite3_column_int(query, 5); - temp.available.availability = (am_Availability_e) sqlite3_column_int(query, 6); - temp.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 7); - temp.interruptState = (am_InterruptState_e) sqlite3_column_int(query, 8); - temp.sourceID = sqlite3_column_int(query, 9); - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(temp.sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - temp.listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - //read out sound properties - std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SourceSoundProperty" + i2s(temp.sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) - while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) - { - tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); - tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); - temp.listSoundProperties.push_back(tempSoundProperty); - } - - MY_SQLITE_FINALIZE(qSoundProperty) - - std::string notificationCommand = "SELECT type, status, parameter FROM SourceNotificationConfiguration" + i2s(temp.sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) - - while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) - { - tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); - tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); - tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); - temp.listNotificationConfigurations.push_back(tempNotificationConfiguration); - } - MY_SQLITE_FINALIZE(qNotification) - - //read out MainSoundProperties if source is visible - if(temp.visible) - { - std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(temp.sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) - while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) - { - tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); - tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); - temp.listMainSoundProperties.push_back(tempMainSoundProperty); - } - - MY_SQLITE_FINALIZE(qMAinSoundProperty) - - std::string mainNotificationCommand = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(temp.sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) - - while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) - { - tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qMainNotification, 0)); - tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qMainNotification, 1)); - tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); - temp.listMainNotificationConfigurations.push_back(tempNotificationConfiguration); - } - MY_SQLITE_FINALIZE(qMainNotification) - } - - - listSources.push_back(temp); - temp.listConnectionFormats.clear(); - temp.listMainSoundProperties.clear(); - temp.listSoundProperties.clear(); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSources SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSourceClasses(std::vector & listSourceClasses) const -{ - listSourceClasses.clear(); - - sqlite3_stmt* query = NULL, *subQuery = NULL; - int eCode = 0, eCode1; - am_SourceClass_s classTemp; - am_ClassProperty_s propertyTemp; - - std::string command = "SELECT sourceClassID, name FROM " + std::string(SOURCE_CLASS_TABLE); - std::string command2; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - classTemp.sourceClassID = sqlite3_column_int(query, 0); - classTemp.name = std::string((const char*) sqlite3_column_text(query, 1)); - - //read out Properties - command2 = "SELECT classProperty, value FROM SourceClassProperties" + i2s(classTemp.sourceClassID); - MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &subQuery, NULL) - - while ((eCode1 = sqlite3_step(subQuery)) == SQLITE_ROW) - { - propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(subQuery, 0); - propertyTemp.value = sqlite3_column_int(subQuery, 1); - classTemp.listClassProperties.push_back(propertyTemp); - } - - if (eCode1 != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode1); - MY_SQLITE_FINALIZE(query) - MY_SQLITE_FINALIZE(subQuery) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(subQuery) - - listSourceClasses.push_back(classTemp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(subQuery) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListCrossfaders(std::vector & listCrossfaders) const -{ - listCrossfaders.clear(); - sqlite3_stmt* query = NULL; - int eCode = 0; - am_Crossfader_s tempData; - std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - tempData.name = std::string((const char*) sqlite3_column_text(query, 0)); - tempData.sinkID_A = sqlite3_column_int(query, 1); - tempData.sinkID_B = sqlite3_column_int(query, 2); - tempData.sourceID = sqlite3_column_int(query, 3); - tempData.hotSink = static_cast(sqlite3_column_int(query, 4)); - tempData.crossfaderID = sqlite3_column_int(query, 5); - listCrossfaders.push_back(tempData); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListCrossfaders SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListGateways(std::vector & listGateways) const -{ - listGateways.clear(); - sqlite3_stmt* query = NULL, *qSinkConnectionFormat = NULL, *qSourceConnectionFormat = NULL; - int eCode = 0; - am_Gateway_s temp; - am_ConnectionFormat_e tempConnectionFormat; - - std::string command = "SELECT name, sinkID, sourceID, domainSinkID, domainSourceID, controlDomainID, gatewayID FROM " + std::string(GATEWAY_TABLE); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.name = std::string((const char*) sqlite3_column_text(query, 0)); - temp.sinkID = sqlite3_column_int(query, 1); - temp.sourceID = sqlite3_column_int(query, 2); - temp.domainSinkID = sqlite3_column_int(query, 3); - temp.domainSourceID = sqlite3_column_int(query, 4); - temp.controlDomainID = sqlite3_column_int(query, 5); - temp.gatewayID = sqlite3_column_int(query, 6); - - //convertionMatrix: - ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); - iter = mListConnectionFormat.find(temp.gatewayID); - if (iter == mListConnectionFormat.end()) - { - logError("DatabaseHandler::getListGateways database error with convertionFormat"); - - return (E_DATABASE_ERROR); - } - temp.convertionMatrix = iter->second; - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM GatewaySourceFormat" + i2s(temp.gatewayID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSourceConnectionFormat, NULL) - while ((eCode = sqlite3_step(qSourceConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSourceConnectionFormat, 0); - temp.listSourceFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qSourceConnectionFormat) - - //read out sound properties - commandConnectionFormat = "SELECT soundFormat FROM GatewaySinkFormat" + i2s(temp.gatewayID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSinkConnectionFormat, NULL) - while ((eCode = sqlite3_step(qSinkConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSinkConnectionFormat, 0); - temp.listSinkFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qSinkConnectionFormat) - - listGateways.push_back(temp); - temp.listSinkFormats.clear(); - temp.listSourceFormats.clear(); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListGateways SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSinkClasses(std::vector & listSinkClasses) const -{ - listSinkClasses.clear(); - - sqlite3_stmt* query = NULL, *subQuery = NULL; - int eCode = 0; - am_SinkClass_s classTemp; - am_ClassProperty_s propertyTemp; - - std::string command = "SELECT sinkClassID, name FROM " + std::string(SINK_CLASS_TABLE); - std::string command2; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - classTemp.sinkClassID = sqlite3_column_int(query, 0); - classTemp.name = std::string((const char*) sqlite3_column_text(query, 1)); - - //read out Properties - command2 = "SELECT classProperty, value FROM SinkClassProperties" + i2s(classTemp.sinkClassID); - MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &subQuery, NULL) - - while ((eCode = sqlite3_step(subQuery)) == SQLITE_ROW) - { - propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(subQuery, 0); - propertyTemp.value = sqlite3_column_int(subQuery, 1); - classTemp.listClassProperties.push_back(propertyTemp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); - - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(subQuery) - - listSinkClasses.push_back(classTemp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListVisibleMainConnections(std::vector & listConnections) const -{ - listConnections.clear(); - sqlite3_stmt *query = NULL; - int eCode = 0; - am_MainConnectionType_s temp; - - std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.mainConnectionID = sqlite3_column_int(query, 0); - temp.sourceID = sqlite3_column_int(query, 1); - temp.sinkID = sqlite3_column_int(query, 2); - temp.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); - temp.delay = sqlite3_column_int(query, 4); - listConnections.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListVisibleMainConnections SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainSinks(std::vector & listMainSinks) const -{ - listMainSinks.clear(); - sqlite3_stmt* query = NULL; - int eCode = 0; - am_SinkType_s temp; - - std::string command = "SELECT name, sinkID, availability, availabilityReason, muteState, mainVolume, sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE visible=1 AND reserved=0"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.name = std::string((const char*) sqlite3_column_text(query, 0)); - temp.sinkID = sqlite3_column_int(query, 1); - temp.availability.availability = (am_Availability_e) sqlite3_column_int(query, 2); - temp.availability.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 3); - temp.muteState = (am_MuteState_e) sqlite3_column_int(query, 4); - temp.volume = sqlite3_column_int(query, 5); - temp.sinkClassID = sqlite3_column_int(query, 6); - listMainSinks.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSinks SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainSources(std::vector & listMainSources) const -{ - listMainSources.clear(); - sqlite3_stmt* query = NULL; - int eCode = 0; - am_SourceType_s temp; - std::string command = "SELECT name, sourceClassID, availability, availabilityReason, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE visible=1"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.name = std::string((const char*) sqlite3_column_text(query, 0)); - temp.sourceClassID = sqlite3_column_int(query, 1); - temp.availability.availability = (am_Availability_e) sqlite3_column_int(query, 2); - temp.availability.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 3); - temp.sourceID = sqlite3_column_int(query, 4); - - listMainSources.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSources SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector & listSoundProperties) const -{ - assert(sinkID!=0); - if (!existSink(sinkID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - listSoundProperties.clear(); - - sqlite3_stmt* query = NULL; - int eCode = 0; - am_MainSoundProperty_s temp; - std::string command = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.type = (am_MainSoundPropertyType_e) sqlite3_column_int(query, 0); - temp.value = sqlite3_column_int(query, 1); - listSoundProperties.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListMainSinkSoundProperties SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector & listSourceProperties) const -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - listSourceProperties.clear(); - - sqlite3_stmt* query = NULL; - int eCode = 0; - am_MainSoundProperty_s temp; - std::string command = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.type = (am_MainSoundPropertyType_e) sqlite3_column_int(query, 0); - temp.value = sqlite3_column_int(query, 1); - listSourceProperties.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListMainSinkSoundProperties SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListSystemProperties(std::vector & listSystemProperties) const -{ - listSystemProperties.clear(); - - sqlite3_stmt* query = NULL; - int eCode = 0; - am_SystemProperty_s temp; - std::string command = "SELECT type, value FROM " + std::string(SYSTEM_TABLE); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.type = (am_SystemPropertyType_e) sqlite3_column_int(query, 0); - temp.value = sqlite3_column_int(query, 1); - listSystemProperties.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSystemProperties SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e am::CAmDatabaseHandler::getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const -{ - listConnectionFormats.clear(); - sqlite3_stmt *qConnectionFormat = NULL; - int eCode = 0; - am_ConnectionFormat_e tempConnectionFormat; - std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - return (E_OK); -} - -am_Error_e am::CAmDatabaseHandler::getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const -{ - listConnectionFormats.clear(); - sqlite3_stmt* qConnectionFormat = NULL; - int eCode = 0; - am_ConnectionFormat_e tempConnectionFormat; - - //read out the connectionFormats - std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) - while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) - { - tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); - listConnectionFormats.push_back(tempConnectionFormat); - } - - MY_SQLITE_FINALIZE(qConnectionFormat) - - return (E_OK); -} - -am_Error_e am::CAmDatabaseHandler::getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const -{ - ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); - iter = mListConnectionFormat.find(gatewayID); - if (iter == mListConnectionFormat.end()) - { - logError("DatabaseHandler::getListGatewayConnectionFormats database error with convertionFormat"); - - return (E_DATABASE_ERROR); - } - listConnectionFormat = iter->second; - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t & delay) const -{ - assert(mainConnectionID!=0); - delay = -1; - sqlite3_stmt *query = NULL; - int eCode = 0; - - std::string command = "SELECT delay FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - delay = sqlite3_column_int(query, 0); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getTimingInformation SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - if (delay == -1) - return (E_NOT_POSSIBLE); - - return (E_OK); -} - -bool CAmDatabaseHandler::sqQuery(const std::string& query) -{ - sqlite3_stmt* statement; - int eCode = 0; - if ((eCode = sqlite3_exec(mpDatabase, query.c_str(), NULL, &statement, NULL)) != SQLITE_OK) - { - logError("DatabaseHandler::sqQuery SQL Query failed:", query.c_str(), "error code:", eCode); - return (false); - } - return (true); -} - -bool CAmDatabaseHandler::openDatabase() -{ - if (sqlite3_open_v2(mPath.c_str(), &mpDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) == SQLITE_OK) - { - logInfo("DatabaseHandler::openDatabase opened database"); - return (true); - } - logError("DatabaseHandler::openDatabase failed to open database"); - return (false); -} - -am_Error_e CAmDatabaseHandler::changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) -{ - assert(connectionID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT mainConnectionID FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE delay=? AND mainConnectionID=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, delay) - MY_SQLITE_BIND_INT(query, 2, connectionID) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - MY_SQLITE_FINALIZE(query) - return (E_OK); - } - command = "UPDATE " + std::string(MAINCONNECTION_TABLE) + " SET delay=? WHERE mainConnectionID=?;"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, delay) - MY_SQLITE_BIND_INT(query, 2, connectionID) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeDelayMainConnection SQLITE Step error code:", eCode); - - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - if (mpDatabaseObserver) - mpDatabaseObserver->timingInformationChanged(connectionID, delay); - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) -{ - assert(connection.connectionID==0); - assert(connection.sinkID!=0); - assert(connection.sourceID!=0); - //connection format is not checked, because it's project specific - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "INSERT INTO " + std::string(CONNECTION_TABLE) + "(sinkID, sourceID, delay, connectionFormat, reserved) VALUES (?,?,?,?,?)"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, connection.sinkID) - MY_SQLITE_BIND_INT(query, 2, connection.sourceID) - MY_SQLITE_BIND_INT(query, 3, connection.delay) - MY_SQLITE_BIND_INT(query, 4, connection.connectionFormat) - MY_SQLITE_BIND_INT(query, 5, true) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterConnectionDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - connectionID = sqlite3_last_insert_rowid(mpDatabase); - - logInfo("DatabaseHandler::enterConnectionDB entered new connection sourceID=", connection.sourceID, "sinkID=", connection.sinkID, "sourceID=", connection.sourceID, "connectionFormat=", connection.connectionFormat, "assigned ID=", connectionID); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) -{ - assert(sinkClass.sinkClassIDsqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SinkClassProperties" + i2s(sinkClassID) + std::string("(classProperty,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator Iterator = sinkClass.listClassProperties.begin(); - for (; Iterator < sinkClass.listClassProperties.end(); ++Iterator) - { - MY_SQLITE_BIND_INT(query, 1, Iterator->classProperty) - MY_SQLITE_BIND_INT(query, 2, Iterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSinkClassDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::enterSinkClassDB entered new sinkClass"); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSinkClassesChanged(); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) -{ - assert(sourceClass.sourceClassIDsqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SourceClassProperties" + i2s(sourceClassID) + std::string("(classProperty,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator Iterator = sourceClass.listClassProperties.begin(); - for (; Iterator < sourceClass.listClassProperties.end(); ++Iterator) - { - MY_SQLITE_BIND_INT(query, 1, Iterator->classProperty) - MY_SQLITE_BIND_INT(query, 2, Iterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSourceClassDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::enterSourceClassDB entered new sourceClass"); - - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSourceClassesChanged(); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::enterSystemProperties(const std::vector & listSystemProperties) -{ - assert(!listSystemProperties.empty()); - sqlite3_stmt* query = NULL; - int eCode = 0; - std::vector::const_iterator listIterator = listSystemProperties.begin(); - std::string command = "DELETE FROM " + std::string(SYSTEM_TABLE); - if (!this->sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO " + std::string(SYSTEM_TABLE) + " (type, value) VALUES (?,?)"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - for (; listIterator < listSystemProperties.end(); ++listIterator) - { - MY_SQLITE_BIND_INT(query, 1, listIterator->type) - MY_SQLITE_BIND_INT(query, 2, listIterator->value) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterSystemProperties SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_RESET(query) - } - - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::enterSystemProperties entered system properties"); - return (E_OK); -} - -/** - * checks for a certain mainConnection - * @param mainConnectionID to be checked for - * @return true if it exists - */ -bool CAmDatabaseHandler::existMainConnection(const am_mainConnectionID_t mainConnectionID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT mainConnectionID FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existMainConnection database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks for a certain Source - * @param sourceID to be checked for - * @return true if it exists - */ -bool CAmDatabaseHandler::existSource(const am_sourceID_t sourceID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND sourceID=" + i2s(sourceID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSource database error!:", eCode); - } - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a source name or ID exists - * @param sourceID the sourceID - * @param name the name - * @return true if it exits - */ -bool CAmDatabaseHandler::existSourceNameOrID(const am_sourceID_t sourceID, const std::string & name) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND (name=? OR sourceID=?)"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) - { - logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_bind_int(query, 2, sourceID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSource database error!:", eCode); - } - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a name exits - * @param name the name - * @return true if it exits - */ -bool CAmDatabaseHandler::existSourceName(const std::string & name) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND name=?"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) - { - logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSource database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks for a certain Sink - * @param sinkID to be checked for - * @return true if it exists - */ -bool CAmDatabaseHandler::existSink(const am_sinkID_t sinkID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND sinkID=" + i2s(sinkID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSink database error!:", eCode); - } - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a sink with the ID or the name exists - * @param sinkID the ID - * @param name the name - * @return true if it exists. - */ -bool CAmDatabaseHandler::existSinkNameOrID(const am_sinkID_t sinkID, const std::string & name) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND (name=? OR sinkID=?)"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) - { - logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_bind_int(query, 2, sinkID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSink database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a sink with the name exists - * @param name the name - * @return true if it exists - */ -bool CAmDatabaseHandler::existSinkName(const std::string & name) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND name=?"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) - { - logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSink database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks for a certain domain - * @param domainID to be checked for - * @return true if it exists - */ -bool CAmDatabaseHandler::existDomain(const am_domainID_t domainID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE reserved=0 AND domainID=" + i2s(domainID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existDomain database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks for certain gateway - * @param gatewayID to be checked for - * @return true if it exists - */ -bool CAmDatabaseHandler::existGateway(const am_gatewayID_t gatewayID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existGateway database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -am_Error_e CAmDatabaseHandler::getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t & domainID) const -{ - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - std::string command = "SELECT domainID FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); - int eCode = 0; - am_Error_e returnVal = E_DATABASE_ERROR; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - domainID = sqlite3_column_int(query, 0); - returnVal = E_OK; - } - else - { - logError("DatabaseHandler::getDomainOfSource database error!:", eCode); - } - - MY_SQLITE_FINALIZE(query) - return (returnVal); -} - -am_Error_e am::CAmDatabaseHandler::getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t & domainID) const -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - std::string command = "SELECT domainID FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); - int eCode = 0; - am_Error_e returnVal = E_DATABASE_ERROR; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - domainID = sqlite3_column_int(query, 0); - returnVal = E_OK; - } - else - { - logError("DatabaseHandler::getDomainOfSink database error!:", eCode); - } - - MY_SQLITE_FINALIZE(query) - return (returnVal); -} - -/** - * checks for certain SinkClass - * @param sinkClassID - * @return true if it exists - */ -bool CAmDatabaseHandler::existSinkClass(const am_sinkClass_t sinkClassID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sinkClassID FROM " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + i2s(sinkClassID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSinkClass database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks for certain sourceClass - * @param sourceClassID - * @return true if it exists - */ -bool CAmDatabaseHandler::existSourceClass(const am_sourceClass_t sourceClassID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + i2s(sourceClassID); - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existSinkClass database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -am_Error_e CAmDatabaseHandler::changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) -{ - assert(connectionID!=0); - - sqlite3_stmt *query = NULL, *queryMainConnectionSubIDs = NULL; - int eCode = 0, eCode1 = 0; - std::string command = "UPDATE " + std::string(CONNECTION_TABLE) + " set delay=? WHERE connectionID=?"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, delay) - MY_SQLITE_BIND_INT(query, 2, connectionID) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeConnectionTimingInformation SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - //now we need to find all mainConnections that use the changed connection and update their timing - - int tempMainConnectionID; - //first get all route tables for all mainconnections - command = "SELECT name FROM sqlite_master WHERE type ='table' and name LIKE 'MainConnectionRoute%'"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - //now check if the connection ID is in this table - std::string tablename = std::string((const char*) sqlite3_column_text(query, 0)); - std::string command2 = "SELECT connectionID FROM " + tablename + " WHERE connectionID=" + i2s(connectionID); - MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &queryMainConnectionSubIDs, NULL) - if ((eCode1 = sqlite3_step(queryMainConnectionSubIDs)) == SQLITE_ROW) - { - //if the connection ID is in, recalculate the mainconnection delay - std::stringstream(tablename.substr(tablename.find_first_not_of("MainConnectionRoute"))) >> tempMainConnectionID; - changeDelayMainConnection(calculateMainConnectionDelay(tempMainConnectionID), tempMainConnectionID); - } - else if (eCode1 != SQLITE_DONE) - { - logError("DatabaseHandler::changeConnectionTimingInformation SQLITE error code:", eCode1); - - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(queryMainConnectionSubIDs) - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::changeConnectionTimingInformation SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeConnectionFinal(const am_connectionID_t connectionID) -{ - assert(connectionID!=0); - - sqlite3_stmt *query = NULL; - int eCode = 0; - std::string command = "UPDATE " + std::string(CONNECTION_TABLE) + " set reserved=0 WHERE connectionID=?"; - - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, connectionID) - - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeConnectionFinal SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_timeSync_t CAmDatabaseHandler::calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const -{ - assert(mainConnectionID!=0); - sqlite3_stmt* query = NULL; - std::string command = "SELECT sum(Connections.delay),min(Connections.delay) FROM " + std::string(CONNECTION_TABLE) + ",MainConnectionRoute" + i2s(mainConnectionID) + " WHERE MainConnectionRoute" + i2s(mainConnectionID) + ".connectionID = Connections.connectionID"; - int eCode = 0; - am_timeSync_t delay = 0; - am_timeSync_t min = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - delay = sqlite3_column_int(query, 0); - min = sqlite3_column_int(query, 1); - } - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::calculateMainConnectionDelay SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - if ((eCode = sqlite3_finalize(query)) != SQLITE_OK) - { - logError("DatabaseHandler::calculateMainConnectionDelay SQLITE Finalize error code:", eCode); - return (E_DATABASE_ERROR); - } - if (min < 0) - delay = -1; - return (delay); - -} - -/** - * registers the Observer at the Database - * @param iObserver pointer to the observer - */ -void CAmDatabaseHandler::registerObserver(CAmDatabaseObserver *iObserver) -{ - assert(iObserver!=NULL); - mpDatabaseObserver = iObserver; -} - -/** - * gives information about the visibility of a source - * @param sourceID the sourceID - * @return true if source is visible - */ -bool CAmDatabaseHandler::sourceVisible(const am_sourceID_t sourceID) const -{ - assert(sourceID!=0); - sqlite3_stmt* query = NULL; - std::string command = "SELECT visible FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); - int eCode = 0; - bool returnVal = false; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - returnVal = (bool) sqlite3_column_int(query, 0); - } - else if (eCode != SQLITE_DONE) - { - returnVal = false; - logError("DatabaseHandler::sourceVisible database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * gives information about the visibility of a sink - * @param sinkID the sinkID - * @return true if source is visible - */ -bool CAmDatabaseHandler::sinkVisible(const am_sinkID_t sinkID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT visible FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND sinkID=" + i2s(sinkID); - int eCode = 0; - bool returnVal = false; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - returnVal = sqlite3_column_int(query, 0); - } - else if (eCode != SQLITE_DONE) - { - returnVal = false; - logError("DatabaseHandler::sinkVisible database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a connection already exists. - * Only takes sink, source and format information for search! - * @param connection the connection to be checked - * @return true if connections exists - */ -bool CAmDatabaseHandler::existConnection(const am_Connection_s & connection) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT connectionID FROM " + std::string(CONNECTION_TABLE) + " WHERE sinkID=? AND sourceID=? AND connectionFormat=? AND reserved=0"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_int(query, 1, connection.sinkID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_bind_int(query, 2, connection.sourceID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_bind_int(query, 3, connection.connectionFormat))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existMainConnection database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a connection with the given ID exists - * @param connectionID - * @return true if connection exits - */ -bool CAmDatabaseHandler::existConnectionID(const am_connectionID_t connectionID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT connectionID FROM " + std::string(CONNECTION_TABLE) + " WHERE connectionID=? AND reserved=0"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_int(query, 1, connectionID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existMainConnection database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -/** - * checks if a CrossFader exists - * @param crossfaderID the ID of the crossfader to be checked - * @return true if exists - */ -bool CAmDatabaseHandler::existcrossFader(const am_crossfaderID_t crossfaderID) const -{ - sqlite3_stmt* query = NULL; - std::string command = "SELECT crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=?"; - int eCode = 0; - bool returnVal = true; - MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_bind_int(query, 1, crossfaderID))) - { - logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); - return (false); - } - - if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - returnVal = false; - else if (eCode != SQLITE_ROW) - { - returnVal = false; - logError("DatabaseHandler::existMainConnection database error!:", eCode); - } - - MY_SQLITE_FINALIZE_BOOL(query) - return (returnVal); -} - -am_Error_e CAmDatabaseHandler::getSoureState(const am_sourceID_t sourceID, am_SourceState_e & sourceState) const -{ - assert(sourceID!=0); - sqlite3_stmt* query = NULL; - sourceState = SS_UNKNNOWN; - std::string command = "SELECT sourceState FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); - int eCode = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceState = (am_SourceState_e) sqlite3_column_int(query, 0); - } - else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - { - logError("DatabaseHandler::getSoureState database error!:", eCode); - } - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) -{ - assert(sourceID!=0); - assert(sourceState>=SS_UNKNNOWN && sourceState<=SS_MAX); - sqlite3_stmt* query = NULL; - std::string command = "UPDATE " + std::string(SOURCE_TABLE) + " SET sourceState=? WHERE sourceID=" + i2s(sourceID); - int eCode = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, sourceState) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSourceState SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSinkVolume(const am_sinkID_t sinkID, am_volume_t & volume) const -{ - assert(sinkID!=0); - sqlite3_stmt* query = NULL; - volume = -1; - std::string command = "SELECT volume FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); - int eCode = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - volume = sqlite3_column_int(query, 0); - } - else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - { - logError("DatabaseHandler::getSinkVolume database error!:", eCode); - } - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSourceVolume(const am_sourceID_t sourceID, am_volume_t & volume) const -{ - assert(sourceID!=0); - sqlite3_stmt* query = NULL; - volume = -1; - std::string command = "SELECT volume FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); - int eCode = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - volume = sqlite3_column_int(query, 0); - } - else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - { - logError("DatabaseHandler::getSourceVolume database error!:", eCode); - } - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t & value) const -{ - assert(sinkID!=0); - if (!existSink(sinkID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existent, but not shown in sequences - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT value FROM SinkSoundProperty" + i2s(sinkID) + " WHERE soundPropertyType=" + i2s(propertyType); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - value = sqlite3_column_int(query, 0); - } - else - { - logError("DatabaseHandler::getDomainState database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t & value) const -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existent, but not shown in sequences - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT value FROM SourceSoundProperty" + i2s(sourceID) + " WHERE soundPropertyType=" + i2s(propertyType); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - value = sqlite3_column_int(query, 0); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getSinkSoundPropertyValue SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const -{ - assert(domainID!=0); - sqlite3_stmt* query = NULL; - state = DS_UNKNOWN; - std::string command = "SELECT domainState FROM " + std::string(DOMAIN_TABLE) + " WHERE domainID=" + i2s(domainID); - int eCode = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - state = (am_DomainState_e) sqlite3_column_int(query, 0); - } - else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) - { - logError("DatabaseHandler::getDomainState database error!:", eCode); - } - MY_SQLITE_FINALIZE(query) - return (E_OK); - -} - -am_Error_e CAmDatabaseHandler::peekDomain(const std::string & name, am_domainID_t & domainID) -{ - domainID=0; - sqlite3_stmt* query = NULL, *queryInsert = NULL; - std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE name=?"; - int eCode = 0, eCode1 = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - domainID = sqlite3_column_int(query, 0); - } - else if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::peekDomain database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - else - { - command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (name,reserved) VALUES (?,?)"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) - MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(queryInsert, 2, 1) - //reservation flag - if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) - { - logError("DatabaseHandler::peekDomain SQLITE Step error code:", eCode1); - MY_SQLITE_FINALIZE(queryInsert) - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(queryInsert) - - domainID = sqlite3_last_insert_rowid(mpDatabase); - } - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::peekSink(const std::string & name, am_sinkID_t & sinkID) -{ - sqlite3_stmt* query = NULL, *queryInsert = NULL; - std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=?"; - int eCode = 0, eCode1 = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkID = sqlite3_column_int(query, 0); - } - else if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::peekSink database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - else - { - if (mFirstStaticSink) - { - command = "INSERT INTO " + std::string(SINK_TABLE) + " (name,reserved,sinkID) VALUES (?,?," + i2s(DYNAMIC_ID_BOUNDARY) + ")"; - mFirstStaticSink = false; - } - else - { - command = "INSERT INTO " + std::string(SINK_TABLE) + " (name,reserved) VALUES (?,?)"; - } - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) - MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(queryInsert, 2, 1) - //reservation flag - if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) - { - logError("DatabaseHandler::peekSink SQLITE Step error code:", eCode1); - MY_SQLITE_FINALIZE(queryInsert) - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(queryInsert) - - sinkID = sqlite3_last_insert_rowid(mpDatabase); - } - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::peekSource(const std::string & name, am_sourceID_t & sourceID) -{ - sqlite3_stmt* query = NULL, *queryInsert = NULL; - std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=?"; - int eCode = 0, eCode1 = 0; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceID = sqlite3_column_int(query, 0); - } - else if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::peekSink database error!:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - else - { - if (mFirstStaticSource) - { - command = "INSERT INTO " + std::string(SOURCE_TABLE) + " (name,reserved,sourceID) VALUES (?,?," + i2s(DYNAMIC_ID_BOUNDARY) + ")"; - mFirstStaticSource = false; - } - else - { - command = "INSERT INTO " + std::string(SOURCE_TABLE) + " (name,reserved) VALUES (?,?)"; - } - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) - MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) - MY_SQLITE_BIND_INT(queryInsert, 2, 1) - //reservation flag - if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) - { - logError("DatabaseHandler::peekSink SQLITE Step error code:", eCode1); - MY_SQLITE_FINALIZE(queryInsert) - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(queryInsert) - sourceID = sqlite3_last_insert_rowid(mpDatabase); - } - - MY_SQLITE_FINALIZE(query) - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SINK_TABLE) + " SET volume=? WHERE sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, volume) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSinkVolume SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSinkVolume changed volume of sink:", sinkID, "to:", volume); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) -{ - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(SOURCE_TABLE) + " SET volume=? WHERE sourceID=" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, volume) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSourceVolume SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSourceVolume changed volume of source=:", sourceID, "to:", volume); - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sourceID_t sourceID) -{ - assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SourceSoundProperty" + i2s(sourceID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, soundProperty.value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSourceSoundPropertyDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSourceSoundPropertyDB changed SourceSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sinkID_t sinkID) -{ - assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SinkSoundProperty" + i2s(sinkID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, soundProperty.value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSinkSoundPropertyDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - assert(sinkID!=0); - - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeSinkSoundPropertyDB changed SinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) -{ - assert(crossfaderID!=0); - assert(hotsink>=HS_UNKNOWN && hotsink>=HS_MAX); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE " + std::string(CROSSFADER_TABLE) + " SET hotsink=? WHERE crossfaderID=" + i2s(crossfaderID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, hotsink) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeCrossFaderHotSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - logInfo("DatabaseHandler::changeCrossFaderHotSink changed hotsink of crossfader=", crossfaderID, "to:", hotsink); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) -{ - sqlite3_stmt* query = NULL; - int eCode = 0; - size_t i = 0; - std::string command; - am_domainID_t rootID = tree.returnRootDomainID(); - CAmRoutingTreeItem *parent = tree.returnRootItem(); - - if (onlyfree) - { - command = "SELECT g.domainSourceID,g.gatewayID FROM " + std::string(GATEWAY_TABLE) + " g WHERE domainSinkID=? AND NOT EXISTS (SELECT NULL FROM " + std::string(CONNECTION_TABLE) + " c WHERE c.sinkID = g.sinkID OR c.sourceID = g.sourceID )"; - } - else - { - command = "SELECT domainSourceID,gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE domainSinkID=?"; - } - - do - { - if (i != 0) - { - parent = flatTree.at(i - 1); - rootID = parent->returnDomainID(); - } - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, rootID) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - // additional check to avoid cyclic routes - const am_domainID_t domainSourceID = sqlite3_column_int(query, 0); - bool sourceDomainAlreadyHandledAsSink = false; - for (std::vector::const_iterator iFT = flatTree.begin(); iFT != flatTree.end(); ++iFT) - { - if (domainSourceID == (*iFT)->returnParent()->returnDomainID()) sourceDomainAlreadyHandledAsSink = true; - } - - if (!sourceDomainAlreadyHandledAsSink) - { - // logInfo("DatabaseHandler::getRoutingTree ", rootID, ", ", domainSourceID, ", ", sqlite3_column_int(query, 1)); - flatTree.push_back(tree.insertItem(domainSourceID, sqlite3_column_int(query, 1), parent)); - } - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getRoutingTree SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - i++; - } while (flatTree.size() > (i - 1)); - - return (E_OK); -} - -am_Error_e am::CAmDatabaseHandler::peekSinkClassID(const std::string & name, am_sinkClass_t & sinkClassID) -{ - if (name.empty()) - return (E_NON_EXISTENT); - - am_Error_e returnVal = E_NON_EXISTENT; - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT sinkClassID FROM " + std::string(SINK_CLASS_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkClassID = sqlite3_column_int(query, 0); - returnVal = E_OK; - } - else if (eCode != SQLITE_DONE) - { - sinkClassID = 0; - logError("DatabaseHandler::peekSinkClassID SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - returnVal = E_DATABASE_ERROR; - } - - MY_SQLITE_FINALIZE(query) - return (returnVal); -} - -am_Error_e am::CAmDatabaseHandler::peekSourceClassID(const std::string & name, am_sourceClass_t & sourceClassID) -{ - if (name.empty()) - return (E_NON_EXISTENT); - - am_Error_e returnVal = E_NON_EXISTENT; - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE name=?"; - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) - - if ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceClassID = sqlite3_column_int(query, 0); - returnVal = E_OK; - } - else if (eCode != SQLITE_DONE) - { - sourceClassID = 0; - logError("DatabaseHandler::peekSourceClassID SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - returnVal = E_DATABASE_ERROR; - } - - MY_SQLITE_FINALIZE(query) - return (returnVal); -} - - -am_Error_e CAmDatabaseHandler::changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) -{ - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - am_sourceClass_t sourceClassOut(sourceClassID); - std::vector listMainSoundPropertiesOut(listMainSoundProperties); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - //check if sinkClass needs to be changed - if (sourceClassID!=0) - { - command = "UPDATE"+ std::string(SOURCE_TABLE)+ " SET sourceClassID=? WHERE sourceID=" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, sourceClassID) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSource SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query); - } - - else //we need to read out the active one - { - command = "SELECT sourceClassID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 and sourceID=" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sourceClassOut = sqlite3_column_int(query, 0); - } - MY_SQLITE_FINALIZE(query) - } - - //check if soundProperties need to be updated - if (!listSoundProperties.empty()) - { - //first we drop the table - command = "DELETE from SourceSoundProperty" + i2s(sourceID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //then we'll have a new one - //Fill SinkSoundProperties - command = "INSERT INTO SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator SoundPropertyIterator = listSoundProperties.begin(); - for (; SoundPropertyIterator < listSoundProperties.end(); ++SoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSource SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - //check if we have to update the list of connectionformats - if (!listConnectionFormats.empty()) - { - //first clear the table - command = "DELETE from SourceConnectionFormat" + i2s(sourceID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = listConnectionFormats.begin(); - for (; connectionFormatIterator < listConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - //then we need to check if we need to update the listMainSoundProperties - if (!listMainSoundProperties.empty() && sourceVisible(sourceID)) - { - command = "DELETE from SourceMainSoundProperty" + i2s(sourceID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //Fill MainSinkSoundProperties - command = "INSERT INTO SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainSoundPropertyIterator = listMainSoundProperties.begin(); - for (; mainSoundPropertyIterator < listMainSoundProperties.end(); ++mainSoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - else //read out the properties - { - getListMainSourceSoundProperties(sourceID,listMainSoundPropertiesOut); - } - - logInfo("DatabaseHandler::changeSource changed changeSink of source:", sourceID); - - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sourceUpdated(sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)); - } - - return (E_OK); - -} - -am_Error_e CAmDatabaseHandler::changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - am_sinkClass_t sinkClassOut(sinkClassID); - std::vector listMainSoundPropertiesOut(listMainSoundProperties); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - //check if sinkClass needs to be changed - if (sinkClassID!=0) - { - command = "UPDATE"+ std::string(SINK_TABLE)+ " SET sinkClassID=? WHERE sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, sinkClassID) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query); - } - - else //we need to read out the active one - { - command = "SELECT sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 and sinkID=" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - sinkClassOut = sqlite3_column_int(query, 0); - } - MY_SQLITE_FINALIZE(query) - } - - //check if soundProperties need to be updated - if (!listSoundProperties.empty()) - { - //first we drop the table - command = "DELETE from SinkSoundProperty" + i2s(sinkID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //then we'll have a new one - //Fill SinkSoundProperties - command = "INSERT INTO SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator SoundPropertyIterator = listSoundProperties.begin(); - for (; SoundPropertyIterator < listSoundProperties.end(); ++SoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - //check if we have to update the list of connectionformats - if (!listConnectionFormats.empty()) - { - //first clear the table - command = "DELETE from SinkConnectionFormat" + i2s(sinkID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = listConnectionFormats.begin(); - for (; connectionFormatIterator < listConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - //then we need to check if we need to update the listMainSoundProperties - if (!listMainSoundProperties.empty() && sinkVisible(sinkID)) - { - command = "DELETE from SinkMainSoundProperty" + i2s(sinkID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //Fill MainSinkSoundProperties - command = "INSERT INTO SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator mainSoundPropertyIterator = listMainSoundProperties.begin(); - for (; mainSoundPropertyIterator < listMainSoundProperties.end(); ++mainSoundPropertyIterator) - { - MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) - MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - else //read out the properties - { - getListMainSinkSoundProperties(sinkID,listMainSoundPropertiesOut); - } - - logInfo("DatabaseHandler::changeSink changed changeSink of sink:", sinkID); - - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sinkUpdated(sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)); - } - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) -{ - assert(sinkID!=0); - if (!existSink(sinkID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - listMainNotificationConfigurations.clear(); - - sqlite3_stmt* query = NULL; - int eCode = 0; - am_NotificationConfiguration_s temp; - std::string command = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(sinkID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.type = static_cast(sqlite3_column_int(query, 0)); - temp.status = static_cast(sqlite3_column_int(query, 1)); - temp.parameter= static_cast(sqlite3_column_int(query, 2)); - listMainNotificationConfigurations.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSinkMainNotificationConfigurations SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); - -} - -am_Error_e CAmDatabaseHandler::getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - listMainNotificationConfigurations.clear(); - - sqlite3_stmt* query = NULL; - int eCode = 0; - am_NotificationConfiguration_s temp; - std::string command = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(sourceID); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - - while ((eCode = sqlite3_step(query)) == SQLITE_ROW) - { - temp.type = static_cast(sqlite3_column_int(query, 0)); - temp.status = static_cast(sqlite3_column_int(query, 1)); - temp.parameter= static_cast(sqlite3_column_int(query, 2)); - listMainNotificationConfigurations.push_back(temp); - } - - if (eCode != SQLITE_DONE) - { - logError("DatabaseHandler::getListSourceMainNotificationConfigurations SQLITE error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - - MY_SQLITE_FINALIZE(query) - - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SinkMainNotificationConfiguration" + i2s(sinkID) + " SET status=?, parameter=? WHERE type=" + i2s(mainNotificationConfiguration.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, mainNotificationConfiguration.status) - MY_SQLITE_BIND_INT(query, 2, mainNotificationConfiguration.parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSinkNotificationConfigurationDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMainNotificationConfigurationChanged(sinkID, mainNotificationConfiguration); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SourceMainNotificationConfiguration" + i2s(sourceID) + " SET status=?, parameter=? WHERE type=" + i2s(mainNotificationConfiguration.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, mainNotificationConfiguration.status) - MY_SQLITE_BIND_INT(query, 2, mainNotificationConfiguration.parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeMainSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - - if (mpDatabaseObserver) - mpDatabaseObserver->sourceMainNotificationConfigurationChanged(sourceID, mainNotificationConfiguration); - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix) -{ - assert(gatewayID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - - if (!listSourceConnectionFormats.empty()) - { - //clear Database - command = "DELETE from GatewaySourceFormat" + i2s(gatewayID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - //fill ConnectionFormats - command = "INSERT INTO GatewaySourceFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = listSourceConnectionFormats.begin(); - for (; connectionFormatIterator < listSourceConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - if (!listSinkConnectionFormats.empty()) - { - //clear Database - command = "DELETE from GatewaySinkFormat" + i2s(gatewayID); - if (!sqQuery(command)) - return (E_DATABASE_ERROR); - - command = "INSERT INTO GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - std::vector::const_iterator connectionFormatIterator = listSinkConnectionFormats.begin(); - for (; connectionFormatIterator < listSinkConnectionFormats.end(); ++connectionFormatIterator) - { - MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_RESET(query) - } - MY_SQLITE_FINALIZE(query) - } - - if (!convertionMatrix.empty()) - { - mListConnectionFormat.clear(); - mListConnectionFormat.insert(std::make_pair(gatewayID, convertionMatrix)); - } - - logInfo("DatabaseHandler::changeGatewayDB changed Gateway with ID", gatewayID); - - //todo: check if observer needs to be adopted. - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s notificationConfiguration) -{ - assert(sinkID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SinkNotificationConfiguration" + i2s(sinkID) + " SET status=?, parameter=? WHERE type=" + i2s(notificationConfiguration.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, notificationConfiguration.status) - MY_SQLITE_BIND_INT(query, 2, notificationConfiguration.parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSinkNotificationConfigurationDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); - - //todo:: inform obsever here... - return (E_OK); -} - -am_Error_e CAmDatabaseHandler::changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s notificationConfiguration) -{ - assert(sourceID!=0); - - sqlite3_stmt* query = NULL; - int eCode = 0; - std::string command; - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - command = "UPDATE SourceNotificationConfiguration" + i2s(sourceID) + " SET status=?, parameter=? WHERE type=" + i2s(notificationConfiguration.type); - MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) - MY_SQLITE_BIND_INT(query, 1, notificationConfiguration.status) - MY_SQLITE_BIND_INT(query, 2, notificationConfiguration.parameter) - if ((eCode = sqlite3_step(query)) != SQLITE_DONE) - { - logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); - MY_SQLITE_FINALIZE(query) - return (E_DATABASE_ERROR); - } - MY_SQLITE_FINALIZE(query) - - logInfo("DatabaseHandler::changeSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); - - //todo:: implement observer function - return (E_OK); -} - -void CAmDatabaseHandler::createTables() -{ - for (uint16_t i = 0; i < sizeof(databaseTables) / sizeof(databaseTables[0]); i++) - { - if (!sqQuery("CREATE TABLE " + databaseTables[i])) - throw std::runtime_error("CAmDatabaseHandler Could not create tables!"); - } -} - -} diff --git a/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp b/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp new file mode 100644 index 0000000..66b801e --- /dev/null +++ b/AudioManagerDaemon/src/CAmDatabaseHandlerMap.cpp @@ -0,0 +1,2739 @@ +/** + * 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 Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2013 + * + * \file CAmMapHandler.cpp + * For further information see http://www.genivi.org/. + * + */ + +#include "CAmMapHandler.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CAmDatabaseObserver.h" +#include "CAmRouter.h" +#include "shared/CAmDltWrapper.h" +#include "CAmLog.h" + + +namespace am +{ + +/* Helper functions */ + +template TMapObjectType const * objectWithKeyIfExistsInMap(const TMapKeyType & key, const AM_MAP & map) +{ + typename AM_MAP::const_iterator iter = map.find(key); + if( iter!=map.end() ) + return (TMapObjectType const *)&iter->second; + return NULL; +} + +template bool existsObjectWithKeyInMap(const TMapKeyType & key, const AM_MAP & map) +{ + return objectWithKeyIfExistsInMap(key, map)!=NULL; +} + +typedef bool (*CAmCompareObjectWithValue)(const void *, const void *, void *); + +template +TMapObjectType const * findFirstObjectMatchingCriteria(const AM_MAP & aMap, + const TSearchObjectType & aComparison, + CAmCompareObjectWithValue comparator, + void *context = NULL) +{ + typename AM_MAP::const_iterator it = aMap.begin(); + TMapObjectType * result = NULL; + for (; it != aMap.end(); ++it) + { + const void * obj1 = (const void *)&it->second; + const void * obj2 = (const void *)&aComparison; + if (comparator(obj1, obj2, context)) + { + result = (TMapObjectType *)&it->second; + break; + } + } + return result; +} + +bool compareSinkObjectByName(const void *anObject, const void *aValue, void *) +{ + return (anObject && aValue)?((const std::string *)aValue)->compare(((const CAmMapHandler::am_Sink_Database_s *)anObject)->name)==0:false; +} + +bool compareSourceObjectByName(const void *anObject, const void *aValue, void *) +{ + return (anObject && aValue)?((const std::string *)aValue)->compare(((const CAmMapHandler::am_Source_Database_s *)anObject)->name)==0:false; +} + +bool compareSinkClassObjectByName(const void *anObject, const void *aValue, void *) +{ + return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_SinkClass_s *)anObject)->name)==0:false; +} + +bool compareSourceClassObjectByName(const void *anObject, const void *aValue, void *) +{ + return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_SourceClass_s *)anObject)->name)==0:false; +} + +bool compareDomainObjectWithValue(const void *anObject, const void *aValue, void *) +{ + return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_Domain_s *)anObject)->name)==0:false; +} + +bool compareSinkObjectByNameAndFlag(const void *anObject, const void *aValue, void *contextOrNull) +{ + if(anObject && aValue) + { + bool flag = (contextOrNull!=NULL)?*((bool*)contextOrNull):true; + return flag==((const CAmMapHandler::am_Sink_Database_s *)anObject)->reserved && + ((const std::string *)aValue)->compare(((const am_Sink_s *)anObject)->name)==0; + } + return false; +} + +bool compareConnectionObjectsWithObject(const void *anObject, const void *aValue, void *) +{ + if(anObject && aValue) + { + return 0==((const CAmMapHandler::am_Connection_Database_s *)anObject)->reserved && + ((const CAmMapHandler::am_Connection_Database_s *)aValue)->sinkID == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->sinkID && + ((const CAmMapHandler::am_Connection_Database_s *)aValue)->sourceID == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->sourceID && + ((const CAmMapHandler::am_Connection_Database_s *)aValue)->connectionFormat == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->connectionFormat; + } + return false; +} + +bool compareSourceObjectsByNameAndFlag(const void *anObject, const void *aValue, void *contextOrNull) +{ + if(anObject && aValue) + { + bool flag = (contextOrNull!=NULL)?*((bool*)contextOrNull):true; + return flag==((const CAmMapHandler::am_Source_Database_s *)anObject)->reserved && + ((const std::string *)aValue)->compare(((const CAmMapHandler::am_Source_Database_s *)anObject)->name)==0; + } + return false; +} + +/* Domain */ + +void CAmMapHandler::CAmDomain::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Domain(" << name.c_str() << ") id(" << domainID << ")" << std::endl << + "bus name(" << busname.c_str() << + ") node name(" << nodename.c_str() << + ") early(" << early << + ") domainID(" << domainID << + ") complete(" << complete << + ") state(" << state << + ") reserved(" << reserved << ")" << std::endl; + outString = fmt.str(); +} + +/* Source */ + +void CAmMapHandler::CAmSource::getSourceType(am_SourceType_s & sourceType) const +{ + sourceType.name = name; + sourceType.sourceClassID = sourceClassID; + sourceType.availability = available; + sourceType.sourceID = sourceID; +} + +void CAmMapHandler::CAmSource::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Source(" << name.c_str() << ") id(" << sourceID << ")" << std::endl << + "sourceClassID(" << sourceClassID << + ") domainID(" << domainID << + ") visible(" << visible << + ") volume(" << volume << + ") interruptState(" << interruptState << + ") sourceState(" << sourceState << + ") reserved(" << reserved << ")" << + ") available([availability:" << available.availability << " availabilityReason:" << available.availabilityReason << "]" + ") listSoundProperties ("; + std::for_each(listSoundProperties.begin(), listSoundProperties.end(), [&](const am_SoundProperty_s & ref) { + fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; + }); + fmt << ") listConnectionFormats ("; + std::for_each(listConnectionFormats.begin(), listConnectionFormats.end(), [&](const am_ConnectionFormat_e & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ") listMainSoundProperties ("; + std::for_each(listMainSoundProperties.begin(), listMainSoundProperties.end(), [&](const am_MainSoundProperty_s & ref) { + fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; + }); + fmt << ") listMainNotificationConfigurations ("; + std::for_each(listMainNotificationConfigurations.begin(), listMainNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { + fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; + }); + fmt << ") listNotificationConfigurations ("; + std::for_each(listNotificationConfigurations.begin(), listNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { + fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + +/* Sink */ + +void CAmMapHandler::CAmSink::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Sink(" << name.c_str() << ") id(" << sinkID << ")" << std::endl << + "sinkClassID(" << sinkClassID << + ") domainID(" << domainID << + ") visible(" << visible << + ") volume(" << volume << + ") muteState(" << muteState << + ") mainVolume(" << mainVolume << + ") reserved(" << reserved << ")" << + ") available([availability:" << available.availability << " availabilityReason:" << available.availabilityReason << "]" + ") listSoundProperties ("; + std::for_each(listSoundProperties.begin(), listSoundProperties.end(), [&](const am_SoundProperty_s & ref) { + fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; + }); + fmt << ") listConnectionFormats ("; + std::for_each(listConnectionFormats.begin(), listConnectionFormats.end(), [&](const am_ConnectionFormat_e & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ") listMainSoundProperties ("; + std::for_each(listMainSoundProperties.begin(), listMainSoundProperties.end(), [&](const am_MainSoundProperty_s & ref) { + fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; + }); + fmt << ") listMainNotificationConfigurations ("; + std::for_each(listMainNotificationConfigurations.begin(), listMainNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { + fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; + }); + fmt << ") listNotificationConfigurations ("; + std::for_each(listNotificationConfigurations.begin(), listNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { + fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + +void CAmMapHandler::CAmSink::getSinkType(am_SinkType_s & sinkType) const +{ + sinkType.name = name; + sinkType.sinkID = sinkID; + sinkType.availability = available; + sinkType.muteState = muteState; + sinkType.volume = mainVolume; + sinkType.sinkClassID = sinkClassID; +} + +/* Connection */ + +void CAmMapHandler::CAmConnection::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Connection id(" << connectionID << ") " << std::endl << + "sourceID(" << sourceID << + ") sinkID(" << sinkID << + ") delay(" << delay << + ") connectionFormat(" << connectionFormat << + ") reserved(" << reserved << ")" << std::endl; + outString = fmt.str(); +} + +/* Main Connection */ + +void CAmMapHandler::CAmMainConnection::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "MainConnection id(" << mainConnectionID << ") " << std::endl << + "connectionState(" << connectionState << + ") sinkID(" << sinkID << + ") sourceID(" << sourceID << + ") delay(" << delay << + ") listConnectionID ("; + std::for_each(listConnectionID.begin(), listConnectionID.end(), [&](const am_connectionID_t & connID) { + fmt << "["<< connID << "]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + +void CAmMapHandler::am_MainConnection_Database_s::getMainConnectionType(am_MainConnectionType_s & connectionType) const +{ + connectionType.mainConnectionID = mainConnectionID; + connectionType.sourceID = sourceID; + connectionType.sinkID = sinkID; + connectionType.connectionState = connectionState; + connectionType.delay = delay; +} + +/* Source Class */ + +void CAmMapHandler::CAmSourceClass::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Source class(" << name.c_str() << ") id(" << sourceClassID << ")\n" << + ") listClassProperties ("; + std::for_each(listClassProperties.begin(), listClassProperties.end(), [&](const am_ClassProperty_s & ref) { + fmt << "[classProperty:" << ref.classProperty << " value:" << ref.value << "]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + +/* Sink Class */ + +void CAmMapHandler::CAmSinkClass::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Sink class(" << name.c_str() << ") id(" << sinkClassID << ")\n" << + ") listClassProperties ("; + std::for_each(listClassProperties.begin(), listClassProperties.end(), [&](const am_ClassProperty_s & ref) { + fmt << "[classProperty:" << ref.classProperty << " value:" << ref.value << "]"; + }); + fmt << ")" << std::endl; + outString = fmt.str(); +} + + +/* Gateway */ + +void CAmMapHandler::CAmGateway::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Gateway(" << name.c_str() << ") id(" << gatewayID << ")\n" << + "sinkID(" << sinkID << + ") sourceID(" << sourceID << + ") domainSinkID(" << domainSinkID << + ") domainSourceID(" << domainSourceID << + ") controlDomainID(" << controlDomainID << + ") listSourceFormats ("; + std::for_each(listSourceFormats.begin(), listSourceFormats.end(), [&](const am_ConnectionFormat_e & ref) { + fmt << "[" << ref << "]"; + }); + fmt << ") listSinkFormats ("; + std::for_each(listSinkFormats.begin(), listSinkFormats.end(), [&](const am_ConnectionFormat_e & 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 CAmMapHandler::CAmCrossfader::getDescription (std::string & outString) const +{ + std::ostringstream fmt; + fmt << "Crossfader(" << name.c_str() << ") id(" << crossfaderID << ")\n" << + "sinkID_A(" << sinkID_A << + ") sinkID_B(" << sinkID_B << + ") sourceID(" << sourceID << + ") hotSink(" << hotSink << + ")" << std::endl; + outString = fmt.str(); +} + +template void CAmMapHandler::printMap (const AM_MAP & t, std::ostream & output) const +{ + typename AM_MAP::const_iterator iter = t.begin(); + for(; iter!=t.end(); iter++) + print(iter->second, output); +} + +template void CAmMapHandler::print (const TPrintObject & t, std::ostream & output) const +{ + std::string description(""); + t.getDescription( description ); + output << description; +} + +bool CAmMapHandler::CAmMappedData::increaseID(int16_t * resultID, int16_t * sourceID, + int16_t const desiredStaticID = 0, int16_t const preferedStaticIDBoundary = DYNAMIC_ID_BOUNDARY) +{ + if( desiredStaticID > 0 && desiredStaticID < preferedStaticIDBoundary ) + { + *resultID = desiredStaticID; + return true; + } + else if( *sourceID < mDefaultIDLimit-1 ) //SHRT_MAX or the max limit is reserved and not used!!! + { + *resultID = (*sourceID)++; + return true; + } + else + { + *resultID = -1; + return false; + } + } + +/** + * template to converts T to std::string + * @param x T + * @return string + */ +template +inline std::string i2s(T const& x) +{ + std::ostringstream o; + o << x; + return (o.str()); +} + +CAmMapHandler::CAmMapHandler():CAmDatabaseHandlerInterface(), mMappedData() +{ + logInfo(__PRETTY_FUNCTION__,"Init"); +} + +CAmMapHandler::~CAmMapHandler() +{ + logInfo(__PRETTY_FUNCTION__,"Destroy"); +} + +am_Error_e CAmMapHandler::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID) +{ + assert(domainData.domainID==0); + assert(!domainData.name.empty()); + assert(!domainData.busname.empty()); + assert(domainData.state>=DS_UNKNOWN && domainData.state<=DS_MAX); + + //first check for a reserved domain + CAmCompareObjectWithValue comparator = compareDomainObjectWithValue; + am_Domain_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mDomainMap, domainData.name, comparator); + + int16_t nextID = 0; + if( NULL != reservedDomain ) + { + nextID = reservedDomain->domainID; + domainID = nextID; + mMappedData.mDomainMap[nextID] = domainData; + mMappedData.mDomainMap[nextID].domainID = nextID; + mMappedData.mDomainMap[nextID].reserved = 0; + return (E_OK); + } + else + { + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentDomainID)) + { + 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); + } + else + { + domainID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (E_MAX); + } + } +} + +int16_t CAmMapHandler::calculateDelayForRoute(const std::vector& listConnectionID) +{ + int16_t delay = 0; + std::vector::const_iterator elementIterator = listConnectionID.begin(); + for (; elementIterator < listConnectionID.end(); ++elementIterator) + { + am_connectionID_t key = *elementIterator; + AM_MAP::const_iterator it = mMappedData.mConnectionMap.find(key); + if (it!=mMappedData.mConnectionMap.end()) + { + int16_t temp_delay = it->second.delay; + if (temp_delay != -1 && delay != -1) + delay += temp_delay; + else + delay = -1; + } + } + return delay; +} + +am_Error_e CAmMapHandler::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID) +{ + assert(mainConnectionData.mainConnectionID==0); + assert(mainConnectionData.connectionState>=CS_UNKNOWN && mainConnectionData.connectionState<=CS_MAX); + assert(mainConnectionData.sinkID!=0); + assert(mainConnectionData.sourceID!=0); + + int16_t delay = 0; + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentMainConnectionID)) + { + connectionID = nextID; + mMappedData.mMainConnectionMap[nextID] = mainConnectionData; + mMappedData.mMainConnectionMap[nextID].mainConnectionID = nextID; + } + else + { + connectionID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (E_MAX); + } + + //now check the connectionTable for all connections in the route. IF connectionID exist + delay = calculateDelayForRoute(mainConnectionData.listConnectionID); + + 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; + mpDatabaseObserver->newMainConnection(mainConnection); + mpDatabaseObserver->mainConnectionStateChanged(connectionID, mainConnectionData.connectionState); + } + + //finally, we update the delay value for the maintable + if (delay == 0) + delay = -1; + return (changeDelayMainConnection(delay, connectionID)); +} + +/** + * Helper method, that inserts a new struct in the map and copies the given into it. + * This method uses the increaseID function to secure the global id is properly increased. + **/ +bool CAmMapHandler::insertSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) +{ + int16_t nextID = 0; + if( mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkID, sinkData.sinkID) ) + { + sinkID = nextID; + mMappedData.mSinkMap[nextID] = sinkData; + mMappedData.mSinkMap[nextID].sinkID = nextID; + return (true); + } + else + { + sinkID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached!"); + return (false); + } +} + +am_Error_e CAmMapHandler::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) +{ + assert(sinkData.sinkID=MS_UNKNOWN && sinkData.muteState<=MS_MAX); + + 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 + CAmCompareObjectWithValue comparator = compareSinkObjectByNameAndFlag; + bool checkForFlag = true; + am_Sink_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSinkMap, sinkData.name, comparator, &checkForFlag); + if( NULL!=reservedDomain ) + { + am_sinkID_t oldSinkID = reservedDomain->sinkID; + mMappedData.mSinkMap[oldSinkID] = sinkData; + mMappedData.mSinkMap[oldSinkID].reserved = 0; + temp_SinkID = oldSinkID; + temp_SinkIndex = oldSinkID; + } + else + { + bool result; + if ( sinkData.sinkID != 0 || mFirstStaticSink ) + { + //check if the ID already exists + if (existSinkNameOrID(sinkData.sinkID, sinkData.name)) + return (E_ALREADY_EXISTS); + } + result = insertSinkDB(sinkData, temp_SinkID); + if( false == result ) + return (E_MAX); + temp_SinkIndex = temp_SinkID; + } + //if the first static sink is entered, we need to set it onto the boundary + if (sinkData.sinkID == 0 && mFirstStaticSink) + { + mFirstStaticSink = false; + } + mMappedData.mSinkMap[temp_SinkIndex].sinkID = temp_SinkID; + sinkID = 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:", sinkID); + + if (mpDatabaseObserver != NULL) + mpDatabaseObserver->newSink(sink); + return (E_OK); +} + +bool CAmMapHandler::insertCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) +{ + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentCrossfaderID, crossfaderData.crossfaderID)) + { + crossfaderID = nextID; + mMappedData.mCrossfaderMap[nextID] = crossfaderData; + mMappedData.mCrossfaderMap[nextID].crossfaderID = nextID; + return (true); + } + else + { + crossfaderID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (false); + } +} + +am_Error_e CAmMapHandler::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) +{ + assert(crossfaderData.crossfaderID=HS_UNKNOWN && crossfaderData.hotSink<=HS_MAX); + assert(!crossfaderData.name.empty()); + assert(existSink(crossfaderData.sinkID_A)); + assert(existSink(crossfaderData.sinkID_B)); + assert(existSource(crossfaderData.sourceID)); + + am_crossfaderID_t temp_CrossfaderID = 0; + am_crossfaderID_t temp_CrossfaderIndex = 0; + + bool result; + //if gatewayData is zero and the first Static Sink was already entered, the ID is created + if (crossfaderData.crossfaderID != 0 || mFirstStaticCrossfader) + { + //check if the ID already exists + if (existcrossFader(crossfaderData.crossfaderID)) + return (E_ALREADY_EXISTS); + } + result = insertCrossfaderDB(crossfaderData, temp_CrossfaderID); + if( false == result ) + return (E_MAX); + temp_CrossfaderIndex = temp_CrossfaderID; + + //if the first static sink is entered, we need to set it onto the boundary + if ( 0==crossfaderData.crossfaderID && mFirstStaticCrossfader) + { + mFirstStaticCrossfader = false; + } + + 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); + return (E_OK); +} + +bool CAmMapHandler::insertGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) +{ + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentGatewayID, gatewayData.gatewayID)) + { + gatewayID = nextID; + mMappedData.mGatewayMap[nextID] = gatewayData; + mMappedData.mGatewayMap[nextID].gatewayID = nextID; + return (true); + } + else + { + gatewayID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (false); + } +} + +am_Error_e CAmMapHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) +{ + assert(gatewayData.gatewayIDnewGateway(gateway); + return (E_OK); +} + +void CAmMapHandler::dump( std::ostream & output ) +{ + output << std::endl << "****************** DUMP START ******************" << std::endl; + printMap(mMappedData.mDomainMap, output); + printMap(mMappedData.mSourceMap, output); + printMap(mMappedData.mSinkMap, output); + printMap(mMappedData.mSourceClassesMap, output); + printMap(mMappedData.mSinkClassesMap, output); + printMap(mMappedData.mConnectionMap, output); + printMap(mMappedData.mMainConnectionMap, output); + printMap(mMappedData.mCrossfaderMap, output); + printMap(mMappedData.mGatewayMap, output); + CAmVectorSystemProperties::const_iterator iter = mMappedData.mSystemProperties.begin(); + output << "System properties" << "\n"; + for(; iter!=mMappedData.mSystemProperties.end(); iter++) + output << "[type:" << iter->type << " value:" << iter->value << "]"; + output << std::endl << "****************** DUMP END ******************" << std::endl; +} + +bool CAmMapHandler::insertSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) +{ + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceID, sourceData.sourceID)) + { + sourceID = nextID; + mMappedData.mSourceMap[nextID] = sourceData; + mMappedData.mSourceMap[nextID].sourceID = nextID; + return (true); + } + else + { + sourceID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (false); + } +} + +am_Error_e CAmMapHandler::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) +{ + assert(sourceData.sourceID=SS_UNKNNOWN && sourceData.sourceState<=SS_MAX); + + bool isFirstStatic = sourceData.sourceID == 0 && mFirstStaticSource; + am_sourceID_t temp_SourceID = 0; + am_sourceID_t temp_SourceIndex = 0; + bool checkForFlag = true; + am_Source_Database_s const *reservedSource = findFirstObjectMatchingCriteria(mMappedData.mSourceMap, sourceData.name, compareSourceObjectsByNameAndFlag, &checkForFlag); + if( NULL != reservedSource ) + { + am_sourceID_t oldSourceID = reservedSource->sourceID; + mMappedData.mSourceMap[oldSourceID] = sourceData; + mMappedData.mSourceMap[oldSourceID].reserved = 0; + temp_SourceID = oldSourceID; + temp_SourceIndex = oldSourceID; + } + else + { + bool result; + if ( !isFirstStatic ) + { + //check if the ID already exists + if (existSourceNameOrID(sourceData.sourceID, sourceData.name)) + return (E_ALREADY_EXISTS); + } + result = insertSourceDB(sourceData, temp_SourceID); + if( false == result ) + return (E_MAX); + temp_SourceIndex = temp_SourceID; + } + + if ( isFirstStatic ) + { + //if the first static sink is entered, we need to set it onto the boundary if needed + mFirstStaticSource = false; + } + mMappedData.mSourceMap[temp_SourceIndex].sourceID = temp_SourceID; + sourceID = temp_SourceID; + + 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); + return (E_OK); +} + +am_Error_e CAmMapHandler::enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) +{ + assert(connection.connectionID==0); + assert(connection.sinkID!=0); + assert(connection.sourceID!=0); + //connection format is not checked, because it's project specific + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentConnectionID)) + { + connectionID = nextID; + mMappedData.mConnectionMap[nextID] = connection; + mMappedData.mConnectionMap[nextID].connectionID = nextID; + } + else + { + connectionID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (E_MAX); + } + + logInfo("DatabaseHandler::enterConnectionDB entered new connection sourceID=", connection.sourceID, "sinkID=", connection.sinkID, "sourceID=", connection.sourceID, "connectionFormat=", connection.connectionFormat, "assigned ID=", connectionID); + return (E_OK); +} + +bool CAmMapHandler::insertSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) +{ + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkClassesID, sinkClass.sinkClassID)) + { + sinkClassID = nextID; + mMappedData.mSinkClassesMap[nextID] = sinkClass; + mMappedData.mSinkClassesMap[nextID].sinkClassID = nextID; + return (true); + } + else + { + sinkClassID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (false); + } +} + +am_Error_e CAmMapHandler::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) +{ + assert(sinkClass.sinkClassIDnumberOfSinkClassesChanged(); + return (E_OK); +} + +bool CAmMapHandler::insertSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) +{ + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceClassesID, sourceClass.sourceClassID)) + { + sourceClassID = nextID; + mMappedData.mSourceClassesMap[nextID] = sourceClass; + mMappedData.mSourceClassesMap[nextID].sourceClassID = nextID; + return (true); + } + else + { + sourceClassID = 0; + logInfo(__PRETTY_FUNCTION__,"Max limit reached."); + return (false); + } +} + +am_Error_e CAmMapHandler::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) +{ + assert(sourceClass.sourceClassIDnumberOfSourceClassesChanged(); + return (E_OK); +} + +am_Error_e CAmMapHandler::enterSystemProperties(const std::vector & listSystemProperties) +{ + assert(!listSystemProperties.empty()); + + mMappedData.mSystemProperties = listSystemProperties; + + logInfo("DatabaseHandler::enterSystemProperties entered system properties"); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) +{ + assert(mainconnectionID!=0); + if (!existMainConnection(mainconnectionID)) + { + return (E_NON_EXISTENT); + } + + int16_t delay = calculateDelayForRoute(listConnectionID); + + //now we replace the data in the main connection object with the new one + mMappedData.mMainConnectionMap[mainconnectionID].listConnectionID = listConnectionID; + + if (changeDelayMainConnection(delay,mainconnectionID)!=E_OK) + logError("DatabaseHandler::changeMainConnectionRouteDB error while changing mainConnectionDelay to ", delay); + + logInfo("DatabaseHandler::changeMainConnectionRouteDB entered new route:", mainconnectionID); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) +{ + assert(mainconnectionID!=0); + assert(connectionState>=CS_UNKNOWN && connectionState<=CS_MAX); + + if (!existMainConnection(mainconnectionID)) + { + return (E_NON_EXISTENT); + } + mMappedData.mMainConnectionMap[mainconnectionID].connectionState = connectionState; + + logInfo("DatabaseHandler::changeMainConnectionStateDB changed mainConnectionState of MainConnection:", mainconnectionID, "to:", connectionState); + if (mpDatabaseObserver) + mpDatabaseObserver->mainConnectionStateChanged(mainconnectionID, connectionState); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSinkMap[sinkID].mainVolume = mainVolume; + + logInfo("DatabaseHandler::changeSinkMainVolumeDB changed mainVolume of sink:", sinkID, "to:", mainVolume); + + if (mpDatabaseObserver) + mpDatabaseObserver->volumeChanged(sinkID, mainVolume); + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); + assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSinkMap[sinkID].available = availability; + + logInfo("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); + + if (mpDatabaseObserver && sourceVisible(sinkID)) + mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); + return (E_OK); +} + +am_Error_e CAmMapHandler::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) +{ + assert(domainID!=0); + assert(domainState>=DS_UNKNOWN && domainState<=DS_MAX); + + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mDomainMap[domainID].state = domainState; + + logInfo("DatabaseHandler::changDomainStateDB changed domainState of domain:", domainID, "to:", domainState); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + assert(muteState>=MS_UNKNOWN && muteState<=MS_MAX); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSinkMap[sinkID].muteState = muteState; + + logInfo("DatabaseHandler::changeSinkMuteStateDB changed sinkMuteState of sink:", sinkID, "to:", muteState); + + if (mpDatabaseObserver) + mpDatabaseObserver->sinkMuteStateChanged(sinkID, muteState); + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID) +{ + assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + std::vector::iterator elementIterator = mMappedData.mSinkMap[sinkID].listMainSoundProperties.begin(); + for (;elementIterator != mMappedData.mSinkMap[sinkID].listMainSoundProperties.end(); ++elementIterator) + { + if (elementIterator->type == soundProperty.type) + elementIterator->value = soundProperty.value; + } + + logInfo("DatabaseHandler::changeMainSinkSoundPropertyDB changed MainSinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); + if (mpDatabaseObserver) + mpDatabaseObserver->mainSinkSoundPropertyChanged(sinkID, soundProperty); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID) +{ + assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + std::vector::iterator elementIterator = mMappedData.mSourceMap[sourceID].listMainSoundProperties.begin(); + for (;elementIterator != mMappedData.mSourceMap[sourceID].listMainSoundProperties.end(); ++elementIterator) + { + if (elementIterator->type == soundProperty.type) + elementIterator->value = soundProperty.value; + } + + logInfo("DatabaseHandler::changeMainSourceSoundPropertyDB changed MainSinkSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); + + if (mpDatabaseObserver) + mpDatabaseObserver->mainSourceSoundPropertyChanged(sourceID, soundProperty); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID) +{ + assert(sourceID!=0); + assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); + assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSourceMap[sourceID].available = availability; + + logInfo("DatabaseHandler::changeSourceAvailabilityDB changed changeSourceAvailabilityDB of source:", sourceID, "to:", availability.availability, "Reason:", availability.availabilityReason); + + if (mpDatabaseObserver && sourceVisible(sourceID)) + mpDatabaseObserver->sourceAvailabilityChanged(sourceID, availability); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSystemPropertyDB(const am_SystemProperty_s & property) +{ + assert(property.type>=SYP_UNKNOWN && property.type<=SYP_MAX); + + std::vector::iterator elementIterator = mMappedData.mSystemProperties.begin(); + for (;elementIterator != mMappedData.mSystemProperties.end(); ++elementIterator) + { + if (elementIterator->type == property.type) + elementIterator->value = property.value; + } + + logInfo("DatabaseHandler::changeSystemPropertyDB changed system property"); + + if (mpDatabaseObserver) + mpDatabaseObserver->systemPropertyChanged(property); + + return (E_OK); +} + +am_Error_e CAmMapHandler::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) +{ + assert(mainConnectionID!=0); + + if (!existMainConnection(mainConnectionID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mMainConnectionMap.erase(mainConnectionID); + + logInfo("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); + if (mpDatabaseObserver) + { + mpDatabaseObserver->mainConnectionStateChanged(mainConnectionID, CS_DISCONNECTED); + mpDatabaseObserver->removedMainConnection(mainConnectionID); + } + return (E_OK); +} + +am_Error_e CAmMapHandler::removeSinkDB(const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + bool visible = sinkVisible(sinkID); + + mMappedData.mSinkMap.erase(sinkID); + // todo: Check the tables SinkMainSoundProperty and SinkMainNotificationConfiguration with 'visible' set to true + //if visible is true then delete SinkMainSoundProperty and SinkMainNotificationConfiguration ???? + logInfo("DatabaseHandler::removeSinkDB removed:", sinkID); + + if (mpDatabaseObserver != NULL) + mpDatabaseObserver->removedSink(sinkID, visible); + + return (E_OK); +} + +am_Error_e CAmMapHandler::removeSourceDB(const am_sourceID_t sourceID) +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + bool visible = sourceVisible(sourceID); + + mMappedData.mSourceMap.erase(sourceID); + + // todo: Check the tables SourceMainSoundProperty and SourceMainNotificationConfiguration with 'visible' set to true + //if visible is true then delete SourceMainSoundProperty and SourceMainNotificationConfiguration ???? + + logInfo("DatabaseHandler::removeSourceDB removed:", sourceID); + if (mpDatabaseObserver) + mpDatabaseObserver->removedSource(sourceID, visible); + return (E_OK); +} + +am_Error_e CAmMapHandler::removeGatewayDB(const am_gatewayID_t gatewayID) +{ + assert(gatewayID!=0); + + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mGatewayMap.erase(gatewayID); + + logInfo("DatabaseHandler::removeGatewayDB removed:", gatewayID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeGateway(gatewayID); + return (E_OK); +} + +am_Error_e CAmMapHandler::removeCrossfaderDB(const am_crossfaderID_t crossfaderID) +{ + assert(crossfaderID!=0); + + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + mMappedData.mCrossfaderMap.erase(crossfaderID); + + logInfo("DatabaseHandler::removeCrossfaderDB removed:", crossfaderID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeCrossfader(crossfaderID); + return (E_OK); +} + +am_Error_e CAmMapHandler::removeDomainDB(const am_domainID_t domainID) +{ + assert(domainID!=0); + + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + mMappedData.mDomainMap.erase(domainID); + + logInfo("DatabaseHandler::removeDomainDB removed:", domainID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeDomain(domainID); + return (E_OK); +} + +am_Error_e CAmMapHandler::removeSinkClassDB(const am_sinkClass_t sinkClassID) +{ + assert(sinkClassID!=0); + + if (!existSinkClass(sinkClassID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSinkClassesMap.erase(sinkClassID); + + logInfo("DatabaseHandler::removeSinkClassDB removed:", sinkClassID); + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSinkClassesChanged(); + + return (E_OK); +} + +am_Error_e CAmMapHandler::removeSourceClassDB(const am_sourceClass_t sourceClassID) +{ + assert(sourceClassID!=0); + + if (!existSourceClass(sourceClassID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSourceClassesMap.erase(sourceClassID); + logInfo("DatabaseHandler::removeSourceClassDB removed:", sourceClassID); + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSourceClassesChanged(); + return (E_OK); +} + +am_Error_e CAmMapHandler::removeConnection(const am_connectionID_t connectionID) +{ + assert(connectionID!=0); + + mMappedData.mConnectionMap.erase(connectionID); + + logInfo("DatabaseHandler::removeConnection removed:", connectionID); + return (E_OK); +} + +am_Error_e CAmMapHandler::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + am_Source_Database_s source = mMappedData.mSourceMap.at(sourceID); + classInfo.sourceClassID = source.sourceClassID; + + if (!existSourceClass(classInfo.sourceClassID)) + { + return (E_NON_EXISTENT); + } + am_SourceClass_s tmpClass = mMappedData.mSourceClassesMap.at(classInfo.sourceClassID); + classInfo = tmpClass; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s & sinkData) const +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + return (E_NON_EXISTENT); + + am_Sink_Database_s mappedSink = mMappedData.mSinkMap.at(sinkID); + if( true == mappedSink.reserved ) + return (E_NON_EXISTENT); + sinkData = mappedSink; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s & sourceData) const +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + return (E_NON_EXISTENT); + + am_Source_Database_s mappedSource = mMappedData.mSourceMap.at(sourceID); + if( true == mappedSource.reserved ) + return (E_NON_EXISTENT); + + sourceData = mappedSource; + + return (E_OK); +} + +am_Error_e am::CAmMapHandler::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s & mainConnectionData) const +{ + assert(mainConnectionID!=0); + if (!existMainConnection(mainConnectionID)) + { + return (E_NON_EXISTENT); + } + am_MainConnection_s temp = mMappedData.mMainConnectionMap.at(mainConnectionID); + mainConnectionData = temp; + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) +{ + assert(sinkClass.sinkClassID!=0); + assert(!sinkClass.listClassProperties.empty()); + + //check if the ID already exists + if (!existSinkClass(sinkClass.sinkClassID)) + return (E_NON_EXISTENT); + + mMappedData.mSinkClassesMap[sinkClass.sinkClassID].listClassProperties = sinkClass.listClassProperties; + + logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) +{ + assert(sourceClass.sourceClassID!=0); + assert(!sourceClass.listClassProperties.empty()); + + //check if the ID already exists + if (!existSourceClass(sourceClass.sourceClassID)) + return (E_NON_EXISTENT); + + mMappedData.mSourceClassesMap[sourceClass.sourceClassID].listClassProperties = sourceClass.listClassProperties; + + logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); + return (E_OK); +} + +am_Error_e CAmMapHandler::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + am_Sink_Database_s sink = mMappedData.mSinkMap.at(sinkID); + sinkClass.sinkClassID = sink.sinkClassID; + + if (!existSinkClass(sinkClass.sinkClassID)) + { + return (E_NON_EXISTENT); + } + am_SinkClass_s tmpSinkClass = mMappedData.mSinkClassesMap.at(sinkClass.sinkClassID); + sinkClass = tmpSinkClass; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const +{ + assert(gatewayID!=0); + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + + gatewayData = mMappedData.mGatewayMap.at(gatewayID); + + return (E_OK); + +} + +am_Error_e CAmMapHandler::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const +{ + assert(crossfaderID!=0); + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + + crossfaderData = mMappedData.mCrossfaderMap.at(crossfaderID); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSinksOfDomain(const am_domainID_t domainID, std::vector & listSinkID) const +{ + assert(domainID!=0); + listSinkID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + + AM_MAP::const_iterator elementIterator = mMappedData.mSinkMap.begin(); + for (;elementIterator != mMappedData.mSinkMap.end(); ++elementIterator) + { + if (0==elementIterator->second.reserved && domainID==elementIterator->second.domainID) + listSinkID.push_back(elementIterator->second.sinkID); + } + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSourcesOfDomain(const am_domainID_t domainID, std::vector & listSourceID) const +{ + assert(domainID!=0); + listSourceID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + CAmMapSource::const_iterator elementIterator = mMappedData.mSourceMap.begin(); + for (;elementIterator != mMappedData.mSourceMap.end(); ++elementIterator) + { + if (0==elementIterator->second.reserved && domainID==elementIterator->second.domainID) + listSourceID.push_back(elementIterator->second.sourceID); + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector & listCrossfader) const +{ + assert(domainID!=0); + listCrossfader.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + + CAmMapSource::const_iterator sourceIterator = mMappedData.mSourceMap.begin(); + for (;sourceIterator != mMappedData.mSourceMap.end(); ++sourceIterator) + { + if (domainID==sourceIterator->second.domainID) + { + CAmMapCrossfader::const_iterator elementIterator = mMappedData.mCrossfaderMap.begin(); + for (;elementIterator != mMappedData.mCrossfaderMap.end(); ++elementIterator) + { + if ( sourceIterator->second.sourceID==elementIterator->second.sourceID ) + listCrossfader.push_back(elementIterator->second.crossfaderID); + } + } + } + + return (E_OK); + +} + +am_Error_e CAmMapHandler::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector & listGatewaysID) const +{ + assert(domainID!=0); + listGatewaysID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + + CAmMapGateway::const_iterator elementIterator = mMappedData.mGatewayMap.begin(); + for (;elementIterator != mMappedData.mGatewayMap.end(); ++elementIterator) + { + if (domainID==elementIterator->second.controlDomainID) + listGatewaysID.push_back(elementIterator->second.gatewayID); + } + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainConnections(std::vector & listMainConnections) const +{ + listMainConnections.clear(); + + CAmMapMainConnection::const_iterator elementIterator = mMappedData.mMainConnectionMap.begin(); + for (;elementIterator != mMappedData.mMainConnectionMap.end(); ++elementIterator) + { + listMainConnections.push_back(elementIterator->second); + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListDomains(std::vector & listDomains) const +{ + listDomains.clear(); + + CAmMapDomain::const_iterator elementIterator = mMappedData.mDomainMap.begin(); + for (;elementIterator != mMappedData.mDomainMap.end(); ++elementIterator) + { + if( 0==elementIterator->second.reserved ) + listDomains.push_back(elementIterator->second); + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListConnections(std::vector & listConnections) const +{ + listConnections.clear(); + + CAmMapConnection::const_iterator elementIterator = mMappedData.mConnectionMap.begin(); + for (;elementIterator != mMappedData.mConnectionMap.end(); ++elementIterator) + { + if( 0==elementIterator->second.reserved ) + listConnections.push_back(elementIterator->second); + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSinks(std::vector & listSinks) const +{ + listSinks.clear(); + + std::for_each(mMappedData.mSinkMap.begin(), mMappedData.mSinkMap.end(), [&](const std::pair& ref) { + if( 0==ref.second.reserved ) + listSinks.push_back(ref.second); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSources(std::vector & listSources) const +{ + listSources.clear(); + + std::for_each(mMappedData.mSourceMap.begin(), mMappedData.mSourceMap.end(), [&](const std::pair& ref) { + if( 0==ref.second.reserved ) + { + listSources.push_back(ref.second); + } + }); + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSourceClasses(std::vector & listSourceClasses) const +{ + listSourceClasses.clear(); + + std::for_each(mMappedData.mSourceClassesMap.begin(), mMappedData.mSourceClassesMap.end(), [&](const std::pair& ref) { + listSourceClasses.push_back(ref.second); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListCrossfaders(std::vector & listCrossfaders) const +{ + listCrossfaders.clear(); + + std::for_each(mMappedData.mCrossfaderMap.begin(), mMappedData.mCrossfaderMap.end(), [&](const std::pair& ref) { + listCrossfaders.push_back(ref.second); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListGateways(std::vector & listGateways) const +{ + listGateways.clear(); + + std::for_each(mMappedData.mGatewayMap.begin(), mMappedData.mGatewayMap.end(), [&](const std::pair& ref) { + listGateways.push_back(ref.second); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSinkClasses(std::vector & listSinkClasses) const +{ + listSinkClasses.clear(); + + std::for_each(mMappedData.mSinkClassesMap.begin(), mMappedData.mSinkClassesMap.end(), [&](const std::pair& ref) { + listSinkClasses.push_back(ref.second); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListVisibleMainConnections(std::vector & listConnections) const +{ + listConnections.clear(); + am_MainConnectionType_s temp; + std::for_each(mMappedData.mMainConnectionMap.begin(), mMappedData.mMainConnectionMap.end(), [&](const std::pair& ref) { + ref.second.getMainConnectionType(temp); + listConnections.push_back(temp); + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSinks(std::vector & listMainSinks) const +{ + listMainSinks.clear(); + am_SinkType_s sinkType; + std::for_each(mMappedData.mSinkMap.begin(), mMappedData.mSinkMap.end(), [&](const std::pair& ref) { + if( 0==ref.second.reserved && 1==ref.second.visible ) + { + ref.second.getSinkType(sinkType); + listMainSinks.push_back(sinkType); + } + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSources(std::vector & listMainSources) const +{ + listMainSources.clear(); + am_SourceType_s temp; + std::for_each(mMappedData.mSourceMap.begin(), mMappedData.mSourceMap.end(), [&](const std::pair& ref) { + if( 1==ref.second.visible ) + { + ref.second.getSourceType(temp); + listMainSources.push_back(temp); + } + }); + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector & listSoundProperties) const +{ + assert(sinkID!=0); + if (!existSink(sinkID)) + return E_NON_EXISTENT; + + am_Sink_s sink = mMappedData.mSinkMap.at(sinkID); + listSoundProperties = sink.listMainSoundProperties; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector & listSourceProperties) const +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return E_NON_EXISTENT; + + am_Source_s source = mMappedData.mSourceMap.at(sourceID); + listSourceProperties = source.listMainSoundProperties; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListSystemProperties(std::vector & listSystemProperties) const +{ + listSystemProperties = mMappedData.mSystemProperties; + return (E_OK); +} + +am_Error_e am::CAmMapHandler::getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const +{ + if (!existSink(sinkID)) + return E_NON_EXISTENT; + am_Sink_s sink = mMappedData.mSinkMap.at(sinkID); + listConnectionFormats = sink.listConnectionFormats; + + return (E_OK); +} + +am_Error_e am::CAmMapHandler::getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const +{ + if (!existSource(sourceID)) + return E_NON_EXISTENT; + am_Source_s source = mMappedData.mSourceMap.at(sourceID); + listConnectionFormats = source.listConnectionFormats; + + return (E_OK); +} + +am_Error_e am::CAmMapHandler::getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const +{ + ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); + iter = mListConnectionFormat.find(gatewayID); + if (iter == mListConnectionFormat.end()) + { + logError("DatabaseHandler::getListGatewayConnectionFormats database error with convertionFormat"); + + return E_NON_EXISTENT; + } + listConnectionFormat = iter->second; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t & delay) const +{ + assert(mainConnectionID!=0); + if (!existMainConnection(mainConnectionID)) + return E_NON_EXISTENT; + delay = -1; + + am_MainConnection_s mainConnection = mMappedData.mMainConnectionMap.at(mainConnectionID); + delay = mainConnection.delay; + + if (delay == -1) + return (E_NOT_POSSIBLE); + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) +{ + assert(connectionID!=0); + if (!existMainConnection(connectionID)) + return (E_NON_EXISTENT); + mMappedData.mMainConnectionMap[connectionID].delay = delay; + + return (E_OK); +} + +/** + * checks for a certain mainConnection + * @param mainConnectionID to be checked for + * @return true if it exists + */ +bool CAmMapHandler::existMainConnection(const am_mainConnectionID_t mainConnectionID) const +{ + return existsObjectWithKeyInMap(mainConnectionID, mMappedData.mMainConnectionMap); +} + +/** + * checks for a certain Source + * @param sourceID to be checked for + * @return true if it exists + */ +bool CAmMapHandler::existSource(const am_sourceID_t sourceID) const +{ + am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); + if( NULL!=source ) + return (0==source->reserved); + + return false; +} + +/** + * checks if a source name or ID exists + * @param sourceID the sourceID + * @param name the name + * @return true if it exits + */ +bool CAmMapHandler::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); +} + +/** + * checks if a name exits + * @param name the name + * @return true if it exits + */ +bool CAmMapHandler::existSourceName(const std::string & name) const +{ + return existSourceNameOrID(SHRT_MAX, name); +} + +/** + * checks for a certain Sink + * @param sinkID to be checked for + * @return true if it exists + */ +bool CAmMapHandler::existSink(const am_sinkID_t sinkID) 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) + { + returnVal = true; + break; + } + } + return (returnVal); +} + +/** + * checks if a sink with the ID or the name exists + * @param sinkID the ID + * @param name the name + * @return true if it exists. + */ +bool CAmMapHandler::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); +} + +/** + * checks if a sink with the name exists + * @param name the name + * @return true if it exists + */ +bool CAmMapHandler::existSinkName(const std::string & name) const +{ + return existSinkNameOrID(SHRT_MAX, name); +} + +/** + * checks for a certain domain + * @param domainID to be checked for + * @return true if it exists + */ +bool CAmMapHandler::existDomain(const am_domainID_t domainID) const +{ + am_Domain_Database_s const * source = objectWithKeyIfExistsInMap(domainID, mMappedData.mDomainMap); + if( NULL!=source ) + return (0==source->reserved); + + return false; +} + +/** + * checks for certain gateway + * @param gatewayID to be checked for + * @return true if it exists + */ +bool CAmMapHandler::existGateway(const am_gatewayID_t gatewayID) const +{ + return existsObjectWithKeyInMap(gatewayID, mMappedData.mGatewayMap); +} + +am_Error_e CAmMapHandler::getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t & domainID) const +{ + assert(sourceID!=0); + + am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); + if( NULL!=source ) + { + domainID = source->domainID; + return E_OK; + } + return E_NON_EXISTENT; +} + +am_Error_e am::CAmMapHandler::getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t & domainID) const +{ + assert(sinkID!=0); + + am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); + if( NULL!=source ) + { + domainID = source->domainID; + return E_OK; + } + return E_NON_EXISTENT; +} + +/** + * checks for certain SinkClass + * @param sinkClassID + * @return true if it exists + */ +bool CAmMapHandler::existSinkClass(const am_sinkClass_t sinkClassID) const +{ + return existsObjectWithKeyInMap(sinkClassID, mMappedData.mSinkClassesMap); +} + +/** + * checks for certain sourceClass + * @param sourceClassID + * @return true if it exists + */ +bool CAmMapHandler::existSourceClass(const am_sourceClass_t sourceClassID) const +{ + return existsObjectWithKeyInMap(sourceClassID, mMappedData.mSourceClassesMap); +} + +am_Error_e CAmMapHandler::changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) +{ + assert(connectionID!=0); + if(!existConnectionID(connectionID)) + return E_NON_EXISTENT; + + mMappedData.mConnectionMap[connectionID].delay = delay; + + //now we need to find all mainConnections that use the changed connection and update their timing + + //first get all route tables for all mainconnections + + CAmMapMainConnection::const_iterator iter = mMappedData.mMainConnectionMap.begin(); + for(; iter != mMappedData.mMainConnectionMap.end(); ++iter) + { + am_MainConnection_s mainConnection = iter->second; + if (std::find(mainConnection.listConnectionID.begin(), mainConnection.listConnectionID.end(), connectionID) != mainConnection.listConnectionID.end()) + { + // Got it. + changeDelayMainConnection(calculateMainConnectionDelay(mainConnection.mainConnectionID), mainConnection.mainConnectionID); + } + + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeConnectionFinal(const am_connectionID_t connectionID) +{ + assert(connectionID!=0); + am_Connection_Database_s const * connection = objectWithKeyIfExistsInMap(connectionID, mMappedData.mConnectionMap); + if( NULL!=connection ) + { + mMappedData.mConnectionMap.at(connectionID).reserved = false; + return E_OK; + } + return (E_NON_EXISTENT); +} + +am_timeSync_t CAmMapHandler::calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const +{ + assert(mainConnectionID!=0); + if (!existMainConnection(mainConnectionID)) + return -1; + am_MainConnection_s mainConnection = mMappedData.mMainConnectionMap.at(mainConnectionID); + am_timeSync_t delay = 0; + am_timeSync_t min = SHRT_MAX; + std::vector::const_iterator iter = mainConnection.listConnectionID.begin(); + for(;iterdelay; + min = std::min(min,source->delay); + } + } + if (min < 0) + delay = -1; + return (delay); + +} + +/** + * registers the Observer at the Database + * @param iObserver pointer to the observer + */ +void CAmMapHandler::registerObserver(CAmDatabaseObserver *iObserver) +{ + assert(iObserver!=NULL); + mpDatabaseObserver = iObserver; +} + +/** + * gives information about the visibility of a source + * @param sourceID the sourceID + * @return true if source is visible + */ +bool CAmMapHandler::sourceVisible(const am_sourceID_t sourceID) const +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return false; + am_Source_Database_s source = mMappedData.mSourceMap.at(sourceID); + return source.visible; +} + +/** + * gives information about the visibility of a sink + * @param sinkID the sinkID + * @return true if source is visible + */ +bool CAmMapHandler::sinkVisible(const am_sinkID_t sinkID) const +{ + am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); + if( NULL!=source ) + { + if(0==source->reserved) + return source->visible; + } + return false; +} + +/** + * checks if a connection already exists. + * Only takes sink, source and format information for search! + * @param connection the connection to be checked + * @return true if connections exists + */ +bool CAmMapHandler::existConnection(const am_Connection_s & connection) const +{ + am_Connection_Database_s const * connectionObject = findFirstObjectMatchingCriteria(mMappedData.mConnectionMap, connection, compareConnectionObjectsWithObject); + return ( NULL!=connectionObject ); +} + +/** + * checks if a connection with the given ID exists + * @param connectionID + * @return true if connection exits + */ +bool CAmMapHandler::existConnectionID(const am_connectionID_t connectionID) const +{ + am_Connection_Database_s const * connection = objectWithKeyIfExistsInMap(connectionID, mMappedData.mConnectionMap); + if( NULL!=connection ) + { + return (0==connection->reserved); + } + return false; +} + +/** + * checks if a CrossFader exists + * @param crossfaderID the ID of the crossfader to be checked + * @return true if exists + */ +bool CAmMapHandler::existcrossFader(const am_crossfaderID_t crossfaderID) const +{ + return existsObjectWithKeyInMap(crossfaderID, mMappedData.mCrossfaderMap); +} + +am_Error_e CAmMapHandler::getSoureState(const am_sourceID_t sourceID, am_SourceState_e & sourceState) const +{ + am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); + if( NULL!=source ) + { + sourceState = source->sourceState; + return (E_OK); + } + else + { + sourceState = SS_UNKNNOWN; + return (E_NON_EXISTENT); + } +} + +am_Error_e CAmMapHandler::changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) +{ + assert(sourceID!=0); + assert(sourceState>=SS_UNKNNOWN && sourceState<=SS_MAX); + if(existSource(sourceID)) + { + mMappedData.mSourceMap.at(sourceID).sourceState = sourceState; + return (E_OK); + } + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::getSinkVolume(const am_sinkID_t sinkID, am_volume_t & volume) const +{ + assert(sinkID!=0); + + am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); + if( NULL!=source ) + { + volume = source->volume; + return (E_OK); + } + volume = -1; + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::getSourceVolume(const am_sourceID_t sourceID, am_volume_t & volume) const +{ + assert(sourceID!=0); + am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); + if( NULL!=source ) + { + volume = source->volume; + return (E_OK); + } + volume = -1; + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t & value) const +{ + assert(sinkID!=0); + + am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); + if( NULL!=source ) + { + std::vector::const_iterator iter = source->listSoundProperties.begin(); + for(; iterlistSoundProperties.end(); ++iter) + { + if( propertyType == iter->type ) + { + value = iter->value; + return (E_OK); + } + } + } + value = -1; + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t & value) const +{ + assert(sourceID!=0); + + am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); + if( NULL!=source ) + { + std::vector::const_iterator iter = source->listSoundProperties.begin(); + for(; iterlistSoundProperties.end(); ++iter) + { + if( propertyType == iter->type ) + { + value = iter->value; + return (E_OK); + } + } + } + value = -1; + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const +{ + assert(domainID!=0); + + am_Domain_Database_s const * source = objectWithKeyIfExistsInMap(domainID, mMappedData.mDomainMap); + if( NULL!=source ) + { + state = source->state; + return (E_OK); + } + state = DS_UNKNOWN; + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::peekDomain(const std::string & name, am_domainID_t & domainID) +{ + domainID=0; + + CAmCompareObjectWithValue comparator = compareDomainObjectWithValue; + am_Domain_Database_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mDomainMap, name, comparator); + + if( NULL != reservedDomain ) + { + domainID = reservedDomain->domainID; + return E_OK; + } + else + { + int16_t nextID = 0; + if( mMappedData.increaseID( &nextID, &mMappedData.mCurrentDomainID) ) + { + domainID = nextID; + am_Domain_Database_s domain; + domain.domainID = nextID; + domain.name = name; + domain.reserved = 1; + mMappedData.mDomainMap[nextID] = domain; + return E_OK; + } + return E_MAX; + } + return (E_OK); +} + +am_Error_e CAmMapHandler::peekSink(const std::string & name, am_sinkID_t & sinkID) +{ + am_Sink_Database_s const *reservedSink = findFirstObjectMatchingCriteria(mMappedData.mSinkMap, name, compareSinkObjectByName); + if( NULL!=reservedSink ) + { + sinkID = reservedSink->sinkID; + return E_OK; + } + else + { + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkID)) + { + if(mFirstStaticSink) + { + nextID = DYNAMIC_ID_BOUNDARY; + mFirstStaticSink = false; + } + sinkID = nextID; + am_Sink_Database_s object; + object.sinkID = nextID; + object.name = name; + object.reserved = 1; + mMappedData.mSinkMap[nextID] = object; + return E_OK; + } + return E_MAX; + } +} + +am_Error_e CAmMapHandler::peekSource(const std::string & name, am_sourceID_t & sourceID) +{ + am_Source_Database_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSourceMap, name, compareSourceObjectByName); + if( NULL!=reservedDomain ) + { + sourceID = reservedDomain->sourceID; + return E_OK; + } + else + { + int16_t nextID = 0; + if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceID)) + { + if(mFirstStaticSource) + { +// nextID = DYNAMIC_ID_BOUNDARY; + mFirstStaticSource = false; + } + sourceID = nextID; + am_Source_Database_s object; + object.sourceID = nextID; + object.name = name; + object.reserved = 1; + mMappedData.mSourceMap[nextID] = object; + return E_OK; + } + else + return E_MAX; + } +} + +am_Error_e CAmMapHandler::changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mSinkMap[sinkID].volume = volume; + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + mMappedData.mSourceMap[sourceID].volume = volume; + + return (E_OK); +} + +am_Error_e CAmMapHandler::changeSourceSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sourceID_t sourceID) +{ + assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + std::vector::iterator iter = mMappedData.mSourceMap[sourceID].listSoundProperties.begin(); + for(; itertype ) + { + iter->value = soundProperty.value; + return (E_OK); + } + } + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::changeSinkSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sinkID_t sinkID) +{ + assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + std::vector::iterator iter = mMappedData.mSinkMap[sinkID].listSoundProperties.begin(); + for(; itertype ) + { + iter->value = soundProperty.value; + return (E_OK); + } + } + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) +{ + assert(crossfaderID!=0); + assert(hotsink>=HS_UNKNOWN && hotsink>=HS_MAX); + + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + + mMappedData.mCrossfaderMap[crossfaderID].hotSink = hotsink; + return (E_OK); +} + +am_Error_e CAmMapHandler::getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) +{ + am_domainID_t rootID = tree.returnRootDomainID(); + CAmRoutingTreeItem *parent = tree.returnRootItem(); + size_t i = 0; + + do + { + if (i != 0) + { + parent = flatTree.at(i - 1); + rootID = parent->returnDomainID(); + } + std::for_each(mMappedData.mGatewayMap.begin(),mMappedData.mGatewayMap.end(), [&](const std::pair& refGateway) { + if( rootID==refGateway.second.domainSinkID ) + { + if(!onlyfree || std::find_if(mMappedData.mConnectionMap.begin(), + mMappedData.mConnectionMap.end(), + [refGateway](const std::pair& refConnection) + { + return (refConnection.second.sinkID == refGateway.second.sinkID || + refConnection.second.sourceID ==refGateway.second.sourceID); + })==mMappedData.mConnectionMap.end() ) + { + // additional check to avoid cyclic routes + const am_domainID_t domainSourceID = refGateway.second.domainSourceID; + bool sourceDomainAlreadyHandledAsSink = false; + for (std::vector::const_iterator iFT = flatTree.begin(); iFT != flatTree.end(); ++iFT) + { + if (domainSourceID == (*iFT)->returnParent()->returnDomainID()) + { + sourceDomainAlreadyHandledAsSink = true; + break; + } + } + + if (!sourceDomainAlreadyHandledAsSink) + { + // logInfo("DatabaseHandler::getRoutingTree ", rootID, ", ", domainSourceID, ", ", sqlite3_column_int(query, 1)); + flatTree.push_back(tree.insertItem(domainSourceID, refGateway.second.gatewayID, parent)); + } + } + } + }); + i++; + } while (flatTree.size() > (i - 1)); + + return (E_OK); +} + +am_Error_e am::CAmMapHandler::peekSinkClassID(const std::string & name, am_sinkClass_t & sinkClassID) +{ + if (name.empty()) + return (E_NON_EXISTENT); + + am_SinkClass_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSinkClassesMap, name, compareSinkClassObjectByName); + if( NULL!=reservedDomain ) + { + sinkClassID = reservedDomain->sinkClassID; + return E_OK; + } + return (E_NON_EXISTENT); +} + +am_Error_e am::CAmMapHandler::peekSourceClassID(const std::string & name, am_sourceClass_t & sourceClassID) +{ + if (name.empty()) + return (E_NON_EXISTENT); + + am_SourceClass_s const *ptrSource = findFirstObjectMatchingCriteria(mMappedData.mSourceClassesMap, name, compareSourceClassObjectByName); + if( NULL!=ptrSource ) + { + sourceClassID = ptrSource->sourceClassID; + return E_OK; + } + return (E_NON_EXISTENT); +} + + +am_Error_e CAmMapHandler::changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + am_sourceClass_t sourceClassOut(sourceClassID); + std::vector listMainSoundPropertiesOut(listMainSoundProperties); + //check if sinkClass needs to be changed + + AM_MAP::iterator iter = mMappedData.mSourceMap.begin(); + for(; iter!=mMappedData.mSourceMap.end(); ++iter) + { + if( iter->second.sourceID == sourceID ) + { + if( sourceClassID!=0 ) + iter->second.sourceClassID = sourceClassID; + else if( 0 == iter->second.reserved ) + sourceClassOut = iter->second.sourceClassID; + } + } + + //check if soundProperties need to be updated + if (!listSoundProperties.empty()) + { + mMappedData.mSourceMap.at(sourceID).listSoundProperties = listSoundProperties; + } + + //check if we have to update the list of connectionformats + if (!listConnectionFormats.empty()) + { + mMappedData.mSourceMap.at(sourceID).listConnectionFormats = listConnectionFormats; + } + + //then we need to check if we need to update the listMainSoundProperties + if (!listMainSoundProperties.empty() && sourceVisible(sourceID)) + { + + mMappedData.mSourceMap.at(sourceID).listMainSoundProperties = listMainSoundProperties; + } + else //read out the properties + { + getListMainSourceSoundProperties(sourceID,listMainSoundPropertiesOut); + } + + logInfo("DatabaseHandler::changeSource changed changeSink of source:", sourceID); + + if (mpDatabaseObserver != NULL) + { + mpDatabaseObserver->sourceUpdated(sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)); + } + + return (E_OK); + +} + +am_Error_e CAmMapHandler::changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) +{ + assert(sinkID!=0); + + am_sinkClass_t sinkClassOut(sinkClassID); + std::vector listMainSoundPropertiesOut(listMainSoundProperties); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + AM_MAP::iterator iter = mMappedData.mSinkMap.begin(); + for(; iter!=mMappedData.mSinkMap.end(); ++iter) + { + if( iter->second.sinkID == sinkID ) + { + if( sinkClassID!=0 ) + iter->second.sinkClassID = sinkClassID; + else if( 0 == iter->second.reserved ) + sinkClassOut = iter->second.sinkClassID; + } + } + + //check if soundProperties need to be updated + if (!listSoundProperties.empty()) + { + mMappedData.mSinkMap.at(sinkID).listSoundProperties = listSoundProperties; + } + + //check if we have to update the list of connectionformats + if (!listConnectionFormats.empty()) + { + mMappedData.mSinkMap.at(sinkID).listConnectionFormats = listConnectionFormats; + } + + //then we need to check if we need to update the listMainSoundProperties + if (!listMainSoundProperties.empty() && sinkVisible(sinkID)) + { + mMappedData.mSinkMap.at(sinkID).listMainSoundProperties = listMainSoundProperties; + } + else //read out the properties + { + getListMainSinkSoundProperties(sinkID,listMainSoundPropertiesOut); + } + + logInfo("DatabaseHandler::changeSink changed changeSink of sink:", sinkID); + + if (mpDatabaseObserver != NULL) + { + mpDatabaseObserver->sinkUpdated(sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)); + } + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) +{ + assert(sinkID!=0); + if (!existSink(sinkID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + listMainNotificationConfigurations.clear(); + + listMainNotificationConfigurations = mMappedData.mSinkMap.at(sinkID).listMainNotificationConfigurations; + + return (E_OK); +} + +am_Error_e CAmMapHandler::getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + + listMainNotificationConfigurations = mMappedData.mSourceMap.at(sourceID).listMainNotificationConfigurations; + + return (E_OK); +} + +bool changeMainNotificationConfiguration(std::vector & listMainNotificationConfigurations, + const am_NotificationConfiguration_s & mainNotificationConfiguration) +{ + bool changed = false; + std::vector::iterator iter = listMainNotificationConfigurations.begin(); + for(; itertype ) + { + iter->status = mainNotificationConfiguration.status; + iter->parameter = mainNotificationConfiguration.parameter; + changed |= true; + } + } + return changed; +} + +am_Error_e CAmMapHandler::changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + if(!changeMainNotificationConfiguration(mMappedData.mSinkMap.at(sinkID).listMainNotificationConfigurations, mainNotificationConfiguration)) + return (E_NO_CHANGE); + + logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); + + if (mpDatabaseObserver) + mpDatabaseObserver->sinkMainNotificationConfigurationChanged(sinkID, mainNotificationConfiguration); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + if(!changeMainNotificationConfiguration(mMappedData.mSourceMap.at(sourceID).listMainNotificationConfigurations, mainNotificationConfiguration)) + return (E_NO_CHANGE); + + logInfo("DatabaseHandler::changeMainSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); + + if (mpDatabaseObserver) + mpDatabaseObserver->sourceMainNotificationConfigurationChanged(sourceID, mainNotificationConfiguration); + return (E_OK); +} + +am_Error_e CAmMapHandler::changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix) +{ + assert(gatewayID!=0); + + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + + if (!listSourceConnectionFormats.empty()) + { + mMappedData.mGatewayMap.at(gatewayID).listSourceFormats = listSourceConnectionFormats; + } + + if (!listSinkConnectionFormats.empty()) + { + mMappedData.mGatewayMap.at(gatewayID).listSinkFormats = listSinkConnectionFormats; + } + + if (!convertionMatrix.empty()) + { + mListConnectionFormat.clear(); + mListConnectionFormat.insert(std::make_pair(gatewayID, convertionMatrix)); + } + + logInfo("DatabaseHandler::changeGatewayDB changed Gateway with ID", gatewayID); + + //todo: check if observer needs to be adopted. + return (E_OK); +} + +bool changeNotificationConfiguration(std::vector & listNotificationConfigurations, const am_NotificationConfiguration_s & notificationConfiguration) +{ + bool changed = false; + std::vector::iterator iter = listNotificationConfigurations.begin(); + for(; itertype ) + { + iter->status = notificationConfiguration.status; + iter->parameter = notificationConfiguration.parameter; + changed |= true; + } + } + return changed; +} + +am_Error_e CAmMapHandler::changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s notificationConfiguration) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + if(!changeNotificationConfiguration(mMappedData.mSinkMap.at(sinkID).listNotificationConfigurations, notificationConfiguration)) + return (E_NO_CHANGE); + + logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); + + //todo:: inform obsever here... + return (E_NON_EXISTENT); +} + +am_Error_e CAmMapHandler::changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s notificationConfiguration) +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + if(!changeNotificationConfiguration(mMappedData.mSourceMap.at(sourceID).listNotificationConfigurations, notificationConfiguration)) + return (E_NO_CHANGE); + + logInfo("DatabaseHandler::changeSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); + + //todo:: implement observer function + return (E_NON_EXISTENT); +} + +} diff --git a/AudioManagerDaemon/src/CAmDatabaseHandlerSQLite.cpp b/AudioManagerDaemon/src/CAmDatabaseHandlerSQLite.cpp new file mode 100644 index 0000000..1e72a4c --- /dev/null +++ b/AudioManagerDaemon/src/CAmDatabaseHandlerSQLite.cpp @@ -0,0 +1,5042 @@ +/** + * 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 Mueller, christian.ei.mueller@bmw.de BMW 2011,2012 + * + * \file CAmDatabaseHandler.cpp + * For further information see http://www.genivi.org/. + * + */ + +#include "CAmDatabaseHandler.h" +#include +#include +#include +#include +#include +#include +#include "CAmDatabaseObserver.h" +#include "CAmRouter.h" +#include "shared/CAmDltWrapper.h" +#include + +namespace am +{ + +/** + * Macro to handle SQLITE errors on prepare + */ +#define MY_SQLITE_PREPARE_V2(db,zSql,nByte,ppStmt,pzTail) \ + if ((eCode = sqlite3_prepare_v2(db, zSql, nByte, ppStmt, pzTail))) \ + { \ + logError("CAmDatabaseHandler::my_sqlite_prepare_v2 on Command",zSql,"failed with errorCode:", eCode); \ + return (E_DATABASE_ERROR); \ + } + +#define MY_SQLITE_PREPARE_V2_BOOL(db,zSql,nByte,ppStmt,pzTail) \ + if ((eCode = sqlite3_prepare_v2(db, zSql, nByte, ppStmt, pzTail))) \ + { \ + logError("CAmDatabaseHandler::my_sqlite_prepare_v2_bool on Command",zSql,"failed with errorCode:", eCode); \ + return (false); \ + } + +/** + * Macro to handle SQLITE errors bind text + */ +#define MY_SQLITE_BIND_TEXT(query,index,text,size,static_) \ + if ((eCode = sqlite3_bind_text(query, index, text, size, static_))) \ + { \ + logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); \ + return (E_DATABASE_ERROR); \ + } + +/** + * Macro to handle SQLITE errors on bind int + */ +#define MY_SQLITE_BIND_INT(query, index, data) \ + if((eCode = sqlite3_bind_int(query, index, data))) \ + { \ + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); \ + return (E_DATABASE_ERROR); \ + } + +/** + * Macro to handle SQLITE errors on reset + */ +#define MY_SQLITE_RESET(query) \ + if((eCode = sqlite3_reset(query))) \ + { \ + logError("CAmDatabaseHandler::sqlite3_reset failed with errorCode:", eCode); \ + return (E_DATABASE_ERROR); \ + } + +/** + * Macro to handle SQLITE finalize + */ +#define MY_SQLITE_FINALIZE(query) \ + if((eCode = sqlite3_finalize(query))) \ + { \ + logError("CAmDatabaseHandler::sqlite3_finalize failed with errorCode:", eCode); \ + return (E_DATABASE_ERROR); \ + } + +#define MY_SQLITE_FINALIZE_BOOL(query) \ + if((eCode = sqlite3_finalize(query))) \ + { \ + logError("CAmDatabaseHandler::sqlite3_finalize failed with errorCode:", eCode); \ + return (true); \ + } + +#define DOMAIN_TABLE "Domains" //!< domain table +#define SOURCE_CLASS_TABLE "SourceClasses" //!< source class table +#define SINK_CLASS_TABLE "SinkClasses" //!< sink class table +#define SOURCE_TABLE "Sources" //!< source table +#define SINK_TABLE "Sinks" //!< sink table +#define GATEWAY_TABLE "Gateways" //!< gateway table +#define CROSSFADER_TABLE "Crossfaders" //!< crossfader table +#define CONNECTION_TABLE "Connections" //!< connection table +#define MAINCONNECTION_TABLE "MainConnections" //!< main connection table +#define SYSTEM_TABLE "SystemProperties" //!< system properties table +/** + * table that holds table informations + */ +const std::string databaseTables[] = +{ " Domains (domainID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), busname VARCHAR(50), nodename VARCHAR(50), early BOOL, complete BOOL, state INTEGER, reserved BOOL);", // + " SourceClasses (sourceClassID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50));", // + " SinkClasses (sinkClassID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50));", // + " Sources (sourceID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, domainID INTEGER, name VARCHAR(50), sourceClassID INTEGER, sourceState INTEGER, volume INTEGER, visible BOOL, availability INTEGER, availabilityReason INTEGER, interruptState INTEGER, reserved BOOL);", // + " Sinks (sinkID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), domainID INTEGER, sinkClassID INTEGER, volume INTEGER, visible BOOL, availability INTEGER, availabilityReason INTEGER, muteState INTEGER, mainVolume INTEGER, reserved BOOL);", // + " Gateways (gatewayID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), sinkID INTEGER, sourceID INTEGER, domainSinkID INTEGER, domainSourceID INTEGER, controlDomainID INTEGER);", // + " Crossfaders (crossfaderID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(50), sinkID_A INTEGER, sinkID_B INTEGER, sourceID INTEGER, hotSink INTEGER);", // + " Connections (connectionID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sourceID INTEGER, sinkID INTEGER, delay INTEGER, connectionFormat INTEGER, reserved BOOL);", // + " MainConnections (mainConnectionID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, sourceID INTEGER, sinkID INTEGER, connectionState INTEGER, delay INTEGER);", // + " SystemProperties (type INTEGER PRIMARY KEY, value INTEGER);" }; + +/** + * template to converts T to std::string + * @param x T + * @return string + */ +template +inline std::string i2s(T const& x) +{ + std::ostringstream o; + o << x; + return (o.str()); +} + +CAmDatabaseHandler::CAmDatabaseHandler():CAmDatabaseHandlerInterface() +{ + mpDatabase = NULL; + mPath = std::string(""); +} + +CAmDatabaseHandler::CAmDatabaseHandler(std::string databasePath):CAmDatabaseHandlerInterface(), + mpDatabase(NULL), // + mPath(databasePath) +{ + + std::ifstream infile(mPath.c_str()); + + if (infile) + { + if(remove(mPath.c_str())==0) + { + logError("DatabaseHandler::DatabaseHandler Knocked down database failed !"); + } + logInfo("DatabaseHandler::DatabaseHandler Knocked down database"); + } + + bool dbOpen = openDatabase(); + if (!dbOpen) + { + logInfo("DatabaseHandler::DatabaseHandler problems opening the database!"); + } + + createTables(); +} + +CAmDatabaseHandler::~CAmDatabaseHandler() +{ + logInfo("Closed Database"); + sqlite3_close(mpDatabase); +} + +am_Error_e CAmDatabaseHandler::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID) +{ + assert(domainData.domainID==0); + assert(!domainData.name.empty()); + assert(!domainData.busname.empty()); + assert(domainData.state>=DS_UNKNOWN && domainData.state<=DS_MAX); + + //first check for a reserved domain + sqlite3_stmt* query = NULL; + int eCode = 0; + domainID=0; + std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, domainData.name.c_str(), domainData.name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + domainID = sqlite3_column_int(query, 0); + command = "UPDATE " + std::string(DOMAIN_TABLE) + " SET name=?, busname=?, nodename=?, early=?, complete=?, state=?, reserved=? WHERE domainID=" + i2s(sqlite3_column_int(query, 0)); + } + else if (eCode == SQLITE_DONE) + { + + command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (name, busname, nodename, early, complete, state, reserved) VALUES (?,?,?,?,?,?,?)"; + } + else + { + logError("DatabaseHandler::enterDomainDB SQLITE Step error code:", eCode); + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, domainData.name.c_str(), domainData.name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_TEXT(query, 2, domainData.busname.c_str(), domainData.busname.size(), SQLITE_STATIC) + MY_SQLITE_BIND_TEXT(query, 3, domainData.nodename.c_str(), domainData.nodename.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(query, 4, domainData.early) + MY_SQLITE_BIND_INT(query, 5, domainData.complete) + MY_SQLITE_BIND_INT(query, 6, domainData.state) + MY_SQLITE_BIND_INT(query, 7, 0) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterDomainDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + if (domainID==0) + domainID = sqlite3_last_insert_rowid(mpDatabase); + logInfo("DatabaseHandler::enterDomainDB entered new domain with name=", domainData.name, "busname=", domainData.busname, "nodename=", domainData.nodename, "assigned ID:", domainID); + + am_Domain_s domain = domainData; + domain.domainID = domainID; + if (mpDatabaseObserver) + mpDatabaseObserver->newDomain(domain); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID) +{ + assert(mainConnectionData.mainConnectionID==0); + assert(mainConnectionData.connectionState>=CS_UNKNOWN && mainConnectionData.connectionState<=CS_MAX); + assert(mainConnectionData.sinkID!=0); + assert(mainConnectionData.sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + int16_t delay = 0; + std::string command = "INSERT INTO " + std::string(MAINCONNECTION_TABLE) + "(sourceID, sinkID, connectionState, delay) VALUES (?,?,?,-1)"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, mainConnectionData.sourceID) + MY_SQLITE_BIND_INT(query, 2, mainConnectionData.sinkID) + MY_SQLITE_BIND_INT(query, 3, mainConnectionData.connectionState) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterMainConnectionDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + connectionID = sqlite3_last_insert_rowid(mpDatabase); + + //now check the connectionTable for all connections in the route. IF connectionID exist + command = "SELECT delay FROM " + std::string(CONNECTION_TABLE) + (" WHERE connectionID=?"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator elementIterator = mainConnectionData.listConnectionID.begin(); + for (; elementIterator < mainConnectionData.listConnectionID.end(); ++elementIterator) + { + MY_SQLITE_BIND_INT(query, 1, *elementIterator) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + int16_t temp_delay = sqlite3_column_int(query, 1); + if (temp_delay != -1 && delay != -1) + delay += temp_delay; + else + delay = -1; + } + else + { + logError("DatabaseHandler::enterMainConnectionDB did not find route for MainConnection: ", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + //now we create a table with references to the connections; + command = "CREATE TABLE MainConnectionRoute" + i2s(connectionID) + std::string("(connectionID INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO MainConnectionRoute" + i2s(connectionID) + "(connectionID) VALUES (?)"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator listConnectionIterator(mainConnectionData.listConnectionID.begin()); + for (; listConnectionIterator < mainConnectionData.listConnectionID.end(); ++listConnectionIterator) + { + MY_SQLITE_BIND_INT(query, 1, *listConnectionIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterMainConnectionDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + 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; + mpDatabaseObserver->newMainConnection(mainConnection); + mpDatabaseObserver->mainConnectionStateChanged(connectionID, mainConnectionData.connectionState); + } + + //finally, we update the delay value for the maintable + if (delay == 0) + delay = -1; + return (changeDelayMainConnection(delay, connectionID)); +} + +am_Error_e CAmDatabaseHandler::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) +{ + assert(sinkData.sinkID=MS_UNKNOWN && sinkData.muteState<=MS_MAX); + + sqlite3_stmt *query = NULL; + int eCode = 0; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=? AND reserved=1"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + command = "UPDATE " + std::string(SINK_TABLE) + " SET name=?, domainID=?, sinkClassID=?, volume=?, visible=?, availability=?, availabilityReason=?, muteState=?, mainVolume=?, reserved=? WHERE sinkID=" + i2s(sqlite3_column_int(query, 0)); + } + else if (eCode == SQLITE_DONE) + { + //if sinkID is zero and the first Static Sink was already entered, the ID is created + if (sinkData.sinkID == 0 && !mFirstStaticSink && !existSinkName(sinkData.name)) + { + command = "INSERT INTO " + std::string(SINK_TABLE) + "(name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, reserved) VALUES (?,?,?,?,?,?,?,?,?,?)"; + } + else + { + //check if the ID already exists + if (existSinkNameOrID(sinkData.sinkID, sinkData.name)) + { + MY_SQLITE_FINALIZE(query) + return (E_ALREADY_EXISTS); + } + command = "INSERT INTO " + std::string(SINK_TABLE) + "(name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, reserved, sinkID) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; + } + } + else + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(query, 2, sinkData.domainID) + MY_SQLITE_BIND_INT(query, 3, sinkData.sinkClassID) + MY_SQLITE_BIND_INT(query, 4, sinkData.volume) + MY_SQLITE_BIND_INT(query, 5, sinkData.visible) + MY_SQLITE_BIND_INT(query, 6, sinkData.available.availability) + MY_SQLITE_BIND_INT(query, 7, sinkData.available.availabilityReason) + MY_SQLITE_BIND_INT(query, 8, sinkData.muteState) + MY_SQLITE_BIND_INT(query, 9, sinkData.mainVolume) + MY_SQLITE_BIND_INT(query, 10, 0) + + //if the ID is not created, we add it to the query + if (sinkData.sinkID != 0) + { + MY_SQLITE_BIND_INT(query, 11, sinkData.sinkID) + } + + //if the first static sink is entered, we need to set it onto the boundary + else if (mFirstStaticSink) + { + MY_SQLITE_BIND_INT(query, 11, DYNAMIC_ID_BOUNDARY) + mFirstStaticSink = false; + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //now read back the sinkID + command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sinkData.name.c_str(), sinkData.name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkID = sqlite3_column_int(query, 0); + } + else + { + sinkID = 0; + logError("DatabaseHandler::existSink database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + //now we need to create the additional tables: + command = "CREATE TABLE SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + command = "CREATE TABLE SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + command = "CREATE TABLE SinkNotificationConfiguration" + i2s(sinkID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = sinkData.listConnectionFormats.begin(); + for (; connectionFormatIterator < sinkData.listConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + //Fill SinkSoundProperties + command = "INSERT INTO SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator SoundPropertyIterator = sinkData.listSoundProperties.begin(); + for (; SoundPropertyIterator < sinkData.listSoundProperties.end(); ++SoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + //Fill NotificationConfigurations + command = "INSERT INTO SinkNotificationConfiguration" + i2s(sinkID) + std::string("(type,status,parameter) VALUES (?,?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator NotificationConfigurationIterator(sinkData.listNotificationConfigurations.begin()); + for (; NotificationConfigurationIterator < sinkData.listNotificationConfigurations.end(); ++NotificationConfigurationIterator) + { + MY_SQLITE_BIND_INT(query, 1, NotificationConfigurationIterator->type) + MY_SQLITE_BIND_INT(query, 2, NotificationConfigurationIterator->status) + MY_SQLITE_BIND_INT(query, 3, NotificationConfigurationIterator->parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + if (sinkData.visible == true) + { + command = "CREATE TABLE SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + //Fill MainSinkSoundProperties + command = "INSERT INTO SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainSoundPropertyIterator = sinkData.listMainSoundProperties.begin(); + for (; mainSoundPropertyIterator < sinkData.listMainSoundProperties.end(); ++mainSoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + //now we got MainNotificationConfigurations as well + command = "CREATE TABLE SinkMainNotificationConfiguration" + i2s(sinkID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO SinkMainNotificationConfiguration" + i2s(sinkID) + std::string("(type,status,parameter) VALUES (?,?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainNotificationConfigurationIterator(sinkData.listMainNotificationConfigurations.begin()); + for (; mainNotificationConfigurationIterator < sinkData.listMainNotificationConfigurations.end(); ++mainNotificationConfigurationIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainNotificationConfigurationIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainNotificationConfigurationIterator->status) + MY_SQLITE_BIND_INT(query, 3, mainNotificationConfigurationIterator->parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + logInfo("DatabaseHandler::enterSinkDB entered new sink with name", sinkData.name, "domainID:", sinkData.domainID, "classID:", sinkData.sinkClassID, "volume:", sinkData.volume, "assigned ID:", sinkID); + am_Sink_s sink = sinkData; + sink.sinkID = sinkID; + if (mpDatabaseObserver != NULL) + mpDatabaseObserver->newSink(sink); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) +{ + assert(crossfaderData.crossfaderID=HS_UNKNOWN && crossfaderData.hotSink<=HS_MAX); + assert(!crossfaderData.name.empty()); + assert(existSink(crossfaderData.sinkID_A)); + assert(existSink(crossfaderData.sinkID_B)); + assert(existSource(crossfaderData.sourceID)); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + //if gatewayData is zero and the first Static Sink was already entered, the ID is created + if (crossfaderData.crossfaderID == 0 && !mFirstStaticCrossfader) + { + command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink) VALUES (?,?,?,?,?)"; + } + else + { + //check if the ID already exists + if (existcrossFader(crossfaderData.crossfaderID)) + return (E_ALREADY_EXISTS); + command = "INSERT INTO " + std::string(CROSSFADER_TABLE) + "(name, sinkID_A, sinkID_B, sourceID, hotSink, crossfaderID) VALUES (?,?,?,?,?,?)"; + } + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + MY_SQLITE_BIND_TEXT(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(query, 2, crossfaderData.sinkID_A) + MY_SQLITE_BIND_INT(query, 3, crossfaderData.sinkID_B) + MY_SQLITE_BIND_INT(query, 4, crossfaderData.sourceID) + MY_SQLITE_BIND_INT(query, 5, crossfaderData.hotSink) + + //if the ID is not created, we add it to the query + if (crossfaderData.crossfaderID != 0) + { + MY_SQLITE_BIND_INT(query, 6, crossfaderData.crossfaderID) + } + + //if the first static sink is entered, we need to set it onto the boundary + else if (mFirstStaticCrossfader) + { + MY_SQLITE_BIND_INT(query, 6, DYNAMIC_ID_BOUNDARY) + mFirstStaticCrossfader = false; + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterCrossfaderDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //now read back the crossfaderID + command = "SELECT crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, crossfaderData.name.c_str(), crossfaderData.name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + crossfaderID = sqlite3_column_int(query, 0); + } + else + { + crossfaderID = 0; + logError("DatabaseHandler::enterCrossfaderDB database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + 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); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) +{ + assert(gatewayData.gatewayIDsqQuery(command)) + return (E_DATABASE_ERROR); + command = "CREATE TABLE GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO GatewaySourceFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = gatewayData.listSourceFormats.begin(); + for (; connectionFormatIterator < gatewayData.listSourceFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + command = "INSERT INTO GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + connectionFormatIterator = gatewayData.listSinkFormats.begin(); + for (; connectionFormatIterator < gatewayData.listSinkFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + 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); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) +{ + assert(sourceData.sourceID=SS_UNKNNOWN && sourceData.sourceState<=SS_MAX); + + sqlite3_stmt* query = NULL; + ; + int eCode = 0; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=? AND reserved=1"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + command = "UPDATE " + std::string(SOURCE_TABLE) + " SET name=?, domainID=?, sourceClassID=?, sourceState=?, volume=?, visible=?, availability=?, availabilityReason=?, interruptState=?, reserved=? WHERE sourceID=" + i2s(sqlite3_column_int(query, 0)); + } + else if (eCode == SQLITE_DONE) + { + //if sinkID is zero and the first Static Sink was already entered, the ID is created + if (sourceData.sourceID == 0 && !mFirstStaticSource && !existSourceName(sourceData.name)) + { + command = "INSERT INTO " + std::string(SOURCE_TABLE) + "(name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, reserved) VALUES (?,?,?,?,?,?,?,?,?,?)"; + } + else + { + //check if the ID already exists + if (existSourceNameOrID(sourceData.sourceID, sourceData.name)) + { + MY_SQLITE_FINALIZE(query) + return (E_ALREADY_EXISTS); + } + command = "INSERT INTO " + std::string(SOURCE_TABLE) + "(name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, reserved, sourceID) VALUES (?,?,?,?,?,?,?,?,?,?,?)"; + } + } + else + { + logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(query, 2, sourceData.domainID) + MY_SQLITE_BIND_INT(query, 3, sourceData.sourceClassID) + MY_SQLITE_BIND_INT(query, 4, sourceData.sourceState) + MY_SQLITE_BIND_INT(query, 5, sourceData.volume) + MY_SQLITE_BIND_INT(query, 6, sourceData.visible) + MY_SQLITE_BIND_INT(query, 7, sourceData.available.availability) + MY_SQLITE_BIND_INT(query, 8, sourceData.available.availabilityReason) + MY_SQLITE_BIND_INT(query, 9, sourceData.interruptState) + MY_SQLITE_BIND_INT(query, 10, 0) + + //if the ID is not created, we add it to the query + if (sourceData.sourceID != 0) + { + MY_SQLITE_BIND_INT(query, 11, sourceData.sourceID) + } + + //if the first static sink is entered, we need to set it onto the boundary + else if (mFirstStaticSource) + { + MY_SQLITE_BIND_INT(query, 11, DYNAMIC_ID_BOUNDARY) + mFirstStaticSource = false; + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //now read back the sinkID + command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, sourceData.name.c_str(), sourceData.name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceID = sqlite3_column_int(query, 0); + } + else + { + sourceID = 0; + logError("DatabaseHandler::existSink database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + //now we need to create the additional tables: + command = "CREATE TABLE SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + command = "CREATE TABLE SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + command = "CREATE TABLE SourceNotificationConfiguration" + i2s(sourceID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = sourceData.listConnectionFormats.begin(); + for (; connectionFormatIterator != sourceData.listConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + //Fill SinkSoundProperties + command = "INSERT INTO SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator SoundPropertyIterator = sourceData.listSoundProperties.begin(); + for (; SoundPropertyIterator != sourceData.listSoundProperties.end(); ++SoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + //Fill NotificationConfigurations + command = "INSERT INTO SourceNotificationConfiguration" + i2s(sourceID) + std::string("(type,status,parameter) VALUES (?,?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator NotificationConfigurationIterator(sourceData.listNotificationConfigurations.begin()); + for (; NotificationConfigurationIterator < sourceData.listNotificationConfigurations.end(); ++NotificationConfigurationIterator) + { + MY_SQLITE_BIND_INT(query, 1, NotificationConfigurationIterator->type) + MY_SQLITE_BIND_INT(query, 2, NotificationConfigurationIterator->status) + MY_SQLITE_BIND_INT(query, 3, NotificationConfigurationIterator->parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + if (sourceData.visible == true) + { + command = "CREATE TABLE SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType INTEGER, value INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + //Fill MainSinkSoundProperties + command = "INSERT INTO SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainSoundPropertyIterator = sourceData.listMainSoundProperties.begin(); + for (; mainSoundPropertyIterator != sourceData.listMainSoundProperties.end(); ++mainSoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSourceDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + + //now we got MainNotificationConfigurations as well + command = "CREATE TABLE SourceMainNotificationConfiguration" + i2s(sourceID) + std::string("(type INTEGER, status INTEGER, parameter INTEGER)"); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO SourceMainNotificationConfiguration" + i2s(sourceID) + std::string("(type,status,parameter) VALUES (?,?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainNotificationConfigurationIterator(sourceData.listMainNotificationConfigurations.begin()); + for (; mainNotificationConfigurationIterator != sourceData.listMainNotificationConfigurations.end(); ++mainNotificationConfigurationIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainNotificationConfigurationIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainNotificationConfigurationIterator->status) + MY_SQLITE_BIND_INT(query, 3, mainNotificationConfigurationIterator->parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + 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); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) +{ + assert(mainconnectionID!=0); + if (!existMainConnection(mainconnectionID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + int16_t delay = 0; + command = "SELECT delay FROM " + std::string(CONNECTION_TABLE) + (" WHERE connectionID=?"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator elementIterator = listConnectionID.begin(); + for (; elementIterator < listConnectionID.end(); ++elementIterator) + { + MY_SQLITE_BIND_INT(query, 1, *elementIterator) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + int16_t temp_delay = sqlite3_column_int(query, 1); + if (temp_delay != -1 && delay != -1) + delay += temp_delay; + else + delay = -1; + } + else + { + logError("DatabaseHandler::changeMainConnectionRouteDB did not find route for MainConnection: ", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + //now we delete the data in the table + command = "DELETE from MainConnectionRoute" + i2s(mainconnectionID); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO MainConnectionRoute" + i2s(mainconnectionID) + "(connectionID) VALUES (?)"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator listConnectionIterator(listConnectionID.begin()); + for (; listConnectionIterator != listConnectionID.end(); ++listConnectionIterator) + { + MY_SQLITE_BIND_INT(query, 1, *listConnectionIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainConnectionRouteDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + if (changeDelayMainConnection(delay,mainconnectionID)!=E_OK) + logError("DatabaseHandler::changeMainConnectionRouteDB error while changing mainConnectionDelay to ", delay); + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeMainConnectionRouteDB entered new route:", mainconnectionID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) +{ + assert(mainconnectionID!=0); + assert(connectionState>=CS_UNKNOWN && connectionState<=CS_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existMainConnection(mainconnectionID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(MAINCONNECTION_TABLE) + " SET connectionState=? WHERE mainConnectionID=" + i2s(mainconnectionID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, connectionState) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainConnectionStateDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeMainConnectionStateDB changed mainConnectionState of MainConnection:", mainconnectionID, "to:", connectionState); + + if (mpDatabaseObserver) + mpDatabaseObserver->mainConnectionStateChanged(mainconnectionID, connectionState); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SINK_TABLE) + " SET mainVolume=? WHERE sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, mainVolume) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSinkMainVolumeDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSinkMainVolumeDB changed mainVolume of sink:", sinkID, "to:", mainVolume); + + if (mpDatabaseObserver) + mpDatabaseObserver->volumeChanged(sinkID, mainVolume); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); + assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SINK_TABLE) + " SET availability=?, availabilityReason=? WHERE sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, availability.availability) + MY_SQLITE_BIND_INT(query, 2, availability.availabilityReason) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSinkAvailabilityDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + assert(sinkID!=0); + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); + + if (mpDatabaseObserver && sourceVisible(sinkID)) + mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) +{ + assert(domainID!=0); + assert(domainState>=DS_UNKNOWN && domainState<=DS_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(DOMAIN_TABLE) + " SET state=? WHERE domainID=" + i2s(domainID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, domainState) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changDomainStateDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changDomainStateDB changed domainState of domain:", domainID, "to:", domainState); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + assert(muteState>=MS_UNKNOWN && muteState<=MS_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SINK_TABLE) + " SET muteState=? WHERE sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, muteState) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSinkMuteStateDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + assert(sinkID!=0); + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSinkMuteStateDB changed sinkMuteState of sink:", sinkID, "to:", muteState); + + if (mpDatabaseObserver) + mpDatabaseObserver->sinkMuteStateChanged(sinkID, muteState); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID) +{ + assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SinkMainSoundProperty" + i2s(sinkID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, soundProperty.value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSinkSoundPropertyDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + assert(sinkID!=0); + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeMainSinkSoundPropertyDB changed MainSinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); + if (mpDatabaseObserver) + mpDatabaseObserver->mainSinkSoundPropertyChanged(sinkID, soundProperty); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID) +{ + assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SourceMainSoundProperty" + i2s(sourceID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, soundProperty.value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSourceSoundPropertyDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeMainSourceSoundPropertyDB changed MainSinkSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); + + if (mpDatabaseObserver) + mpDatabaseObserver->mainSourceSoundPropertyChanged(sourceID, soundProperty); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID) +{ + assert(sourceID!=0); + assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); + assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SOURCE_TABLE) + " SET availability=?, availabilityReason=? WHERE sourceID=" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, availability.availability) + MY_SQLITE_BIND_INT(query, 2, availability.availabilityReason) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSourceAvailabilityDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeSourceAvailabilityDB changed changeSourceAvailabilityDB of source:", sourceID, "to:", availability.availability, "Reason:", availability.availabilityReason); + + if (mpDatabaseObserver && sourceVisible(sourceID)) + mpDatabaseObserver->sourceAvailabilityChanged(sourceID, availability); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSystemPropertyDB(const am_SystemProperty_s & property) +{ + assert(property.type>=SYP_UNKNOWN && property.type<=SYP_MAX); + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "UPDATE " + std::string(SYSTEM_TABLE) + " set value=? WHERE type=?"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, property.value) + MY_SQLITE_BIND_INT(query, 2, property.type) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSystemPropertyDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeSystemPropertyDB changed system property"); + + if (mpDatabaseObserver) + mpDatabaseObserver->systemPropertyChanged(property); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) +{ + assert(mainConnectionID!=0); + + if (!existMainConnection(mainConnectionID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); + std::string command1 = "DROP table MainConnectionRoute" + i2s(mainConnectionID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + if (!sqQuery(command1)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); + if (mpDatabaseObserver) + { + mpDatabaseObserver->mainConnectionStateChanged(mainConnectionID, CS_DISCONNECTED); + mpDatabaseObserver->removedMainConnection(mainConnectionID); + } + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeSinkDB(const am_sinkID_t sinkID) +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + bool visible = sinkVisible(sinkID); + + std::string command = "DELETE from " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); + std::string command1 = "DROP table SinkConnectionFormat" + i2s(sinkID); + std::string command2 = "DROP table SinkSoundProperty" + i2s(sinkID); + std::string command3 = "DROP table SinkMainSoundProperty" + i2s(sinkID); + std::string command4 = "DROP table SinkNotificationConfiguration" + i2s(sinkID); + std::string command5 = "DROP table SinkMainNotificationConfiguration" + i2s(sinkID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + if (!sqQuery(command1)) + return (E_DATABASE_ERROR); + if (!sqQuery(command2)) + return (E_DATABASE_ERROR); + if (!sqQuery(command4)) + return (E_DATABASE_ERROR); + if (visible) //only drop table if it ever existed + { + if (!sqQuery(command3)) + return (E_DATABASE_ERROR); + if (!sqQuery(command5)) + return (E_DATABASE_ERROR); + } + logInfo("DatabaseHandler::removeSinkDB removed:", sinkID); + + if (mpDatabaseObserver != NULL) + mpDatabaseObserver->removedSink(sinkID, visible); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeSourceDB(const am_sourceID_t sourceID) +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + bool visible = sourceVisible(sourceID); + + std::string command = "DELETE from " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); + std::string command1 = "DROP table SourceConnectionFormat" + i2s(sourceID); + std::string command2 = "DROP table SourceMainSoundProperty" + i2s(sourceID); + std::string command3 = "DROP table SourceSoundProperty" + i2s(sourceID); + std::string command4 = "DROP table SourceNotificationConfiguration" + i2s(sourceID); + std::string command5 = "DROP table SourceMainNotificationConfiguration" + i2s(sourceID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + if (!sqQuery(command1)) + return (E_DATABASE_ERROR); + if (!sqQuery(command3)) + return (E_DATABASE_ERROR); + if (!sqQuery(command4)) + return (E_DATABASE_ERROR); + + if(visible) + { + if (!sqQuery(command2)) + return (E_DATABASE_ERROR); + if (!sqQuery(command5)) + return (E_DATABASE_ERROR); + } + logInfo("DatabaseHandler::removeSourceDB removed:", sourceID); + if (mpDatabaseObserver) + mpDatabaseObserver->removedSource(sourceID, visible); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeGatewayDB(const am_gatewayID_t gatewayID) +{ + assert(gatewayID!=0); + + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeGatewayDB removed:", gatewayID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeGateway(gatewayID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeCrossfaderDB(const am_crossfaderID_t crossfaderID) +{ + assert(crossfaderID!=0); + + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeCrossfaderDB removed:", crossfaderID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeCrossfader(crossfaderID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeDomainDB(const am_domainID_t domainID) +{ + assert(domainID!=0); + + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(DOMAIN_TABLE) + " WHERE domainID=" + i2s(domainID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeDomainDB removed:", domainID); + if (mpDatabaseObserver) + mpDatabaseObserver->removeDomain(domainID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeSinkClassDB(const am_sinkClass_t sinkClassID) +{ + assert(sinkClassID!=0); + + if (!existSinkClass(sinkClassID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + i2s(sinkClassID); + std::string command1 = "DROP table SinkClassProperties" + i2s(sinkClassID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + if (!sqQuery(command1)) + return (E_DATABASE_ERROR); + + logInfo("DatabaseHandler::removeSinkClassDB removed:", sinkClassID); + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSinkClassesChanged(); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeSourceClassDB(const am_sourceClass_t sourceClassID) +{ + assert(sourceClassID!=0); + + if (!existSourceClass(sourceClassID)) + { + return (E_NON_EXISTENT); + } + std::string command = "DELETE from " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + i2s(sourceClassID); + std::string command1 = "DROP table SourceClassProperties" + i2s(sourceClassID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + if (!sqQuery(command1)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeSourceClassDB removed:", sourceClassID); + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSourceClassesChanged(); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::removeConnection(const am_connectionID_t connectionID) +{ + assert(connectionID!=0); + + std::string command = "DELETE from " + std::string(CONNECTION_TABLE) + " WHERE connectionID=" + i2s(connectionID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + logInfo("DatabaseHandler::removeConnection removed:", connectionID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_ClassProperty_s propertyTemp; + std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + (i2s(sourceID)); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + classInfo.sourceClassID = sqlite3_column_int(query, 0); + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + command = "SELECT name FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + (i2s(classInfo.sourceClassID)); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + classInfo.name = std::string((const char*) sqlite3_column_text(query, 0)); + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //read out Properties + command = "SELECT classProperty, value FROM SourceClassProperties" + i2s(classInfo.sourceClassID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(query, 0); + propertyTemp.value = sqlite3_column_int(query, 1); + classInfo.listClassProperties.push_back(propertyTemp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getSourceClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s & sinkData) const +{ + + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qMainNotification = NULL, *qNotification = NULL; + int eCode = 0; + am_ConnectionFormat_e tempConnectionFormat; + am_SoundProperty_s tempSoundProperty; + am_MainSoundProperty_s tempMainSoundProperty; + am_NotificationConfiguration_s tempNotificationConfiguration,tempMainNotification; + std::string command = "SELECT name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 and sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkData.name = std::string((const char*) sqlite3_column_text(query, 0)); + sinkData.domainID = sqlite3_column_int(query, 1); + sinkData.sinkClassID = sqlite3_column_int(query, 2); + sinkData.volume = sqlite3_column_int(query, 3); + sinkData.visible = sqlite3_column_int(query, 4); + sinkData.available.availability = (am_Availability_e) sqlite3_column_int(query, 5); + sinkData.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 6); + sinkData.muteState = (am_MuteState_e) sqlite3_column_int(query, 7); + sinkData.mainVolume = sqlite3_column_int(query, 8); + sinkData.sinkID = sqlite3_column_int(query, 9); + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + sinkData.listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + //read out sound properties + std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SinkSoundProperty" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) + while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) + { + tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); + tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); + sinkData.listSoundProperties.push_back(tempSoundProperty); + } + + MY_SQLITE_FINALIZE(qSoundProperty) + + std::string notificationCommand = "SELECT type, status, parameter FROM SinkNotificationConfiguration" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) + + while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) + { + tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); + tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); + tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); + sinkData.listNotificationConfigurations.push_back(tempNotificationConfiguration); + } + MY_SQLITE_FINALIZE(qNotification) + + if (sinkData.visible) + { + + //read out MainSoundProperties + std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) + while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) + { + tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); + tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); + sinkData.listMainSoundProperties.push_back(tempMainSoundProperty); + } + + MY_SQLITE_FINALIZE(qMAinSoundProperty) + + std::string mainNotificationCommand = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) + + while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) + { + tempMainNotification.type = static_cast(sqlite3_column_int(qMainNotification, 0)); + tempMainNotification.status = static_cast(sqlite3_column_int(qMainNotification, 1)); + tempMainNotification.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); + sinkData.listMainNotificationConfigurations.push_back(tempMainNotification); + } + MY_SQLITE_FINALIZE(qMainNotification) + } + } + + else if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getSinkInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s & sourceData) const +{ + assert(sourceID!=0); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qMainNotification = NULL, *qNotification = NULL; + int eCode = 0; + am_ConnectionFormat_e tempConnectionFormat; + am_SoundProperty_s tempSoundProperty; + am_MainSoundProperty_s tempMainSoundProperty; + am_NotificationConfiguration_s tempNotificationConfiguration,tempMainNotification; + std::string command = "SELECT name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND sourceID=" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceData.name = std::string((const char*) sqlite3_column_text(query, 0)); + sourceData.domainID = sqlite3_column_int(query, 1); + sourceData.sourceClassID = sqlite3_column_int(query, 2); + sourceData.sourceState = (am_SourceState_e) sqlite3_column_int(query, 3); + sourceData.volume = sqlite3_column_int(query, 4); + sourceData.visible = sqlite3_column_int(query, 5); + sourceData.available.availability = (am_Availability_e) sqlite3_column_int(query, 6); + sourceData.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 7); + sourceData.interruptState = (am_InterruptState_e) sqlite3_column_int(query, 8); + sourceData.sourceID = sqlite3_column_int(query, 9); + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + sourceData.listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + //read out sound properties + std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SourceSoundProperty" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL); + while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) + { + tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); + tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); + sourceData.listSoundProperties.push_back(tempSoundProperty); + } + + MY_SQLITE_FINALIZE(qSoundProperty) + + std::string notificationCommand = "SELECT type, status, parameter FROM SourceNotificationConfiguration" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) + + while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) + { + tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); + tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); + tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); + sourceData.listNotificationConfigurations.push_back(tempNotificationConfiguration); + } + MY_SQLITE_FINALIZE(qNotification) + + if (sourceData.visible) + { + + //read out MainSoundProperties + std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) + while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) + { + tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); + tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); + sourceData.listMainSoundProperties.push_back(tempMainSoundProperty); + } + + MY_SQLITE_FINALIZE(qMAinSoundProperty) + + std::string mainNotificationCommand = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) + + while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) + { + tempMainNotification.type = static_cast(sqlite3_column_int(qMainNotification, 0)); + tempMainNotification.status = static_cast(sqlite3_column_int(qMainNotification, 1)); + tempMainNotification.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); + sourceData.listMainNotificationConfigurations.push_back(tempMainNotification); + } + MY_SQLITE_FINALIZE(qMainNotification) + + } + } + else if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getSourceInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e am::CAmDatabaseHandler::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s & mainConnectionData) const +{ + assert(mainConnectionID!=0); + if (!existMainConnection(mainConnectionID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt *query = NULL, *query1 = NULL; + int eCode = 0; + am_MainConnection_s temp; + std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); + std::string command1 = "SELECT connectionID FROM MainConnectionRoute"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + mainConnectionData.mainConnectionID = sqlite3_column_int(query, 0); + mainConnectionData.sourceID = sqlite3_column_int(query, 1); + mainConnectionData.sinkID = sqlite3_column_int(query, 2); + mainConnectionData.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); + mainConnectionData.delay = sqlite3_column_int(query, 4); + std::string statement = command1 + i2s(mainConnectionID); + MY_SQLITE_PREPARE_V2(mpDatabase, statement.c_str(), -1, &query1, NULL) + while ((eCode = sqlite3_step(query1)) == SQLITE_ROW) + { + mainConnectionData.listConnectionID.push_back(sqlite3_column_int(query1, 0)); + } + MY_SQLITE_FINALIZE(query1) + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getMainConnectionInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) +{ + assert(sinkClass.sinkClassID!=0); + assert(!sinkClass.listClassProperties.empty()); + + sqlite3_stmt* query = NULL; + int eCode = 0; + + //check if the ID already exists + if (!existSinkClass(sinkClass.sinkClassID)) + return (E_NON_EXISTENT); + + //fill ConnectionFormats + std::string command = "UPDATE SinkClassProperties" + i2s(sinkClass.sinkClassID) + " set value=? WHERE classProperty=?;"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator Iterator = sinkClass.listClassProperties.begin(); + for (; Iterator < sinkClass.listClassProperties.end(); ++Iterator) + { + MY_SQLITE_BIND_INT(query, 1, Iterator->value) + MY_SQLITE_BIND_INT(query, 2, Iterator->classProperty) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::setSinkClassInfoDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) +{ + assert(sourceClass.sourceClassID!=0); + assert(!sourceClass.listClassProperties.empty()); + + sqlite3_stmt* query = NULL; + int eCode = 0; + + //check if the ID already exists + if (!existSourceClass(sourceClass.sourceClassID)) + return (E_NON_EXISTENT); + + //fill ConnectionFormats + std::string command = "UPDATE SourceClassProperties" + i2s(sourceClass.sourceClassID) + " set value=? WHERE classProperty=?;"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator Iterator = sourceClass.listClassProperties.begin(); + for (; Iterator < sourceClass.listClassProperties.end(); ++Iterator) + { + MY_SQLITE_BIND_INT(query, 1, Iterator->value) + MY_SQLITE_BIND_INT(query, 2, Iterator->classProperty) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::setSinkClassInfoDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const +{ + assert(sinkID!=0); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_ClassProperty_s propertyTemp; + std::string command = "SELECT sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + (i2s(sinkID)); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkClass.sinkClassID = sqlite3_column_int(query, 0); + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + command = "SELECT name FROM " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + (i2s(sinkClass.sinkClassID)); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkClass.name = std::string((const char*) sqlite3_column_text(query, 0)); + } + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //read out Properties + command = "SELECT classProperty, value FROM SinkClassProperties" + i2s(sinkClass.sinkClassID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(query, 0); + propertyTemp.value = sqlite3_column_int(query, 1); + sinkClass.listClassProperties.push_back(propertyTemp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getSinkClassInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const +{ + assert(gatewayID!=0); + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL, *qSinkConnectionFormat = NULL, *qSourceConnectionFormat = NULL; + int eCode = 0; + am_ConnectionFormat_e tempConnectionFormat; + std::string command = "SELECT name, sinkID, sourceID, domainSinkID, domainSourceID, controlDomainID, gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + gatewayData.name = std::string((const char*) sqlite3_column_text(query, 0)); + gatewayData.sinkID = sqlite3_column_int(query, 1); + gatewayData.sourceID = sqlite3_column_int(query, 2); + gatewayData.domainSinkID = sqlite3_column_int(query, 3); + gatewayData.domainSourceID = sqlite3_column_int(query, 4); + gatewayData.controlDomainID = sqlite3_column_int(query, 5); + gatewayData.gatewayID = sqlite3_column_int(query, 6); + + //convertionMatrix: + ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); + iter = mListConnectionFormat.find(gatewayData.gatewayID); + if (iter == mListConnectionFormat.end()) + { + logError("DatabaseHandler::getGatewayInfoDB database error with convertionFormat"); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + gatewayData.convertionMatrix = iter->second; + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM GatewaySourceFormat" + i2s(gatewayData.gatewayID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSourceConnectionFormat, NULL) + while ((eCode = sqlite3_step(qSourceConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSourceConnectionFormat, 0); + gatewayData.listSourceFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qSourceConnectionFormat) + + //read out sound properties + commandConnectionFormat = "SELECT soundFormat FROM GatewaySinkFormat" + i2s(gatewayData.gatewayID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSinkConnectionFormat, NULL) + while ((eCode = sqlite3_step(qSinkConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSinkConnectionFormat, 0); + gatewayData.listSinkFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qSinkConnectionFormat) + + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getGatewayInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); + +} + +am_Error_e CAmDatabaseHandler::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const +{ + assert(crossfaderID!=0); + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=" + i2s(crossfaderID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + crossfaderData.name = std::string((const char*) sqlite3_column_text(query, 0)); + crossfaderData.sinkID_A = sqlite3_column_int(query, 1); + crossfaderData.sinkID_B = sqlite3_column_int(query, 2); + crossfaderData.sourceID = sqlite3_column_int(query, 3); + crossfaderData.hotSink = static_cast(sqlite3_column_int(query, 4)); + crossfaderData.crossfaderID = sqlite3_column_int(query, 5); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getCrossfaderInfoDB SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSinksOfDomain(const am_domainID_t domainID, std::vector & listSinkID) const +{ + assert(domainID!=0); + listSinkID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_sinkID_t temp; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND domainID=" + (i2s(domainID)); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp = sqlite3_column_int(query, 0); + listSinkID.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSinksOfDomain SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSourcesOfDomain(const am_domainID_t domainID, std::vector & listSourceID) const +{ + assert(domainID!=0); + listSourceID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_sourceID_t temp; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND domainID=" + i2s(domainID); + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp = sqlite3_column_int(query, 0); + listSourceID.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourcesOfDomain SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector & listCrossfader) const +{ + assert(domainID!=0); + listCrossfader.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_crossfaderID_t temp; + + std::string command = "SELECT c.crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " c," + std::string(SOURCE_TABLE) + " s WHERE c.sourceID=s.sourceID AND s.domainID=" + i2s(domainID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp = sqlite3_column_int(query, 0); + listCrossfader.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListCrossfadersOfDomain SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); + +} + +am_Error_e CAmDatabaseHandler::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector & listGatewaysID) const +{ + assert(domainID!=0); + listGatewaysID.clear(); + if (!existDomain(domainID)) + { + return (E_NON_EXISTENT); + } + sqlite3_stmt* query = NULL; + int eCode = 0; + am_gatewayID_t temp; + + std::string command = "SELECT gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE controlDomainID=" + i2s(domainID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp = sqlite3_column_int(query, 0); + listGatewaysID.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListGatewaysOfDomain SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainConnections(std::vector & listMainConnections) const +{ + listMainConnections.clear(); + sqlite3_stmt *query = NULL, *query1 = NULL; + int eCode = 0; + am_MainConnection_s temp; + std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE); + std::string command1 = "SELECT connectionID FROM MainConnectionRoute"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.mainConnectionID = sqlite3_column_int(query, 0); + temp.sourceID = sqlite3_column_int(query, 1); + temp.sinkID = sqlite3_column_int(query, 2); + temp.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); + temp.delay = sqlite3_column_int(query, 4); + std::string statement = command1 + i2s(temp.mainConnectionID); + MY_SQLITE_PREPARE_V2(mpDatabase, statement.c_str(), -1, &query1, NULL) + while ((eCode = sqlite3_step(query1)) == SQLITE_ROW) + { + temp.listConnectionID.push_back(sqlite3_column_int(query1, 0)); + } + listMainConnections.push_back(temp); + MY_SQLITE_FINALIZE(query1) + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListMainConnections SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListDomains(std::vector & listDomains) const +{ + listDomains.clear(); + sqlite3_stmt* query = NULL; + int eCode = 0; + am_Domain_s temp; + std::string command = "SELECT domainID, name, busname, nodename, early, complete, state FROM " + std::string(DOMAIN_TABLE) + " WHERE reserved=0"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.domainID = sqlite3_column_int(query, 0); + temp.name = std::string((const char*) sqlite3_column_text(query, 1)); + temp.busname = std::string((const char*) sqlite3_column_text(query, 2)); + temp.nodename = std::string((const char*) sqlite3_column_text(query, 3)); + temp.early = sqlite3_column_int(query, 4); + temp.complete = sqlite3_column_int(query, 5); + temp.state = (am_DomainState_e) sqlite3_column_int(query, 6); + listDomains.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListDomains SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListConnections(std::vector & listConnections) const +{ + listConnections.clear(); + sqlite3_stmt* query = NULL; + int eCode = 0; + am_Connection_s temp; + std::string command = "SELECT connectionID, sourceID, sinkID, delay, connectionFormat FROM " + std::string(CONNECTION_TABLE) + " WHERE reserved=0"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.connectionID = sqlite3_column_int(query, 0); + temp.sourceID = sqlite3_column_int(query, 1); + temp.sinkID = sqlite3_column_int(query, 2); + temp.delay = sqlite3_column_int(query, 3); + temp.connectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(query, 4); + listConnections.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListConnections SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSinks(std::vector & listSinks) const +{ + listSinks.clear(); + sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qNotificationConfiguration= NULL, *qMAinSoundProperty = NULL, *qMainNotificationConfiguration= NULL; + int eCode = 0; + am_Sink_s temp; + am_ConnectionFormat_e tempConnectionFormat; + am_SoundProperty_s tempSoundProperty; + am_MainSoundProperty_s tempMainSoundProperty; + am_NotificationConfiguration_s tempNotificationConfiguration; + am_NotificationConfiguration_s tempMainNotificationConfiguration; + std::string command = "SELECT name, domainID, sinkClassID, volume, visible, availability, availabilityReason, muteState, mainVolume, sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.name = std::string((const char*) sqlite3_column_text(query, 0)); + temp.domainID = sqlite3_column_int(query, 1); + temp.sinkClassID = sqlite3_column_int(query, 2); + temp.volume = sqlite3_column_int(query, 3); + temp.visible = sqlite3_column_int(query, 4); + temp.available.availability = (am_Availability_e) sqlite3_column_int(query, 5); + temp.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 6); + temp.muteState = (am_MuteState_e) sqlite3_column_int(query, 7); + temp.mainVolume = sqlite3_column_int(query, 8); + temp.sinkID = sqlite3_column_int(query, 9); + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(temp.sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + temp.listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + //read out sound properties + std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SinkSoundProperty" + i2s(temp.sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) + while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) + { + tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); + tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); + temp.listSoundProperties.push_back(tempSoundProperty); + } + + MY_SQLITE_FINALIZE(qSoundProperty) + + //read out notifications + std::string commandNotificationConfiguration = "SELECT type, status, parameter FROM SinkNotificationConfiguration" + i2s(temp.sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandNotificationConfiguration.c_str(), -1, &qNotificationConfiguration, NULL) + while ((eCode = sqlite3_step(qNotificationConfiguration)) == SQLITE_ROW) + { + tempNotificationConfiguration.type = static_cast (sqlite3_column_int(qNotificationConfiguration, 0)); + tempNotificationConfiguration.status = static_cast (sqlite3_column_int(qNotificationConfiguration, 1)); + tempNotificationConfiguration.parameter = static_cast (sqlite3_column_int(qNotificationConfiguration, 2)); + temp.listNotificationConfigurations.push_back(tempNotificationConfiguration); + } + + MY_SQLITE_FINALIZE(qNotificationConfiguration) + + //read out MainSoundProperties if sink is visible + if(temp.visible) + { + std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(temp.sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) + while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) + { + tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); + tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); + temp.listMainSoundProperties.push_back(tempMainSoundProperty); + } + + MY_SQLITE_FINALIZE(qMAinSoundProperty) + + //and mainNotificationConfigurations + std::string commandMainNotificationConfiguration = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(temp.sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandMainNotificationConfiguration.c_str(), -1, &qMainNotificationConfiguration, NULL) + while ((eCode = sqlite3_step(qMainNotificationConfiguration)) == SQLITE_ROW) + { + tempMainNotificationConfiguration.type = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 0)); + tempMainNotificationConfiguration.status = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 1)); + tempMainNotificationConfiguration.parameter = static_cast (sqlite3_column_int(qMainNotificationConfiguration, 2)); + temp.listMainNotificationConfigurations.push_back(tempMainNotificationConfiguration); + } + + MY_SQLITE_FINALIZE(qMainNotificationConfiguration) + } + + listSinks.push_back(temp); + temp.listConnectionFormats.clear(); + temp.listMainSoundProperties.clear(); + temp.listSoundProperties.clear(); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSinks SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSources(std::vector & listSources) const +{ + listSources.clear(); + sqlite3_stmt* query = NULL, *qConnectionFormat = NULL, *qSoundProperty = NULL, *qMAinSoundProperty = NULL, *qNotification(NULL), *qMainNotification(NULL); + int eCode = 0; + am_Source_s temp; + am_ConnectionFormat_e tempConnectionFormat; + am_SoundProperty_s tempSoundProperty; + am_MainSoundProperty_s tempMainSoundProperty; + am_NotificationConfiguration_s tempNotificationConfiguration; + std::string command = "SELECT name, domainID, sourceClassID, sourceState, volume, visible, availability, availabilityReason, interruptState, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.name = std::string((const char*) sqlite3_column_text(query, 0)); + temp.domainID = sqlite3_column_int(query, 1); + temp.sourceClassID = sqlite3_column_int(query, 2); + temp.sourceState = (am_SourceState_e) sqlite3_column_int(query, 3); + temp.volume = sqlite3_column_int(query, 4); + temp.visible = sqlite3_column_int(query, 5); + temp.available.availability = (am_Availability_e) sqlite3_column_int(query, 6); + temp.available.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 7); + temp.interruptState = (am_InterruptState_e) sqlite3_column_int(query, 8); + temp.sourceID = sqlite3_column_int(query, 9); + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(temp.sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + temp.listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + //read out sound properties + std::string commandSoundProperty = "SELECT soundPropertyType, value FROM SourceSoundProperty" + i2s(temp.sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandSoundProperty.c_str(), -1, &qSoundProperty, NULL) + while ((eCode = sqlite3_step(qSoundProperty)) == SQLITE_ROW) + { + tempSoundProperty.type = (am_SoundPropertyType_e) sqlite3_column_int(qSoundProperty, 0); + tempSoundProperty.value = sqlite3_column_int(qSoundProperty, 1); + temp.listSoundProperties.push_back(tempSoundProperty); + } + + MY_SQLITE_FINALIZE(qSoundProperty) + + std::string notificationCommand = "SELECT type, status, parameter FROM SourceNotificationConfiguration" + i2s(temp.sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, notificationCommand.c_str(), -1, &qNotification, NULL) + + while ((eCode = sqlite3_step(qNotification)) == SQLITE_ROW) + { + tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qNotification, 0)); + tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qNotification, 1)); + tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qNotification, 2)); + temp.listNotificationConfigurations.push_back(tempNotificationConfiguration); + } + MY_SQLITE_FINALIZE(qNotification) + + //read out MainSoundProperties if source is visible + if(temp.visible) + { + std::string commandMainSoundProperty = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(temp.sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandMainSoundProperty.c_str(), -1, &qMAinSoundProperty, NULL) + while ((eCode = sqlite3_step(qMAinSoundProperty)) == SQLITE_ROW) + { + tempMainSoundProperty.type = (am_MainSoundPropertyType_e) sqlite3_column_int(qMAinSoundProperty, 0); + tempMainSoundProperty.value = sqlite3_column_int(qMAinSoundProperty, 1); + temp.listMainSoundProperties.push_back(tempMainSoundProperty); + } + + MY_SQLITE_FINALIZE(qMAinSoundProperty) + + std::string mainNotificationCommand = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(temp.sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, mainNotificationCommand.c_str(), -1, &qMainNotification, NULL) + + while ((eCode = sqlite3_step(qMainNotification)) == SQLITE_ROW) + { + tempNotificationConfiguration.type = static_cast(sqlite3_column_int(qMainNotification, 0)); + tempNotificationConfiguration.status = static_cast(sqlite3_column_int(qMainNotification, 1)); + tempNotificationConfiguration.parameter= static_cast(sqlite3_column_int(qMainNotification, 2)); + temp.listMainNotificationConfigurations.push_back(tempNotificationConfiguration); + } + MY_SQLITE_FINALIZE(qMainNotification) + } + + + listSources.push_back(temp); + temp.listConnectionFormats.clear(); + temp.listMainSoundProperties.clear(); + temp.listSoundProperties.clear(); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSources SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSourceClasses(std::vector & listSourceClasses) const +{ + listSourceClasses.clear(); + + sqlite3_stmt* query = NULL, *subQuery = NULL; + int eCode = 0, eCode1; + am_SourceClass_s classTemp; + am_ClassProperty_s propertyTemp; + + std::string command = "SELECT sourceClassID, name FROM " + std::string(SOURCE_CLASS_TABLE); + std::string command2; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + classTemp.sourceClassID = sqlite3_column_int(query, 0); + classTemp.name = std::string((const char*) sqlite3_column_text(query, 1)); + + //read out Properties + command2 = "SELECT classProperty, value FROM SourceClassProperties" + i2s(classTemp.sourceClassID); + MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &subQuery, NULL) + + while ((eCode1 = sqlite3_step(subQuery)) == SQLITE_ROW) + { + propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(subQuery, 0); + propertyTemp.value = sqlite3_column_int(subQuery, 1); + classTemp.listClassProperties.push_back(propertyTemp); + } + + if (eCode1 != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode1); + MY_SQLITE_FINALIZE(query) + MY_SQLITE_FINALIZE(subQuery) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(subQuery) + + listSourceClasses.push_back(classTemp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(subQuery) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListCrossfaders(std::vector & listCrossfaders) const +{ + listCrossfaders.clear(); + sqlite3_stmt* query = NULL; + int eCode = 0; + am_Crossfader_s tempData; + std::string command = "SELECT name, sinkID_A, sinkID_B, sourceID, hotSink,crossfaderID FROM " + std::string(CROSSFADER_TABLE); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + tempData.name = std::string((const char*) sqlite3_column_text(query, 0)); + tempData.sinkID_A = sqlite3_column_int(query, 1); + tempData.sinkID_B = sqlite3_column_int(query, 2); + tempData.sourceID = sqlite3_column_int(query, 3); + tempData.hotSink = static_cast(sqlite3_column_int(query, 4)); + tempData.crossfaderID = sqlite3_column_int(query, 5); + listCrossfaders.push_back(tempData); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListCrossfaders SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListGateways(std::vector & listGateways) const +{ + listGateways.clear(); + sqlite3_stmt* query = NULL, *qSinkConnectionFormat = NULL, *qSourceConnectionFormat = NULL; + int eCode = 0; + am_Gateway_s temp; + am_ConnectionFormat_e tempConnectionFormat; + + std::string command = "SELECT name, sinkID, sourceID, domainSinkID, domainSourceID, controlDomainID, gatewayID FROM " + std::string(GATEWAY_TABLE); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.name = std::string((const char*) sqlite3_column_text(query, 0)); + temp.sinkID = sqlite3_column_int(query, 1); + temp.sourceID = sqlite3_column_int(query, 2); + temp.domainSinkID = sqlite3_column_int(query, 3); + temp.domainSourceID = sqlite3_column_int(query, 4); + temp.controlDomainID = sqlite3_column_int(query, 5); + temp.gatewayID = sqlite3_column_int(query, 6); + + //convertionMatrix: + ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); + iter = mListConnectionFormat.find(temp.gatewayID); + if (iter == mListConnectionFormat.end()) + { + logError("DatabaseHandler::getListGateways database error with convertionFormat"); + + return (E_DATABASE_ERROR); + } + temp.convertionMatrix = iter->second; + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM GatewaySourceFormat" + i2s(temp.gatewayID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSourceConnectionFormat, NULL) + while ((eCode = sqlite3_step(qSourceConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSourceConnectionFormat, 0); + temp.listSourceFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qSourceConnectionFormat) + + //read out sound properties + commandConnectionFormat = "SELECT soundFormat FROM GatewaySinkFormat" + i2s(temp.gatewayID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qSinkConnectionFormat, NULL) + while ((eCode = sqlite3_step(qSinkConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qSinkConnectionFormat, 0); + temp.listSinkFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qSinkConnectionFormat) + + listGateways.push_back(temp); + temp.listSinkFormats.clear(); + temp.listSourceFormats.clear(); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListGateways SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSinkClasses(std::vector & listSinkClasses) const +{ + listSinkClasses.clear(); + + sqlite3_stmt* query = NULL, *subQuery = NULL; + int eCode = 0; + am_SinkClass_s classTemp; + am_ClassProperty_s propertyTemp; + + std::string command = "SELECT sinkClassID, name FROM " + std::string(SINK_CLASS_TABLE); + std::string command2; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + classTemp.sinkClassID = sqlite3_column_int(query, 0); + classTemp.name = std::string((const char*) sqlite3_column_text(query, 1)); + + //read out Properties + command2 = "SELECT classProperty, value FROM SinkClassProperties" + i2s(classTemp.sinkClassID); + MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &subQuery, NULL) + + while ((eCode = sqlite3_step(subQuery)) == SQLITE_ROW) + { + propertyTemp.classProperty = (am_ClassProperty_e) sqlite3_column_int(subQuery, 0); + propertyTemp.value = sqlite3_column_int(subQuery, 1); + classTemp.listClassProperties.push_back(propertyTemp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); + + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(subQuery) + + listSinkClasses.push_back(classTemp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourceClasses SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListVisibleMainConnections(std::vector & listConnections) const +{ + listConnections.clear(); + sqlite3_stmt *query = NULL; + int eCode = 0; + am_MainConnectionType_s temp; + + std::string command = "SELECT mainConnectionID, sourceID, sinkID, connectionState, delay FROM " + std::string(MAINCONNECTION_TABLE); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.mainConnectionID = sqlite3_column_int(query, 0); + temp.sourceID = sqlite3_column_int(query, 1); + temp.sinkID = sqlite3_column_int(query, 2); + temp.connectionState = (am_ConnectionState_e) sqlite3_column_int(query, 3); + temp.delay = sqlite3_column_int(query, 4); + listConnections.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListVisibleMainConnections SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainSinks(std::vector & listMainSinks) const +{ + listMainSinks.clear(); + sqlite3_stmt* query = NULL; + int eCode = 0; + am_SinkType_s temp; + + std::string command = "SELECT name, sinkID, availability, availabilityReason, muteState, mainVolume, sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE visible=1 AND reserved=0"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.name = std::string((const char*) sqlite3_column_text(query, 0)); + temp.sinkID = sqlite3_column_int(query, 1); + temp.availability.availability = (am_Availability_e) sqlite3_column_int(query, 2); + temp.availability.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 3); + temp.muteState = (am_MuteState_e) sqlite3_column_int(query, 4); + temp.volume = sqlite3_column_int(query, 5); + temp.sinkClassID = sqlite3_column_int(query, 6); + listMainSinks.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSinks SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainSources(std::vector & listMainSources) const +{ + listMainSources.clear(); + sqlite3_stmt* query = NULL; + int eCode = 0; + am_SourceType_s temp; + std::string command = "SELECT name, sourceClassID, availability, availabilityReason, sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE visible=1"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.name = std::string((const char*) sqlite3_column_text(query, 0)); + temp.sourceClassID = sqlite3_column_int(query, 1); + temp.availability.availability = (am_Availability_e) sqlite3_column_int(query, 2); + temp.availability.availabilityReason = (am_AvailabilityReason_e) sqlite3_column_int(query, 3); + temp.sourceID = sqlite3_column_int(query, 4); + + listMainSources.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSources SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector & listSoundProperties) const +{ + assert(sinkID!=0); + if (!existSink(sinkID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + listSoundProperties.clear(); + + sqlite3_stmt* query = NULL; + int eCode = 0; + am_MainSoundProperty_s temp; + std::string command = "SELECT soundPropertyType, value FROM SinkMainSoundProperty" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.type = (am_MainSoundPropertyType_e) sqlite3_column_int(query, 0); + temp.value = sqlite3_column_int(query, 1); + listSoundProperties.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListMainSinkSoundProperties SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector & listSourceProperties) const +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + listSourceProperties.clear(); + + sqlite3_stmt* query = NULL; + int eCode = 0; + am_MainSoundProperty_s temp; + std::string command = "SELECT soundPropertyType, value FROM SourceMainSoundProperty" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.type = (am_MainSoundPropertyType_e) sqlite3_column_int(query, 0); + temp.value = sqlite3_column_int(query, 1); + listSourceProperties.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListMainSinkSoundProperties SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListSystemProperties(std::vector & listSystemProperties) const +{ + listSystemProperties.clear(); + + sqlite3_stmt* query = NULL; + int eCode = 0; + am_SystemProperty_s temp; + std::string command = "SELECT type, value FROM " + std::string(SYSTEM_TABLE); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.type = (am_SystemPropertyType_e) sqlite3_column_int(query, 0); + temp.value = sqlite3_column_int(query, 1); + listSystemProperties.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSystemProperties SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e am::CAmDatabaseHandler::getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const +{ + listConnectionFormats.clear(); + sqlite3_stmt *qConnectionFormat = NULL; + int eCode = 0; + am_ConnectionFormat_e tempConnectionFormat; + std::string commandConnectionFormat = "SELECT soundFormat FROM SinkConnectionFormat" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + return (E_OK); +} + +am_Error_e am::CAmDatabaseHandler::getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const +{ + listConnectionFormats.clear(); + sqlite3_stmt* qConnectionFormat = NULL; + int eCode = 0; + am_ConnectionFormat_e tempConnectionFormat; + + //read out the connectionFormats + std::string commandConnectionFormat = "SELECT soundFormat FROM SourceConnectionFormat" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, commandConnectionFormat.c_str(), -1, &qConnectionFormat, NULL) + while ((eCode = sqlite3_step(qConnectionFormat)) == SQLITE_ROW) + { + tempConnectionFormat = (am_ConnectionFormat_e) sqlite3_column_int(qConnectionFormat, 0); + listConnectionFormats.push_back(tempConnectionFormat); + } + + MY_SQLITE_FINALIZE(qConnectionFormat) + + return (E_OK); +} + +am_Error_e am::CAmDatabaseHandler::getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const +{ + ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); + iter = mListConnectionFormat.find(gatewayID); + if (iter == mListConnectionFormat.end()) + { + logError("DatabaseHandler::getListGatewayConnectionFormats database error with convertionFormat"); + + return (E_DATABASE_ERROR); + } + listConnectionFormat = iter->second; + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t & delay) const +{ + assert(mainConnectionID!=0); + delay = -1; + sqlite3_stmt *query = NULL; + int eCode = 0; + + std::string command = "SELECT delay FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + delay = sqlite3_column_int(query, 0); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getTimingInformation SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + if (delay == -1) + return (E_NOT_POSSIBLE); + + return (E_OK); +} + +bool CAmDatabaseHandler::sqQuery(const std::string& query) +{ + sqlite3_stmt* statement; + int eCode = 0; + if ((eCode = sqlite3_exec(mpDatabase, query.c_str(), NULL, &statement, NULL)) != SQLITE_OK) + { + logError("DatabaseHandler::sqQuery SQL Query failed:", query.c_str(), "error code:", eCode); + return (false); + } + return (true); +} + +bool CAmDatabaseHandler::openDatabase() +{ + if (sqlite3_open_v2(mPath.c_str(), &mpDatabase, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX, NULL) == SQLITE_OK) + { + logInfo("DatabaseHandler::openDatabase opened database"); + return (true); + } + logError("DatabaseHandler::openDatabase failed to open database"); + return (false); +} + +am_Error_e CAmDatabaseHandler::changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) +{ + assert(connectionID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT mainConnectionID FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE delay=? AND mainConnectionID=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, delay) + MY_SQLITE_BIND_INT(query, 2, connectionID) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + MY_SQLITE_FINALIZE(query) + return (E_OK); + } + command = "UPDATE " + std::string(MAINCONNECTION_TABLE) + " SET delay=? WHERE mainConnectionID=?;"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, delay) + MY_SQLITE_BIND_INT(query, 2, connectionID) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeDelayMainConnection SQLITE Step error code:", eCode); + + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + if (mpDatabaseObserver) + mpDatabaseObserver->timingInformationChanged(connectionID, delay); + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) +{ + assert(connection.connectionID==0); + assert(connection.sinkID!=0); + assert(connection.sourceID!=0); + //connection format is not checked, because it's project specific + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "INSERT INTO " + std::string(CONNECTION_TABLE) + "(sinkID, sourceID, delay, connectionFormat, reserved) VALUES (?,?,?,?,?)"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, connection.sinkID) + MY_SQLITE_BIND_INT(query, 2, connection.sourceID) + MY_SQLITE_BIND_INT(query, 3, connection.delay) + MY_SQLITE_BIND_INT(query, 4, connection.connectionFormat) + MY_SQLITE_BIND_INT(query, 5, true) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterConnectionDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + connectionID = sqlite3_last_insert_rowid(mpDatabase); + + logInfo("DatabaseHandler::enterConnectionDB entered new connection sourceID=", connection.sourceID, "sinkID=", connection.sinkID, "sourceID=", connection.sourceID, "connectionFormat=", connection.connectionFormat, "assigned ID=", connectionID); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) +{ + assert(sinkClass.sinkClassIDsqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SinkClassProperties" + i2s(sinkClassID) + std::string("(classProperty,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator Iterator = sinkClass.listClassProperties.begin(); + for (; Iterator < sinkClass.listClassProperties.end(); ++Iterator) + { + MY_SQLITE_BIND_INT(query, 1, Iterator->classProperty) + MY_SQLITE_BIND_INT(query, 2, Iterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSinkClassDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::enterSinkClassDB entered new sinkClass"); + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSinkClassesChanged(); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) +{ + assert(sourceClass.sourceClassIDsqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SourceClassProperties" + i2s(sourceClassID) + std::string("(classProperty,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator Iterator = sourceClass.listClassProperties.begin(); + for (; Iterator < sourceClass.listClassProperties.end(); ++Iterator) + { + MY_SQLITE_BIND_INT(query, 1, Iterator->classProperty) + MY_SQLITE_BIND_INT(query, 2, Iterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSourceClassDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::enterSourceClassDB entered new sourceClass"); + + if (mpDatabaseObserver) + mpDatabaseObserver->numberOfSourceClassesChanged(); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::enterSystemProperties(const std::vector & listSystemProperties) +{ + assert(!listSystemProperties.empty()); + sqlite3_stmt* query = NULL; + int eCode = 0; + std::vector::const_iterator listIterator = listSystemProperties.begin(); + std::string command = "DELETE FROM " + std::string(SYSTEM_TABLE); + if (!this->sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO " + std::string(SYSTEM_TABLE) + " (type, value) VALUES (?,?)"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + for (; listIterator < listSystemProperties.end(); ++listIterator) + { + MY_SQLITE_BIND_INT(query, 1, listIterator->type) + MY_SQLITE_BIND_INT(query, 2, listIterator->value) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterSystemProperties SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_RESET(query) + } + + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::enterSystemProperties entered system properties"); + return (E_OK); +} + +/** + * checks for a certain mainConnection + * @param mainConnectionID to be checked for + * @return true if it exists + */ +bool CAmDatabaseHandler::existMainConnection(const am_mainConnectionID_t mainConnectionID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT mainConnectionID FROM " + std::string(MAINCONNECTION_TABLE) + " WHERE mainConnectionID=" + i2s(mainConnectionID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existMainConnection database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks for a certain Source + * @param sourceID to be checked for + * @return true if it exists + */ +bool CAmDatabaseHandler::existSource(const am_sourceID_t sourceID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND sourceID=" + i2s(sourceID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSource database error!:", eCode); + } + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a source name or ID exists + * @param sourceID the sourceID + * @param name the name + * @return true if it exits + */ +bool CAmDatabaseHandler::existSourceNameOrID(const am_sourceID_t sourceID, const std::string & name) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND (name=? OR sourceID=?)"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) + { + logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_bind_int(query, 2, sourceID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSource database error!:", eCode); + } + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a name exits + * @param name the name + * @return true if it exits + */ +bool CAmDatabaseHandler::existSourceName(const std::string & name) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 AND name=?"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) + { + logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSource database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks for a certain Sink + * @param sinkID to be checked for + * @return true if it exists + */ +bool CAmDatabaseHandler::existSink(const am_sinkID_t sinkID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND sinkID=" + i2s(sinkID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSink database error!:", eCode); + } + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a sink with the ID or the name exists + * @param sinkID the ID + * @param name the name + * @return true if it exists. + */ +bool CAmDatabaseHandler::existSinkNameOrID(const am_sinkID_t sinkID, const std::string & name) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND (name=? OR sinkID=?)"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) + { + logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_bind_int(query, 2, sinkID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSink database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a sink with the name exists + * @param name the name + * @return true if it exists + */ +bool CAmDatabaseHandler::existSinkName(const std::string & name) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND name=?"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_text(query, 1, name.c_str(), name.size(), SQLITE_STATIC))) + { + logError("CAmDatabaseHandler::sqlite3_bind_text failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSink database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks for a certain domain + * @param domainID to be checked for + * @return true if it exists + */ +bool CAmDatabaseHandler::existDomain(const am_domainID_t domainID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE reserved=0 AND domainID=" + i2s(domainID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existDomain database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks for certain gateway + * @param gatewayID to be checked for + * @return true if it exists + */ +bool CAmDatabaseHandler::existGateway(const am_gatewayID_t gatewayID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE gatewayID=" + i2s(gatewayID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existGateway database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +am_Error_e CAmDatabaseHandler::getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t & domainID) const +{ + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + std::string command = "SELECT domainID FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); + int eCode = 0; + am_Error_e returnVal = E_DATABASE_ERROR; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + domainID = sqlite3_column_int(query, 0); + returnVal = E_OK; + } + else + { + logError("DatabaseHandler::getDomainOfSource database error!:", eCode); + } + + MY_SQLITE_FINALIZE(query) + return (returnVal); +} + +am_Error_e am::CAmDatabaseHandler::getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t & domainID) const +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + std::string command = "SELECT domainID FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); + int eCode = 0; + am_Error_e returnVal = E_DATABASE_ERROR; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + domainID = sqlite3_column_int(query, 0); + returnVal = E_OK; + } + else + { + logError("DatabaseHandler::getDomainOfSink database error!:", eCode); + } + + MY_SQLITE_FINALIZE(query) + return (returnVal); +} + +/** + * checks for certain SinkClass + * @param sinkClassID + * @return true if it exists + */ +bool CAmDatabaseHandler::existSinkClass(const am_sinkClass_t sinkClassID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sinkClassID FROM " + std::string(SINK_CLASS_TABLE) + " WHERE sinkClassID=" + i2s(sinkClassID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSinkClass database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks for certain sourceClass + * @param sourceClassID + * @return true if it exists + */ +bool CAmDatabaseHandler::existSourceClass(const am_sourceClass_t sourceClassID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE sourceClassID=" + i2s(sourceClassID); + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existSinkClass database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +am_Error_e CAmDatabaseHandler::changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) +{ + assert(connectionID!=0); + + sqlite3_stmt *query = NULL, *queryMainConnectionSubIDs = NULL; + int eCode = 0, eCode1 = 0; + std::string command = "UPDATE " + std::string(CONNECTION_TABLE) + " set delay=? WHERE connectionID=?"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, delay) + MY_SQLITE_BIND_INT(query, 2, connectionID) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeConnectionTimingInformation SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + //now we need to find all mainConnections that use the changed connection and update their timing + + int tempMainConnectionID; + //first get all route tables for all mainconnections + command = "SELECT name FROM sqlite_master WHERE type ='table' and name LIKE 'MainConnectionRoute%'"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + //now check if the connection ID is in this table + std::string tablename = std::string((const char*) sqlite3_column_text(query, 0)); + std::string command2 = "SELECT connectionID FROM " + tablename + " WHERE connectionID=" + i2s(connectionID); + MY_SQLITE_PREPARE_V2(mpDatabase, command2.c_str(), -1, &queryMainConnectionSubIDs, NULL) + if ((eCode1 = sqlite3_step(queryMainConnectionSubIDs)) == SQLITE_ROW) + { + //if the connection ID is in, recalculate the mainconnection delay + std::stringstream(tablename.substr(tablename.find_first_not_of("MainConnectionRoute"))) >> tempMainConnectionID; + changeDelayMainConnection(calculateMainConnectionDelay(tempMainConnectionID), tempMainConnectionID); + } + else if (eCode1 != SQLITE_DONE) + { + logError("DatabaseHandler::changeConnectionTimingInformation SQLITE error code:", eCode1); + + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(queryMainConnectionSubIDs) + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::changeConnectionTimingInformation SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeConnectionFinal(const am_connectionID_t connectionID) +{ + assert(connectionID!=0); + + sqlite3_stmt *query = NULL; + int eCode = 0; + std::string command = "UPDATE " + std::string(CONNECTION_TABLE) + " set reserved=0 WHERE connectionID=?"; + + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, connectionID) + + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeConnectionFinal SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_timeSync_t CAmDatabaseHandler::calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const +{ + assert(mainConnectionID!=0); + sqlite3_stmt* query = NULL; + std::string command = "SELECT sum(Connections.delay),min(Connections.delay) FROM " + std::string(CONNECTION_TABLE) + ",MainConnectionRoute" + i2s(mainConnectionID) + " WHERE MainConnectionRoute" + i2s(mainConnectionID) + ".connectionID = Connections.connectionID"; + int eCode = 0; + am_timeSync_t delay = 0; + am_timeSync_t min = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + delay = sqlite3_column_int(query, 0); + min = sqlite3_column_int(query, 1); + } + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::calculateMainConnectionDelay SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + if ((eCode = sqlite3_finalize(query)) != SQLITE_OK) + { + logError("DatabaseHandler::calculateMainConnectionDelay SQLITE Finalize error code:", eCode); + return (E_DATABASE_ERROR); + } + if (min < 0) + delay = -1; + return (delay); + +} + +/** + * registers the Observer at the Database + * @param iObserver pointer to the observer + */ +void CAmDatabaseHandler::registerObserver(CAmDatabaseObserver *iObserver) +{ + assert(iObserver!=NULL); + mpDatabaseObserver = iObserver; +} + +/** + * gives information about the visibility of a source + * @param sourceID the sourceID + * @return true if source is visible + */ +bool CAmDatabaseHandler::sourceVisible(const am_sourceID_t sourceID) const +{ + assert(sourceID!=0); + sqlite3_stmt* query = NULL; + std::string command = "SELECT visible FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); + int eCode = 0; + bool returnVal = false; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + returnVal = (bool) sqlite3_column_int(query, 0); + } + else if (eCode != SQLITE_DONE) + { + returnVal = false; + logError("DatabaseHandler::sourceVisible database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * gives information about the visibility of a sink + * @param sinkID the sinkID + * @return true if source is visible + */ +bool CAmDatabaseHandler::sinkVisible(const am_sinkID_t sinkID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT visible FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 AND sinkID=" + i2s(sinkID); + int eCode = 0; + bool returnVal = false; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + returnVal = sqlite3_column_int(query, 0); + } + else if (eCode != SQLITE_DONE) + { + returnVal = false; + logError("DatabaseHandler::sinkVisible database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a connection already exists. + * Only takes sink, source and format information for search! + * @param connection the connection to be checked + * @return true if connections exists + */ +bool CAmDatabaseHandler::existConnection(const am_Connection_s & connection) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT connectionID FROM " + std::string(CONNECTION_TABLE) + " WHERE sinkID=? AND sourceID=? AND connectionFormat=? AND reserved=0"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_int(query, 1, connection.sinkID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_bind_int(query, 2, connection.sourceID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_bind_int(query, 3, connection.connectionFormat))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existMainConnection database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a connection with the given ID exists + * @param connectionID + * @return true if connection exits + */ +bool CAmDatabaseHandler::existConnectionID(const am_connectionID_t connectionID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT connectionID FROM " + std::string(CONNECTION_TABLE) + " WHERE connectionID=? AND reserved=0"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_int(query, 1, connectionID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existMainConnection database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +/** + * checks if a CrossFader exists + * @param crossfaderID the ID of the crossfader to be checked + * @return true if exists + */ +bool CAmDatabaseHandler::existcrossFader(const am_crossfaderID_t crossfaderID) const +{ + sqlite3_stmt* query = NULL; + std::string command = "SELECT crossfaderID FROM " + std::string(CROSSFADER_TABLE) + " WHERE crossfaderID=?"; + int eCode = 0; + bool returnVal = true; + MY_SQLITE_PREPARE_V2_BOOL(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_bind_int(query, 1, crossfaderID))) + { + logError("CAmDatabaseHandler::sqlite3_bind_int failed with errorCode:", eCode); + return (false); + } + + if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + returnVal = false; + else if (eCode != SQLITE_ROW) + { + returnVal = false; + logError("DatabaseHandler::existMainConnection database error!:", eCode); + } + + MY_SQLITE_FINALIZE_BOOL(query) + return (returnVal); +} + +am_Error_e CAmDatabaseHandler::getSoureState(const am_sourceID_t sourceID, am_SourceState_e & sourceState) const +{ + assert(sourceID!=0); + sqlite3_stmt* query = NULL; + sourceState = SS_UNKNNOWN; + std::string command = "SELECT sourceState FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); + int eCode = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceState = (am_SourceState_e) sqlite3_column_int(query, 0); + } + else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + { + logError("DatabaseHandler::getSoureState database error!:", eCode); + } + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) +{ + assert(sourceID!=0); + assert(sourceState>=SS_UNKNNOWN && sourceState<=SS_MAX); + sqlite3_stmt* query = NULL; + std::string command = "UPDATE " + std::string(SOURCE_TABLE) + " SET sourceState=? WHERE sourceID=" + i2s(sourceID); + int eCode = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, sourceState) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSourceState SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSinkVolume(const am_sinkID_t sinkID, am_volume_t & volume) const +{ + assert(sinkID!=0); + sqlite3_stmt* query = NULL; + volume = -1; + std::string command = "SELECT volume FROM " + std::string(SINK_TABLE) + " WHERE sinkID=" + i2s(sinkID); + int eCode = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + volume = sqlite3_column_int(query, 0); + } + else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + { + logError("DatabaseHandler::getSinkVolume database error!:", eCode); + } + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSourceVolume(const am_sourceID_t sourceID, am_volume_t & volume) const +{ + assert(sourceID!=0); + sqlite3_stmt* query = NULL; + volume = -1; + std::string command = "SELECT volume FROM " + std::string(SOURCE_TABLE) + " WHERE sourceID=" + i2s(sourceID); + int eCode = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + volume = sqlite3_column_int(query, 0); + } + else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + { + logError("DatabaseHandler::getSourceVolume database error!:", eCode); + } + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t & value) const +{ + assert(sinkID!=0); + if (!existSink(sinkID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existent, but not shown in sequences + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT value FROM SinkSoundProperty" + i2s(sinkID) + " WHERE soundPropertyType=" + i2s(propertyType); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + value = sqlite3_column_int(query, 0); + } + else + { + logError("DatabaseHandler::getDomainState database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t & value) const +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existent, but not shown in sequences + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT value FROM SourceSoundProperty" + i2s(sourceID) + " WHERE soundPropertyType=" + i2s(propertyType); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + value = sqlite3_column_int(query, 0); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getSinkSoundPropertyValue SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const +{ + assert(domainID!=0); + sqlite3_stmt* query = NULL; + state = DS_UNKNOWN; + std::string command = "SELECT domainState FROM " + std::string(DOMAIN_TABLE) + " WHERE domainID=" + i2s(domainID); + int eCode = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + state = (am_DomainState_e) sqlite3_column_int(query, 0); + } + else if ((eCode = sqlite3_step(query)) == SQLITE_DONE) + { + logError("DatabaseHandler::getDomainState database error!:", eCode); + } + MY_SQLITE_FINALIZE(query) + return (E_OK); + +} + +am_Error_e CAmDatabaseHandler::peekDomain(const std::string & name, am_domainID_t & domainID) +{ + domainID=0; + sqlite3_stmt* query = NULL, *queryInsert = NULL; + std::string command = "SELECT domainID FROM " + std::string(DOMAIN_TABLE) + " WHERE name=?"; + int eCode = 0, eCode1 = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + domainID = sqlite3_column_int(query, 0); + } + else if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::peekDomain database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + else + { + command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (name,reserved) VALUES (?,?)"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) + MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(queryInsert, 2, 1) + //reservation flag + if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) + { + logError("DatabaseHandler::peekDomain SQLITE Step error code:", eCode1); + MY_SQLITE_FINALIZE(queryInsert) + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(queryInsert) + + domainID = sqlite3_last_insert_rowid(mpDatabase); + } + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::peekSink(const std::string & name, am_sinkID_t & sinkID) +{ + sqlite3_stmt* query = NULL, *queryInsert = NULL; + std::string command = "SELECT sinkID FROM " + std::string(SINK_TABLE) + " WHERE name=?"; + int eCode = 0, eCode1 = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkID = sqlite3_column_int(query, 0); + } + else if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::peekSink database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + else + { + if (mFirstStaticSink) + { + command = "INSERT INTO " + std::string(SINK_TABLE) + " (name,reserved,sinkID) VALUES (?,?," + i2s(DYNAMIC_ID_BOUNDARY) + ")"; + mFirstStaticSink = false; + } + else + { + command = "INSERT INTO " + std::string(SINK_TABLE) + " (name,reserved) VALUES (?,?)"; + } + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) + MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(queryInsert, 2, 1) + //reservation flag + if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) + { + logError("DatabaseHandler::peekSink SQLITE Step error code:", eCode1); + MY_SQLITE_FINALIZE(queryInsert) + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(queryInsert) + + sinkID = sqlite3_last_insert_rowid(mpDatabase); + } + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::peekSource(const std::string & name, am_sourceID_t & sourceID) +{ + sqlite3_stmt* query = NULL, *queryInsert = NULL; + std::string command = "SELECT sourceID FROM " + std::string(SOURCE_TABLE) + " WHERE name=?"; + int eCode = 0, eCode1 = 0; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceID = sqlite3_column_int(query, 0); + } + else if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::peekSink database error!:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + else + { + if (mFirstStaticSource) + { + command = "INSERT INTO " + std::string(SOURCE_TABLE) + " (name,reserved,sourceID) VALUES (?,?," + i2s(DYNAMIC_ID_BOUNDARY) + ")"; + mFirstStaticSource = false; + } + else + { + command = "INSERT INTO " + std::string(SOURCE_TABLE) + " (name,reserved) VALUES (?,?)"; + } + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &queryInsert, NULL) + MY_SQLITE_BIND_TEXT(queryInsert, 1, name.c_str(), name.size(), SQLITE_STATIC) + MY_SQLITE_BIND_INT(queryInsert, 2, 1) + //reservation flag + if ((eCode1 = sqlite3_step(queryInsert)) != SQLITE_DONE) + { + logError("DatabaseHandler::peekSink SQLITE Step error code:", eCode1); + MY_SQLITE_FINALIZE(queryInsert) + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(queryInsert) + sourceID = sqlite3_last_insert_rowid(mpDatabase); + } + + MY_SQLITE_FINALIZE(query) + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SINK_TABLE) + " SET volume=? WHERE sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, volume) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSinkVolume SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSinkVolume changed volume of sink:", sinkID, "to:", volume); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) +{ + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(SOURCE_TABLE) + " SET volume=? WHERE sourceID=" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, volume) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSourceVolume SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSourceVolume changed volume of source=:", sourceID, "to:", volume); + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sourceID_t sourceID) +{ + assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SourceSoundProperty" + i2s(sourceID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, soundProperty.value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSourceSoundPropertyDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSourceSoundPropertyDB changed SourceSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sinkID_t sinkID) +{ + assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SinkSoundProperty" + i2s(sinkID) + " SET value=? WHERE soundPropertyType=" + i2s(soundProperty.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, soundProperty.value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSinkSoundPropertyDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + assert(sinkID!=0); + + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeSinkSoundPropertyDB changed SinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) +{ + assert(crossfaderID!=0); + assert(hotsink>=HS_UNKNOWN && hotsink>=HS_MAX); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existcrossFader(crossfaderID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE " + std::string(CROSSFADER_TABLE) + " SET hotsink=? WHERE crossfaderID=" + i2s(crossfaderID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, hotsink) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeCrossFaderHotSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + logInfo("DatabaseHandler::changeCrossFaderHotSink changed hotsink of crossfader=", crossfaderID, "to:", hotsink); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) +{ + sqlite3_stmt* query = NULL; + int eCode = 0; + size_t i = 0; + std::string command; + am_domainID_t rootID = tree.returnRootDomainID(); + CAmRoutingTreeItem *parent = tree.returnRootItem(); + + if (onlyfree) + { + command = "SELECT g.domainSourceID,g.gatewayID FROM " + std::string(GATEWAY_TABLE) + " g WHERE domainSinkID=? AND NOT EXISTS (SELECT NULL FROM " + std::string(CONNECTION_TABLE) + " c WHERE c.sinkID = g.sinkID OR c.sourceID = g.sourceID )"; + } + else + { + command = "SELECT domainSourceID,gatewayID FROM " + std::string(GATEWAY_TABLE) + " WHERE domainSinkID=?"; + } + + do + { + if (i != 0) + { + parent = flatTree.at(i - 1); + rootID = parent->returnDomainID(); + } + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, rootID) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + // additional check to avoid cyclic routes + const am_domainID_t domainSourceID = sqlite3_column_int(query, 0); + bool sourceDomainAlreadyHandledAsSink = false; + for (std::vector::const_iterator iFT = flatTree.begin(); iFT != flatTree.end(); ++iFT) + { + if (domainSourceID == (*iFT)->returnParent()->returnDomainID()) sourceDomainAlreadyHandledAsSink = true; + } + + if (!sourceDomainAlreadyHandledAsSink) + { + // logInfo("DatabaseHandler::getRoutingTree ", rootID, ", ", domainSourceID, ", ", sqlite3_column_int(query, 1)); + flatTree.push_back(tree.insertItem(domainSourceID, sqlite3_column_int(query, 1), parent)); + } + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getRoutingTree SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + i++; + } while (flatTree.size() > (i - 1)); + + return (E_OK); +} + +am_Error_e am::CAmDatabaseHandler::peekSinkClassID(const std::string & name, am_sinkClass_t & sinkClassID) +{ + if (name.empty()) + return (E_NON_EXISTENT); + + am_Error_e returnVal = E_NON_EXISTENT; + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT sinkClassID FROM " + std::string(SINK_CLASS_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkClassID = sqlite3_column_int(query, 0); + returnVal = E_OK; + } + else if (eCode != SQLITE_DONE) + { + sinkClassID = 0; + logError("DatabaseHandler::peekSinkClassID SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + returnVal = E_DATABASE_ERROR; + } + + MY_SQLITE_FINALIZE(query) + return (returnVal); +} + +am_Error_e am::CAmDatabaseHandler::peekSourceClassID(const std::string & name, am_sourceClass_t & sourceClassID) +{ + if (name.empty()) + return (E_NON_EXISTENT); + + am_Error_e returnVal = E_NON_EXISTENT; + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command = "SELECT sourceClassID FROM " + std::string(SOURCE_CLASS_TABLE) + " WHERE name=?"; + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_TEXT(query, 1, name.c_str(), name.size(), SQLITE_STATIC) + + if ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceClassID = sqlite3_column_int(query, 0); + returnVal = E_OK; + } + else if (eCode != SQLITE_DONE) + { + sourceClassID = 0; + logError("DatabaseHandler::peekSourceClassID SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + returnVal = E_DATABASE_ERROR; + } + + MY_SQLITE_FINALIZE(query) + return (returnVal); +} + + +am_Error_e CAmDatabaseHandler::changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) +{ + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + am_sourceClass_t sourceClassOut(sourceClassID); + std::vector listMainSoundPropertiesOut(listMainSoundProperties); + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + + //check if sinkClass needs to be changed + if (sourceClassID!=0) + { + command = "UPDATE"+ std::string(SOURCE_TABLE)+ " SET sourceClassID=? WHERE sourceID=" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, sourceClassID) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSource SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query); + } + + else //we need to read out the active one + { + command = "SELECT sourceClassID FROM " + std::string(SOURCE_TABLE) + " WHERE reserved=0 and sourceID=" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sourceClassOut = sqlite3_column_int(query, 0); + } + MY_SQLITE_FINALIZE(query) + } + + //check if soundProperties need to be updated + if (!listSoundProperties.empty()) + { + //first we drop the table + command = "DELETE from SourceSoundProperty" + i2s(sourceID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //then we'll have a new one + //Fill SinkSoundProperties + command = "INSERT INTO SourceSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator SoundPropertyIterator = listSoundProperties.begin(); + for (; SoundPropertyIterator < listSoundProperties.end(); ++SoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSource SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + //check if we have to update the list of connectionformats + if (!listConnectionFormats.empty()) + { + //first clear the table + command = "DELETE from SourceConnectionFormat" + i2s(sourceID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SourceConnectionFormat" + i2s(sourceID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = listConnectionFormats.begin(); + for (; connectionFormatIterator < listConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + //then we need to check if we need to update the listMainSoundProperties + if (!listMainSoundProperties.empty() && sourceVisible(sourceID)) + { + command = "DELETE from SourceMainSoundProperty" + i2s(sourceID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //Fill MainSinkSoundProperties + command = "INSERT INTO SourceMainSoundProperty" + i2s(sourceID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainSoundPropertyIterator = listMainSoundProperties.begin(); + for (; mainSoundPropertyIterator < listMainSoundProperties.end(); ++mainSoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + else //read out the properties + { + getListMainSourceSoundProperties(sourceID,listMainSoundPropertiesOut); + } + + logInfo("DatabaseHandler::changeSource changed changeSink of source:", sourceID); + + if (mpDatabaseObserver != NULL) + { + mpDatabaseObserver->sourceUpdated(sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)); + } + + return (E_OK); + +} + +am_Error_e CAmDatabaseHandler::changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + am_sinkClass_t sinkClassOut(sinkClassID); + std::vector listMainSoundPropertiesOut(listMainSoundProperties); + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + + //check if sinkClass needs to be changed + if (sinkClassID!=0) + { + command = "UPDATE"+ std::string(SINK_TABLE)+ " SET sinkClassID=? WHERE sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, sinkClassID) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query); + } + + else //we need to read out the active one + { + command = "SELECT sinkClassID FROM " + std::string(SINK_TABLE) + " WHERE reserved=0 and sinkID=" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + sinkClassOut = sqlite3_column_int(query, 0); + } + MY_SQLITE_FINALIZE(query) + } + + //check if soundProperties need to be updated + if (!listSoundProperties.empty()) + { + //first we drop the table + command = "DELETE from SinkSoundProperty" + i2s(sinkID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //then we'll have a new one + //Fill SinkSoundProperties + command = "INSERT INTO SinkSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator SoundPropertyIterator = listSoundProperties.begin(); + for (; SoundPropertyIterator < listSoundProperties.end(); ++SoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, SoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, SoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + //check if we have to update the list of connectionformats + if (!listConnectionFormats.empty()) + { + //first clear the table + command = "DELETE from SinkConnectionFormat" + i2s(sinkID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO SinkConnectionFormat" + i2s(sinkID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = listConnectionFormats.begin(); + for (; connectionFormatIterator < listConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + //then we need to check if we need to update the listMainSoundProperties + if (!listMainSoundProperties.empty() && sinkVisible(sinkID)) + { + command = "DELETE from SinkMainSoundProperty" + i2s(sinkID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //Fill MainSinkSoundProperties + command = "INSERT INTO SinkMainSoundProperty" + i2s(sinkID) + std::string("(soundPropertyType,value) VALUES (?,?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator mainSoundPropertyIterator = listMainSoundProperties.begin(); + for (; mainSoundPropertyIterator < listMainSoundProperties.end(); ++mainSoundPropertyIterator) + { + MY_SQLITE_BIND_INT(query, 1, mainSoundPropertyIterator->type) + MY_SQLITE_BIND_INT(query, 2, mainSoundPropertyIterator->value) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeSink SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + else //read out the properties + { + getListMainSinkSoundProperties(sinkID,listMainSoundPropertiesOut); + } + + logInfo("DatabaseHandler::changeSink changed changeSink of sink:", sinkID); + + if (mpDatabaseObserver != NULL) + { + mpDatabaseObserver->sinkUpdated(sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)); + } + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) +{ + assert(sinkID!=0); + if (!existSink(sinkID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + listMainNotificationConfigurations.clear(); + + sqlite3_stmt* query = NULL; + int eCode = 0; + am_NotificationConfiguration_s temp; + std::string command = "SELECT type, status, parameter FROM SinkMainNotificationConfiguration" + i2s(sinkID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.type = static_cast(sqlite3_column_int(query, 0)); + temp.status = static_cast(sqlite3_column_int(query, 1)); + temp.parameter= static_cast(sqlite3_column_int(query, 2)); + listMainNotificationConfigurations.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSinkMainNotificationConfigurations SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); + +} + +am_Error_e CAmDatabaseHandler::getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) +{ + assert(sourceID!=0); + if (!existSource(sourceID)) + return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences + listMainNotificationConfigurations.clear(); + + sqlite3_stmt* query = NULL; + int eCode = 0; + am_NotificationConfiguration_s temp; + std::string command = "SELECT type, status, parameter FROM SourceMainNotificationConfiguration" + i2s(sourceID); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + + while ((eCode = sqlite3_step(query)) == SQLITE_ROW) + { + temp.type = static_cast(sqlite3_column_int(query, 0)); + temp.status = static_cast(sqlite3_column_int(query, 1)); + temp.parameter= static_cast(sqlite3_column_int(query, 2)); + listMainNotificationConfigurations.push_back(temp); + } + + if (eCode != SQLITE_DONE) + { + logError("DatabaseHandler::getListSourceMainNotificationConfigurations SQLITE error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + + MY_SQLITE_FINALIZE(query) + + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SinkMainNotificationConfiguration" + i2s(sinkID) + " SET status=?, parameter=? WHERE type=" + i2s(mainNotificationConfiguration.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, mainNotificationConfiguration.status) + MY_SQLITE_BIND_INT(query, 2, mainNotificationConfiguration.parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSinkNotificationConfigurationDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); + + if (mpDatabaseObserver) + mpDatabaseObserver->sinkMainNotificationConfigurationChanged(sinkID, mainNotificationConfiguration); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) +{ + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SourceMainNotificationConfiguration" + i2s(sourceID) + " SET status=?, parameter=? WHERE type=" + i2s(mainNotificationConfiguration.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, mainNotificationConfiguration.status) + MY_SQLITE_BIND_INT(query, 2, mainNotificationConfiguration.parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeMainSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); + + if (mpDatabaseObserver) + mpDatabaseObserver->sourceMainNotificationConfigurationChanged(sourceID, mainNotificationConfiguration); + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix) +{ + assert(gatewayID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existGateway(gatewayID)) + { + return (E_NON_EXISTENT); + } + + if (!listSourceConnectionFormats.empty()) + { + //clear Database + command = "DELETE from GatewaySourceFormat" + i2s(gatewayID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + //fill ConnectionFormats + command = "INSERT INTO GatewaySourceFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = listSourceConnectionFormats.begin(); + for (; connectionFormatIterator < listSourceConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + if (!listSinkConnectionFormats.empty()) + { + //clear Database + command = "DELETE from GatewaySinkFormat" + i2s(gatewayID); + if (!sqQuery(command)) + return (E_DATABASE_ERROR); + + command = "INSERT INTO GatewaySinkFormat" + i2s(gatewayID) + std::string("(soundFormat) VALUES (?)"); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + std::vector::const_iterator connectionFormatIterator = listSinkConnectionFormats.begin(); + for (; connectionFormatIterator < listSinkConnectionFormats.end(); ++connectionFormatIterator) + { + MY_SQLITE_BIND_INT(query, 1, *connectionFormatIterator) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::enterGatewayDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_RESET(query) + } + MY_SQLITE_FINALIZE(query) + } + + if (!convertionMatrix.empty()) + { + mListConnectionFormat.clear(); + mListConnectionFormat.insert(std::make_pair(gatewayID, convertionMatrix)); + } + + logInfo("DatabaseHandler::changeGatewayDB changed Gateway with ID", gatewayID); + + //todo: check if observer needs to be adopted. + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s notificationConfiguration) +{ + assert(sinkID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSink(sinkID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SinkNotificationConfiguration" + i2s(sinkID) + " SET status=?, parameter=? WHERE type=" + i2s(notificationConfiguration.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, notificationConfiguration.status) + MY_SQLITE_BIND_INT(query, 2, notificationConfiguration.parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSinkNotificationConfigurationDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); + + //todo:: inform obsever here... + return (E_OK); +} + +am_Error_e CAmDatabaseHandler::changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s notificationConfiguration) +{ + assert(sourceID!=0); + + sqlite3_stmt* query = NULL; + int eCode = 0; + std::string command; + + if (!existSource(sourceID)) + { + return (E_NON_EXISTENT); + } + command = "UPDATE SourceNotificationConfiguration" + i2s(sourceID) + " SET status=?, parameter=? WHERE type=" + i2s(notificationConfiguration.type); + MY_SQLITE_PREPARE_V2(mpDatabase, command.c_str(), -1, &query, NULL) + MY_SQLITE_BIND_INT(query, 1, notificationConfiguration.status) + MY_SQLITE_BIND_INT(query, 2, notificationConfiguration.parameter) + if ((eCode = sqlite3_step(query)) != SQLITE_DONE) + { + logError("DatabaseHandler::changeMainSourceNotificationConfigurationDB SQLITE Step error code:", eCode); + MY_SQLITE_FINALIZE(query) + return (E_DATABASE_ERROR); + } + MY_SQLITE_FINALIZE(query) + + logInfo("DatabaseHandler::changeSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); + + //todo:: implement observer function + return (E_OK); +} + +void CAmDatabaseHandler::createTables() +{ + for (uint16_t i = 0; i < sizeof(databaseTables) / sizeof(databaseTables[0]); i++) + { + if (!sqQuery("CREATE TABLE " + databaseTables[i])) + throw std::runtime_error("CAmDatabaseHandler Could not create tables!"); + } +} + +} diff --git a/AudioManagerDaemon/src/CAmMapHandler.cpp b/AudioManagerDaemon/src/CAmMapHandler.cpp deleted file mode 100644 index 66b801e..0000000 --- a/AudioManagerDaemon/src/CAmMapHandler.cpp +++ /dev/null @@ -1,2739 +0,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 Aleksandar Donchev, aleksander.donchev@partner.bmw.de BMW 2013 - * - * \file CAmMapHandler.cpp - * For further information see http://www.genivi.org/. - * - */ - -#include "CAmMapHandler.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "CAmDatabaseObserver.h" -#include "CAmRouter.h" -#include "shared/CAmDltWrapper.h" -#include "CAmLog.h" - - -namespace am -{ - -/* Helper functions */ - -template TMapObjectType const * objectWithKeyIfExistsInMap(const TMapKeyType & key, const AM_MAP & map) -{ - typename AM_MAP::const_iterator iter = map.find(key); - if( iter!=map.end() ) - return (TMapObjectType const *)&iter->second; - return NULL; -} - -template bool existsObjectWithKeyInMap(const TMapKeyType & key, const AM_MAP & map) -{ - return objectWithKeyIfExistsInMap(key, map)!=NULL; -} - -typedef bool (*CAmCompareObjectWithValue)(const void *, const void *, void *); - -template -TMapObjectType const * findFirstObjectMatchingCriteria(const AM_MAP & aMap, - const TSearchObjectType & aComparison, - CAmCompareObjectWithValue comparator, - void *context = NULL) -{ - typename AM_MAP::const_iterator it = aMap.begin(); - TMapObjectType * result = NULL; - for (; it != aMap.end(); ++it) - { - const void * obj1 = (const void *)&it->second; - const void * obj2 = (const void *)&aComparison; - if (comparator(obj1, obj2, context)) - { - result = (TMapObjectType *)&it->second; - break; - } - } - return result; -} - -bool compareSinkObjectByName(const void *anObject, const void *aValue, void *) -{ - return (anObject && aValue)?((const std::string *)aValue)->compare(((const CAmMapHandler::am_Sink_Database_s *)anObject)->name)==0:false; -} - -bool compareSourceObjectByName(const void *anObject, const void *aValue, void *) -{ - return (anObject && aValue)?((const std::string *)aValue)->compare(((const CAmMapHandler::am_Source_Database_s *)anObject)->name)==0:false; -} - -bool compareSinkClassObjectByName(const void *anObject, const void *aValue, void *) -{ - return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_SinkClass_s *)anObject)->name)==0:false; -} - -bool compareSourceClassObjectByName(const void *anObject, const void *aValue, void *) -{ - return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_SourceClass_s *)anObject)->name)==0:false; -} - -bool compareDomainObjectWithValue(const void *anObject, const void *aValue, void *) -{ - return (anObject && aValue)?((const std::string *)aValue)->compare(((const am_Domain_s *)anObject)->name)==0:false; -} - -bool compareSinkObjectByNameAndFlag(const void *anObject, const void *aValue, void *contextOrNull) -{ - if(anObject && aValue) - { - bool flag = (contextOrNull!=NULL)?*((bool*)contextOrNull):true; - return flag==((const CAmMapHandler::am_Sink_Database_s *)anObject)->reserved && - ((const std::string *)aValue)->compare(((const am_Sink_s *)anObject)->name)==0; - } - return false; -} - -bool compareConnectionObjectsWithObject(const void *anObject, const void *aValue, void *) -{ - if(anObject && aValue) - { - return 0==((const CAmMapHandler::am_Connection_Database_s *)anObject)->reserved && - ((const CAmMapHandler::am_Connection_Database_s *)aValue)->sinkID == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->sinkID && - ((const CAmMapHandler::am_Connection_Database_s *)aValue)->sourceID == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->sourceID && - ((const CAmMapHandler::am_Connection_Database_s *)aValue)->connectionFormat == ((const CAmMapHandler::am_Connection_Database_s *)anObject)->connectionFormat; - } - return false; -} - -bool compareSourceObjectsByNameAndFlag(const void *anObject, const void *aValue, void *contextOrNull) -{ - if(anObject && aValue) - { - bool flag = (contextOrNull!=NULL)?*((bool*)contextOrNull):true; - return flag==((const CAmMapHandler::am_Source_Database_s *)anObject)->reserved && - ((const std::string *)aValue)->compare(((const CAmMapHandler::am_Source_Database_s *)anObject)->name)==0; - } - return false; -} - -/* Domain */ - -void CAmMapHandler::CAmDomain::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Domain(" << name.c_str() << ") id(" << domainID << ")" << std::endl << - "bus name(" << busname.c_str() << - ") node name(" << nodename.c_str() << - ") early(" << early << - ") domainID(" << domainID << - ") complete(" << complete << - ") state(" << state << - ") reserved(" << reserved << ")" << std::endl; - outString = fmt.str(); -} - -/* Source */ - -void CAmMapHandler::CAmSource::getSourceType(am_SourceType_s & sourceType) const -{ - sourceType.name = name; - sourceType.sourceClassID = sourceClassID; - sourceType.availability = available; - sourceType.sourceID = sourceID; -} - -void CAmMapHandler::CAmSource::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Source(" << name.c_str() << ") id(" << sourceID << ")" << std::endl << - "sourceClassID(" << sourceClassID << - ") domainID(" << domainID << - ") visible(" << visible << - ") volume(" << volume << - ") interruptState(" << interruptState << - ") sourceState(" << sourceState << - ") reserved(" << reserved << ")" << - ") available([availability:" << available.availability << " availabilityReason:" << available.availabilityReason << "]" - ") listSoundProperties ("; - std::for_each(listSoundProperties.begin(), listSoundProperties.end(), [&](const am_SoundProperty_s & ref) { - fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; - }); - fmt << ") listConnectionFormats ("; - std::for_each(listConnectionFormats.begin(), listConnectionFormats.end(), [&](const am_ConnectionFormat_e & ref) { - fmt << "[" << ref << "]"; - }); - fmt << ") listMainSoundProperties ("; - std::for_each(listMainSoundProperties.begin(), listMainSoundProperties.end(), [&](const am_MainSoundProperty_s & ref) { - fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; - }); - fmt << ") listMainNotificationConfigurations ("; - std::for_each(listMainNotificationConfigurations.begin(), listMainNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { - fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; - }); - fmt << ") listNotificationConfigurations ("; - std::for_each(listNotificationConfigurations.begin(), listNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { - fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; - }); - fmt << ")" << std::endl; - outString = fmt.str(); -} - -/* Sink */ - -void CAmMapHandler::CAmSink::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Sink(" << name.c_str() << ") id(" << sinkID << ")" << std::endl << - "sinkClassID(" << sinkClassID << - ") domainID(" << domainID << - ") visible(" << visible << - ") volume(" << volume << - ") muteState(" << muteState << - ") mainVolume(" << mainVolume << - ") reserved(" << reserved << ")" << - ") available([availability:" << available.availability << " availabilityReason:" << available.availabilityReason << "]" - ") listSoundProperties ("; - std::for_each(listSoundProperties.begin(), listSoundProperties.end(), [&](const am_SoundProperty_s & ref) { - fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; - }); - fmt << ") listConnectionFormats ("; - std::for_each(listConnectionFormats.begin(), listConnectionFormats.end(), [&](const am_ConnectionFormat_e & ref) { - fmt << "[" << ref << "]"; - }); - fmt << ") listMainSoundProperties ("; - std::for_each(listMainSoundProperties.begin(), listMainSoundProperties.end(), [&](const am_MainSoundProperty_s & ref) { - fmt << "[type:" << ref.type << " value:" << ref.value <<"]"; - }); - fmt << ") listMainNotificationConfigurations ("; - std::for_each(listMainNotificationConfigurations.begin(), listMainNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { - fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; - }); - fmt << ") listNotificationConfigurations ("; - std::for_each(listNotificationConfigurations.begin(), listNotificationConfigurations.end(), [&](const am_NotificationConfiguration_s & ref) { - fmt << "[type:" << ref.type << " status:" << ref.status << " parameter:" << ref.parameter <<"]"; - }); - fmt << ")" << std::endl; - outString = fmt.str(); -} - -void CAmMapHandler::CAmSink::getSinkType(am_SinkType_s & sinkType) const -{ - sinkType.name = name; - sinkType.sinkID = sinkID; - sinkType.availability = available; - sinkType.muteState = muteState; - sinkType.volume = mainVolume; - sinkType.sinkClassID = sinkClassID; -} - -/* Connection */ - -void CAmMapHandler::CAmConnection::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Connection id(" << connectionID << ") " << std::endl << - "sourceID(" << sourceID << - ") sinkID(" << sinkID << - ") delay(" << delay << - ") connectionFormat(" << connectionFormat << - ") reserved(" << reserved << ")" << std::endl; - outString = fmt.str(); -} - -/* Main Connection */ - -void CAmMapHandler::CAmMainConnection::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "MainConnection id(" << mainConnectionID << ") " << std::endl << - "connectionState(" << connectionState << - ") sinkID(" << sinkID << - ") sourceID(" << sourceID << - ") delay(" << delay << - ") listConnectionID ("; - std::for_each(listConnectionID.begin(), listConnectionID.end(), [&](const am_connectionID_t & connID) { - fmt << "["<< connID << "]"; - }); - fmt << ")" << std::endl; - outString = fmt.str(); -} - -void CAmMapHandler::am_MainConnection_Database_s::getMainConnectionType(am_MainConnectionType_s & connectionType) const -{ - connectionType.mainConnectionID = mainConnectionID; - connectionType.sourceID = sourceID; - connectionType.sinkID = sinkID; - connectionType.connectionState = connectionState; - connectionType.delay = delay; -} - -/* Source Class */ - -void CAmMapHandler::CAmSourceClass::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Source class(" << name.c_str() << ") id(" << sourceClassID << ")\n" << - ") listClassProperties ("; - std::for_each(listClassProperties.begin(), listClassProperties.end(), [&](const am_ClassProperty_s & ref) { - fmt << "[classProperty:" << ref.classProperty << " value:" << ref.value << "]"; - }); - fmt << ")" << std::endl; - outString = fmt.str(); -} - -/* Sink Class */ - -void CAmMapHandler::CAmSinkClass::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Sink class(" << name.c_str() << ") id(" << sinkClassID << ")\n" << - ") listClassProperties ("; - std::for_each(listClassProperties.begin(), listClassProperties.end(), [&](const am_ClassProperty_s & ref) { - fmt << "[classProperty:" << ref.classProperty << " value:" << ref.value << "]"; - }); - fmt << ")" << std::endl; - outString = fmt.str(); -} - - -/* Gateway */ - -void CAmMapHandler::CAmGateway::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Gateway(" << name.c_str() << ") id(" << gatewayID << ")\n" << - "sinkID(" << sinkID << - ") sourceID(" << sourceID << - ") domainSinkID(" << domainSinkID << - ") domainSourceID(" << domainSourceID << - ") controlDomainID(" << controlDomainID << - ") listSourceFormats ("; - std::for_each(listSourceFormats.begin(), listSourceFormats.end(), [&](const am_ConnectionFormat_e & ref) { - fmt << "[" << ref << "]"; - }); - fmt << ") listSinkFormats ("; - std::for_each(listSinkFormats.begin(), listSinkFormats.end(), [&](const am_ConnectionFormat_e & 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 CAmMapHandler::CAmCrossfader::getDescription (std::string & outString) const -{ - std::ostringstream fmt; - fmt << "Crossfader(" << name.c_str() << ") id(" << crossfaderID << ")\n" << - "sinkID_A(" << sinkID_A << - ") sinkID_B(" << sinkID_B << - ") sourceID(" << sourceID << - ") hotSink(" << hotSink << - ")" << std::endl; - outString = fmt.str(); -} - -template void CAmMapHandler::printMap (const AM_MAP & t, std::ostream & output) const -{ - typename AM_MAP::const_iterator iter = t.begin(); - for(; iter!=t.end(); iter++) - print(iter->second, output); -} - -template void CAmMapHandler::print (const TPrintObject & t, std::ostream & output) const -{ - std::string description(""); - t.getDescription( description ); - output << description; -} - -bool CAmMapHandler::CAmMappedData::increaseID(int16_t * resultID, int16_t * sourceID, - int16_t const desiredStaticID = 0, int16_t const preferedStaticIDBoundary = DYNAMIC_ID_BOUNDARY) -{ - if( desiredStaticID > 0 && desiredStaticID < preferedStaticIDBoundary ) - { - *resultID = desiredStaticID; - return true; - } - else if( *sourceID < mDefaultIDLimit-1 ) //SHRT_MAX or the max limit is reserved and not used!!! - { - *resultID = (*sourceID)++; - return true; - } - else - { - *resultID = -1; - return false; - } - } - -/** - * template to converts T to std::string - * @param x T - * @return string - */ -template -inline std::string i2s(T const& x) -{ - std::ostringstream o; - o << x; - return (o.str()); -} - -CAmMapHandler::CAmMapHandler():CAmDatabaseHandlerInterface(), mMappedData() -{ - logInfo(__PRETTY_FUNCTION__,"Init"); -} - -CAmMapHandler::~CAmMapHandler() -{ - logInfo(__PRETTY_FUNCTION__,"Destroy"); -} - -am_Error_e CAmMapHandler::enterDomainDB(const am_Domain_s & domainData, am_domainID_t & domainID) -{ - assert(domainData.domainID==0); - assert(!domainData.name.empty()); - assert(!domainData.busname.empty()); - assert(domainData.state>=DS_UNKNOWN && domainData.state<=DS_MAX); - - //first check for a reserved domain - CAmCompareObjectWithValue comparator = compareDomainObjectWithValue; - am_Domain_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mDomainMap, domainData.name, comparator); - - int16_t nextID = 0; - if( NULL != reservedDomain ) - { - nextID = reservedDomain->domainID; - domainID = nextID; - mMappedData.mDomainMap[nextID] = domainData; - mMappedData.mDomainMap[nextID].domainID = nextID; - mMappedData.mDomainMap[nextID].reserved = 0; - return (E_OK); - } - else - { - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentDomainID)) - { - 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); - } - else - { - domainID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (E_MAX); - } - } -} - -int16_t CAmMapHandler::calculateDelayForRoute(const std::vector& listConnectionID) -{ - int16_t delay = 0; - std::vector::const_iterator elementIterator = listConnectionID.begin(); - for (; elementIterator < listConnectionID.end(); ++elementIterator) - { - am_connectionID_t key = *elementIterator; - AM_MAP::const_iterator it = mMappedData.mConnectionMap.find(key); - if (it!=mMappedData.mConnectionMap.end()) - { - int16_t temp_delay = it->second.delay; - if (temp_delay != -1 && delay != -1) - delay += temp_delay; - else - delay = -1; - } - } - return delay; -} - -am_Error_e CAmMapHandler::enterMainConnectionDB(const am_MainConnection_s & mainConnectionData, am_mainConnectionID_t & connectionID) -{ - assert(mainConnectionData.mainConnectionID==0); - assert(mainConnectionData.connectionState>=CS_UNKNOWN && mainConnectionData.connectionState<=CS_MAX); - assert(mainConnectionData.sinkID!=0); - assert(mainConnectionData.sourceID!=0); - - int16_t delay = 0; - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentMainConnectionID)) - { - connectionID = nextID; - mMappedData.mMainConnectionMap[nextID] = mainConnectionData; - mMappedData.mMainConnectionMap[nextID].mainConnectionID = nextID; - } - else - { - connectionID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (E_MAX); - } - - //now check the connectionTable for all connections in the route. IF connectionID exist - delay = calculateDelayForRoute(mainConnectionData.listConnectionID); - - 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; - mpDatabaseObserver->newMainConnection(mainConnection); - mpDatabaseObserver->mainConnectionStateChanged(connectionID, mainConnectionData.connectionState); - } - - //finally, we update the delay value for the maintable - if (delay == 0) - delay = -1; - return (changeDelayMainConnection(delay, connectionID)); -} - -/** - * Helper method, that inserts a new struct in the map and copies the given into it. - * This method uses the increaseID function to secure the global id is properly increased. - **/ -bool CAmMapHandler::insertSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) -{ - int16_t nextID = 0; - if( mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkID, sinkData.sinkID) ) - { - sinkID = nextID; - mMappedData.mSinkMap[nextID] = sinkData; - mMappedData.mSinkMap[nextID].sinkID = nextID; - return (true); - } - else - { - sinkID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached!"); - return (false); - } -} - -am_Error_e CAmMapHandler::enterSinkDB(const am_Sink_s & sinkData, am_sinkID_t & sinkID) -{ - assert(sinkData.sinkID=MS_UNKNOWN && sinkData.muteState<=MS_MAX); - - 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 - CAmCompareObjectWithValue comparator = compareSinkObjectByNameAndFlag; - bool checkForFlag = true; - am_Sink_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSinkMap, sinkData.name, comparator, &checkForFlag); - if( NULL!=reservedDomain ) - { - am_sinkID_t oldSinkID = reservedDomain->sinkID; - mMappedData.mSinkMap[oldSinkID] = sinkData; - mMappedData.mSinkMap[oldSinkID].reserved = 0; - temp_SinkID = oldSinkID; - temp_SinkIndex = oldSinkID; - } - else - { - bool result; - if ( sinkData.sinkID != 0 || mFirstStaticSink ) - { - //check if the ID already exists - if (existSinkNameOrID(sinkData.sinkID, sinkData.name)) - return (E_ALREADY_EXISTS); - } - result = insertSinkDB(sinkData, temp_SinkID); - if( false == result ) - return (E_MAX); - temp_SinkIndex = temp_SinkID; - } - //if the first static sink is entered, we need to set it onto the boundary - if (sinkData.sinkID == 0 && mFirstStaticSink) - { - mFirstStaticSink = false; - } - mMappedData.mSinkMap[temp_SinkIndex].sinkID = temp_SinkID; - sinkID = 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:", sinkID); - - if (mpDatabaseObserver != NULL) - mpDatabaseObserver->newSink(sink); - return (E_OK); -} - -bool CAmMapHandler::insertCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) -{ - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentCrossfaderID, crossfaderData.crossfaderID)) - { - crossfaderID = nextID; - mMappedData.mCrossfaderMap[nextID] = crossfaderData; - mMappedData.mCrossfaderMap[nextID].crossfaderID = nextID; - return (true); - } - else - { - crossfaderID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (false); - } -} - -am_Error_e CAmMapHandler::enterCrossfaderDB(const am_Crossfader_s & crossfaderData, am_crossfaderID_t & crossfaderID) -{ - assert(crossfaderData.crossfaderID=HS_UNKNOWN && crossfaderData.hotSink<=HS_MAX); - assert(!crossfaderData.name.empty()); - assert(existSink(crossfaderData.sinkID_A)); - assert(existSink(crossfaderData.sinkID_B)); - assert(existSource(crossfaderData.sourceID)); - - am_crossfaderID_t temp_CrossfaderID = 0; - am_crossfaderID_t temp_CrossfaderIndex = 0; - - bool result; - //if gatewayData is zero and the first Static Sink was already entered, the ID is created - if (crossfaderData.crossfaderID != 0 || mFirstStaticCrossfader) - { - //check if the ID already exists - if (existcrossFader(crossfaderData.crossfaderID)) - return (E_ALREADY_EXISTS); - } - result = insertCrossfaderDB(crossfaderData, temp_CrossfaderID); - if( false == result ) - return (E_MAX); - temp_CrossfaderIndex = temp_CrossfaderID; - - //if the first static sink is entered, we need to set it onto the boundary - if ( 0==crossfaderData.crossfaderID && mFirstStaticCrossfader) - { - mFirstStaticCrossfader = false; - } - - 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); - return (E_OK); -} - -bool CAmMapHandler::insertGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) -{ - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentGatewayID, gatewayData.gatewayID)) - { - gatewayID = nextID; - mMappedData.mGatewayMap[nextID] = gatewayData; - mMappedData.mGatewayMap[nextID].gatewayID = nextID; - return (true); - } - else - { - gatewayID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (false); - } -} - -am_Error_e CAmMapHandler::enterGatewayDB(const am_Gateway_s & gatewayData, am_gatewayID_t & gatewayID) -{ - assert(gatewayData.gatewayIDnewGateway(gateway); - return (E_OK); -} - -void CAmMapHandler::dump( std::ostream & output ) -{ - output << std::endl << "****************** DUMP START ******************" << std::endl; - printMap(mMappedData.mDomainMap, output); - printMap(mMappedData.mSourceMap, output); - printMap(mMappedData.mSinkMap, output); - printMap(mMappedData.mSourceClassesMap, output); - printMap(mMappedData.mSinkClassesMap, output); - printMap(mMappedData.mConnectionMap, output); - printMap(mMappedData.mMainConnectionMap, output); - printMap(mMappedData.mCrossfaderMap, output); - printMap(mMappedData.mGatewayMap, output); - CAmVectorSystemProperties::const_iterator iter = mMappedData.mSystemProperties.begin(); - output << "System properties" << "\n"; - for(; iter!=mMappedData.mSystemProperties.end(); iter++) - output << "[type:" << iter->type << " value:" << iter->value << "]"; - output << std::endl << "****************** DUMP END ******************" << std::endl; -} - -bool CAmMapHandler::insertSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) -{ - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceID, sourceData.sourceID)) - { - sourceID = nextID; - mMappedData.mSourceMap[nextID] = sourceData; - mMappedData.mSourceMap[nextID].sourceID = nextID; - return (true); - } - else - { - sourceID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (false); - } -} - -am_Error_e CAmMapHandler::enterSourceDB(const am_Source_s & sourceData, am_sourceID_t & sourceID) -{ - assert(sourceData.sourceID=SS_UNKNNOWN && sourceData.sourceState<=SS_MAX); - - bool isFirstStatic = sourceData.sourceID == 0 && mFirstStaticSource; - am_sourceID_t temp_SourceID = 0; - am_sourceID_t temp_SourceIndex = 0; - bool checkForFlag = true; - am_Source_Database_s const *reservedSource = findFirstObjectMatchingCriteria(mMappedData.mSourceMap, sourceData.name, compareSourceObjectsByNameAndFlag, &checkForFlag); - if( NULL != reservedSource ) - { - am_sourceID_t oldSourceID = reservedSource->sourceID; - mMappedData.mSourceMap[oldSourceID] = sourceData; - mMappedData.mSourceMap[oldSourceID].reserved = 0; - temp_SourceID = oldSourceID; - temp_SourceIndex = oldSourceID; - } - else - { - bool result; - if ( !isFirstStatic ) - { - //check if the ID already exists - if (existSourceNameOrID(sourceData.sourceID, sourceData.name)) - return (E_ALREADY_EXISTS); - } - result = insertSourceDB(sourceData, temp_SourceID); - if( false == result ) - return (E_MAX); - temp_SourceIndex = temp_SourceID; - } - - if ( isFirstStatic ) - { - //if the first static sink is entered, we need to set it onto the boundary if needed - mFirstStaticSource = false; - } - mMappedData.mSourceMap[temp_SourceIndex].sourceID = temp_SourceID; - sourceID = temp_SourceID; - - 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); - return (E_OK); -} - -am_Error_e CAmMapHandler::enterConnectionDB(const am_Connection_s& connection, am_connectionID_t& connectionID) -{ - assert(connection.connectionID==0); - assert(connection.sinkID!=0); - assert(connection.sourceID!=0); - //connection format is not checked, because it's project specific - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentConnectionID)) - { - connectionID = nextID; - mMappedData.mConnectionMap[nextID] = connection; - mMappedData.mConnectionMap[nextID].connectionID = nextID; - } - else - { - connectionID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (E_MAX); - } - - logInfo("DatabaseHandler::enterConnectionDB entered new connection sourceID=", connection.sourceID, "sinkID=", connection.sinkID, "sourceID=", connection.sourceID, "connectionFormat=", connection.connectionFormat, "assigned ID=", connectionID); - return (E_OK); -} - -bool CAmMapHandler::insertSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) -{ - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkClassesID, sinkClass.sinkClassID)) - { - sinkClassID = nextID; - mMappedData.mSinkClassesMap[nextID] = sinkClass; - mMappedData.mSinkClassesMap[nextID].sinkClassID = nextID; - return (true); - } - else - { - sinkClassID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (false); - } -} - -am_Error_e CAmMapHandler::enterSinkClassDB(const am_SinkClass_s & sinkClass, am_sinkClass_t & sinkClassID) -{ - assert(sinkClass.sinkClassIDnumberOfSinkClassesChanged(); - return (E_OK); -} - -bool CAmMapHandler::insertSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) -{ - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceClassesID, sourceClass.sourceClassID)) - { - sourceClassID = nextID; - mMappedData.mSourceClassesMap[nextID] = sourceClass; - mMappedData.mSourceClassesMap[nextID].sourceClassID = nextID; - return (true); - } - else - { - sourceClassID = 0; - logInfo(__PRETTY_FUNCTION__,"Max limit reached."); - return (false); - } -} - -am_Error_e CAmMapHandler::enterSourceClassDB(am_sourceClass_t & sourceClassID, const am_SourceClass_s & sourceClass) -{ - assert(sourceClass.sourceClassIDnumberOfSourceClassesChanged(); - return (E_OK); -} - -am_Error_e CAmMapHandler::enterSystemProperties(const std::vector & listSystemProperties) -{ - assert(!listSystemProperties.empty()); - - mMappedData.mSystemProperties = listSystemProperties; - - logInfo("DatabaseHandler::enterSystemProperties entered system properties"); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeMainConnectionRouteDB(const am_mainConnectionID_t mainconnectionID, const std::vector& listConnectionID) -{ - assert(mainconnectionID!=0); - if (!existMainConnection(mainconnectionID)) - { - return (E_NON_EXISTENT); - } - - int16_t delay = calculateDelayForRoute(listConnectionID); - - //now we replace the data in the main connection object with the new one - mMappedData.mMainConnectionMap[mainconnectionID].listConnectionID = listConnectionID; - - if (changeDelayMainConnection(delay,mainconnectionID)!=E_OK) - logError("DatabaseHandler::changeMainConnectionRouteDB error while changing mainConnectionDelay to ", delay); - - logInfo("DatabaseHandler::changeMainConnectionRouteDB entered new route:", mainconnectionID); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeMainConnectionStateDB(const am_mainConnectionID_t mainconnectionID, const am_ConnectionState_e connectionState) -{ - assert(mainconnectionID!=0); - assert(connectionState>=CS_UNKNOWN && connectionState<=CS_MAX); - - if (!existMainConnection(mainconnectionID)) - { - return (E_NON_EXISTENT); - } - mMappedData.mMainConnectionMap[mainconnectionID].connectionState = connectionState; - - logInfo("DatabaseHandler::changeMainConnectionStateDB changed mainConnectionState of MainConnection:", mainconnectionID, "to:", connectionState); - if (mpDatabaseObserver) - mpDatabaseObserver->mainConnectionStateChanged(mainconnectionID, connectionState); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSinkMainVolumeDB(const am_mainVolume_t mainVolume, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSinkMap[sinkID].mainVolume = mainVolume; - - logInfo("DatabaseHandler::changeSinkMainVolumeDB changed mainVolume of sink:", sinkID, "to:", mainVolume); - - if (mpDatabaseObserver) - mpDatabaseObserver->volumeChanged(sinkID, mainVolume); - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSinkAvailabilityDB(const am_Availability_s & availability, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); - assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSinkMap[sinkID].available = availability; - - logInfo("DatabaseHandler::changeSinkAvailabilityDB changed sinkAvailability of sink:", sinkID, "to:", availability.availability, "Reason:", availability.availabilityReason); - - if (mpDatabaseObserver && sourceVisible(sinkID)) - mpDatabaseObserver->sinkAvailabilityChanged(sinkID, availability); - return (E_OK); -} - -am_Error_e CAmMapHandler::changDomainStateDB(const am_DomainState_e domainState, const am_domainID_t domainID) -{ - assert(domainID!=0); - assert(domainState>=DS_UNKNOWN && domainState<=DS_MAX); - - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mDomainMap[domainID].state = domainState; - - logInfo("DatabaseHandler::changDomainStateDB changed domainState of domain:", domainID, "to:", domainState); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSinkMuteStateDB(const am_MuteState_e muteState, const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - assert(muteState>=MS_UNKNOWN && muteState<=MS_MAX); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSinkMap[sinkID].muteState = muteState; - - logInfo("DatabaseHandler::changeSinkMuteStateDB changed sinkMuteState of sink:", sinkID, "to:", muteState); - - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMuteStateChanged(sinkID, muteState); - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeMainSinkSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sinkID_t sinkID) -{ - assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - std::vector::iterator elementIterator = mMappedData.mSinkMap[sinkID].listMainSoundProperties.begin(); - for (;elementIterator != mMappedData.mSinkMap[sinkID].listMainSoundProperties.end(); ++elementIterator) - { - if (elementIterator->type == soundProperty.type) - elementIterator->value = soundProperty.value; - } - - logInfo("DatabaseHandler::changeMainSinkSoundPropertyDB changed MainSinkSoundProperty of sink:", sinkID, "type:", soundProperty.type, "to:", soundProperty.value); - if (mpDatabaseObserver) - mpDatabaseObserver->mainSinkSoundPropertyChanged(sinkID, soundProperty); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeMainSourceSoundPropertyDB(const am_MainSoundProperty_s & soundProperty, const am_sourceID_t sourceID) -{ - assert(soundProperty.type>=MSP_UNKNOWN && soundProperty.type<=MSP_MAX); - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - std::vector::iterator elementIterator = mMappedData.mSourceMap[sourceID].listMainSoundProperties.begin(); - for (;elementIterator != mMappedData.mSourceMap[sourceID].listMainSoundProperties.end(); ++elementIterator) - { - if (elementIterator->type == soundProperty.type) - elementIterator->value = soundProperty.value; - } - - logInfo("DatabaseHandler::changeMainSourceSoundPropertyDB changed MainSinkSoundProperty of source:", sourceID, "type:", soundProperty.type, "to:", soundProperty.value); - - if (mpDatabaseObserver) - mpDatabaseObserver->mainSourceSoundPropertyChanged(sourceID, soundProperty); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSourceAvailabilityDB(const am_Availability_s & availability, const am_sourceID_t sourceID) -{ - assert(sourceID!=0); - assert(availability.availability>=A_UNKNOWN && availability.availability<=A_MAX); - assert(availability.availabilityReason>=AR_UNKNOWN && availability.availabilityReason<=AR_MAX); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSourceMap[sourceID].available = availability; - - logInfo("DatabaseHandler::changeSourceAvailabilityDB changed changeSourceAvailabilityDB of source:", sourceID, "to:", availability.availability, "Reason:", availability.availabilityReason); - - if (mpDatabaseObserver && sourceVisible(sourceID)) - mpDatabaseObserver->sourceAvailabilityChanged(sourceID, availability); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSystemPropertyDB(const am_SystemProperty_s & property) -{ - assert(property.type>=SYP_UNKNOWN && property.type<=SYP_MAX); - - std::vector::iterator elementIterator = mMappedData.mSystemProperties.begin(); - for (;elementIterator != mMappedData.mSystemProperties.end(); ++elementIterator) - { - if (elementIterator->type == property.type) - elementIterator->value = property.value; - } - - logInfo("DatabaseHandler::changeSystemPropertyDB changed system property"); - - if (mpDatabaseObserver) - mpDatabaseObserver->systemPropertyChanged(property); - - return (E_OK); -} - -am_Error_e CAmMapHandler::removeMainConnectionDB(const am_mainConnectionID_t mainConnectionID) -{ - assert(mainConnectionID!=0); - - if (!existMainConnection(mainConnectionID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mMainConnectionMap.erase(mainConnectionID); - - logInfo("DatabaseHandler::removeMainConnectionDB removed:", mainConnectionID); - if (mpDatabaseObserver) - { - mpDatabaseObserver->mainConnectionStateChanged(mainConnectionID, CS_DISCONNECTED); - mpDatabaseObserver->removedMainConnection(mainConnectionID); - } - return (E_OK); -} - -am_Error_e CAmMapHandler::removeSinkDB(const am_sinkID_t sinkID) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - bool visible = sinkVisible(sinkID); - - mMappedData.mSinkMap.erase(sinkID); - // todo: Check the tables SinkMainSoundProperty and SinkMainNotificationConfiguration with 'visible' set to true - //if visible is true then delete SinkMainSoundProperty and SinkMainNotificationConfiguration ???? - logInfo("DatabaseHandler::removeSinkDB removed:", sinkID); - - if (mpDatabaseObserver != NULL) - mpDatabaseObserver->removedSink(sinkID, visible); - - return (E_OK); -} - -am_Error_e CAmMapHandler::removeSourceDB(const am_sourceID_t sourceID) -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - bool visible = sourceVisible(sourceID); - - mMappedData.mSourceMap.erase(sourceID); - - // todo: Check the tables SourceMainSoundProperty and SourceMainNotificationConfiguration with 'visible' set to true - //if visible is true then delete SourceMainSoundProperty and SourceMainNotificationConfiguration ???? - - logInfo("DatabaseHandler::removeSourceDB removed:", sourceID); - if (mpDatabaseObserver) - mpDatabaseObserver->removedSource(sourceID, visible); - return (E_OK); -} - -am_Error_e CAmMapHandler::removeGatewayDB(const am_gatewayID_t gatewayID) -{ - assert(gatewayID!=0); - - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mGatewayMap.erase(gatewayID); - - logInfo("DatabaseHandler::removeGatewayDB removed:", gatewayID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeGateway(gatewayID); - return (E_OK); -} - -am_Error_e CAmMapHandler::removeCrossfaderDB(const am_crossfaderID_t crossfaderID) -{ - assert(crossfaderID!=0); - - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - mMappedData.mCrossfaderMap.erase(crossfaderID); - - logInfo("DatabaseHandler::removeCrossfaderDB removed:", crossfaderID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeCrossfader(crossfaderID); - return (E_OK); -} - -am_Error_e CAmMapHandler::removeDomainDB(const am_domainID_t domainID) -{ - assert(domainID!=0); - - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - mMappedData.mDomainMap.erase(domainID); - - logInfo("DatabaseHandler::removeDomainDB removed:", domainID); - if (mpDatabaseObserver) - mpDatabaseObserver->removeDomain(domainID); - return (E_OK); -} - -am_Error_e CAmMapHandler::removeSinkClassDB(const am_sinkClass_t sinkClassID) -{ - assert(sinkClassID!=0); - - if (!existSinkClass(sinkClassID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSinkClassesMap.erase(sinkClassID); - - logInfo("DatabaseHandler::removeSinkClassDB removed:", sinkClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSinkClassesChanged(); - - return (E_OK); -} - -am_Error_e CAmMapHandler::removeSourceClassDB(const am_sourceClass_t sourceClassID) -{ - assert(sourceClassID!=0); - - if (!existSourceClass(sourceClassID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSourceClassesMap.erase(sourceClassID); - logInfo("DatabaseHandler::removeSourceClassDB removed:", sourceClassID); - if (mpDatabaseObserver) - mpDatabaseObserver->numberOfSourceClassesChanged(); - return (E_OK); -} - -am_Error_e CAmMapHandler::removeConnection(const am_connectionID_t connectionID) -{ - assert(connectionID!=0); - - mMappedData.mConnectionMap.erase(connectionID); - - logInfo("DatabaseHandler::removeConnection removed:", connectionID); - return (E_OK); -} - -am_Error_e CAmMapHandler::getSourceClassInfoDB(const am_sourceID_t sourceID, am_SourceClass_s & classInfo) const -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - am_Source_Database_s source = mMappedData.mSourceMap.at(sourceID); - classInfo.sourceClassID = source.sourceClassID; - - if (!existSourceClass(classInfo.sourceClassID)) - { - return (E_NON_EXISTENT); - } - am_SourceClass_s tmpClass = mMappedData.mSourceClassesMap.at(classInfo.sourceClassID); - classInfo = tmpClass; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getSinkInfoDB(const am_sinkID_t sinkID, am_Sink_s & sinkData) const -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - return (E_NON_EXISTENT); - - am_Sink_Database_s mappedSink = mMappedData.mSinkMap.at(sinkID); - if( true == mappedSink.reserved ) - return (E_NON_EXISTENT); - sinkData = mappedSink; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getSourceInfoDB(const am_sourceID_t sourceID, am_Source_s & sourceData) const -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - return (E_NON_EXISTENT); - - am_Source_Database_s mappedSource = mMappedData.mSourceMap.at(sourceID); - if( true == mappedSource.reserved ) - return (E_NON_EXISTENT); - - sourceData = mappedSource; - - return (E_OK); -} - -am_Error_e am::CAmMapHandler::getMainConnectionInfoDB(const am_mainConnectionID_t mainConnectionID, am_MainConnection_s & mainConnectionData) const -{ - assert(mainConnectionID!=0); - if (!existMainConnection(mainConnectionID)) - { - return (E_NON_EXISTENT); - } - am_MainConnection_s temp = mMappedData.mMainConnectionMap.at(mainConnectionID); - mainConnectionData = temp; - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSinkClassInfoDB(const am_SinkClass_s& sinkClass) -{ - assert(sinkClass.sinkClassID!=0); - assert(!sinkClass.listClassProperties.empty()); - - //check if the ID already exists - if (!existSinkClass(sinkClass.sinkClassID)) - return (E_NON_EXISTENT); - - mMappedData.mSinkClassesMap[sinkClass.sinkClassID].listClassProperties = sinkClass.listClassProperties; - - logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSourceClassInfoDB(const am_SourceClass_s& sourceClass) -{ - assert(sourceClass.sourceClassID!=0); - assert(!sourceClass.listClassProperties.empty()); - - //check if the ID already exists - if (!existSourceClass(sourceClass.sourceClassID)) - return (E_NON_EXISTENT); - - mMappedData.mSourceClassesMap[sourceClass.sourceClassID].listClassProperties = sourceClass.listClassProperties; - - logInfo("DatabaseHandler::setSinkClassInfoDB set setSinkClassInfo"); - return (E_OK); -} - -am_Error_e CAmMapHandler::getSinkClassInfoDB(const am_sinkID_t sinkID, am_SinkClass_s & sinkClass) const -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - am_Sink_Database_s sink = mMappedData.mSinkMap.at(sinkID); - sinkClass.sinkClassID = sink.sinkClassID; - - if (!existSinkClass(sinkClass.sinkClassID)) - { - return (E_NON_EXISTENT); - } - am_SinkClass_s tmpSinkClass = mMappedData.mSinkClassesMap.at(sinkClass.sinkClassID); - sinkClass = tmpSinkClass; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getGatewayInfoDB(const am_gatewayID_t gatewayID, am_Gateway_s & gatewayData) const -{ - assert(gatewayID!=0); - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - - gatewayData = mMappedData.mGatewayMap.at(gatewayID); - - return (E_OK); - -} - -am_Error_e CAmMapHandler::getCrossfaderInfoDB(const am_crossfaderID_t crossfaderID, am_Crossfader_s & crossfaderData) const -{ - assert(crossfaderID!=0); - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - - crossfaderData = mMappedData.mCrossfaderMap.at(crossfaderID); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSinksOfDomain(const am_domainID_t domainID, std::vector & listSinkID) const -{ - assert(domainID!=0); - listSinkID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - - AM_MAP::const_iterator elementIterator = mMappedData.mSinkMap.begin(); - for (;elementIterator != mMappedData.mSinkMap.end(); ++elementIterator) - { - if (0==elementIterator->second.reserved && domainID==elementIterator->second.domainID) - listSinkID.push_back(elementIterator->second.sinkID); - } - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSourcesOfDomain(const am_domainID_t domainID, std::vector & listSourceID) const -{ - assert(domainID!=0); - listSourceID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - CAmMapSource::const_iterator elementIterator = mMappedData.mSourceMap.begin(); - for (;elementIterator != mMappedData.mSourceMap.end(); ++elementIterator) - { - if (0==elementIterator->second.reserved && domainID==elementIterator->second.domainID) - listSourceID.push_back(elementIterator->second.sourceID); - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListCrossfadersOfDomain(const am_domainID_t domainID, std::vector & listCrossfader) const -{ - assert(domainID!=0); - listCrossfader.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - - CAmMapSource::const_iterator sourceIterator = mMappedData.mSourceMap.begin(); - for (;sourceIterator != mMappedData.mSourceMap.end(); ++sourceIterator) - { - if (domainID==sourceIterator->second.domainID) - { - CAmMapCrossfader::const_iterator elementIterator = mMappedData.mCrossfaderMap.begin(); - for (;elementIterator != mMappedData.mCrossfaderMap.end(); ++elementIterator) - { - if ( sourceIterator->second.sourceID==elementIterator->second.sourceID ) - listCrossfader.push_back(elementIterator->second.crossfaderID); - } - } - } - - return (E_OK); - -} - -am_Error_e CAmMapHandler::getListGatewaysOfDomain(const am_domainID_t domainID, std::vector & listGatewaysID) const -{ - assert(domainID!=0); - listGatewaysID.clear(); - if (!existDomain(domainID)) - { - return (E_NON_EXISTENT); - } - - CAmMapGateway::const_iterator elementIterator = mMappedData.mGatewayMap.begin(); - for (;elementIterator != mMappedData.mGatewayMap.end(); ++elementIterator) - { - if (domainID==elementIterator->second.controlDomainID) - listGatewaysID.push_back(elementIterator->second.gatewayID); - } - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainConnections(std::vector & listMainConnections) const -{ - listMainConnections.clear(); - - CAmMapMainConnection::const_iterator elementIterator = mMappedData.mMainConnectionMap.begin(); - for (;elementIterator != mMappedData.mMainConnectionMap.end(); ++elementIterator) - { - listMainConnections.push_back(elementIterator->second); - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListDomains(std::vector & listDomains) const -{ - listDomains.clear(); - - CAmMapDomain::const_iterator elementIterator = mMappedData.mDomainMap.begin(); - for (;elementIterator != mMappedData.mDomainMap.end(); ++elementIterator) - { - if( 0==elementIterator->second.reserved ) - listDomains.push_back(elementIterator->second); - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListConnections(std::vector & listConnections) const -{ - listConnections.clear(); - - CAmMapConnection::const_iterator elementIterator = mMappedData.mConnectionMap.begin(); - for (;elementIterator != mMappedData.mConnectionMap.end(); ++elementIterator) - { - if( 0==elementIterator->second.reserved ) - listConnections.push_back(elementIterator->second); - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSinks(std::vector & listSinks) const -{ - listSinks.clear(); - - std::for_each(mMappedData.mSinkMap.begin(), mMappedData.mSinkMap.end(), [&](const std::pair& ref) { - if( 0==ref.second.reserved ) - listSinks.push_back(ref.second); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSources(std::vector & listSources) const -{ - listSources.clear(); - - std::for_each(mMappedData.mSourceMap.begin(), mMappedData.mSourceMap.end(), [&](const std::pair& ref) { - if( 0==ref.second.reserved ) - { - listSources.push_back(ref.second); - } - }); - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSourceClasses(std::vector & listSourceClasses) const -{ - listSourceClasses.clear(); - - std::for_each(mMappedData.mSourceClassesMap.begin(), mMappedData.mSourceClassesMap.end(), [&](const std::pair& ref) { - listSourceClasses.push_back(ref.second); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListCrossfaders(std::vector & listCrossfaders) const -{ - listCrossfaders.clear(); - - std::for_each(mMappedData.mCrossfaderMap.begin(), mMappedData.mCrossfaderMap.end(), [&](const std::pair& ref) { - listCrossfaders.push_back(ref.second); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListGateways(std::vector & listGateways) const -{ - listGateways.clear(); - - std::for_each(mMappedData.mGatewayMap.begin(), mMappedData.mGatewayMap.end(), [&](const std::pair& ref) { - listGateways.push_back(ref.second); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSinkClasses(std::vector & listSinkClasses) const -{ - listSinkClasses.clear(); - - std::for_each(mMappedData.mSinkClassesMap.begin(), mMappedData.mSinkClassesMap.end(), [&](const std::pair& ref) { - listSinkClasses.push_back(ref.second); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListVisibleMainConnections(std::vector & listConnections) const -{ - listConnections.clear(); - am_MainConnectionType_s temp; - std::for_each(mMappedData.mMainConnectionMap.begin(), mMappedData.mMainConnectionMap.end(), [&](const std::pair& ref) { - ref.second.getMainConnectionType(temp); - listConnections.push_back(temp); - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSinks(std::vector & listMainSinks) const -{ - listMainSinks.clear(); - am_SinkType_s sinkType; - std::for_each(mMappedData.mSinkMap.begin(), mMappedData.mSinkMap.end(), [&](const std::pair& ref) { - if( 0==ref.second.reserved && 1==ref.second.visible ) - { - ref.second.getSinkType(sinkType); - listMainSinks.push_back(sinkType); - } - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSources(std::vector & listMainSources) const -{ - listMainSources.clear(); - am_SourceType_s temp; - std::for_each(mMappedData.mSourceMap.begin(), mMappedData.mSourceMap.end(), [&](const std::pair& ref) { - if( 1==ref.second.visible ) - { - ref.second.getSourceType(temp); - listMainSources.push_back(temp); - } - }); - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSinkSoundProperties(const am_sinkID_t sinkID, std::vector & listSoundProperties) const -{ - assert(sinkID!=0); - if (!existSink(sinkID)) - return E_NON_EXISTENT; - - am_Sink_s sink = mMappedData.mSinkMap.at(sinkID); - listSoundProperties = sink.listMainSoundProperties; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSourceSoundProperties(const am_sourceID_t sourceID, std::vector & listSourceProperties) const -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return E_NON_EXISTENT; - - am_Source_s source = mMappedData.mSourceMap.at(sourceID); - listSourceProperties = source.listMainSoundProperties; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListSystemProperties(std::vector & listSystemProperties) const -{ - listSystemProperties = mMappedData.mSystemProperties; - return (E_OK); -} - -am_Error_e am::CAmMapHandler::getListSinkConnectionFormats(const am_sinkID_t sinkID, std::vector & listConnectionFormats) const -{ - if (!existSink(sinkID)) - return E_NON_EXISTENT; - am_Sink_s sink = mMappedData.mSinkMap.at(sinkID); - listConnectionFormats = sink.listConnectionFormats; - - return (E_OK); -} - -am_Error_e am::CAmMapHandler::getListSourceConnectionFormats(const am_sourceID_t sourceID, std::vector & listConnectionFormats) const -{ - if (!existSource(sourceID)) - return E_NON_EXISTENT; - am_Source_s source = mMappedData.mSourceMap.at(sourceID); - listConnectionFormats = source.listConnectionFormats; - - return (E_OK); -} - -am_Error_e am::CAmMapHandler::getListGatewayConnectionFormats(const am_gatewayID_t gatewayID, std::vector & listConnectionFormat) const -{ - ListConnectionFormat::const_iterator iter = mListConnectionFormat.begin(); - iter = mListConnectionFormat.find(gatewayID); - if (iter == mListConnectionFormat.end()) - { - logError("DatabaseHandler::getListGatewayConnectionFormats database error with convertionFormat"); - - return E_NON_EXISTENT; - } - listConnectionFormat = iter->second; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getTimingInformation(const am_mainConnectionID_t mainConnectionID, am_timeSync_t & delay) const -{ - assert(mainConnectionID!=0); - if (!existMainConnection(mainConnectionID)) - return E_NON_EXISTENT; - delay = -1; - - am_MainConnection_s mainConnection = mMappedData.mMainConnectionMap.at(mainConnectionID); - delay = mainConnection.delay; - - if (delay == -1) - return (E_NOT_POSSIBLE); - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeDelayMainConnection(const am_timeSync_t & delay, const am_mainConnectionID_t & connectionID) -{ - assert(connectionID!=0); - if (!existMainConnection(connectionID)) - return (E_NON_EXISTENT); - mMappedData.mMainConnectionMap[connectionID].delay = delay; - - return (E_OK); -} - -/** - * checks for a certain mainConnection - * @param mainConnectionID to be checked for - * @return true if it exists - */ -bool CAmMapHandler::existMainConnection(const am_mainConnectionID_t mainConnectionID) const -{ - return existsObjectWithKeyInMap(mainConnectionID, mMappedData.mMainConnectionMap); -} - -/** - * checks for a certain Source - * @param sourceID to be checked for - * @return true if it exists - */ -bool CAmMapHandler::existSource(const am_sourceID_t sourceID) const -{ - am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); - if( NULL!=source ) - return (0==source->reserved); - - return false; -} - -/** - * checks if a source name or ID exists - * @param sourceID the sourceID - * @param name the name - * @return true if it exits - */ -bool CAmMapHandler::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); -} - -/** - * checks if a name exits - * @param name the name - * @return true if it exits - */ -bool CAmMapHandler::existSourceName(const std::string & name) const -{ - return existSourceNameOrID(SHRT_MAX, name); -} - -/** - * checks for a certain Sink - * @param sinkID to be checked for - * @return true if it exists - */ -bool CAmMapHandler::existSink(const am_sinkID_t sinkID) 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) - { - returnVal = true; - break; - } - } - return (returnVal); -} - -/** - * checks if a sink with the ID or the name exists - * @param sinkID the ID - * @param name the name - * @return true if it exists. - */ -bool CAmMapHandler::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); -} - -/** - * checks if a sink with the name exists - * @param name the name - * @return true if it exists - */ -bool CAmMapHandler::existSinkName(const std::string & name) const -{ - return existSinkNameOrID(SHRT_MAX, name); -} - -/** - * checks for a certain domain - * @param domainID to be checked for - * @return true if it exists - */ -bool CAmMapHandler::existDomain(const am_domainID_t domainID) const -{ - am_Domain_Database_s const * source = objectWithKeyIfExistsInMap(domainID, mMappedData.mDomainMap); - if( NULL!=source ) - return (0==source->reserved); - - return false; -} - -/** - * checks for certain gateway - * @param gatewayID to be checked for - * @return true if it exists - */ -bool CAmMapHandler::existGateway(const am_gatewayID_t gatewayID) const -{ - return existsObjectWithKeyInMap(gatewayID, mMappedData.mGatewayMap); -} - -am_Error_e CAmMapHandler::getDomainOfSource(const am_sourceID_t sourceID, am_domainID_t & domainID) const -{ - assert(sourceID!=0); - - am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); - if( NULL!=source ) - { - domainID = source->domainID; - return E_OK; - } - return E_NON_EXISTENT; -} - -am_Error_e am::CAmMapHandler::getDomainOfSink(const am_sinkID_t sinkID, am_domainID_t & domainID) const -{ - assert(sinkID!=0); - - am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); - if( NULL!=source ) - { - domainID = source->domainID; - return E_OK; - } - return E_NON_EXISTENT; -} - -/** - * checks for certain SinkClass - * @param sinkClassID - * @return true if it exists - */ -bool CAmMapHandler::existSinkClass(const am_sinkClass_t sinkClassID) const -{ - return existsObjectWithKeyInMap(sinkClassID, mMappedData.mSinkClassesMap); -} - -/** - * checks for certain sourceClass - * @param sourceClassID - * @return true if it exists - */ -bool CAmMapHandler::existSourceClass(const am_sourceClass_t sourceClassID) const -{ - return existsObjectWithKeyInMap(sourceClassID, mMappedData.mSourceClassesMap); -} - -am_Error_e CAmMapHandler::changeConnectionTimingInformation(const am_connectionID_t connectionID, const am_timeSync_t delay) -{ - assert(connectionID!=0); - if(!existConnectionID(connectionID)) - return E_NON_EXISTENT; - - mMappedData.mConnectionMap[connectionID].delay = delay; - - //now we need to find all mainConnections that use the changed connection and update their timing - - //first get all route tables for all mainconnections - - CAmMapMainConnection::const_iterator iter = mMappedData.mMainConnectionMap.begin(); - for(; iter != mMappedData.mMainConnectionMap.end(); ++iter) - { - am_MainConnection_s mainConnection = iter->second; - if (std::find(mainConnection.listConnectionID.begin(), mainConnection.listConnectionID.end(), connectionID) != mainConnection.listConnectionID.end()) - { - // Got it. - changeDelayMainConnection(calculateMainConnectionDelay(mainConnection.mainConnectionID), mainConnection.mainConnectionID); - } - - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeConnectionFinal(const am_connectionID_t connectionID) -{ - assert(connectionID!=0); - am_Connection_Database_s const * connection = objectWithKeyIfExistsInMap(connectionID, mMappedData.mConnectionMap); - if( NULL!=connection ) - { - mMappedData.mConnectionMap.at(connectionID).reserved = false; - return E_OK; - } - return (E_NON_EXISTENT); -} - -am_timeSync_t CAmMapHandler::calculateMainConnectionDelay(const am_mainConnectionID_t mainConnectionID) const -{ - assert(mainConnectionID!=0); - if (!existMainConnection(mainConnectionID)) - return -1; - am_MainConnection_s mainConnection = mMappedData.mMainConnectionMap.at(mainConnectionID); - am_timeSync_t delay = 0; - am_timeSync_t min = SHRT_MAX; - std::vector::const_iterator iter = mainConnection.listConnectionID.begin(); - for(;iterdelay; - min = std::min(min,source->delay); - } - } - if (min < 0) - delay = -1; - return (delay); - -} - -/** - * registers the Observer at the Database - * @param iObserver pointer to the observer - */ -void CAmMapHandler::registerObserver(CAmDatabaseObserver *iObserver) -{ - assert(iObserver!=NULL); - mpDatabaseObserver = iObserver; -} - -/** - * gives information about the visibility of a source - * @param sourceID the sourceID - * @return true if source is visible - */ -bool CAmMapHandler::sourceVisible(const am_sourceID_t sourceID) const -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return false; - am_Source_Database_s source = mMappedData.mSourceMap.at(sourceID); - return source.visible; -} - -/** - * gives information about the visibility of a sink - * @param sinkID the sinkID - * @return true if source is visible - */ -bool CAmMapHandler::sinkVisible(const am_sinkID_t sinkID) const -{ - am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); - if( NULL!=source ) - { - if(0==source->reserved) - return source->visible; - } - return false; -} - -/** - * checks if a connection already exists. - * Only takes sink, source and format information for search! - * @param connection the connection to be checked - * @return true if connections exists - */ -bool CAmMapHandler::existConnection(const am_Connection_s & connection) const -{ - am_Connection_Database_s const * connectionObject = findFirstObjectMatchingCriteria(mMappedData.mConnectionMap, connection, compareConnectionObjectsWithObject); - return ( NULL!=connectionObject ); -} - -/** - * checks if a connection with the given ID exists - * @param connectionID - * @return true if connection exits - */ -bool CAmMapHandler::existConnectionID(const am_connectionID_t connectionID) const -{ - am_Connection_Database_s const * connection = objectWithKeyIfExistsInMap(connectionID, mMappedData.mConnectionMap); - if( NULL!=connection ) - { - return (0==connection->reserved); - } - return false; -} - -/** - * checks if a CrossFader exists - * @param crossfaderID the ID of the crossfader to be checked - * @return true if exists - */ -bool CAmMapHandler::existcrossFader(const am_crossfaderID_t crossfaderID) const -{ - return existsObjectWithKeyInMap(crossfaderID, mMappedData.mCrossfaderMap); -} - -am_Error_e CAmMapHandler::getSoureState(const am_sourceID_t sourceID, am_SourceState_e & sourceState) const -{ - am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); - if( NULL!=source ) - { - sourceState = source->sourceState; - return (E_OK); - } - else - { - sourceState = SS_UNKNNOWN; - return (E_NON_EXISTENT); - } -} - -am_Error_e CAmMapHandler::changeSourceState(const am_sourceID_t sourceID, const am_SourceState_e sourceState) -{ - assert(sourceID!=0); - assert(sourceState>=SS_UNKNNOWN && sourceState<=SS_MAX); - if(existSource(sourceID)) - { - mMappedData.mSourceMap.at(sourceID).sourceState = sourceState; - return (E_OK); - } - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::getSinkVolume(const am_sinkID_t sinkID, am_volume_t & volume) const -{ - assert(sinkID!=0); - - am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); - if( NULL!=source ) - { - volume = source->volume; - return (E_OK); - } - volume = -1; - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::getSourceVolume(const am_sourceID_t sourceID, am_volume_t & volume) const -{ - assert(sourceID!=0); - am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); - if( NULL!=source ) - { - volume = source->volume; - return (E_OK); - } - volume = -1; - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::getSinkSoundPropertyValue(const am_sinkID_t sinkID, const am_SoundPropertyType_e propertyType, int16_t & value) const -{ - assert(sinkID!=0); - - am_Sink_Database_s const * source = objectWithKeyIfExistsInMap(sinkID, mMappedData.mSinkMap); - if( NULL!=source ) - { - std::vector::const_iterator iter = source->listSoundProperties.begin(); - for(; iterlistSoundProperties.end(); ++iter) - { - if( propertyType == iter->type ) - { - value = iter->value; - return (E_OK); - } - } - } - value = -1; - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::getSourceSoundPropertyValue(const am_sourceID_t sourceID, const am_SoundPropertyType_e propertyType, int16_t & value) const -{ - assert(sourceID!=0); - - am_Source_Database_s const * source = objectWithKeyIfExistsInMap(sourceID, mMappedData.mSourceMap); - if( NULL!=source ) - { - std::vector::const_iterator iter = source->listSoundProperties.begin(); - for(; iterlistSoundProperties.end(); ++iter) - { - if( propertyType == iter->type ) - { - value = iter->value; - return (E_OK); - } - } - } - value = -1; - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::getDomainState(const am_domainID_t domainID, am_DomainState_e& state) const -{ - assert(domainID!=0); - - am_Domain_Database_s const * source = objectWithKeyIfExistsInMap(domainID, mMappedData.mDomainMap); - if( NULL!=source ) - { - state = source->state; - return (E_OK); - } - state = DS_UNKNOWN; - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::peekDomain(const std::string & name, am_domainID_t & domainID) -{ - domainID=0; - - CAmCompareObjectWithValue comparator = compareDomainObjectWithValue; - am_Domain_Database_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mDomainMap, name, comparator); - - if( NULL != reservedDomain ) - { - domainID = reservedDomain->domainID; - return E_OK; - } - else - { - int16_t nextID = 0; - if( mMappedData.increaseID( &nextID, &mMappedData.mCurrentDomainID) ) - { - domainID = nextID; - am_Domain_Database_s domain; - domain.domainID = nextID; - domain.name = name; - domain.reserved = 1; - mMappedData.mDomainMap[nextID] = domain; - return E_OK; - } - return E_MAX; - } - return (E_OK); -} - -am_Error_e CAmMapHandler::peekSink(const std::string & name, am_sinkID_t & sinkID) -{ - am_Sink_Database_s const *reservedSink = findFirstObjectMatchingCriteria(mMappedData.mSinkMap, name, compareSinkObjectByName); - if( NULL!=reservedSink ) - { - sinkID = reservedSink->sinkID; - return E_OK; - } - else - { - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSinkID)) - { - if(mFirstStaticSink) - { - nextID = DYNAMIC_ID_BOUNDARY; - mFirstStaticSink = false; - } - sinkID = nextID; - am_Sink_Database_s object; - object.sinkID = nextID; - object.name = name; - object.reserved = 1; - mMappedData.mSinkMap[nextID] = object; - return E_OK; - } - return E_MAX; - } -} - -am_Error_e CAmMapHandler::peekSource(const std::string & name, am_sourceID_t & sourceID) -{ - am_Source_Database_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSourceMap, name, compareSourceObjectByName); - if( NULL!=reservedDomain ) - { - sourceID = reservedDomain->sourceID; - return E_OK; - } - else - { - int16_t nextID = 0; - if(mMappedData.increaseID(&nextID, &mMappedData.mCurrentSourceID)) - { - if(mFirstStaticSource) - { -// nextID = DYNAMIC_ID_BOUNDARY; - mFirstStaticSource = false; - } - sourceID = nextID; - am_Source_Database_s object; - object.sourceID = nextID; - object.name = name; - object.reserved = 1; - mMappedData.mSourceMap[nextID] = object; - return E_OK; - } - else - return E_MAX; - } -} - -am_Error_e CAmMapHandler::changeSinkVolume(const am_sinkID_t sinkID, const am_volume_t volume) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mSinkMap[sinkID].volume = volume; - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSourceVolume(const am_sourceID_t sourceID, const am_volume_t volume) -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - mMappedData.mSourceMap[sourceID].volume = volume; - - return (E_OK); -} - -am_Error_e CAmMapHandler::changeSourceSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sourceID_t sourceID) -{ - assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - std::vector::iterator iter = mMappedData.mSourceMap[sourceID].listSoundProperties.begin(); - for(; itertype ) - { - iter->value = soundProperty.value; - return (E_OK); - } - } - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::changeSinkSoundPropertyDB(const am_SoundProperty_s & soundProperty, const am_sinkID_t sinkID) -{ - assert(soundProperty.type>=SP_UNKNOWN && soundProperty.type<=SP_MAX); - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - std::vector::iterator iter = mMappedData.mSinkMap[sinkID].listSoundProperties.begin(); - for(; itertype ) - { - iter->value = soundProperty.value; - return (E_OK); - } - } - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::changeCrossFaderHotSink(const am_crossfaderID_t crossfaderID, const am_HotSink_e hotsink) -{ - assert(crossfaderID!=0); - assert(hotsink>=HS_UNKNOWN && hotsink>=HS_MAX); - - if (!existcrossFader(crossfaderID)) - { - return (E_NON_EXISTENT); - } - - mMappedData.mCrossfaderMap[crossfaderID].hotSink = hotsink; - return (E_OK); -} - -am_Error_e CAmMapHandler::getRoutingTree(bool onlyfree, CAmRoutingTree& tree, std::vector& flatTree) -{ - am_domainID_t rootID = tree.returnRootDomainID(); - CAmRoutingTreeItem *parent = tree.returnRootItem(); - size_t i = 0; - - do - { - if (i != 0) - { - parent = flatTree.at(i - 1); - rootID = parent->returnDomainID(); - } - std::for_each(mMappedData.mGatewayMap.begin(),mMappedData.mGatewayMap.end(), [&](const std::pair& refGateway) { - if( rootID==refGateway.second.domainSinkID ) - { - if(!onlyfree || std::find_if(mMappedData.mConnectionMap.begin(), - mMappedData.mConnectionMap.end(), - [refGateway](const std::pair& refConnection) - { - return (refConnection.second.sinkID == refGateway.second.sinkID || - refConnection.second.sourceID ==refGateway.second.sourceID); - })==mMappedData.mConnectionMap.end() ) - { - // additional check to avoid cyclic routes - const am_domainID_t domainSourceID = refGateway.second.domainSourceID; - bool sourceDomainAlreadyHandledAsSink = false; - for (std::vector::const_iterator iFT = flatTree.begin(); iFT != flatTree.end(); ++iFT) - { - if (domainSourceID == (*iFT)->returnParent()->returnDomainID()) - { - sourceDomainAlreadyHandledAsSink = true; - break; - } - } - - if (!sourceDomainAlreadyHandledAsSink) - { - // logInfo("DatabaseHandler::getRoutingTree ", rootID, ", ", domainSourceID, ", ", sqlite3_column_int(query, 1)); - flatTree.push_back(tree.insertItem(domainSourceID, refGateway.second.gatewayID, parent)); - } - } - } - }); - i++; - } while (flatTree.size() > (i - 1)); - - return (E_OK); -} - -am_Error_e am::CAmMapHandler::peekSinkClassID(const std::string & name, am_sinkClass_t & sinkClassID) -{ - if (name.empty()) - return (E_NON_EXISTENT); - - am_SinkClass_s const *reservedDomain = findFirstObjectMatchingCriteria(mMappedData.mSinkClassesMap, name, compareSinkClassObjectByName); - if( NULL!=reservedDomain ) - { - sinkClassID = reservedDomain->sinkClassID; - return E_OK; - } - return (E_NON_EXISTENT); -} - -am_Error_e am::CAmMapHandler::peekSourceClassID(const std::string & name, am_sourceClass_t & sourceClassID) -{ - if (name.empty()) - return (E_NON_EXISTENT); - - am_SourceClass_s const *ptrSource = findFirstObjectMatchingCriteria(mMappedData.mSourceClassesMap, name, compareSourceClassObjectByName); - if( NULL!=ptrSource ) - { - sourceClassID = ptrSource->sourceClassID; - return E_OK; - } - return (E_NON_EXISTENT); -} - - -am_Error_e CAmMapHandler::changeSourceDB(const am_sourceID_t sourceID, const am_sourceClass_t sourceClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - am_sourceClass_t sourceClassOut(sourceClassID); - std::vector listMainSoundPropertiesOut(listMainSoundProperties); - //check if sinkClass needs to be changed - - AM_MAP::iterator iter = mMappedData.mSourceMap.begin(); - for(; iter!=mMappedData.mSourceMap.end(); ++iter) - { - if( iter->second.sourceID == sourceID ) - { - if( sourceClassID!=0 ) - iter->second.sourceClassID = sourceClassID; - else if( 0 == iter->second.reserved ) - sourceClassOut = iter->second.sourceClassID; - } - } - - //check if soundProperties need to be updated - if (!listSoundProperties.empty()) - { - mMappedData.mSourceMap.at(sourceID).listSoundProperties = listSoundProperties; - } - - //check if we have to update the list of connectionformats - if (!listConnectionFormats.empty()) - { - mMappedData.mSourceMap.at(sourceID).listConnectionFormats = listConnectionFormats; - } - - //then we need to check if we need to update the listMainSoundProperties - if (!listMainSoundProperties.empty() && sourceVisible(sourceID)) - { - - mMappedData.mSourceMap.at(sourceID).listMainSoundProperties = listMainSoundProperties; - } - else //read out the properties - { - getListMainSourceSoundProperties(sourceID,listMainSoundPropertiesOut); - } - - logInfo("DatabaseHandler::changeSource changed changeSink of source:", sourceID); - - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sourceUpdated(sourceID,sourceClassOut,listMainSoundPropertiesOut,sourceVisible(sourceID)); - } - - return (E_OK); - -} - -am_Error_e CAmMapHandler::changeSinkDB(const am_sinkID_t sinkID, const am_sinkClass_t sinkClassID, const std::vector& listSoundProperties, const std::vector& listConnectionFormats, const std::vector& listMainSoundProperties) -{ - assert(sinkID!=0); - - am_sinkClass_t sinkClassOut(sinkClassID); - std::vector listMainSoundPropertiesOut(listMainSoundProperties); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - - AM_MAP::iterator iter = mMappedData.mSinkMap.begin(); - for(; iter!=mMappedData.mSinkMap.end(); ++iter) - { - if( iter->second.sinkID == sinkID ) - { - if( sinkClassID!=0 ) - iter->second.sinkClassID = sinkClassID; - else if( 0 == iter->second.reserved ) - sinkClassOut = iter->second.sinkClassID; - } - } - - //check if soundProperties need to be updated - if (!listSoundProperties.empty()) - { - mMappedData.mSinkMap.at(sinkID).listSoundProperties = listSoundProperties; - } - - //check if we have to update the list of connectionformats - if (!listConnectionFormats.empty()) - { - mMappedData.mSinkMap.at(sinkID).listConnectionFormats = listConnectionFormats; - } - - //then we need to check if we need to update the listMainSoundProperties - if (!listMainSoundProperties.empty() && sinkVisible(sinkID)) - { - mMappedData.mSinkMap.at(sinkID).listMainSoundProperties = listMainSoundProperties; - } - else //read out the properties - { - getListMainSinkSoundProperties(sinkID,listMainSoundPropertiesOut); - } - - logInfo("DatabaseHandler::changeSink changed changeSink of sink:", sinkID); - - if (mpDatabaseObserver != NULL) - { - mpDatabaseObserver->sinkUpdated(sinkID,sinkClassOut,listMainSoundPropertiesOut,sinkVisible(sinkID)); - } - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSinkNotificationConfigurations(const am_sinkID_t sinkID, std::vector& listMainNotificationConfigurations) -{ - assert(sinkID!=0); - if (!existSink(sinkID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - listMainNotificationConfigurations.clear(); - - listMainNotificationConfigurations = mMappedData.mSinkMap.at(sinkID).listMainNotificationConfigurations; - - return (E_OK); -} - -am_Error_e CAmMapHandler::getListMainSourceNotificationConfigurations(const am_sourceID_t sourceID, std::vector& listMainNotificationConfigurations) -{ - assert(sourceID!=0); - if (!existSource(sourceID)) - return (E_DATABASE_ERROR); // todo: here we could change to non existen, but not shown in sequences - - listMainNotificationConfigurations = mMappedData.mSourceMap.at(sourceID).listMainNotificationConfigurations; - - return (E_OK); -} - -bool changeMainNotificationConfiguration(std::vector & listMainNotificationConfigurations, - const am_NotificationConfiguration_s & mainNotificationConfiguration) -{ - bool changed = false; - std::vector::iterator iter = listMainNotificationConfigurations.begin(); - for(; itertype ) - { - iter->status = mainNotificationConfiguration.status; - iter->parameter = mainNotificationConfiguration.parameter; - changed |= true; - } - } - return changed; -} - -am_Error_e CAmMapHandler::changeMainSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - if(!changeMainNotificationConfiguration(mMappedData.mSinkMap.at(sinkID).listMainNotificationConfigurations, mainNotificationConfiguration)) - return (E_NO_CHANGE); - - logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - - if (mpDatabaseObserver) - mpDatabaseObserver->sinkMainNotificationConfigurationChanged(sinkID, mainNotificationConfiguration); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeMainSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s mainNotificationConfiguration) -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - if(!changeMainNotificationConfiguration(mMappedData.mSourceMap.at(sourceID).listMainNotificationConfigurations, mainNotificationConfiguration)) - return (E_NO_CHANGE); - - logInfo("DatabaseHandler::changeMainSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", mainNotificationConfiguration.type, "to status=", mainNotificationConfiguration.status, "and parameter=",mainNotificationConfiguration.parameter); - - if (mpDatabaseObserver) - mpDatabaseObserver->sourceMainNotificationConfigurationChanged(sourceID, mainNotificationConfiguration); - return (E_OK); -} - -am_Error_e CAmMapHandler::changeGatewayDB(const am_gatewayID_t gatewayID, const std::vector& listSourceConnectionFormats, const std::vector& listSinkConnectionFormats, const std::vector& convertionMatrix) -{ - assert(gatewayID!=0); - - if (!existGateway(gatewayID)) - { - return (E_NON_EXISTENT); - } - - if (!listSourceConnectionFormats.empty()) - { - mMappedData.mGatewayMap.at(gatewayID).listSourceFormats = listSourceConnectionFormats; - } - - if (!listSinkConnectionFormats.empty()) - { - mMappedData.mGatewayMap.at(gatewayID).listSinkFormats = listSinkConnectionFormats; - } - - if (!convertionMatrix.empty()) - { - mListConnectionFormat.clear(); - mListConnectionFormat.insert(std::make_pair(gatewayID, convertionMatrix)); - } - - logInfo("DatabaseHandler::changeGatewayDB changed Gateway with ID", gatewayID); - - //todo: check if observer needs to be adopted. - return (E_OK); -} - -bool changeNotificationConfiguration(std::vector & listNotificationConfigurations, const am_NotificationConfiguration_s & notificationConfiguration) -{ - bool changed = false; - std::vector::iterator iter = listNotificationConfigurations.begin(); - for(; itertype ) - { - iter->status = notificationConfiguration.status; - iter->parameter = notificationConfiguration.parameter; - changed |= true; - } - } - return changed; -} - -am_Error_e CAmMapHandler::changeSinkNotificationConfigurationDB(const am_sinkID_t sinkID, const am_NotificationConfiguration_s notificationConfiguration) -{ - assert(sinkID!=0); - - if (!existSink(sinkID)) - { - return (E_NON_EXISTENT); - } - if(!changeNotificationConfiguration(mMappedData.mSinkMap.at(sinkID).listNotificationConfigurations, notificationConfiguration)) - return (E_NO_CHANGE); - - logInfo("DatabaseHandler::changeMainSinkNotificationConfigurationDB changed MainNotificationConfiguration of source:", sinkID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); - - //todo:: inform obsever here... - return (E_NON_EXISTENT); -} - -am_Error_e CAmMapHandler::changeSourceNotificationConfigurationDB(const am_sourceID_t sourceID, const am_NotificationConfiguration_s notificationConfiguration) -{ - assert(sourceID!=0); - - if (!existSource(sourceID)) - { - return (E_NON_EXISTENT); - } - - if(!changeNotificationConfiguration(mMappedData.mSourceMap.at(sourceID).listNotificationConfigurations, notificationConfiguration)) - return (E_NO_CHANGE); - - logInfo("DatabaseHandler::changeSourceNotificationConfigurationDB changed MainNotificationConfiguration of source:", sourceID, "type:", notificationConfiguration.type, "to status=", notificationConfiguration.status, "and parameter=",notificationConfiguration.parameter); - - //todo:: implement observer function - return (E_NON_EXISTENT); -} - -} -- cgit v1.2.1