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 <dlfcn.h>
17 #include "camera_log.h"
18 #include "camera_dynamic_loader.h"
19
20 namespace OHOS {
21 namespace CameraStandard {
22 using namespace std;
23 const char *librarySuffix = ".so";
CameraDynamicLoader()24 CameraDynamicLoader::CameraDynamicLoader()
25 {
26 MEDIA_INFO_LOG("CameraDynamicLoader ctor");
27 }
28
~CameraDynamicLoader()29 CameraDynamicLoader::~CameraDynamicLoader()
30 {
31 MEDIA_INFO_LOG("CameraDynamicLoader dtor");
32 for (auto iterator = dynamicLibHandle_.begin(); iterator != dynamicLibHandle_.end(); ++iterator) {
33 dlclose(iterator->second);
34 MEDIA_INFO_LOG("close library camera_dynamic success: %{public}s", iterator->first.c_str());
35 }
36 }
37
OpenDynamicHandle(std::string dynamicLibrary)38 void* CameraDynamicLoader::OpenDynamicHandle(std::string dynamicLibrary)
39 {
40 CAMERA_SYNC_TRACE;
41 std::lock_guard loaderLock(libLock_);
42 if (!EndsWith(dynamicLibrary, librarySuffix)) {
43 MEDIA_ERR_LOG("CloseDynamicHandle with error name!");
44 return nullptr;
45 }
46 if (dynamicLibHandle_[dynamicLibrary] == nullptr) {
47 void* dynamicLibHandle = dlopen(dynamicLibrary.c_str(), RTLD_NOW);
48 if (dynamicLibHandle == nullptr) {
49 MEDIA_ERR_LOG("Failed to open %{public}s, reason: %{public}sn", dynamicLibrary.c_str(), dlerror());
50 return nullptr;
51 }
52 MEDIA_INFO_LOG("open library %{public}s success", dynamicLibrary.c_str());
53 dynamicLibHandle_[dynamicLibrary] = dynamicLibHandle;
54 }
55 return dynamicLibHandle_[dynamicLibrary];
56 }
57
GetFuntion(std::string dynamicLibrary,std::string function)58 void* CameraDynamicLoader::GetFuntion(std::string dynamicLibrary, std::string function)
59 {
60 CAMERA_SYNC_TRACE;
61 std::lock_guard loaderLock(libLock_);
62 // if not opened, then open directly
63 if (dynamicLibHandle_[dynamicLibrary] == nullptr) {
64 OpenDynamicHandle(dynamicLibrary);
65 }
66
67 void* handle = nullptr;
68 if (dynamicLibHandle_[dynamicLibrary] != nullptr) {
69 handle = dlsym(dynamicLibHandle_[dynamicLibrary], function.c_str());
70 if (handle == nullptr) {
71 MEDIA_ERR_LOG("Failed to load %{public}s, reason: %{public}sn", function.c_str(), dlerror());
72 return nullptr;
73 }
74 MEDIA_INFO_LOG("GetFuntion %{public}s success", function.c_str());
75 }
76 return handle;
77 }
78
CloseDynamicHandle(std::string dynamicLibrary)79 void CameraDynamicLoader::CloseDynamicHandle(std::string dynamicLibrary)
80 {
81 CAMERA_SYNC_TRACE;
82 std::lock_guard loaderLock(libLock_);
83 if (!EndsWith(dynamicLibrary, librarySuffix)) {
84 MEDIA_ERR_LOG("CloseDynamicHandle with error name!");
85 return;
86 }
87 if (dynamicLibHandle_[dynamicLibrary] != nullptr) {
88 dlclose(dynamicLibHandle_[dynamicLibrary]);
89 dynamicLibHandle_[dynamicLibrary] = nullptr;
90 MEDIA_INFO_LOG("close library camera_dynamic success: %{public}s", dynamicLibrary.c_str());
91 }
92 }
93 } // namespace Camera
94 } // namespace OHOS