X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FCommonAPI%2FDBus%2FDBusAddressTranslator.cpp;h=a1c836e939be25f100fcdffe76e630e16d54c131;hb=a9bb45cd1e743ef08a27a1cb71317429b89b2140;hp=8b6f938841ef0d20369cafe9853d40f81e0d6ab5;hpb=a43e3e5c5df7623cf37a21b02886d7216a911751;p=profile%2Fivi%2Fcommon-api-dbus-runtime.git diff --git a/src/CommonAPI/DBus/DBusAddressTranslator.cpp b/src/CommonAPI/DBus/DBusAddressTranslator.cpp index 8b6f938..a1c836e 100644 --- a/src/CommonAPI/DBus/DBusAddressTranslator.cpp +++ b/src/CommonAPI/DBus/DBusAddressTranslator.cpp @@ -21,17 +21,54 @@ namespace DBus { enum class TypeEnum { - DBUS_CONNECTION, DBUS_OBJECT, DBUS_INTERFACE + DBUS_CONNECTION, DBUS_OBJECT, DBUS_INTERFACE, DBUS_PREDEFINED }; static const std::unordered_map allowedValueTypes = { {"dbus_connection", TypeEnum::DBUS_CONNECTION}, {"dbus_object", TypeEnum::DBUS_OBJECT}, - {"dbus_interface", TypeEnum::DBUS_INTERFACE} + {"dbus_interface", TypeEnum::DBUS_INTERFACE}, + {"dbus_predefined", TypeEnum::DBUS_PREDEFINED} }; -inline void readValue(std::string& readLine, DBusServiceAddress dbusServiceAddress) { +DBusAddressTranslator::DBusAddressTranslator() {} + + +void DBusAddressTranslator::init() { + std::string fqnOfConfigFile = getCurrentBinaryFileFQN(); + std::ifstream addressConfigFile; + + if (fqnOfConfigFile != "") { + fqnOfConfigFile += DBUS_CONFIG_SUFFIX; + + addressConfigFile.open(fqnOfConfigFile.c_str()); + + if (addressConfigFile.is_open()) { + readConfigFile(addressConfigFile); + addressConfigFile.close(); + } + + addressConfigFile.clear(); + std::vector splittedConfigFQN = split(fqnOfConfigFile, '/'); + std::string globalConfigFQN = DBUS_GLOBAL_CONFIG_ROOT + splittedConfigFQN.at(splittedConfigFQN.size() - 1); + addressConfigFile.open(globalConfigFQN); + if (addressConfigFile.is_open()) { + readConfigFile(addressConfigFile); + addressConfigFile.close(); + } + addressConfigFile.clear(); + } + + addressConfigFile.open(DBUS_GLOBAL_CONFIG_FQN); + if(addressConfigFile.is_open()) { + readConfigFile(addressConfigFile); + addressConfigFile.close(); + } +} + + +inline void readValue(std::string& readLine, CommonApiServiceDetails& serviceDetails) { std::stringstream readStream(readLine); std::string paramName; @@ -44,13 +81,16 @@ inline void readValue(std::string& readLine, DBusServiceAddress dbusServiceAddre getline(readStream, paramValue); switch(typeEntry->second) { case TypeEnum::DBUS_CONNECTION: - std::get<0>(dbusServiceAddress) = paramValue; + std::get<0>(std::get<0>(serviceDetails)) = paramValue; break; case TypeEnum::DBUS_OBJECT: - std::get<1>(dbusServiceAddress) = paramValue; + std::get<1>(std::get<0>(serviceDetails)) = paramValue; break; case TypeEnum::DBUS_INTERFACE: - std::get<2>(dbusServiceAddress) = paramValue; + std::get<2>(std::get<0>(serviceDetails)) = paramValue; + break; + case TypeEnum::DBUS_PREDEFINED: + std::get<1>(serviceDetails) = paramValue == "true" ? true : false; break; } } @@ -63,73 +103,67 @@ inline void reset(DBusServiceAddress& dbusServiceAddress) { std::get<2>(dbusServiceAddress) = ""; } - -void DBusAddressTranslator::fillUndefinedRequiredValues(DBusServiceAddress& dbusServiceAddress, const std::string& commonApiAddress) const { - std::string connectionName; - std::string objectPath; - std::string interfaceName; - - findFallbackDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath); - - std::get<0>(dbusServiceAddress) = std::get<0>(dbusServiceAddress) == "" ? connectionName : std::get<0>(dbusServiceAddress); - std::get<1>(dbusServiceAddress) = std::get<1>(dbusServiceAddress) == "" ? objectPath : std::get<1>(dbusServiceAddress); +inline void reset(CommonApiServiceDetails& serviceDetails) { + reset(std::get<0>(serviceDetails)); + std::get<1>(serviceDetails) = false; } -//TODO: Fall, dass Datei nicht gefunden! -//TODO: Suche in etc/config (oder so) +void DBusAddressTranslator::readConfigFile(std::ifstream& addressConfigFile) { + std::string currentlyParsedCommonApiAddress; + CommonApiServiceDetails serviceDetails; + reset(serviceDetails); -DBusAddressTranslator::DBusAddressTranslator() { - std::string fqnOfConfigFile = getCurrentBinaryFileName(); - fqnOfConfigFile += DBUS_CONFIG_SUFFIX; + bool newAddressFound = false; - std::ifstream addressConfigFile; + while (addressConfigFile.good()) { + std::string readLine; + getline(addressConfigFile, readLine); + const size_t readLineLength = readLine.length(); - addressConfigFile.open(fqnOfConfigFile.c_str()); - - if(addressConfigFile) { - std::string currentlyParsedCommonApiAddress; - DBusServiceAddress dbusServiceAddress; - reset(dbusServiceAddress); - - bool currentAddressNotYetContained = false; - bool atLeastOneAddressFound = false; - - while (addressConfigFile.good()) { - std::string readLine; - getline(addressConfigFile, readLine); - const size_t readLineLength = readLine.length(); - - if (readLine[0] == '[' && readLine[readLineLength - 1] == ']') { - if (atLeastOneAddressFound) { - fillUndefinedRequiredValues(dbusServiceAddress, currentlyParsedCommonApiAddress); - knownDBusAddresses.insert( {currentlyParsedCommonApiAddress, dbusServiceAddress}); - knownCommonAddresses.insert( {dbusServiceAddress, currentlyParsedCommonApiAddress}); - } - reset(dbusServiceAddress); - currentlyParsedCommonApiAddress = readLine.substr(1, readLineLength - 2); - currentAddressNotYetContained = - knownDBusAddresses.find(currentlyParsedCommonApiAddress) == knownDBusAddresses.end() - && - knownCommonAddresses.find(dbusServiceAddress) - == knownCommonAddresses.end(); - atLeastOneAddressFound = true; - - } else if (currentAddressNotYetContained) { - readValue(readLine, dbusServiceAddress); + if (readLine[0] == '[' && readLine[readLineLength - 1] == ']') { + if (newAddressFound) { + fillUndefinedValues(serviceDetails, currentlyParsedCommonApiAddress); + commonApiAddressDetails.insert( {currentlyParsedCommonApiAddress, serviceDetails}); + dbusToCommonApiAddress.insert( {std::get<0>(serviceDetails), currentlyParsedCommonApiAddress}); + } + reset(serviceDetails); + std::string newAddress = readLine.substr(1, readLineLength - 2); + if (isValidCommonApiAddress(newAddress)) { + currentlyParsedCommonApiAddress = std::move(newAddress); + newAddressFound = commonApiAddressDetails.find(currentlyParsedCommonApiAddress) == commonApiAddressDetails.end(); } - } - knownDBusAddresses.insert( {currentlyParsedCommonApiAddress, dbusServiceAddress}); - addressConfigFile.close(); + } else if (newAddressFound) { + readValue(readLine, serviceDetails); + } + } + if(newAddressFound) { + fillUndefinedValues(serviceDetails, currentlyParsedCommonApiAddress); + commonApiAddressDetails.insert( {currentlyParsedCommonApiAddress, serviceDetails}); + dbusToCommonApiAddress.insert( {std::get<0>(serviceDetails), currentlyParsedCommonApiAddress}); } } +void DBusAddressTranslator::fillUndefinedValues(CommonApiServiceDetails& serviceDetails, const std::string& commonApiAddress) const { + std::string connectionName; + std::string objectPath; + std::string interfaceName; + + findFallbackDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath); + + std::get<0>(std::get<0>(serviceDetails)) = std::get<0>(std::get<0>(serviceDetails)) == "" ? connectionName : std::get<0>(std::get<0>(serviceDetails)); + std::get<1>(std::get<0>(serviceDetails)) = std::get<1>(std::get<0>(serviceDetails)) == "" ? objectPath : std::get<1>(std::get<0>(serviceDetails)); + std::get<2>(std::get<0>(serviceDetails)) = std::get<2>(std::get<0>(serviceDetails)) == "" ? interfaceName : std::get<2>(std::get<0>(serviceDetails)); +} + + DBusAddressTranslator& DBusAddressTranslator::getInstance() { static DBusAddressTranslator* dbusNameService_; if(!dbusNameService_) { dbusNameService_ = new DBusAddressTranslator(); + dbusNameService_->init(); } return *dbusNameService_; } @@ -140,14 +174,15 @@ void DBusAddressTranslator::searchForDBusAddress(const std::string& commonApiAdd std::string& connectionName, std::string& objectPath) { - const auto& foundAddressMapping = knownDBusAddresses.find(commonApiAddress); - if(foundAddressMapping != knownDBusAddresses.end()) { - connectionName = std::get<0>(foundAddressMapping->second); - objectPath = std::get<1>(foundAddressMapping->second); - interfaceName = std::get<2>(foundAddressMapping->second); + const auto& foundAddressMapping = commonApiAddressDetails.find(commonApiAddress); + + if(foundAddressMapping != commonApiAddressDetails.end()) { + connectionName = std::get<0>(std::get<0>(foundAddressMapping->second)); + objectPath = std::get<1>(std::get<0>(foundAddressMapping->second)); + interfaceName = std::get<2>(std::get<0>(foundAddressMapping->second)); } else { findFallbackDBusAddress(commonApiAddress, interfaceName, connectionName, objectPath); - knownDBusAddresses.insert( {commonApiAddress, std::make_tuple(connectionName, objectPath, interfaceName) } ); + commonApiAddressDetails.insert( {commonApiAddress, std::make_tuple(std::make_tuple(connectionName, objectPath, interfaceName), false) } ); } } @@ -158,15 +193,28 @@ void DBusAddressTranslator::searchForCommonAddress(const std::string& interfaceN DBusServiceAddress dbusAddress(connectionName, objectPath, interfaceName); - const auto& foundAddressMapping = knownCommonAddresses.find(dbusAddress); - if (foundAddressMapping != knownCommonAddresses.end()) { + const auto& foundAddressMapping = dbusToCommonApiAddress.find(dbusAddress); + if (foundAddressMapping != dbusToCommonApiAddress.end()) { commonApiAddress = foundAddressMapping->second; } else { findFallbackCommonAddress(commonApiAddress, interfaceName, connectionName, objectPath); - knownCommonAddresses.insert( {std::move(dbusAddress), commonApiAddress} ); + dbusToCommonApiAddress.insert( {std::move(dbusAddress), commonApiAddress} ); } } +void DBusAddressTranslator::getPredefinedInstances(const std::string& connectionName, + std::vector& instances) { + instances.clear(); + auto dbusAddress = commonApiAddressDetails.begin(); + while (dbusAddress != commonApiAddressDetails.end()) { + CommonApiServiceDetails serviceDetails = dbusAddress->second; + if (connectionName == std::get<0>(std::get<0>(serviceDetails)) + && true == std::get<1>(serviceDetails)) { + instances.push_back(std::get<0>(serviceDetails)); + } + dbusAddress++; + } +} void DBusAddressTranslator::findFallbackDBusAddress(const std::string& commonApiAddress, std::string& interfaceName,