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