1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "nfc_impl.h"
17094332d3Sopenharmony_ci#include <hdf_base.h>
18094332d3Sopenharmony_ci#include <hdf_log.h>
19094332d3Sopenharmony_ci#include <iproxy_broker.h>
20094332d3Sopenharmony_ci#include <vector>
21094332d3Sopenharmony_ci#include "nfc_vendor_adaptions.h"
22094332d3Sopenharmony_ci
23094332d3Sopenharmony_ci#define HDF_LOG_TAG hdf_nfc_dal
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_ci#ifdef LOG_DOMAIN
26094332d3Sopenharmony_ci#undef LOG_DOMAIN
27094332d3Sopenharmony_ci#endif
28094332d3Sopenharmony_ci
29094332d3Sopenharmony_ci#define LOG_DOMAIN 0xD000306
30094332d3Sopenharmony_ci
31094332d3Sopenharmony_cinamespace OHOS {
32094332d3Sopenharmony_cinamespace HDI {
33094332d3Sopenharmony_cinamespace Nfc {
34094332d3Sopenharmony_cinamespace V1_1 {
35094332d3Sopenharmony_cistatic sptr<INfcCallback> g_callbackV1_1 = nullptr;
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_cistatic void EventCallback(unsigned char event, unsigned char status)
38094332d3Sopenharmony_ci{
39094332d3Sopenharmony_ci    if (g_callbackV1_1 != nullptr) {
40094332d3Sopenharmony_ci        g_callbackV1_1->OnEvent((NfcEvent)event, (NfcStatus)status);
41094332d3Sopenharmony_ci    }
42094332d3Sopenharmony_ci}
43094332d3Sopenharmony_ci
44094332d3Sopenharmony_cistatic void DataCallback(uint16_t len, uint8_t *data)
45094332d3Sopenharmony_ci{
46094332d3Sopenharmony_ci    if (g_callbackV1_1 != nullptr) {
47094332d3Sopenharmony_ci        std::vector<uint8_t> vec(data, data + len / sizeof(uint8_t));
48094332d3Sopenharmony_ci        g_callbackV1_1->OnData(vec);
49094332d3Sopenharmony_ci    }
50094332d3Sopenharmony_ci}
51094332d3Sopenharmony_ci
52094332d3Sopenharmony_ciextern "C" INfcInterface *NfcInterfaceImplGetInstance(void)
53094332d3Sopenharmony_ci{
54094332d3Sopenharmony_ci    using OHOS::HDI::Nfc::V1_1::NfcImpl;
55094332d3Sopenharmony_ci    NfcImpl *service = new (std::nothrow) NfcImpl();
56094332d3Sopenharmony_ci    if (service == nullptr) {
57094332d3Sopenharmony_ci        return nullptr;
58094332d3Sopenharmony_ci    }
59094332d3Sopenharmony_ci    return service;
60094332d3Sopenharmony_ci}
61094332d3Sopenharmony_ci
62094332d3Sopenharmony_ciNfcImpl::NfcImpl()
63094332d3Sopenharmony_ci{
64094332d3Sopenharmony_ci    remoteDeathRecipient_ =
65094332d3Sopenharmony_ci        new RemoteDeathRecipient(std::bind(&NfcImpl::OnRemoteDied, this, std::placeholders::_1));
66094332d3Sopenharmony_ci}
67094332d3Sopenharmony_ci
68094332d3Sopenharmony_ciNfcImpl::~NfcImpl()
69094332d3Sopenharmony_ci{
70094332d3Sopenharmony_ci    HDF_LOGI("~NfcImpl");
71094332d3Sopenharmony_ci    std::lock_guard<std::mutex> guard(callbacksMutex_);
72094332d3Sopenharmony_ci    if (callbacks_ != nullptr) {
73094332d3Sopenharmony_ci        RemoveNfcDeathRecipient(callbacks_);
74094332d3Sopenharmony_ci        callbacks_ = nullptr;
75094332d3Sopenharmony_ci    }
76094332d3Sopenharmony_ci}
77094332d3Sopenharmony_ci
78094332d3Sopenharmony_ciint32_t NfcImpl::Open(const sptr<INfcCallback> &callbackObj, NfcStatus &status)
79094332d3Sopenharmony_ci{
80094332d3Sopenharmony_ci    HDF_LOGI("NfcImpl::Open");
81094332d3Sopenharmony_ci    std::lock_guard<std::mutex> guard(callbacksMutex_);
82094332d3Sopenharmony_ci    if (callbackObj == nullptr) {
83094332d3Sopenharmony_ci        HDF_LOGE("Open, callback is nullptr!");
84094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
85094332d3Sopenharmony_ci    }
86094332d3Sopenharmony_ci    g_callbackV1_1 = callbackObj;
87094332d3Sopenharmony_ci
88094332d3Sopenharmony_ci    int ret = adaptor_.VendorOpen(EventCallback, DataCallback);
89094332d3Sopenharmony_ci    if (ret == 0) {
90094332d3Sopenharmony_ci        callbacks_ = callbackObj;
91094332d3Sopenharmony_ci        AddNfcDeathRecipient(callbacks_);
92094332d3Sopenharmony_ci        status = NfcStatus::OK;
93094332d3Sopenharmony_ci        return HDF_SUCCESS;
94094332d3Sopenharmony_ci    }
95094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
96094332d3Sopenharmony_ci    return HDF_FAILURE;
97094332d3Sopenharmony_ci}
98094332d3Sopenharmony_ci
99094332d3Sopenharmony_ciint32_t NfcImpl::CoreInitialized(const std::vector<uint8_t> &data, NfcStatus &status)
100094332d3Sopenharmony_ci{
101094332d3Sopenharmony_ci    if (data.empty()) {
102094332d3Sopenharmony_ci        HDF_LOGE("CoreInitialized, data is nullptr!");
103094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
104094332d3Sopenharmony_ci    }
105094332d3Sopenharmony_ci    int ret = adaptor_.VendorCoreInitialized(data.size(), (uint8_t *)&data[0]);
106094332d3Sopenharmony_ci    if (ret == 0) {
107094332d3Sopenharmony_ci        status = NfcStatus::OK;
108094332d3Sopenharmony_ci        return HDF_SUCCESS;
109094332d3Sopenharmony_ci    }
110094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
111094332d3Sopenharmony_ci    return HDF_FAILURE;
112094332d3Sopenharmony_ci}
113094332d3Sopenharmony_ci
114094332d3Sopenharmony_ciint32_t NfcImpl::Prediscover(NfcStatus &status)
115094332d3Sopenharmony_ci{
116094332d3Sopenharmony_ci    int ret = adaptor_.VendorPrediscover();
117094332d3Sopenharmony_ci    if (ret == 0) {
118094332d3Sopenharmony_ci        status = NfcStatus::OK;
119094332d3Sopenharmony_ci        return HDF_SUCCESS;
120094332d3Sopenharmony_ci    }
121094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
122094332d3Sopenharmony_ci    return HDF_FAILURE;
123094332d3Sopenharmony_ci}
124094332d3Sopenharmony_ci
125094332d3Sopenharmony_ciint32_t NfcImpl::Write(const std::vector<uint8_t> &data, NfcStatus &status)
126094332d3Sopenharmony_ci{
127094332d3Sopenharmony_ci    if (data.empty()) {
128094332d3Sopenharmony_ci        HDF_LOGE("Write, data is nullptr!");
129094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
130094332d3Sopenharmony_ci    }
131094332d3Sopenharmony_ci    int ret = adaptor_.VendorWrite(data.size(), (uint8_t *)&data[0]);
132094332d3Sopenharmony_ci    if (ret == 0) {
133094332d3Sopenharmony_ci        status = NfcStatus::OK;
134094332d3Sopenharmony_ci        return HDF_SUCCESS;
135094332d3Sopenharmony_ci    }
136094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
137094332d3Sopenharmony_ci    return HDF_FAILURE;
138094332d3Sopenharmony_ci}
139094332d3Sopenharmony_ci
140094332d3Sopenharmony_ciint32_t NfcImpl::ControlGranted(NfcStatus &status)
141094332d3Sopenharmony_ci{
142094332d3Sopenharmony_ci    int ret = adaptor_.VendorControlGranted();
143094332d3Sopenharmony_ci    if (ret == 0) {
144094332d3Sopenharmony_ci        status = NfcStatus::OK;
145094332d3Sopenharmony_ci        return HDF_SUCCESS;
146094332d3Sopenharmony_ci    }
147094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
148094332d3Sopenharmony_ci    return HDF_FAILURE;
149094332d3Sopenharmony_ci}
150094332d3Sopenharmony_ci
151094332d3Sopenharmony_ciint32_t NfcImpl::PowerCycle(NfcStatus &status)
152094332d3Sopenharmony_ci{
153094332d3Sopenharmony_ci    int ret = adaptor_.VendorPowerCycle();
154094332d3Sopenharmony_ci    if (ret == 0) {
155094332d3Sopenharmony_ci        status = NfcStatus::OK;
156094332d3Sopenharmony_ci        return HDF_SUCCESS;
157094332d3Sopenharmony_ci    }
158094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
159094332d3Sopenharmony_ci    return HDF_FAILURE;
160094332d3Sopenharmony_ci}
161094332d3Sopenharmony_ci
162094332d3Sopenharmony_ciint32_t NfcImpl::Close(NfcStatus &status)
163094332d3Sopenharmony_ci{
164094332d3Sopenharmony_ci    HDF_LOGI("NfcImpl::Close");
165094332d3Sopenharmony_ci    std::lock_guard<std::mutex> guard(callbacksMutex_);
166094332d3Sopenharmony_ci    int ret = adaptor_.VendorClose(false);
167094332d3Sopenharmony_ci    g_callbackV1_1 = nullptr;
168094332d3Sopenharmony_ci    if (callbacks_ != nullptr) {
169094332d3Sopenharmony_ci        RemoveNfcDeathRecipient(callbacks_);
170094332d3Sopenharmony_ci        callbacks_ = nullptr;
171094332d3Sopenharmony_ci    }
172094332d3Sopenharmony_ci    if (ret == 0) {
173094332d3Sopenharmony_ci        status = NfcStatus::OK;
174094332d3Sopenharmony_ci        return HDF_SUCCESS;
175094332d3Sopenharmony_ci    }
176094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
177094332d3Sopenharmony_ci    return HDF_FAILURE;
178094332d3Sopenharmony_ci}
179094332d3Sopenharmony_ci
180094332d3Sopenharmony_ciint32_t NfcImpl::Ioctl(NfcCommand cmd, const std::vector<uint8_t> &data, NfcStatus &status)
181094332d3Sopenharmony_ci{
182094332d3Sopenharmony_ci    if (data.empty()) {
183094332d3Sopenharmony_ci        HDF_LOGE("Ioctl, data is nullptr!");
184094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
185094332d3Sopenharmony_ci    }
186094332d3Sopenharmony_ci    int ret = adaptor_.VendorIoctl(data.size(), (uint8_t *)&data[0]);
187094332d3Sopenharmony_ci    if (ret == 0) {
188094332d3Sopenharmony_ci        status = NfcStatus::OK;
189094332d3Sopenharmony_ci        return HDF_SUCCESS;
190094332d3Sopenharmony_ci    }
191094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
192094332d3Sopenharmony_ci    return HDF_FAILURE;
193094332d3Sopenharmony_ci}
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_ciint32_t NfcImpl::IoctlWithResponse(NfcCommand cmd, const std::vector<uint8_t> &data,
196094332d3Sopenharmony_ci    std::vector<uint8_t> &response, NfcStatus &status)
197094332d3Sopenharmony_ci{
198094332d3Sopenharmony_ci    if (data.empty()) {
199094332d3Sopenharmony_ci        HDF_LOGE("NfcImpl::IoctlWithResponse, data is nullptr!");
200094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci    int ret = adaptor_.VendorIoctlWithResponse(cmd, (void*)&data[0], data.size(), response);
203094332d3Sopenharmony_ci    if (ret == 0) {
204094332d3Sopenharmony_ci        status = NfcStatus::OK;
205094332d3Sopenharmony_ci        return HDF_SUCCESS;
206094332d3Sopenharmony_ci    }
207094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
208094332d3Sopenharmony_ci    return HDF_FAILURE;
209094332d3Sopenharmony_ci}
210094332d3Sopenharmony_ci
211094332d3Sopenharmony_ciint32_t NfcImpl::GetVendorConfig(NfcVendorConfig &config, NfcStatus &status)
212094332d3Sopenharmony_ci{
213094332d3Sopenharmony_ci    if (adaptor_.VendorGetConfig(config) != HDF_SUCCESS) {
214094332d3Sopenharmony_ci        HDF_LOGE("GetConfig, fail to get vendor config!");
215094332d3Sopenharmony_ci        status = NfcStatus::FAILED;
216094332d3Sopenharmony_ci        return HDF_FAILURE;
217094332d3Sopenharmony_ci    }
218094332d3Sopenharmony_ci    status = NfcStatus::OK;
219094332d3Sopenharmony_ci    return HDF_SUCCESS;
220094332d3Sopenharmony_ci}
221094332d3Sopenharmony_ci
222094332d3Sopenharmony_ciint32_t NfcImpl::DoFactoryReset(NfcStatus &status)
223094332d3Sopenharmony_ci{
224094332d3Sopenharmony_ci    int ret = adaptor_.VendorFactoryReset();
225094332d3Sopenharmony_ci    if (ret == 0) {
226094332d3Sopenharmony_ci        status = NfcStatus::OK;
227094332d3Sopenharmony_ci        return HDF_SUCCESS;
228094332d3Sopenharmony_ci    }
229094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
230094332d3Sopenharmony_ci    return HDF_FAILURE;
231094332d3Sopenharmony_ci}
232094332d3Sopenharmony_ci
233094332d3Sopenharmony_ciint32_t NfcImpl::Shutdown(NfcStatus &status)
234094332d3Sopenharmony_ci{
235094332d3Sopenharmony_ci    int ret = adaptor_.VendorShutdownCase();
236094332d3Sopenharmony_ci    if (ret == 0) {
237094332d3Sopenharmony_ci        status = NfcStatus::OK;
238094332d3Sopenharmony_ci        return HDF_SUCCESS;
239094332d3Sopenharmony_ci    }
240094332d3Sopenharmony_ci    status = NfcStatus::FAILED;
241094332d3Sopenharmony_ci    return HDF_FAILURE;
242094332d3Sopenharmony_ci}
243094332d3Sopenharmony_ci
244094332d3Sopenharmony_civoid NfcImpl::OnRemoteDied(const wptr<IRemoteObject> &object)
245094332d3Sopenharmony_ci{
246094332d3Sopenharmony_ci    HDF_LOGW("NfcImpl::OnRemoteDied");
247094332d3Sopenharmony_ci    {
248094332d3Sopenharmony_ci        std::lock_guard<std::mutex> guard(callbacksMutex_);
249094332d3Sopenharmony_ci        callbacks_ = nullptr;
250094332d3Sopenharmony_ci    }
251094332d3Sopenharmony_ci    NfcStatus status = NfcStatus::FAILED;
252094332d3Sopenharmony_ci    int32_t ret = Close(status);
253094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
254094332d3Sopenharmony_ci        HDF_LOGE("OnRemoteDied, Close failed, status(%{public}d)!", status);
255094332d3Sopenharmony_ci    }
256094332d3Sopenharmony_ci}
257094332d3Sopenharmony_ci
258094332d3Sopenharmony_ciint32_t NfcImpl::AddNfcDeathRecipient(const sptr<INfcCallback> &callbackObj)
259094332d3Sopenharmony_ci{
260094332d3Sopenharmony_ci    if (callbackObj == nullptr) {
261094332d3Sopenharmony_ci        HDF_LOGE("AddNfcDeathRecipient callbackobj nullptr");
262094332d3Sopenharmony_ci        return HDF_FAILURE;
263094332d3Sopenharmony_ci    }
264094332d3Sopenharmony_ci    const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<INfcCallback>(callbackObj);
265094332d3Sopenharmony_ci    if (remote == nullptr) {
266094332d3Sopenharmony_ci        HDF_LOGE("AddNfcDeathRecipient remote nullptr");
267094332d3Sopenharmony_ci        return HDF_FAILURE;
268094332d3Sopenharmony_ci    }
269094332d3Sopenharmony_ci    bool result = remote->AddDeathRecipient(remoteDeathRecipient_);
270094332d3Sopenharmony_ci    if (!result) {
271094332d3Sopenharmony_ci        HDF_LOGE("NfcImpl AddDeathRecipient failed!");
272094332d3Sopenharmony_ci        return HDF_FAILURE;
273094332d3Sopenharmony_ci    }
274094332d3Sopenharmony_ci    return HDF_SUCCESS;
275094332d3Sopenharmony_ci}
276094332d3Sopenharmony_ci
277094332d3Sopenharmony_ciint32_t NfcImpl::RemoveNfcDeathRecipient(const sptr<INfcCallback> &callbackObj)
278094332d3Sopenharmony_ci{
279094332d3Sopenharmony_ci    if (callbackObj == nullptr) {
280094332d3Sopenharmony_ci        HDF_LOGE("RemoveNfcDeathRecipient callbackobj nullptr");
281094332d3Sopenharmony_ci        return HDF_FAILURE;
282094332d3Sopenharmony_ci    }
283094332d3Sopenharmony_ci    const sptr<IRemoteObject> &remote = OHOS::HDI::hdi_objcast<INfcCallback>(callbackObj);
284094332d3Sopenharmony_ci    if (remote == nullptr) {
285094332d3Sopenharmony_ci        HDF_LOGE("RemoveNfcDeathRecipient remote nullptr");
286094332d3Sopenharmony_ci        return HDF_FAILURE;
287094332d3Sopenharmony_ci    }
288094332d3Sopenharmony_ci    bool result = remote->RemoveDeathRecipient(remoteDeathRecipient_);
289094332d3Sopenharmony_ci    if (!result) {
290094332d3Sopenharmony_ci        HDF_LOGE("NfcImpl RemoveDeathRecipient failed!");
291094332d3Sopenharmony_ci        return HDF_FAILURE;
292094332d3Sopenharmony_ci    }
293094332d3Sopenharmony_ci    return HDF_SUCCESS;
294094332d3Sopenharmony_ci}
295094332d3Sopenharmony_ci} // V1_1
296094332d3Sopenharmony_ci} // Nfc
297094332d3Sopenharmony_ci} // HDI
298094332d3Sopenharmony_ci} // OHOS
299