• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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