1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci
16fb299fa2Sopenharmony_ci#include "update_hdi_client.h"
17fb299fa2Sopenharmony_ci
18fb299fa2Sopenharmony_ci#include <cerrno>
19fb299fa2Sopenharmony_ci#include <dlfcn.h>
20fb299fa2Sopenharmony_ci
21fb299fa2Sopenharmony_ci#include "log/log.h"
22fb299fa2Sopenharmony_ci
23fb299fa2Sopenharmony_cinamespace Updater {
24fb299fa2Sopenharmony_ciconstexpr const char *HDI_LIB_NAME = "libupdate_hdi_impl.z.so";
25fb299fa2Sopenharmony_ci
26fb299fa2Sopenharmony_ciUpdateHdiClient &UpdateHdiClient::GetInstance()
27fb299fa2Sopenharmony_ci{
28fb299fa2Sopenharmony_ci    static UpdateHdiClient instance;
29fb299fa2Sopenharmony_ci    return instance;
30fb299fa2Sopenharmony_ci}
31fb299fa2Sopenharmony_ci
32fb299fa2Sopenharmony_ciUpdateHdiClient::~UpdateHdiClient()
33fb299fa2Sopenharmony_ci{
34fb299fa2Sopenharmony_ci    CloseLibrary();
35fb299fa2Sopenharmony_ci}
36fb299fa2Sopenharmony_ci
37fb299fa2Sopenharmony_ciint32_t UpdateHdiClient::GetLockStatus(bool &status)
38fb299fa2Sopenharmony_ci{
39fb299fa2Sopenharmony_ci    if (updateInterface_ == nullptr && !Init()) {
40fb299fa2Sopenharmony_ci        LOG(ERROR) << "updateInterface_ is null";
41fb299fa2Sopenharmony_ci        return -1;
42fb299fa2Sopenharmony_ci    }
43fb299fa2Sopenharmony_ci    return updateInterface_->GetLockStatus(status);
44fb299fa2Sopenharmony_ci}
45fb299fa2Sopenharmony_ci
46fb299fa2Sopenharmony_cibool UpdateHdiClient::Init()
47fb299fa2Sopenharmony_ci{
48fb299fa2Sopenharmony_ci    if (updateInterface_ != nullptr) {
49fb299fa2Sopenharmony_ci        LOG(INFO) << "updateInterface_ has loaded";
50fb299fa2Sopenharmony_ci        return true;
51fb299fa2Sopenharmony_ci    }
52fb299fa2Sopenharmony_ci    return LoadLibrary();
53fb299fa2Sopenharmony_ci}
54fb299fa2Sopenharmony_ci
55fb299fa2Sopenharmony_cibool UpdateHdiClient::LoadLibrary()
56fb299fa2Sopenharmony_ci{
57fb299fa2Sopenharmony_ci    constexpr const char *getInstance = "GetInterfaceInstance";
58fb299fa2Sopenharmony_ci    if (updateInterface_ != nullptr) {
59fb299fa2Sopenharmony_ci        LOG(INFO) << "updateInterface_ has loaded";
60fb299fa2Sopenharmony_ci        return true;
61fb299fa2Sopenharmony_ci    }
62fb299fa2Sopenharmony_ci
63fb299fa2Sopenharmony_ci    handler_ = dlopen(HDI_LIB_NAME, RTLD_LAZY);
64fb299fa2Sopenharmony_ci    if (handler_ == nullptr) {
65fb299fa2Sopenharmony_ci        LOG(ERROR) << "open " << HDI_LIB_NAME << " fail";
66fb299fa2Sopenharmony_ci        return false;
67fb299fa2Sopenharmony_ci    }
68fb299fa2Sopenharmony_ci
69fb299fa2Sopenharmony_ci    auto getInterface = reinterpret_cast<IUpdateInterface *(*)()>(dlsym(handler_, getInstance));
70fb299fa2Sopenharmony_ci    if (getInterface == nullptr) {
71fb299fa2Sopenharmony_ci        LOG(ERROR) << "can not find " << getInstance;
72fb299fa2Sopenharmony_ci        CloseLibrary();
73fb299fa2Sopenharmony_ci        return false;
74fb299fa2Sopenharmony_ci    }
75fb299fa2Sopenharmony_ci
76fb299fa2Sopenharmony_ci    updateInterface_ = getInterface();
77fb299fa2Sopenharmony_ci    if (updateInterface_ == nullptr) {
78fb299fa2Sopenharmony_ci        LOG(ERROR) << "updateInterface_ is null";
79fb299fa2Sopenharmony_ci        CloseLibrary();
80fb299fa2Sopenharmony_ci        return false;
81fb299fa2Sopenharmony_ci    }
82fb299fa2Sopenharmony_ci    LOG(INFO) << "load " << HDI_LIB_NAME << " success";
83fb299fa2Sopenharmony_ci    return true;
84fb299fa2Sopenharmony_ci}
85fb299fa2Sopenharmony_ci
86fb299fa2Sopenharmony_civoid UpdateHdiClient::CloseLibrary()
87fb299fa2Sopenharmony_ci{
88fb299fa2Sopenharmony_ci    if (handler_ == nullptr) {
89fb299fa2Sopenharmony_ci        LOG(INFO) << HDI_LIB_NAME << "is already closed";
90fb299fa2Sopenharmony_ci        return;
91fb299fa2Sopenharmony_ci    }
92fb299fa2Sopenharmony_ci    updateInterface_ = nullptr;
93fb299fa2Sopenharmony_ci    dlclose(handler_);
94fb299fa2Sopenharmony_ci    handler_ = nullptr;
95fb299fa2Sopenharmony_ci    LOG(INFO) << HDI_LIB_NAME << " is closed";
96fb299fa2Sopenharmony_ci}
97fb299fa2Sopenharmony_ci}
98