2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include "test-addon-manager.h"
20 #include <dali-test-suite-utils.h>
25 #ifndef ADDON_LIBS_PATH
26 #define ADDON_LIBS_PATH ""
33 std::vector<std::string> AddOnManager::EnumerateAddOns()
35 std::string listFileName(ADDON_LIBS_PATH);
36 listFileName += "/addons.txt";
38 // Read list of available test addons
39 tet_printf("Enumerating addons, file: %s\n", listFileName.c_str());
40 std::vector<std::string> addons{};
41 auto* fin = fopen(listFileName.c_str(), "r");
42 char* lineBuf = new char[256];
44 while(getline(&lineBuf, &n, fin) > 0)
46 tet_printf("Adding %s\n", lineBuf);
47 addons.emplace_back(lineBuf);
51 std::vector<std::string> retval{};
53 for(auto& name : addons)
55 std::string path(ADDON_LIBS_PATH);
59 mAddOnCache.emplace_back();
60 mAddOnCache.back().handle = dlopen(path.c_str(), RTLD_DEEPBIND | RTLD_LAZY);
61 if(!mAddOnCache.back().handle)
63 mAddOnCache.back().valid = false;
64 tet_printf("Can't open addon lib: %s\n", path.c_str());
67 // Here addon must self register
68 if(!mAddOnCache.back().valid)
70 puts("Addon invalid!");
74 tet_printf("Valid AddOn: %s\n", mAddOnCache.back().name.c_str());
75 retval.emplace_back(mAddOnCache.back().name);
82 * Check for self-registering addons
86 void AddOnManager::RegisterAddOnDispatchTable(const AddOnDispatchTable* dispatchTable)
88 // Register the dispatch table
89 auto& entry = mAddOnCache.back();
90 entry.name = dispatchTable->name;
91 tet_printf("Registering AddOn: %s\n", entry.name.c_str());
92 entry.GetGlobalProc = dispatchTable->GetGlobalProc;
93 entry.GetInstanceProc = dispatchTable->GetInstanceProc;
94 entry.GetAddOnInfo = dispatchTable->GetAddOnInfo;
95 entry.OnStart = dispatchTable->OnStart;
96 entry.OnStop = dispatchTable->OnStop;
97 entry.OnPause = dispatchTable->OnPause;
98 entry.OnResume = dispatchTable->OnResume;
102 bool AddOnManager::GetAddOnInfo(const std::string& name, AddOnInfo& info)
105 std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &info](AddOnCacheEntry& entry) {
106 if(entry.name == name)
108 entry.GetAddOnInfo(info);
117 std::vector<AddOnLibrary> AddOnManager::LoadAddOns(const std::vector<std::string>& addonNames)
119 if(mAddOnCache.empty())
124 std::vector<AddOnLibrary> retval{};
125 for(auto& name : addonNames)
128 auto iter = std::find_if(mAddOnCache.begin(), mAddOnCache.end(), [&retval, name, &index](AddOnCacheEntry& entry) {
130 if(entry.name == name)
136 if(iter != mAddOnCache.end())
138 retval.emplace_back(*reinterpret_cast<void**>(&index));
142 retval.emplace_back(nullptr);
149 void* AddOnManager::GetGlobalProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
151 auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
152 return mAddOnCache[index - 1].GetGlobalProc(procName);
155 void* AddOnManager::GetInstanceProc(const Dali::AddOnLibrary& addOnLibrary, const char* procName)
157 auto index = *reinterpret_cast<const size_t*>(&addOnLibrary);
158 return mAddOnCache[index - 1].GetInstanceProc(procName);
161 void AddOnManager::Start()
163 for(auto& entry : mAddOnCache)
172 void AddOnManager::Resume()
174 for(auto& entry : mAddOnCache)
183 void AddOnManager::Stop()
185 for(auto& entry : mAddOnCache)
194 void AddOnManager::Pause()
196 for(auto& entry : mAddOnCache)