1 /*
2 * Copyright (c) 2024-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_device_name_mgr.h"
17
18 #include "datashare_result_set.h"
19 #include "ohos_account_kits.h"
20 #include "os_account_manager.h"
21 #include "iservice_registry.h"
22 #include "system_ability_definition.h"
23 #include "uri.h"
24
25 #include "device_manager_service.h"
26 #include "dm_error_type.h"
27 #include "dm_log.h"
28 #include "settings_data_event_monitor.h"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 namespace {
33 const std::string SETTINGS_DATA_BASE_URI =
34 "datashare:///com.ohos.settingsdata/entry/settingsdata/SETTINGSDATA?Proxy=true";
35 const std::string SETTINGS_DATA_SECURE_URI =
36 "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_SECURE_";
37 constexpr const char *SETTINGS_DATA_EXT_URI = "datashare:///com.ohos.settingsdata.DataAbility";
38 constexpr const char *SETTINGS_DATA_FIELD_KEYWORD = "KEYWORD";
39 constexpr const char *SETTINGS_DATA_FIELD_VALUE = "VALUE";
40 constexpr const char *PREDICATES_STRING = "settings.general.device_name";
41 constexpr const char *USER_DEFINED_STRING = "settings.general.user_defined_device_name";
42 constexpr const char *DISPLAY_DEVICE_NAME_STRING = "settings.general.display_device_name";
43 }
44
45 std::mutex LocalDeviceNameMgr::devNameMtx_;
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 auto dataShareHelper = GetDataShareHelper();
182 if (dataShareHelper == nullptr) {
183 LOGE("dataShareHelper is null");
184 return ERR_DM_FAILED;
185 }
186 std::string localDeviceName = "";
187 int32_t ret = GetUserDefinedDeviceName(dataShareHelper, localDeviceName);
188 if (ret == DM_OK && !localDeviceName.empty()) {
189 std::lock_guard<std::mutex> lock(devNameMtx_);
190 localDeviceName_ = localDeviceName;
191 dataShareHelper->Release();
192 LOGI("get user defined deviceName=%{public}s", localDeviceName.c_str());
193
194 return DM_OK;
195 }
196 ret = GetDefaultDeviceName(dataShareHelper, localDeviceName);
197 if (ret != DM_OK || localDeviceName.empty()) {
198 LOGE("get default deviceName failed");
199 return ERR_DM_FAILED;
200 }
201 std::lock_guard<std::mutex> lock(devNameMtx_);
202 localDeviceName_ = localDeviceName;
203 dataShareHelper->Release();
204 LOGI("get default deviceName=%{public}s", localDeviceName.c_str());
205
206 return DM_OK;
207 }
208
RegisterDeviceNameChangeCb()209 void LocalDeviceNameMgr::RegisterDeviceNameChangeCb()
210 {
211 auto dataShareHelper = GetDataShareHelper();
212 if (dataShareHelper == nullptr) {
213 LOGE("dataShareHelper is null");
214 return;
215 }
216
217 auto uri = std::make_shared<Uri>(SETTINGS_DATA_BASE_URI + "&key=" + PREDICATES_STRING);
218 sptr<SettingsDataEventMonitor> settingDataObserver =
219 sptr<SettingsDataEventMonitor>(new SettingsDataEventMonitor(shared_from_this(),
220 SettingsDataMonitorType::USER_DEFINED_DEVICE_NAME_MONITOR));
221 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
222
223 int32_t osAccountId = GetActiveOsAccountIds();
224 if (osAccountId == ERR_DM_FAILED) {
225 LOGE("Get OsAccountId error");
226 return;
227 }
228 std::string accountIdStr = std::to_string(osAccountId);
229 uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr +
230 "?Proxy=true&key=" + USER_DEFINED_STRING);
231
232 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
233 dataShareHelper->Release();
234 LOGI("register device name change cb success");
235 }
236
QueryLocalDisplayName()237 int32_t LocalDeviceNameMgr::QueryLocalDisplayName()
238 {
239 auto dataShareHelper = GetDataShareHelper();
240 if (dataShareHelper == nullptr) {
241 LOGE("dataShareHelper is null");
242 return ERR_DM_FAILED;
243 }
244 std::string localDisplayName = "";
245 int32_t ret = GetDisplayDeviceName(dataShareHelper, localDisplayName);
246 if (ret != DM_OK || localDisplayName.empty()) {
247 LOGE("get display device name failed");
248 return ERR_DM_FAILED;
249 }
250 std::lock_guard<std::mutex> lock(devNameMtx_);
251 localDisplayName_ = localDisplayName;
252 dataShareHelper->Release();
253 LOGI("get display deviceName=%{public}s", localDisplayName.c_str());
254 return DM_OK;
255 }
256
RegisterDisplayNameChangeCb()257 void LocalDeviceNameMgr::RegisterDisplayNameChangeCb()
258 {
259 auto dataShareHelper = GetDataShareHelper();
260 if (dataShareHelper == nullptr) {
261 LOGE("dataShareHelper is null");
262 return;
263 }
264
265 int32_t osAccountId = GetActiveOsAccountIds();
266 if (osAccountId == ERR_DM_FAILED) {
267 LOGE("Get OsAccountId error");
268 return;
269 }
270 std::string accountIdStr = std::to_string(osAccountId);
271 auto uri = std::make_shared<Uri>(SETTINGS_DATA_SECURE_URI + accountIdStr +
272 "?Proxy=true&key=" + DISPLAY_DEVICE_NAME_STRING);
273 sptr<SettingsDataEventMonitor> settingDataObserver =
274 sptr<SettingsDataEventMonitor>(new SettingsDataEventMonitor(shared_from_this(),
275 SettingsDataMonitorType::DISPLAY_DEVICE_NAME_MONITOR));
276 dataShareHelper->RegisterObserver(*uri, settingDataObserver);
277 dataShareHelper->Release();
278 LOGI("register display device name change cb success");
279 }
280
GetLocalDisplayName() const281 std::string LocalDeviceNameMgr::GetLocalDisplayName() const
282 {
283 std::lock_guard<std::mutex> lock(devNameMtx_);
284 return localDisplayName_;
285 }
286
GetLocalDeviceName() const287 std::string LocalDeviceNameMgr::GetLocalDeviceName() const
288 {
289 std::lock_guard<std::mutex> lock(devNameMtx_);
290 return localDeviceName_;
291 }
292 } // namespace DistributedHardware
293 } // namespace OHOS