1 /*
2 * Copyright (c) 2025 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
16 #include "local_service_info_manager.h"
17
18 #include "distributed_device_profile_constants.h"
19 #include "distributed_device_profile_errors.h"
20 #include "distributed_device_profile_log.h"
21 #include "dp_services_constants.h"
22 #include "local_service_info.h"
23 #include "local_service_info_rdb_adapter.h"
24
25 namespace OHOS {
26 namespace DistributedDeviceProfile {
27 IMPLEMENT_SINGLE_INSTANCE(LocalServiceInfoManager)
28
29 namespace {
30 const std::string TAG = "LocalServiceInfoManager";
31 }
32
Init()33 int32_t LocalServiceInfoManager::Init()
34 {
35 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().Init();
36 if (ret != DP_SUCCESS) {
37 HILOGE("LocalServiceInfoRdbAdapter Init failed");
38 return DP_INIT_DB_FAILED;
39 }
40 CreateTable();
41 CreateIndex();
42 HILOGI("end!");
43 return DP_SUCCESS;
44 }
45
UnInit()46 int32_t LocalServiceInfoManager::UnInit()
47 {
48 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().UnInit();
49 if (ret != DP_SUCCESS) {
50 HILOGE("LocalServiceInfoRdbAdapter UnInit failed");
51 return DP_UNINIT_FAIL;
52 }
53 return DP_SUCCESS;
54 }
55
CreateTable()56 int32_t LocalServiceInfoManager::CreateTable()
57 {
58 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().CreateTable(CREATE_LOCAL_SERVICE_INFO_TABLE_SQL);
59 if (ret != DP_SUCCESS) {
60 HILOGE("local_service_Info create failed");
61 return DP_CREATE_TABLE_FAIL;
62 }
63 return DP_SUCCESS;
64 }
65
CreateIndex()66 int32_t LocalServiceInfoManager::CreateIndex()
67 {
68 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().CreateTable(
69 CREATE_LOCAL_SERVICE_INFO_TABLE_UNIQUE_INDEX_SQL);
70 if (ret != DP_SUCCESS) {
71 HILOGE("local_service_Info unique index create failed");
72 return DP_CREATE_UNIQUE_INDEX_FAIL;
73 }
74 return DP_SUCCESS;
75 }
76
PutLocalServiceInfo(const LocalServiceInfo & localServiceInfo)77 int32_t LocalServiceInfoManager::PutLocalServiceInfo(const LocalServiceInfo& localServiceInfo)
78 {
79 if (localServiceInfo.GetBundleName().empty() || localServiceInfo.GetPinExchangeType() == 0) {
80 HILOGE("Invalid parameter");
81 return DP_INVALID_PARAM;
82 }
83 ValuesBucket values;
84 LocalServiceInfoToEntries(localServiceInfo, values);
85 int64_t rowId = ROWID_INIT;
86 int32_t ret = RET_INIT;
87 std::string bundleName = localServiceInfo.GetBundleName();
88 int32_t pinExchangeType = localServiceInfo.GetPinExchangeType();
89 LocalServiceInfo oldBusInfo;
90 int32_t getRet = GetLocalServiceInfoByBundleAndPinType(bundleName, pinExchangeType, oldBusInfo);
91 if (getRet == DP_SUCCESS) {
92 HILOGI("localserviceInfo already exit");
93 return DP_LOCAL_SERVICE_INFO_EXISTS;
94 }
95 ret = LocalServiceInfoRdbAdapter::GetInstance().Put(rowId, LOCAL_SERVICE_INFO_TABLE, values);
96 if (ret != DP_SUCCESS) {
97 HILOGE("%{public}s insert failed", LOCAL_SERVICE_INFO_TABLE.c_str());
98 return DP_PUT_LOCAL_SERVICE_INFO_FAIL;
99 }
100 HILOGI("end!");
101 return DP_SUCCESS;
102 }
103
DeleteLocalServiceInfo(const std::string & bundleName,int32_t pinExchangeType)104 int32_t LocalServiceInfoManager::DeleteLocalServiceInfo(const std::string& bundleName, int32_t pinExchangeType)
105 {
106 if (bundleName.empty() || pinExchangeType == 0) {
107 HILOGE("Invalid parameter");
108 return DP_INVALID_PARAM;
109 }
110 LocalServiceInfo oldBusInfo;
111 int32_t getRet = GetLocalServiceInfoByBundleAndPinType(bundleName, pinExchangeType, oldBusInfo);
112 if (getRet == DP_NOT_FIND_DATA) {
113 HILOGI("LocalServiceInfo not exit, doesn't need delete");
114 return DP_SUCCESS;
115 }
116 if (getRet != DP_SUCCESS) {
117 HILOGE("GetLocalServiceInfo filed");
118 return getRet;
119 }
120 int32_t deleteRows = DELETEROWS_INIT;
121 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().Delete(deleteRows, LOCAL_SERVICE_INFO_TABLE,
122 LOCAL_SERVICE_INFO_UNIQUE_INDEX_EQUAL_CONDITION,
123 std::vector<ValueObject>{ValueObject(bundleName), ValueObject(pinExchangeType)});
124 if (ret != DP_SUCCESS) {
125 HILOGE("delete %{public}s data failed", LOCAL_SERVICE_INFO_TABLE.c_str());
126 return DP_DELETE_LOCAL_SERVICE_INFO_FAIL;
127 }
128 HILOGI("end!");
129 return DP_SUCCESS;
130 }
131
UpdateLocalServiceInfo(const LocalServiceInfo & localServiceInfo)132 int32_t LocalServiceInfoManager::UpdateLocalServiceInfo(const LocalServiceInfo& localServiceInfo)
133 {
134 if (localServiceInfo.GetBundleName().empty() || localServiceInfo.GetPinExchangeType() == 0) {
135 HILOGE("Invalid parameter");
136 return DP_INVALID_PARAM;
137 }
138 LocalServiceInfo serInfo;
139 std::string bundleName = localServiceInfo.GetBundleName();
140 int32_t pinExchangeType = localServiceInfo.GetPinExchangeType();
141 int32_t getRet = GetLocalServiceInfoByBundleAndPinType(bundleName, pinExchangeType, serInfo);
142 if (getRet == DP_NOT_FIND_DATA) {
143 HILOGE("localserviceInfo not exit, can't update");
144 return getRet;
145 }
146 if (getRet != DP_SUCCESS) {
147 HILOGI("GetLocalServiceInfoByBundleAndPinType failed");
148 return getRet;
149 }
150 ValuesBucket values;
151 LocalServiceInfoToEntries(localServiceInfo, values);
152 int32_t changeRowCnt = CHANGEROWCNT_INIT;
153 int32_t ret = LocalServiceInfoRdbAdapter::GetInstance().Update(changeRowCnt, LOCAL_SERVICE_INFO_TABLE, values,
154 LOCAL_SERVICE_INFO_UNIQUE_INDEX_EQUAL_CONDITION,
155 std::vector<ValueObject>{ValueObject(bundleName), ValueObject(pinExchangeType)});
156 if (ret != DP_SUCCESS) {
157 HILOGE("Update %{public}s table failed", LOCAL_SERVICE_INFO_TABLE.c_str());
158 return DP_UPDATE_LOCAL_SERVICE_INFO_FAIL;
159 }
160 HILOGI("end!");
161 return DP_SUCCESS;
162 }
163
GetLocalServiceInfoByBundleAndPinType(const std::string & bundleName,int32_t pinExchangeType,LocalServiceInfo & localServiceInfo)164 int32_t LocalServiceInfoManager::GetLocalServiceInfoByBundleAndPinType(const std::string& bundleName,
165 int32_t pinExchangeType, LocalServiceInfo& localServiceInfo)
166 {
167 if (bundleName.empty() || pinExchangeType == 0) {
168 HILOGE("Invalid parameter");
169 return DP_INVALID_PARAM;
170 }
171 std::vector<ValueObject> condition;
172 condition.emplace_back(ValueObject(bundleName));
173 condition.emplace_back(ValueObject(pinExchangeType));
174 std::shared_ptr<ResultSet> resultSet = LocalServiceInfoRdbAdapter::GetInstance().Get(
175 SELECT_LOCAL_SERVICE_INFO_WHERE_BUNDLENAME_PINEXCHANGETYPE, condition);
176 if (resultSet == nullptr) {
177 HILOGE("resultSet is nullptr");
178 return DP_GET_RESULTSET_FAIL;
179 }
180 int32_t rowCount = ROWCOUNT_INIT;
181 resultSet->GetRowCount(rowCount);
182 if (rowCount == 0) {
183 HILOGE("by condition not find data");
184 resultSet->Close();
185 return DP_NOT_FIND_DATA;
186 }
187 int32_t ret = resultSet->GoToNextRow();
188 if (ret != DP_SUCCESS) {
189 HILOGE("get localserviceInfo failed");
190 resultSet->Close();
191 return DP_NOT_FIND_DATA;
192 }
193 ConvertToLocalServiceInfo(resultSet, localServiceInfo);
194 resultSet->Close();
195 HILOGI("end!");
196 return DP_SUCCESS;
197 }
198
ConvertToLocalServiceInfo(std::shared_ptr<ResultSet> resultSet,LocalServiceInfo & LocalServiceInfo)199 int32_t LocalServiceInfoManager::ConvertToLocalServiceInfo(std::shared_ptr<ResultSet> resultSet,
200 LocalServiceInfo& LocalServiceInfo)
201 {
202 if (resultSet == nullptr) {
203 HILOGE("resultSet is nullptr");
204 return DP_GET_RESULTSET_FAIL;
205 }
206 RowEntity rowEntity;
207 if (resultSet->GetRow(rowEntity) != DP_SUCCESS) {
208 HILOGE("get resultSet failed");
209 return DP_GET_RESULTSET_FAIL;
210 }
211 LocalServiceInfo.SetBundleName(rowEntity.Get(BUNDLE_NAME));
212 LocalServiceInfo.SetAuthBoxType(rowEntity.Get(AUTH_BOX_TYPE));
213 LocalServiceInfo.SetAuthType(rowEntity.Get(AUTH_TYPE));
214 LocalServiceInfo.SetPinExchangeType(rowEntity.Get(PIN_EXCHANGE_TYPE));
215 LocalServiceInfo.SetPinCode(rowEntity.Get(PINCODE));
216 LocalServiceInfo.SetDescription(rowEntity.Get(DESCRIPTION));
217 LocalServiceInfo.SetExtraInfo(rowEntity.Get(EXTRAINFO));
218 return DP_SUCCESS;
219 }
220
LocalServiceInfoToEntries(const LocalServiceInfo & LocalServiceInfo,ValuesBucket & values)221 int32_t LocalServiceInfoManager::LocalServiceInfoToEntries(const LocalServiceInfo& LocalServiceInfo,
222 ValuesBucket& values)
223 {
224 values.PutString(BUNDLE_NAME, LocalServiceInfo.GetBundleName());
225 values.PutInt(AUTH_BOX_TYPE, LocalServiceInfo.GetAuthBoxType());
226 values.PutInt(AUTH_TYPE, LocalServiceInfo.GetAuthType());
227 values.PutInt(PIN_EXCHANGE_TYPE, LocalServiceInfo.GetPinExchangeType());
228 values.PutString(PINCODE, LocalServiceInfo.GetPinCode());
229 values.PutString(DESCRIPTION, LocalServiceInfo.GetDescription());
230 values.PutString(EXTRAINFO, LocalServiceInfo.GetExtraInfo());
231 return DP_SUCCESS;
232 }
233 } // namespace DistributedDeviceProfile
234 } // namespace OHOS
235