1 /*
2  * Copyright (C) 2023 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 #include "nfc_data_share_impl.h"
16 #include "loghelper.h"
17 #include "iremote_broker.h"
18 #include "iremote_stub.h"
19 
20 namespace OHOS {
21 namespace NFC {
NfcDataShareImpl()22 NfcDataShareImpl::NfcDataShareImpl()
23 {
24     CreateDataShareHelper();
25 }
26 
~NfcDataShareImpl()27 NfcDataShareImpl::~NfcDataShareImpl()
28 {
29     remoteObj_ = nullptr;
30 }
31 
CreateDataShareHelper()32 std::shared_ptr<DataShare::DataShareHelper> NfcDataShareImpl::CreateDataShareHelper()
33 {
34     std::lock_guard<std::mutex> guard(mutex_);
35     if (remoteObj_ == nullptr) {
36         WarnLog("%{public}s: remoteObject is nullptr, reInitialize.", __func__);
37         auto remote = sptr<INfcState>(new (std::nothrow) IRemoteStub<INfcState>());
38         if (remote == nullptr) {
39             ErrorLog("%{public}s: get remoteObject fail.", __func__);
40             return nullptr;
41         }
42         remoteObj_ = remote->AsObject();
43     }
44     return DataShare::DataShareHelper::Creator(remoteObj_, KITS::NFC_DATA_URI);
45 }
46 
GetValue(Uri & uri,const std::string & column,int32_t & value)47 KITS::ErrorCode NfcDataShareImpl::GetValue(Uri &uri, const std::string &column, int32_t &value)
48 {
49     if (dataShareHelper_ == nullptr) {
50         ErrorLog("%{public}s: dataShareHelper_ is nullptr, retry init.", __func__);
51         dataShareHelper_ = CreateDataShareHelper();
52         if (dataShareHelper_ == nullptr) {
53             ErrorLog("%{public}s: dataShareHelper_ is nullptr, retry init failed.", __func__);
54             return KITS::ERR_NFC_DATABASE_RW;
55         }
56     }
57     DataShare::DataSharePredicates predicates;
58     std::vector<std::string> columns;
59     predicates.EqualTo(KITS::NFC_DATA_COLUMN_KEYWORD, column);
60     auto rows = dataShareHelper_->Query(uri, predicates, columns);
61     if (rows == nullptr) {
62         ErrorLog("%{public}s: can't get rows.", __func__);
63         return KITS::ERR_NFC_DATABASE_RW;
64     }
65     rows->GoToFirstRow();
66     int32_t columnIndex;
67     rows->GetColumnIndex(KITS::NFC_DATA_COLUMN_VALUE, columnIndex);
68     std::string valueStr;
69     int32_t result = rows->GetString(columnIndex, valueStr);
70     if (result != KITS::ERR_NONE) {
71         ErrorLog("%{public}s: can't get value.", __func__);
72         return KITS::ERR_NFC_DATABASE_RW;
73     }
74     rows->Close();
75     value = atoi(valueStr.c_str());
76     InfoLog("GetValue success, value = %{public}d.", value);
77     return KITS::ERR_NONE;
78 }
79 
SetValue(Uri & uri,const std::string & column,int & value)80 KITS::ErrorCode NfcDataShareImpl::SetValue(Uri &uri, const std::string &column, int &value)
81 {
82     if (dataShareHelper_ == nullptr) {
83         ErrorLog("%{public}s: dataShareHelper_ is nullptr, retry init.", __func__);
84         dataShareHelper_ = CreateDataShareHelper();
85         if (dataShareHelper_ == nullptr) {
86             ErrorLog("%{public}s: dataShareHelper_ is nullptr, retry init failed.", __func__);
87             return KITS::ERR_NFC_DATABASE_RW;
88         }
89     }
90     int oldVal = 0;
91     int errorCode = GetValue(uri, column, oldVal);
92     DataShare::DataShareValueObject keyObj(column);
93     DataShare::DataShareValueObject valueObj(std::to_string(value));
94     DataShare::DataShareValuesBucket bucket;
95     bucket.Put(KITS::NFC_DATA_COLUMN_VALUE, valueObj);
96     bucket.Put(KITS::NFC_DATA_COLUMN_KEYWORD, keyObj);
97     int32_t result;
98     if (errorCode != KITS::ERR_NONE) {
99         result = dataShareHelper_->Insert(uri, bucket);
100     } else {
101         DataShare::DataSharePredicates predicates;
102         predicates.EqualTo(KITS::NFC_DATA_COLUMN_KEYWORD, column);
103         result = dataShareHelper_->Update(uri, predicates, bucket);
104     }
105     // INVALID_VALUE is -1 DataShare's errorCode
106     if (result == KITS::DATA_SHARE_INVALID_VALUE) {
107         ErrorLog("%{public}s: can't set value.", __func__);
108         return KITS::ERR_NFC_DATABASE_RW;
109     }
110     return KITS::ERR_NONE;
111 }
112 } // NFC
113 } // OHOS