1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <core/intf_engine.h>
17 #include <core/plugin/intf_plugin.h>
18 #include <core/plugin/intf_plugin_register.h>
19 
20 #include <meta/base/plugin.h>
21 
22 #include "meta_object_lib.h"
23 
24 namespace {
25 static CORE_NS::IPluginRegister* g_pluginRegistry { nullptr };
26 } // namespace
27 
CORE_BEGIN_NAMESPACE()28 CORE_BEGIN_NAMESPACE()
29 IPluginRegister& GetPluginRegister()
30 {
31     return *g_pluginRegistry;
32 }
33 CORE_END_NAMESPACE()
34 
35 using namespace CORE_NS;
36 using namespace META_NS;
37 
38 META_BEGIN_NAMESPACE()
39 
40 namespace {
41 
42 MetaObjectLib* g_state = nullptr;
43 
44 // Register our interface to the GLOBAL registry.
45 constexpr CORE_NS::InterfaceTypeInfo INTERFACE = { &g_state, IMetaObjectLib::UID, "Meta Object Lib", nullptr,
__anon65a680bd0302() 46     [](CORE_NS::IClassRegister& registry, CORE_NS::PluginToken token) -> CORE_NS::IInterface* {
47         return *static_cast<IMetaObjectLib**>(token);
48     } };
49 
RegisterInterfaces(IPluginRegister & pluginRegistry)50 PluginToken RegisterInterfaces(IPluginRegister& pluginRegistry)
51 {
52     // Initializing dynamic plugin.
53     // Pluginregistry access via the provided registry instance which is saved here.
54     g_pluginRegistry = &pluginRegistry;
55     if (g_state == nullptr) {
56         g_state = new MetaObjectLib;
57 
58         auto& classRegister = CORE_NS::GetPluginRegister().GetClassRegister();
59         classRegister.RegisterInterfaceType(INTERFACE);
60 
61         g_state->Initialize();
62     }
63     return g_state;
64 }
UnregisterInterfaces(PluginToken token)65 void UnregisterInterfaces(PluginToken token)
66 {
67     if (token != g_state) {
68         return;
69     }
70     if (g_state) {
71         g_state->Uninitialize();
72 
73         delete g_state;
74         g_state = nullptr;
75 
76         auto& classRegister = CORE_NS::GetPluginRegister().GetClassRegister();
77         classRegister.UnregisterInterfaceType(INTERFACE);
78     }
79 
80     g_pluginRegistry = nullptr;
81 }
VersionString()82 const char* VersionString()
83 {
84     return META_VERSION_STRING;
85 }
86 
87 // const BASE_NS::Uid plugin_deps[] {};
88 } // namespace
89 
META_END_NAMESPACE()90 META_END_NAMESPACE()
91 
92 extern "C" {
93 #if defined(_MSC_VER)
94 _declspec(dllexport)
95 #else
96 __attribute__((visibility("default")))
97 #endif
98     // NOLINTNEXTLINE(readability-identifier-naming) to keep LumeEngine convention
99     CORE_NS::IPlugin gPluginData { { IPlugin::UID }, "MetaObject",
100         /** Version information of the plugin. */
101         CORE_NS::Version { META_NS::META_OBJECT_PLUGIN_UID, META_NS::VersionString }, META_NS::RegisterInterfaces,
102         META_NS::UnregisterInterfaces, {}};
103 }
104