• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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