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 "loghelper.h"
16 #include "iremote_broker.h"
17 #include "iremote_stub.h"
18 #include "setting_data_share_impl.h"
19 namespace OHOS {
20 namespace NFC {
SettingDataShareImpl()21 OHOS::NFC::SettingDataShareImpl::SettingDataShareImpl()
22 {
23 Initialize();
24 }
~SettingDataShareImpl()25 SettingDataShareImpl::~SettingDataShareImpl()
26 {
27 remoteObj_ = nullptr;
28 }
RegisterDataObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)29 KITS::ErrorCode SettingDataShareImpl::RegisterDataObserver(const Uri& uri,
30 const sptr<AAFwk::IDataAbilityObserver>& dataObserver)
31 {
32 if (dataObserver == nullptr) {
33 ErrorLog("%{public}s: dataObserver is nullptr.", __func__);
34 return KITS::ERR_NFC_DATABASE_RW;
35 }
36 if (dataShareHelper_ == nullptr) {
37 ErrorLog("%{public}s: dataShareHelper_ is nullptr.", __func__);
38 Initialize();
39 if (dataShareHelper_ == nullptr) {
40 ErrorLog("%{public}s: dataShareHelper_ is nullptr. Retry failed.", __func__);
41 return KITS::ERR_NFC_DATABASE_RW;
42 }
43 }
44 dataShareHelper_->RegisterObserver(uri, dataObserver);
45 return KITS::ERR_NONE;
46 }
ReleaseDataObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)47 KITS::ErrorCode SettingDataShareImpl::ReleaseDataObserver(const Uri& uri,
48 const sptr<AAFwk::IDataAbilityObserver>& dataObserver)
49 {
50 if (dataShareHelper_ == nullptr) {
51 ErrorLog("%{public}s: dataShareHelper_ is nullptr.", __func__);
52 Initialize();
53 if (dataShareHelper_ == nullptr) {
54 ErrorLog("%{public}s: dataShareHelper_ is nullptr. Retry failed.", __func__);
55 return KITS::ERR_NFC_DATABASE_RW;
56 }
57 }
58 dataShareHelper_->UnregisterObserver(uri, dataObserver);
59 return KITS::ERR_NONE;
60 }
GetElementName(Uri & uri,const std::string & column,ElementName & value)61 KITS::ErrorCode SettingDataShareImpl::GetElementName(Uri& uri, const std::string& column, ElementName& value)
62 {
63 if (dataShareHelper_ == nullptr) {
64 ErrorLog("%{public}s: dataShareHelper_ is nullptr.", __func__);
65 Initialize();
66 if (dataShareHelper_ == nullptr) {
67 ErrorLog("%{public}s: dataShareHelper_ is nullptr. Retry failed.", __func__);
68 return KITS::ERR_NFC_DATABASE_RW;
69 }
70 }
71 DataShare::DataSharePredicates predicates;
72 std::vector<std::string> columns;
73 predicates.EqualTo(KITS::NFC_DATA_COLUMN_KEYWORD, column);
74 auto rows = dataShareHelper_->Query(uri, predicates, columns);
75 if (rows == nullptr) {
76 ErrorLog("%{public}s: can't get rows.", __func__);
77 return KITS::ERR_NFC_DATABASE_RW;
78 }
79 rows->GoToFirstRow();
80 int32_t columnIndex;
81 rows->GetColumnIndex(KITS::NFC_DATA_COLUMN_VALUE, columnIndex);
82 std::string valueStr;
83 int32_t ret = rows->GetString(columnIndex, valueStr);
84 if (ret != KITS::ERR_NONE) {
85 ErrorLog("%{public}s: can't get value.", __func__);
86 return KITS::ERR_NFC_DATABASE_RW;
87 }
88 rows->Close();
89 ParseElementURI(valueStr, value);
90 InfoLog("%{public}s: success, value = %{public}s, element = %{public}s.", __func__, valueStr.c_str(),
91 value.GetURI().c_str());
92 return KITS::ERR_NONE;
93 }
94
ParseElementURI(const std::string & uri,ElementName & value)95 bool SettingDataShareImpl::ParseElementURI(const std::string& uri, ElementName& value)
96 {
97 const size_t memberNum = 2;
98 if (std::count(uri.begin(), uri.end(), '/') != memberNum - 1) {
99 ErrorLog("Invalid uri: %{public}s.", uri.c_str());
100 return false;
101 }
102
103 std::vector<std::string> uriVec;
104 Split(uri, "/", uriVec);
105 uriVec.resize(memberNum);
106
107 int index = 0;
108 value.SetBundleName(uriVec[index++]);
109 value.SetAbilityName(uriVec[index++]);
110 return true;
111 }
112
Split(const std::string & str,const std::string & delim,std::vector<std::string> & vec)113 void SettingDataShareImpl::Split(const std::string& str, const std::string& delim, std::vector<std::string>& vec)
114 {
115 std::string::size_type pos1 = 0;
116 std::string::size_type pos2 = str.find(delim);
117 while (std::string::npos != pos2) {
118 vec.push_back(str.substr(pos1, pos2 - pos1));
119 pos1 = pos2 + delim.size();
120 pos2 = str.find(delim, pos1);
121 }
122 if (pos1 != str.size()) {
123 vec.push_back(str.substr(pos1));
124 }
125 }
SetElementName(Uri & uri,const std::string & column,ElementName & value)126 KITS::ErrorCode SettingDataShareImpl::SetElementName(Uri& uri, const std::string& column, ElementName& value)
127 {
128 if (dataShareHelper_ == nullptr) {
129 ErrorLog("%{public}s: dataShareHelper_ is nullptr.", __func__);
130 Initialize();
131 if (dataShareHelper_ == nullptr) {
132 ErrorLog("%{public}s: dataShareHelper_ is nullptr. Retry failed.", __func__);
133 return KITS::ERR_NFC_DATABASE_RW;
134 }
135 }
136 ElementName oldVal;
137 int errorCode = GetElementName(uri, column, oldVal);
138 DataShare::DataShareValueObject keyObj(column);
139 DataShare::DataShareValueObject valueObj(value.GetURI());
140 DataShare::DataShareValuesBucket bucket;
141 bucket.Put(KITS::NFC_DATA_COLUMN_VALUE, valueObj);
142 bucket.Put(KITS::NFC_DATA_COLUMN_KEYWORD, keyObj);
143 int32_t result;
144 if (errorCode != KITS::ERR_NONE) {
145 result = dataShareHelper_->Insert(uri, bucket);
146 } else {
147 DataShare::DataSharePredicates predicates;
148 predicates.EqualTo(KITS::NFC_DATA_COLUMN_KEYWORD, column);
149 result = dataShareHelper_->Update(uri, predicates, bucket);
150 }
151 // INVALID_VALUE is -1 DataShare's errorCode
152 if (result == KITS::DATA_SHARE_INVALID_VALUE) {
153 ErrorLog("%{public}s: can't set value.", __func__);
154 return KITS::ERR_NFC_DATABASE_RW;
155 }
156 return KITS::ERR_NONE;
157 }
CreateDataShareHelper()158 std::shared_ptr<DataShare::DataShareHelper> SettingDataShareImpl::CreateDataShareHelper()
159 {
160 if (remoteObj_ == nullptr) {
161 ErrorLog("%{public}s: remoteObject is nullptr, reInitialize.", __func__);
162 Initialize();
163 }
164 return DataShare::DataShareHelper::Creator(remoteObj_, KITS::NFC_DATA_URI_PAYMENT_DEFAULT_APP);
165 }
Initialize()166 void SettingDataShareImpl::Initialize()
167 {
168 auto remote = sptr<ISettingData>(new (std::nothrow) IRemoteStub<ISettingData>());
169 if (remote == nullptr) {
170 ErrorLog("%{public}s: remoteObject is nullptr.", __func__);
171 return;
172 }
173 remoteObj_ = remote->AsObject();
174 dataShareHelper_ = CreateDataShareHelper();
175 }
176 } // namespace NFC
177 } // namespace OHOS