1 /*
2 * Copyright (c) 2024 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_device_name_mgr.h"
17
18 #include "data_ability_observer_stub.h"
19 #include "datashare_helper.h"
20 #include "datashare_predicates.h"
21 #include "datashare_result_set.h"
22 #include "ohos_account_kits.h"
23 #include "os_account_manager.h"
24 #include "iservice_registry.h"
25 #include "system_ability_definition.h"
26 #include "uri.h"
27
28 #include "dm_constants.h"
29 #include "dm_log.h"
30 #include "settings_data_event_monitor.h"
31
32 namespace OHOS {
33 namespace DistributedHardware {
34 namespace {
35 const std::string SETTINGS_DATA_BASE_URI =
36 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
37 const std::string SETTINGS_DATA_SECURE_URI =
38 "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_";
39 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
40 constexpr const char *SETTINGS_DATA_FIELD_KEYWORD = "KEYWORD";
41 constexpr const char *SETTINGS_DATA_FIELD_VALUE = "VALUE";
42 constexpr const char *PREDICATES_STRING = "settings.general.device_name";
43 constexpr const char *USER_DEFINED_STRING = "settings.general.user_defined_device_name";
44 constexpr const char *DISPLAY_DEVICE_NAME_STRING = "settings.general.display_device_name";
45 }
46
LocalDeviceNameMgr()47 LocalDeviceNameMgr::LocalDeviceNameMgr() : localDeviceName_(""), localDisplayName_("")
48 {
49 LOGI("Ctor LocalDeviceNameMgr");
50 }
51
~LocalDeviceNameMgr()52 LocalDeviceNameMgr::~LocalDeviceNameMgr()
53 {
54 std::lock_guard<std::mutex> lock(devNameMtx_);
55 localDeviceName_ = "";
56 localDisplayName_ = "";
57 LOGI("Dtor LocalDeviceNameMgr");
58 }
59
GetDataShareHelper()60 std::shared_ptr<DataShare::DataShareHelper> LocalDeviceNameMgr::GetDataShareHelper()
61 {
62 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
63 if (saManager == nullptr) {
64 LOGE("saManager NULL");
65 return nullptr;
66 }
67
68 sptr<IRemoteObject> remoteObject = saManager->GetSystemAbility(DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID);
69 if (remoteObject == nullptr) {
70 LOGE("remoteObject NULL");
71 return nullptr;
72 }
73 return DataShare::DataShareHelper::Creator(remoteObject, SETTINGS_DATA_BASE_URI, SETTINGS_DATA_EXT_URI);
74 }
75
GetDeviceNameFromDataShareHelper( std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::shared_ptr<Uri> uri, const char *key, std::string &deviceName)76 int32_t LocalDeviceNameMgr::GetDeviceNameFromDataShareHelper(
77 std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::shared_ptr<Uri> uri,
78 const char *key, std::string &deviceName)
79 {
80 if (dataShareHelper == nullptr || uri == nullptr || key == nullptr) {
81 LOGE("dataShareHelper or uri or key is null, param is error!");
82 return ERR_DM_FAILED;
83 }
84 int32_t numRows = 0;
85 std::string val;
86 std::vector<std::string> columns;
87 columns.emplace_back(SETTINGS_DATA_FIELD_VALUE);
88 DataShare::DataSharePredicates predicates;
89 predicates.EqualTo(SETTINGS_DATA_FIELD_KEYWORD, key);
90
91 auto resultSet = dataShareHelper->Query(*uri, predicates, columns);
92 if (resultSet == nullptr) {
93 LOGE("query fail.");
94 return ERR_DM_FAILED;
95 }
96 resultSet->GetRowCount(numRows);
97 if (numRows <= 0) {
98 LOGE("row zero.");
99 resultSet->Close();
100 return ERR_DM_FAILED;
101 }
102
103 int columnIndex;
104 resultSet->GoToFirstRow();
105 resultSet->GetColumnIndex(SETTINGS_DATA_FIELD_VALUE, columnIndex);
106 if (resultSet->GetString(columnIndex, val) != DM_OK) {
107 LOGE("GetString val fail");
108 resultSet->Close();
109 return ERR_DM_FAILED;
110 }
111 deviceName = val;
112 LOGI("deviceName=%{public}s.", deviceName.c_str());
113 resultSet->Close();
114 return DM_OK;
115 }
116
GetDefaultDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::string &deviceName)117 int32_t LocalDeviceNameMgr::GetDefaultDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
118 std::string &deviceName)
119 {
120 if (dataShareHelper == nullptr) {
121 LOGE("dataShareHelper is null, param is error!");
122 return ERR_DM_FAILED;
123 }
124 std::shared_ptr<Uri> uri = std::make_shared<Uri>(SETTINGS_DATA_BASE_URI + "&key=" + PREDICATES_STRING);
125 LOGI("get default deviceName");
126 return GetDeviceNameFromDataShareHelper(dataShareHelper, uri, PREDICATES_STRING, deviceName);
127 }
128
GetUserDefinedDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::string &deviceName)129 int32_t LocalDeviceNameMgr::GetUserDefinedDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
130 std::string &deviceName)
131 {
132 if (dataShareHelper == nullptr) {
133 LOGE("dataShareHelper is null, param is error!");
134 return ERR_DM_FAILED;
135 }
136 int32_t osAccountId = GetActiveOsAccountIds();
137 if (osAccountId == ERR_DM_FAILED) {
138 LOGE("osAccountId acquire fail!");
139 return ERR_DM_FAILED;
140 }
141 std::string accountIdStr = std::to_string(osAccountId);
142 std::shared_ptr<Uri> uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr + "?Proxy=true&key=" +
143 USER_DEFINED_STRING);
144 LOGI("get user defined deviceName, accountId=%{public}s", accountIdStr.c_str());
145 return GetDeviceNameFromDataShareHelper(dataShareHelper, uri, USER_DEFINED_STRING, deviceName);
146 }
147
GetDisplayDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper, std::string &deviceName)148 int32_t LocalDeviceNameMgr::GetDisplayDeviceName(std::shared_ptr<DataShare::DataShareHelper> dataShareHelper,
149 std::string &deviceName)
150 {
151 if (dataShareHelper == nullptr) {
152 LOGE("dataShareHelper is null, param is error!");
153 return ERR_DM_FAILED;
154 }
155 int32_t osAccountId = GetActiveOsAccountIds();
156 if (osAccountId == ERR_DM_FAILED) {
157 LOGE("osAccountId acquire fail!");
158 return ERR_DM_FAILED;
159 }
160 std::string accountIdStr = std::to_string(osAccountId);
161 std::shared_ptr<Uri> uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr + "?Proxy=true&key=" +
162 DISPLAY_DEVICE_NAME_STRING);
163 LOGI("get user defined deviceName, accountId=%{public}s", accountIdStr.c_str());
164 return GetDeviceNameFromDataShareHelper(dataShareHelper, uri, DISPLAY_DEVICE_NAME_STRING, deviceName);
165 }
166
GetActiveOsAccountIds()167 int32_t LocalDeviceNameMgr::GetActiveOsAccountIds()
168 {
169 std::vector<int32_t> accountId;
170 int32_t ret = OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(accountId);
171 if (ret != DM_OK || accountId.empty()) {
172 LOGE("QueryActiveOsAccountIds failed");
173 return ERR_DM_FAILED;
174 }
175 LOGI("account id=%{public}d", accountId[0]);
176 return accountId[0];
177 }
178
QueryLocalDeviceName()179 int32_t LocalDeviceNameMgr::QueryLocalDeviceName()
180 {
181 LOGI("start");
182 auto dataShareHelper = GetDataShareHelper();
183 if (dataShareHelper == nullptr) {
184 LOGE("dataShareHelper is null");
185 return ERR_DM_FAILED;
186 }
187 std::string localDeviceName = "";
188 int32_t ret = GetUserDefinedDeviceName(dataShareHelper, localDeviceName);
189 if (ret == DM_OK && !localDeviceName.empty()) {
190 std::lock_guard<std::mutex> lock(devNameMtx_);
191 localDeviceName_ = localDeviceName;
192 dataShareHelper->Release();
193 LOGI("get user defined deviceName=%{public}s", localDeviceName.c_str());
194 return DM_OK;
195 }
196 ret = GetDefaultDeviceName(dataShareHelper, localDeviceName);
197 LOGI("get default deviceName=%{public}s", localDeviceName.c_str());
198 dataShareHelper->Release();
199 return DM_OK;
200 }
201
RegisterDeviceNameChangeCb()202 void LocalDeviceNameMgr::RegisterDeviceNameChangeCb()
203 {
204 LOGI("start");
205 auto dataShareHelper = GetDataShareHelper();
206 if (dataShareHelper == nullptr) {
207 LOGE("dataShareHelper is null");
208 return;
209 }
210
211 auto uri = std::make_shared<Uri>(SETTINGS_DATA_BASE_URI + "&key=" + PREDICATES_STRING);
212 sptr<SettingsDataEventMonitor> settingDataObserver =
213 sptr<SettingsDataEventMonitor>(new SettingsDataEventMonitor(shared_from_this(),
214 SettingsDataMonitorType::USER_DEFINED_DEVICE_NAME_MONITOR));
215 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
216
217 int32_t osAccountId = GetActiveOsAccountIds();
218 if (osAccountId == ERR_DM_FAILED) {
219 LOGE("Get OsAccountId error");
220 return;
221 }
222 std::string accountIdStr = std::to_string(osAccountId);
223 uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr +
224 "?Proxy=true&key=" + USER_DEFINED_STRING);
225
226 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
227 dataShareHelper->Release();
228 LOGI("register device name change cb success");
229 }
230
QueryLocalDisplayName()231 int32_t LocalDeviceNameMgr::QueryLocalDisplayName()
232 {
233 LOGI("start");
234 auto dataShareHelper = GetDataShareHelper();
235 if (dataShareHelper == nullptr) {
236 LOGE("dataShareHelper is null");
237 return ERR_DM_FAILED;
238 }
239 std::string localDisplayName = "";
240 int32_t ret = GetDisplayDeviceName(dataShareHelper, localDisplayName);
241 if (ret != DM_OK || localDisplayName.empty()) {
242 LOGE("get display device name failed");
243 return ERR_DM_FAILED;
244 }
245 std::lock_guard<std::mutex> lock(devNameMtx_);
246 localDisplayName_ = localDisplayName;
247 dataShareHelper->Release();
248 LOGI("get display deviceName=%{public}s", localDisplayName.c_str());
249 return DM_OK;
250 }
251
RegisterDisplayNameChangeCb()252 void LocalDeviceNameMgr::RegisterDisplayNameChangeCb()
253 {
254 LOGI("start");
255 auto dataShareHelper = GetDataShareHelper();
256 if (dataShareHelper == nullptr) {
257 LOGE("dataShareHelper is null");
258 return;
259 }
260
261 int32_t osAccountId = GetActiveOsAccountIds();
262 if (osAccountId == ERR_DM_FAILED) {
263 LOGE("Get OsAccountId error");
264 return;
265 }
266 std::string accountIdStr = std::to_string(osAccountId);
267 auto uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr +
268 "?Proxy=true&key=" + DISPLAY_DEVICE_NAME_STRING);
269 sptr<SettingsDataEventMonitor> settingDataObserver =
270 sptr<SettingsDataEventMonitor>(new SettingsDataEventMonitor(shared_from_this(),
271 SettingsDataMonitorType::DISPLAY_DEVICE_NAME_MONITOR));
272 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
273 dataShareHelper->Release();
274 LOGI("register display device name change cb success");
275 }
276
277 } // namespace DistributedHardware
278 } // namespace OHOS