1e5c4badcSopenharmony_ci/* 2e5c4badcSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3e5c4badcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e5c4badcSopenharmony_ci * you may not use this file except in compliance with the License. 5e5c4badcSopenharmony_ci * You may obtain a copy of the License at 6e5c4badcSopenharmony_ci * 7e5c4badcSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e5c4badcSopenharmony_ci * 9e5c4badcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e5c4badcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e5c4badcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e5c4badcSopenharmony_ci * See the License for the specific language governing permissions and 13e5c4badcSopenharmony_ci * limitations under the License. 14e5c4badcSopenharmony_ci */ 15e5c4badcSopenharmony_ci 16e5c4badcSopenharmony_ci#ifndef PLUGIN_SERVER_H 17e5c4badcSopenharmony_ci#define PLUGIN_SERVER_H 18e5c4badcSopenharmony_ci 19e5c4badcSopenharmony_ci#include <cstdint> 20e5c4badcSopenharmony_ci#include <map> 21e5c4badcSopenharmony_ci#include <string> 22e5c4badcSopenharmony_ci#include <vector> 23e5c4badcSopenharmony_ci#include <functional> 24e5c4badcSopenharmony_ci#include "attr_data.h" 25e5c4badcSopenharmony_ci#include "iosfwd" 26e5c4badcSopenharmony_ci#include "nocopyable.h" 27e5c4badcSopenharmony_ci#include "plugin_class_base.h" 28e5c4badcSopenharmony_ci#include "plugin_common_type.h" 29e5c4badcSopenharmony_ci#include "plugin_service.h" 30e5c4badcSopenharmony_ci#include "priority_scheme.h" 31e5c4badcSopenharmony_ci#include "singleton.h" 32e5c4badcSopenharmony_ci 33e5c4badcSopenharmony_cinamespace OHOS { 34e5c4badcSopenharmony_cinamespace MultimediaPlugin { 35e5c4badcSopenharmony_ciclass PlatformAdp; 36e5c4badcSopenharmony_ciclass PluginFw; 37e5c4badcSopenharmony_ciclass GstPluginFw; 38e5c4badcSopenharmony_ci 39e5c4badcSopenharmony_cienum class PluginFWType : int32_t { 40e5c4badcSopenharmony_ci PLUGIN_FW_GENERAL = 0, 41e5c4badcSopenharmony_ci PLUGIN_FW_GSTREAMER 42e5c4badcSopenharmony_ci}; 43e5c4badcSopenharmony_ci 44e5c4badcSopenharmony_ciclass PluginServer final : public NoCopyable { 45e5c4badcSopenharmony_cipublic: 46e5c4badcSopenharmony_ci uint32_t Register(std::vector<std::string> &&pluginPaths); 47e5c4badcSopenharmony_ci 48e5c4badcSopenharmony_ci template<typename T> 49e5c4badcSopenharmony_ci inline T *CreateObject(const std::string &className, uint32_t &errorCode) 50e5c4badcSopenharmony_ci { 51e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 52e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, className, errorCode)); 53e5c4badcSopenharmony_ci } 54e5c4badcSopenharmony_ci 55e5c4badcSopenharmony_ci template<typename T> 56e5c4badcSopenharmony_ci inline T *CreateObject(const std::string &className) 57e5c4badcSopenharmony_ci { 58e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 59e5c4badcSopenharmony_ci uint32_t errorCode = 0; 60e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, className, errorCode)); 61e5c4badcSopenharmony_ci } 62e5c4badcSopenharmony_ci 63e5c4badcSopenharmony_ci template<typename T> 64e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, uint32_t &errorCode) 65e5c4badcSopenharmony_ci { 66e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 67e5c4badcSopenharmony_ci std::map<std::string, AttrData> emptyCapabilities; 68e5c4badcSopenharmony_ci PriorityScheme emptyPriScheme; 69e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, emptyCapabilities, 70e5c4badcSopenharmony_ci emptyPriScheme, errorCode)); 71e5c4badcSopenharmony_ci } 72e5c4badcSopenharmony_ci 73e5c4badcSopenharmony_ci template<typename T> 74e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType) 75e5c4badcSopenharmony_ci { 76e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 77e5c4badcSopenharmony_ci std::map<std::string, AttrData> emptyCapabilities; 78e5c4badcSopenharmony_ci PriorityScheme emptyPriScheme; 79e5c4badcSopenharmony_ci uint32_t errorCode = 0; 80e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, emptyCapabilities, 81e5c4badcSopenharmony_ci emptyPriScheme, errorCode)); 82e5c4badcSopenharmony_ci } 83e5c4badcSopenharmony_ci 84e5c4badcSopenharmony_ci template<typename T> 85e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const PriorityScheme &priorityScheme, uint32_t &errorCode) 86e5c4badcSopenharmony_ci { 87e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 88e5c4badcSopenharmony_ci std::map<std::string, AttrData> emptyCapabilities; 89e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, emptyCapabilities, 90e5c4badcSopenharmony_ci priorityScheme, errorCode)); 91e5c4badcSopenharmony_ci } 92e5c4badcSopenharmony_ci 93e5c4badcSopenharmony_ci template<typename T> 94e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const PriorityScheme &priorityScheme) 95e5c4badcSopenharmony_ci { 96e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 97e5c4badcSopenharmony_ci std::map<std::string, AttrData> emptyCapabilities; 98e5c4badcSopenharmony_ci uint32_t errorCode = 0; 99e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, emptyCapabilities, 100e5c4badcSopenharmony_ci priorityScheme, errorCode)); 101e5c4badcSopenharmony_ci } 102e5c4badcSopenharmony_ci 103e5c4badcSopenharmony_ci template<typename T> 104e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const std::map<std::string, AttrData> &capabilities, 105e5c4badcSopenharmony_ci uint32_t &errorCode) 106e5c4badcSopenharmony_ci { 107e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 108e5c4badcSopenharmony_ci PriorityScheme emptyPriScheme; 109e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, capabilities, 110e5c4badcSopenharmony_ci emptyPriScheme, errorCode)); 111e5c4badcSopenharmony_ci } 112e5c4badcSopenharmony_ci 113e5c4badcSopenharmony_ci template<typename T> 114e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const std::map<std::string, AttrData> &capabilities) 115e5c4badcSopenharmony_ci { 116e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 117e5c4badcSopenharmony_ci PriorityScheme emptyPriScheme; 118e5c4badcSopenharmony_ci uint32_t errorCode = 0; 119e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, capabilities, 120e5c4badcSopenharmony_ci emptyPriScheme, errorCode)); 121e5c4badcSopenharmony_ci } 122e5c4badcSopenharmony_ci 123e5c4badcSopenharmony_ci template<typename T> 124e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const std::map<std::string, AttrData> &capabilities, 125e5c4badcSopenharmony_ci const PriorityScheme &priorityScheme, uint32_t &errorCode) 126e5c4badcSopenharmony_ci { 127e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 128e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, capabilities, 129e5c4badcSopenharmony_ci priorityScheme, errorCode)); 130e5c4badcSopenharmony_ci } 131e5c4badcSopenharmony_ci 132e5c4badcSopenharmony_ci template<typename T> 133e5c4badcSopenharmony_ci inline T *CreateObject(uint16_t serviceType, const std::map<std::string, AttrData> &capabilities, 134e5c4badcSopenharmony_ci const PriorityScheme &priorityScheme) 135e5c4badcSopenharmony_ci { 136e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 137e5c4badcSopenharmony_ci uint32_t errorCode = 0; 138e5c4badcSopenharmony_ci return ConvertToServiceInterface<T>(CreateObject(interfaceID, serviceType, capabilities, 139e5c4badcSopenharmony_ci priorityScheme, errorCode)); 140e5c4badcSopenharmony_ci } 141e5c4badcSopenharmony_ci 142e5c4badcSopenharmony_ci template<typename T> 143e5c4badcSopenharmony_ci inline uint32_t PluginServerGetClassInfo(uint16_t serviceType, std::vector<ClassInfo> &classesInfo) 144e5c4badcSopenharmony_ci { 145e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 146e5c4badcSopenharmony_ci std::map<std::string, AttrData> emptyCapabilities; 147e5c4badcSopenharmony_ci return PluginServerGetClassInfo(interfaceID, serviceType, emptyCapabilities, classesInfo); 148e5c4badcSopenharmony_ci } 149e5c4badcSopenharmony_ci 150e5c4badcSopenharmony_ci template<typename T> 151e5c4badcSopenharmony_ci inline uint32_t PluginServerGetClassInfo(uint16_t serviceType, const std::map<std::string, AttrData> &capabilities, 152e5c4badcSopenharmony_ci std::vector<ClassInfo> &classesInfo) 153e5c4badcSopenharmony_ci { 154e5c4badcSopenharmony_ci uint16_t interfaceID = GetInterfaceId<T>(); 155e5c4badcSopenharmony_ci return PluginServerGetClassInfo(interfaceID, serviceType, capabilities, classesInfo); 156e5c4badcSopenharmony_ci } 157e5c4badcSopenharmony_ci 158e5c4badcSopenharmony_ci DECLARE_DELAYED_REF_SINGLETON(PluginServer); 159e5c4badcSopenharmony_ci 160e5c4badcSopenharmony_ciprivate: 161e5c4badcSopenharmony_ci template<typename T> 162e5c4badcSopenharmony_ci inline T *ConvertToServiceInterface(PluginClassBase *pluginBase) 163e5c4badcSopenharmony_ci { 164e5c4badcSopenharmony_ci#ifdef PLUGIN_FLAG_RTTI_ENABLE 165e5c4badcSopenharmony_ci // when -frtti is enabled, we use dynamic cast directly 166e5c4badcSopenharmony_ci // to achieve the correct base class side-to-side conversion. 167e5c4badcSopenharmony_ci T *serviceObj = dynamic_cast<T *>(pluginBase); 168e5c4badcSopenharmony_ci if (serviceObj == nullptr && pluginBase != nullptr) { 169e5c4badcSopenharmony_ci // type mismatch. 170e5c4badcSopenharmony_ci delete pluginBase; 171e5c4badcSopenharmony_ci } 172e5c4badcSopenharmony_ci#else 173e5c4badcSopenharmony_ci // adjust pointer position when multiple inheritance. 174e5c4badcSopenharmony_ci void *obj = dynamic_cast<void *>(pluginBase); 175e5c4badcSopenharmony_ci // when -frtti is not enable, we use static cast. 176e5c4badcSopenharmony_ci // static cast is not safe enough, but we have checked before we get here. 177e5c4badcSopenharmony_ci T *serviceObj = static_cast<T *>(obj); 178e5c4badcSopenharmony_ci#endif 179e5c4badcSopenharmony_ci return serviceObj; 180e5c4badcSopenharmony_ci } 181e5c4badcSopenharmony_ci 182e5c4badcSopenharmony_ci PluginClassBase *CreateObject(uint16_t interfaceID, const std::string &className, uint32_t &errorCode); 183e5c4badcSopenharmony_ci PluginClassBase *CreateObject(uint16_t interfaceID, uint16_t serviceType, 184e5c4badcSopenharmony_ci const std::map<std::string, AttrData> &capabilities, 185e5c4badcSopenharmony_ci const PriorityScheme &priorityScheme, uint32_t &errorCode); 186e5c4badcSopenharmony_ci uint32_t PluginServerGetClassInfo(uint16_t interfaceID, uint16_t serviceType, 187e5c4badcSopenharmony_ci const std::map<std::string, AttrData> &capabilities, 188e5c4badcSopenharmony_ci std::vector<ClassInfo> &classesInfo); 189e5c4badcSopenharmony_ci PluginFWType AnalyzeFWType(const std::string &canonicalPath); 190e5c4badcSopenharmony_ci 191e5c4badcSopenharmony_ci PlatformAdp &platformAdp_; 192e5c4badcSopenharmony_ci PluginFw &pluginFw_; 193e5c4badcSopenharmony_ci GstPluginFw &gstPluginFw_; 194e5c4badcSopenharmony_ci}; 195e5c4badcSopenharmony_ci} // namespace MultimediaPlugin 196e5c4badcSopenharmony_ci} // namespace OHOS 197e5c4badcSopenharmony_ci 198e5c4badcSopenharmony_ci#endif // PLUGIN_SERVER_H 199