// Copyright (C) 2013-2020 Bayerische Motoren Werke Aktiengesellschaft (BMW AG) // 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/. #if !defined (COMMONAPI_INTERNAL_COMPILATION) #error "Only can be included directly, this file may disappear or change contents." #endif #ifndef COMMONAPI_RUNTIME_HPP_ #define COMMONAPI_RUNTIME_HPP_ #include #include #include #include #include #include #include #include namespace CommonAPI { static const ConnectionId_t DEFAULT_CONNECTION_ID = ""; class MainLoopContext; class Proxy; class ProxyManager; class StubBase; class Runtime { public: COMMONAPI_EXPORT static std::string getProperty(const std::string &_name); COMMONAPI_EXPORT static void setProperty(const std::string &_name, const std::string &_value); COMMONAPI_EXPORT static std::shared_ptr get(); COMMONAPI_EXPORT Runtime(); COMMONAPI_EXPORT virtual ~Runtime(); template class ProxyClass_, typename ... AttributeExtensions_> COMMONAPI_EXPORT std::shared_ptr< ProxyClass_ > buildProxy(const std::string &_domain, const std::string &_instance, const ConnectionId_t &_connectionId = DEFAULT_CONNECTION_ID) { std::shared_ptr proxy = createProxy(_domain, ProxyClass_::getInterface(), _instance, _connectionId); if (proxy) { return std::make_shared>(proxy); } return nullptr; } template class ProxyClass_, typename ... AttributeExtensions_> COMMONAPI_EXPORT std::shared_ptr< ProxyClass_ > buildProxy(const std::string &_domain, const std::string &_instance, std::shared_ptr _context) { std::shared_ptr proxy = createProxy(_domain, ProxyClass_::getInterface(), _instance, _context); if (proxy) { return std::make_shared>(proxy); } return nullptr; } template class ProxyClass_, template class AttributeExtension_> COMMONAPI_EXPORT std::shared_ptr::class_t> buildProxyWithDefaultAttributeExtension(const std::string &_domain, const std::string &_instance, const ConnectionId_t &_connectionId = DEFAULT_CONNECTION_ID) { std::shared_ptr proxy = createProxy(_domain, DefaultAttributeProxyHelper::class_t::getInterface(), _instance, _connectionId); if (proxy) { return std::make_shared::class_t>(proxy); } return nullptr; } template class ProxyClass_, template class AttributeExtension_> COMMONAPI_EXPORT std::shared_ptr::class_t> buildProxyWithDefaultAttributeExtension(const std::string &_domain, const std::string &_instance, std::shared_ptr _context) { std::shared_ptr proxy = createProxy(_domain, DefaultAttributeProxyHelper::class_t::getInterface(), _instance, _context); if (proxy) { return std::make_shared::class_t>(proxy); } return nullptr; } template COMMONAPI_EXPORT bool registerService(const std::string &_domain, const std::string &_instance, std::shared_ptr _service, const ConnectionId_t &_connectionId = DEFAULT_CONNECTION_ID) { return registerStub(_domain, Stub_::StubInterface::getInterface(), _instance, _service, _connectionId); } template COMMONAPI_EXPORT bool registerService(const std::string &_domain, const std::string &_instance, std::shared_ptr _service, std::shared_ptr _context) { return registerStub(_domain, Stub_::StubInterface::getInterface(), _instance, _service, _context); } COMMONAPI_EXPORT bool unregisterService(const std::string &_domain, const std::string &_interface, const std::string &_instance) { return unregisterStub(_domain, _interface, _instance); } COMMONAPI_EXPORT bool registerFactory(const std::string &_ipc, std::shared_ptr _factory); COMMONAPI_EXPORT bool unregisterFactory(const std::string &_ipc); inline const std::string &getDefaultBinding() const { return defaultBinding_; }; COMMONAPI_EXPORT void initFactories(); COMMONAPI_EXPORT Timeout_t getDefaultCallTimeout() const; private: COMMONAPI_EXPORT void init(); COMMONAPI_EXPORT bool readConfiguration(); COMMONAPI_EXPORT bool splitAddress(const std::string &, std::string &, std::string &, std::string &); COMMONAPI_EXPORT std::shared_ptr createProxy(const std::string &, const std::string &, const std::string &, const ConnectionId_t &); COMMONAPI_EXPORT std::shared_ptr createProxy(const std::string &, const std::string &, const std::string &, std::shared_ptr); COMMONAPI_EXPORT std::shared_ptr createProxyHelper(const std::string &, const std::string &, const std::string &, const ConnectionId_t &, bool); COMMONAPI_EXPORT std::shared_ptr createProxyHelper(const std::string &, const std::string &, const std::string &, std::shared_ptr, bool); COMMONAPI_EXPORT bool registerStub(const std::string &, const std::string &, const std::string &, std::shared_ptr, const ConnectionId_t &); COMMONAPI_EXPORT bool registerStub(const std::string &, const std::string &, const std::string &, std::shared_ptr, std::shared_ptr); COMMONAPI_EXPORT bool registerStubHelper(const std::string &, const std::string &, const std::string &, std::shared_ptr, const ConnectionId_t &, bool); COMMONAPI_EXPORT bool registerStubHelper(const std::string &, const std::string &, const std::string &, std::shared_ptr, std::shared_ptr, bool); COMMONAPI_EXPORT bool unregisterStub(const std::string &, const std::string &, const std::string &); COMMONAPI_EXPORT std::string getLibrary(const std::string &, const std::string &, const std::string &, bool); COMMONAPI_EXPORT bool loadLibrary(const std::string &); private: std::string usedConfig_; std::string defaultBinding_; std::string defaultFolder_; std::string defaultConfig_; Timeout_t defaultCallTimeout_; std::map> factories_; std::shared_ptr defaultFactory_; std::map> libraries_; std::set loadedLibraries_; // Library name std::mutex mutex_; std::mutex factoriesMutex_; std::mutex loadMutex_; bool isConfigured_; bool isInitialized_; static std::map properties_; friend class ProxyManager; }; } // namespace CommonAPI #endif // COMMONAPI_RUNTIME_HPP_