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