1 /*
2 * Copyright (c) 2022-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 "input_display_bind_helper.h"
17
18 #include <fstream>
19
20 #include "parameters.h"
21 #include "util.h"
22
23 #undef MMI_LOG_DOMAIN
24 #define MMI_LOG_DOMAIN MMI_LOG_WINDOW
25 #undef MMI_LOG_TAG
26 #define MMI_LOG_TAG "InputDisplayBindHelper"
27
28 namespace OHOS {
29 namespace MMI {
30 namespace {
31 const std::string FOLD_SCREEN_FLAG = system::GetParameter("const.window.foldscreen.type", "");
32 const char* INPUT_DEVICE_NAME_CONFIG { "/sys_prod/etc/input/input_device_name.cfg" };
33 const std::string DIRECTORY { "/sys/devices/virtual/input" };
34 const char* SEPARATOR { "/" };
35 const char* SUFFIX { "0000:0000" };
36 const std::string INPUT { "input" };
37 const std::string EVENT { "event" };
38 const char* NAME { "name" };
39 const int32_t DISPLAY_ID_MAIN { 0 };
40 const int32_t DISPLAY_ID_SUB { 5 };
41 }
42
43 namespace fs = std::filesystem;
44
IsDualDisplayFoldDevice()45 static bool IsDualDisplayFoldDevice()
46 {
47 return (!FOLD_SCREEN_FLAG.empty() && (FOLD_SCREEN_FLAG[0] == '2' || FOLD_SCREEN_FLAG[0] == '4'));
48 }
49
GetInputDeviceId() const50 int32_t BindInfo::GetInputDeviceId() const
51 {
52 return inputDeviceId_;
53 }
54
GetInputNodeName() const55 std::string BindInfo::GetInputNodeName() const
56 {
57 return inputNodeName_;
58 }
59
GetInputDeviceName() const60 std::string BindInfo::GetInputDeviceName() const
61 {
62 return inputDeviceName_;
63 }
64
GetDisplayId() const65 int32_t BindInfo::GetDisplayId() const
66 {
67 return displayId_;
68 }
69
GetDisplayName() const70 std::string BindInfo::GetDisplayName() const
71 {
72 return displayName_;
73 }
74
IsUnbind() const75 bool BindInfo::IsUnbind() const
76 {
77 return ((inputDeviceId_ == -1) || (displayId_ == -1));
78 }
79
InputDeviceNotBind() const80 bool BindInfo::InputDeviceNotBind() const
81 {
82 return (inputDeviceId_ == -1);
83 }
84
DisplayNotBind() const85 bool BindInfo::DisplayNotBind() const
86 {
87 return (displayId_ == -1);
88 }
89
AddInputDevice(int32_t deviceId,const std::string & nodeName,const std::string & deviceName)90 bool BindInfo::AddInputDevice(int32_t deviceId, const std::string &nodeName, const std::string &deviceName)
91 {
92 if ((inputDeviceId_ != -1) || !inputNodeName_.empty() || !inputDeviceName_.empty()) {
93 return false;
94 }
95 inputDeviceId_ = deviceId;
96 inputNodeName_ = nodeName;
97 inputDeviceName_ = deviceName;
98 return true;
99 }
100
RemoveInputDevice()101 void BindInfo::RemoveInputDevice()
102 {
103 inputDeviceId_ = -1;
104 inputDeviceName_.clear();
105 }
106
AddDisplay(int32_t id,const std::string & name)107 bool BindInfo::AddDisplay(int32_t id, const std::string &name)
108 {
109 if ((displayId_ != -1) || !displayName_.empty()) {
110 return false;
111 }
112 displayId_ = id;
113 displayName_ = name;
114 return true;
115 }
116
RemoveDisplay()117 void BindInfo::RemoveDisplay()
118 {
119 displayId_ = -1;
120 displayName_.clear();
121 }
122
GetDesc() const123 std::string BindInfo::GetDesc() const
124 {
125 std::ostringstream oss;
126 oss << "InputDevice(id:" << inputDeviceId_ << ",name:" << inputDeviceName_ << "),Display(id:" << displayId_ <<
127 ",name:" << displayName_ << ")";
128 return oss.str();
129 }
130
operator <(const BindInfo & l,const BindInfo & r)131 bool operator < (const BindInfo &l, const BindInfo &r)
132 {
133 if (l.inputDeviceId_ != r.inputDeviceId_) {
134 return (l.inputDeviceId_ < r.inputDeviceId_);
135 }
136 return (l.displayId_ < r.displayId_);
137 }
138
operator <<(std::ostream & os,const BindInfo & r)139 std::ostream &operator << (std::ostream &os, const BindInfo &r)
140 {
141 os << r.inputDeviceName_ << "<=>" << r.displayName_ << std::endl;
142 return os;
143 }
144
operator >>(std::istream & is,BindInfo & r)145 std::istream &operator >> (std::istream &is, BindInfo &r)
146 {
147 std::string line;
148 std::getline(is, line);
149 const std::string delim = "<=>";
150 std::string::size_type pos = line.find(delim);
151 if (pos == std::string::npos) {
152 return is;
153 }
154 r.inputDeviceName_ = line.substr(0, pos);
155 r.displayName_ = line.substr(pos + delim.length());
156 r.inputDeviceId_ = 0;
157 r.displayId_ = 0;
158 return is;
159 }
160
GetDesc() const161 std::string BindInfos::GetDesc() const
162 {
163 int32_t index = 0;
164 std::ostringstream oss;
165 for (const auto &info : infos_) {
166 oss << "index:" << index << "," << info.GetDesc() << std::endl;
167 }
168 return oss.str();
169 }
170
GetInfos() const171 const std::list<BindInfo> &BindInfos::GetInfos() const
172 {
173 return infos_;
174 }
175
GetBindDisplayIdByInputDevice(int32_t inputDeviceId) const176 int32_t BindInfos::GetBindDisplayIdByInputDevice(int32_t inputDeviceId) const
177 {
178 for (const auto &item : infos_) {
179 if (item.GetInputDeviceId() == inputDeviceId) {
180 if (!item.IsUnbind()) {
181 return item.GetDisplayId();
182 }
183 }
184 }
185 return -1;
186 }
187
GetBindDisplayNameByInputDevice(int32_t inputDeviceId) const188 std::string BindInfos::GetBindDisplayNameByInputDevice(int32_t inputDeviceId) const
189 {
190 for (const auto &item : infos_) {
191 if (item.GetInputDeviceId() == inputDeviceId) {
192 if (!item.IsUnbind()) {
193 return item.GetDisplayName();
194 }
195 }
196 }
197 return "";
198 }
199
GetDisplayNameByInputDevice(const std::string & name) const200 std::string BindInfos::GetDisplayNameByInputDevice(const std::string &name) const
201 {
202 for (const auto &item : infos_) {
203 if (item.GetInputDeviceName() == name) {
204 return item.GetDisplayName();
205 }
206 }
207 return "";
208 }
209
GetInputDeviceByDisplayName(const std::string & name) const210 std::string BindInfos::GetInputDeviceByDisplayName(const std::string &name) const
211 {
212 for (const auto &item : infos_) {
213 if (item.GetDisplayName() == name) {
214 return item.GetInputDeviceName();
215 }
216 }
217 return "";
218 }
219
Add(const BindInfo & info)220 bool BindInfos::Add(const BindInfo &info)
221 {
222 auto it = infos_.begin();
223 for (; it != infos_.end(); ++it) {
224 if (info < *it) {
225 break;
226 }
227 }
228 auto it2 = infos_.emplace(it, std::move(info));
229 if (it2 == infos_.end()) {
230 MMI_HILOGE("Duplicate %{public}s", info.GetDesc().c_str());
231 }
232 return true;
233 }
234
UnbindInputDevice(int32_t deviceId)235 void BindInfos::UnbindInputDevice(int32_t deviceId)
236 {
237 auto it = infos_.begin();
238 for (; it != infos_.end(); ++it) {
239 if (it->GetInputDeviceId() == deviceId) {
240 it->RemoveInputDevice();
241 infos_.erase(it);
242 return;
243 }
244 }
245 }
246
UnbindDisplay(int32_t displayId)247 void BindInfos::UnbindDisplay(int32_t displayId)
248 {
249 auto it = infos_.begin();
250 for (; it != infos_.end(); ++it) {
251 if (it->GetDisplayId() == displayId) {
252 it->RemoveDisplay();
253 infos_.erase(it);
254 return;
255 }
256 }
257 }
258
GetUnbindInputDevice(const std::string & displayName)259 BindInfo BindInfos::GetUnbindInputDevice(const std::string &displayName)
260 {
261 auto it = infos_.begin();
262 while (it != infos_.end()) {
263 if (it->InputDeviceNotBind()) {
264 if (it->GetDisplayName() == displayName) {
265 auto info = std::move(*it);
266 infos_.erase(it);
267 return info;
268 }
269 }
270 ++it;
271 }
272 return BindInfo();
273 }
274
GetUnbindDisplay()275 BindInfo BindInfos::GetUnbindDisplay()
276 {
277 auto it = infos_.begin();
278 while (it != infos_.end()) {
279 if (it->DisplayNotBind()) {
280 auto info = std::move(*it);
281 infos_.erase(it);
282 return info;
283 }
284 ++it;
285 }
286 return BindInfo();
287 }
288
GetUnbindDisplay(const std::string & inputDeviceName)289 BindInfo BindInfos::GetUnbindDisplay(const std::string &inputDeviceName)
290 {
291 auto it = infos_.begin();
292 while (it != infos_.end()) {
293 if (it->DisplayNotBind()) {
294 if (it->GetInputDeviceName() == inputDeviceName) {
295 auto info = std::move(*it);
296 infos_.erase(it);
297 return info;
298 }
299 }
300 ++it;
301 }
302 return GetUnbindDisplay();
303 }
304
operator <<(std::ostream & os,const BindInfos & r)305 std::ostream &operator << (std::ostream &os, const BindInfos &r)
306 {
307 const auto &infos = r.GetInfos();
308 for (const auto &info : infos) {
309 if (!info.IsUnbind()) {
310 os << info;
311 }
312 }
313 return os;
314 }
315
operator >>(std::istream & is,BindInfos & r)316 std::istream &operator >> (std::istream &is, BindInfos &r)
317 {
318 while (!is.eof()) {
319 BindInfo info;
320 is >> info;
321 if (info.IsUnbind()) {
322 break;
323 }
324 r.Add(info);
325 }
326 return is;
327 }
328
InputDisplayBindHelper(const std::string bindCfgFile)329 InputDisplayBindHelper::InputDisplayBindHelper(const std::string bindCfgFile)
330 : fileName_(bindCfgFile), infos_(std::make_shared<BindInfos>()), configFileInfos_(std::make_shared<BindInfos>())
331 {}
332
GetBindDisplayNameByInputDevice(int32_t inputDeviceId) const333 std::string InputDisplayBindHelper::GetBindDisplayNameByInputDevice(int32_t inputDeviceId) const
334 {
335 CALL_DEBUG_ENTER;
336 CHKPO(infos_);
337 return infos_->GetBindDisplayNameByInputDevice(inputDeviceId);
338 }
339
AddInputDevice(int32_t id,const std::string & nodeName,const std::string & sysUid)340 void InputDisplayBindHelper::AddInputDevice(int32_t id, const std::string &nodeName, const std::string &sysUid)
341 {
342 CALL_DEBUG_ENTER;
343 MMI_HILOGD("Param: id:%{public}d, nodeName:%{public}s, name:%{public}s", id, nodeName.c_str(), sysUid.c_str());
344 CHKPV(configFileInfos_);
345 auto displayName = configFileInfos_->GetDisplayNameByInputDevice(sysUid);
346 BindInfo info = infos_->GetUnbindInputDevice(displayName);
347 info.AddInputDevice(id, nodeName, sysUid);
348 infos_->Add(info);
349 Store();
350 }
351
RemoveInputDevice(int32_t id)352 void InputDisplayBindHelper::RemoveInputDevice(int32_t id)
353 {
354 CALL_DEBUG_ENTER;
355 MMI_HILOGD("Param: id:%{public}d", id);
356 CHKPV(infos_);
357 infos_->UnbindInputDevice(id);
358 }
359
IsDisplayAdd(int32_t id,const std::string & name)360 bool InputDisplayBindHelper::IsDisplayAdd(int32_t id, const std::string &name)
361 {
362 CHKPF(infos_);
363 const auto &infos = infos_->GetInfos();
364 for (const auto &info : infos) {
365 if ((info.GetDisplayName() == name) && (info.GetDisplayId() == id)) {
366 return true;
367 }
368 }
369 return false;
370 }
371
GetDisplayIdNames() const372 std::set<std::pair<uint64_t, std::string>> InputDisplayBindHelper::GetDisplayIdNames() const
373 {
374 CALL_DEBUG_ENTER;
375 std::set<std::pair<uint64_t, std::string>> idNames;
376 CHKFR(infos_, idNames, "infos_ is null");
377 const auto &infos = infos_->GetInfos();
378 for (const auto &info : infos) {
379 if (info.GetDisplayId() != -1) {
380 idNames.insert(std::make_pair(info.GetDisplayId(), info.GetDisplayName()));
381 }
382 }
383 return idNames;
384 }
385
AddDisplay(int32_t id,const std::string & name)386 void InputDisplayBindHelper::AddDisplay(int32_t id, const std::string &name)
387 {
388 CALL_DEBUG_ENTER;
389 MMI_HILOGD("Param: id:%{public}d, name:%{public}s", id, name.c_str());
390 auto inputDeviceName = configFileInfos_->GetInputDeviceByDisplayName(name);
391 if (IsDualDisplayFoldDevice()) {
392 std::string deviceName = GetInputDeviceById(id);
393 if (!deviceName.empty()) {
394 inputDeviceName = deviceName;
395 }
396 }
397 BindInfo info = infos_->GetUnbindDisplay(inputDeviceName);
398 info.AddDisplay(id, name);
399 infos_->Add(info);
400 Store();
401 }
402
AddLocalDisplay(int32_t id,const std::string & name)403 void InputDisplayBindHelper::AddLocalDisplay(int32_t id, const std::string &name)
404 {
405 CALL_DEBUG_ENTER;
406 MMI_HILOGD("Param: id:%{public}d, name:%{public}s", id, name.c_str());
407 CHKPV(infos_);
408
409 const auto &infos = infos_->GetInfos();
410 std::vector<std::string> unbindDevices;
411 for (const auto &info : infos) {
412 if (info.DisplayNotBind()) {
413 unbindDevices.push_back(info.GetInputDeviceName());
414 MMI_HILOGI("Unbind InputDevice, id:%{public}d, inputDevice:%{public}s",
415 info.GetInputDeviceId(), info.GetInputDeviceName().c_str());
416 }
417 }
418
419 bool IsStore = false;
420 for (auto &item : unbindDevices) {
421 auto inputDeviceName = item;
422 if (IsDualDisplayFoldDevice()) {
423 std::string deviceName = GetInputDeviceById(id);
424 if (!deviceName.empty()) {
425 inputDeviceName = deviceName;
426 }
427 }
428 BindInfo info = infos_->GetUnbindDisplay(inputDeviceName);
429 info.AddDisplay(id, name);
430 infos_->Add(info);
431 IsStore = true;
432 }
433 if (IsStore) {
434 Store();
435 }
436 unbindDevices.clear();
437 }
438
GetInputDeviceById(int32_t id)439 std::string InputDisplayBindHelper::GetInputDeviceById(int32_t id)
440 {
441 CALL_DEBUG_ENTER;
442 if (id != DISPLAY_ID_MAIN && id != DISPLAY_ID_SUB) {
443 return "";
444 }
445
446 std::string inputNodeName = GetInputNodeNameByCfg(id);
447 if (inputNodeName.empty()) {
448 return "";
449 }
450
451 std::string inputNode = GetInputNode(inputNodeName);
452 if (inputNode.empty()) {
453 CHKPO(infos_);
454 const auto &infos = infos_->GetInfos();
455 for (const auto &item : infos) {
456 if (inputNodeName == item.GetInputNodeName()) {
457 return item.GetInputDeviceName();
458 }
459 }
460 return "";
461 }
462
463 std::string inputEvent = inputNode;
464 size_t pos = inputEvent.find(INPUT);
465 if (pos != std::string::npos) {
466 inputEvent.replace(pos, INPUT.length(), EVENT);
467 }
468
469 std::string inputDeviceName;
470 inputDeviceName.append(DIRECTORY).append(SEPARATOR)
471 .append(inputNode).append(SEPARATOR)
472 .append(inputEvent).append(SUFFIX);
473
474 MMI_HILOGI("GetInputDeviceById, id:%{public}d, inputDevice:%{public}s", id, inputDeviceName.c_str());
475 return inputDeviceName;
476 }
477
GetInputNodeNameByCfg(int32_t id)478 std::string InputDisplayBindHelper::GetInputNodeNameByCfg(int32_t id)
479 {
480 CALL_DEBUG_ENTER;
481 std::ifstream file(INPUT_DEVICE_NAME_CONFIG);
482 std::string res;
483 if (file.is_open()) {
484 std::string line;
485 while (getline(file, line)) {
486 const std::string delim = "<=>";
487 size_t pos = line.find(delim);
488 if (pos == std::string::npos) {
489 continue;
490 }
491 std::string displayId = line.substr(0, pos);
492 std::string inputNodeName = line.substr(pos + delim.length());
493 if (!displayId.empty() && !inputNodeName.empty()
494 && std::all_of(displayId.begin(), displayId.end(), ::isdigit)
495 && std::atoi(displayId.c_str()) == id) {
496 res = inputNodeName;
497 break;
498 }
499 }
500 file.close();
501 }
502 if (!res.empty() && (res.back() == '\n' || res.back() == '\r')) {
503 res.pop_back();
504 }
505 return res;
506 }
507
GetContent(const std::string & fileName)508 std::string InputDisplayBindHelper::GetContent(const std::string &fileName)
509 {
510 CALL_DEBUG_ENTER;
511 std::string content;
512 char realPath[PATH_MAX] = {};
513 if (realpath(fileName.c_str(), realPath) == nullptr) {
514 MMI_HILOGE("The realpath return nullptr");
515 return content;
516 }
517 std::ifstream file(realPath);
518 if (file.is_open()) {
519 std::string line;
520 while (getline(file, line)) {
521 content.append(line);
522 }
523 file.close();
524 }
525 return content;
526 }
527
GetInputNode(const std::string & inputNodeName)528 std::string InputDisplayBindHelper::GetInputNode(const std::string &inputNodeName)
529 {
530 CALL_DEBUG_ENTER;
531 std::string inputNode;
532 if (fs::exists(DIRECTORY) && fs::is_directory(DIRECTORY)) {
533 for (const auto& entry : fs::directory_iterator(DIRECTORY)) {
534 std::string node = fs::path(entry.path()).filename();
535 std::string file;
536 file.append(DIRECTORY).append(SEPARATOR)
537 .append(node).append(SEPARATOR)
538 .append(NAME);
539 if (inputNodeName == GetContent(file)) {
540 inputNode = node;
541 break;
542 }
543 }
544 }
545 return inputNode;
546 }
547
RemoveDisplay(int32_t id)548 void InputDisplayBindHelper::RemoveDisplay(int32_t id)
549 {
550 CALL_DEBUG_ENTER;
551 MMI_HILOGD("Param: id:%{public}d", id);
552 CHKPV(infos_);
553 infos_->UnbindDisplay(id);
554 }
555
Store()556 void InputDisplayBindHelper::Store()
557 {
558 CALL_DEBUG_ENTER;
559 CHKPV(infos_);
560 char realPath[PATH_MAX] = {};
561 CHKPV(realpath(fileName_.c_str(), realPath));
562 if (!IsValidJsonPath(realPath)) {
563 MMI_HILOGE("File path is invalid");
564 return;
565 }
566 std::ofstream ofs(realPath, std::ios::trunc | std::ios::out | std::ios_base::binary);
567 if (!ofs) {
568 MMI_HILOGE("Open file fail.%{private}s, errno:%{public}d", realPath, errno);
569 return;
570 }
571 ofs << *infos_;
572 ofs.close();
573 }
574
GetDisplayBindInfo(DisplayBindInfos & infos)575 int32_t InputDisplayBindHelper::GetDisplayBindInfo(DisplayBindInfos &infos)
576 {
577 CALL_DEBUG_ENTER;
578 CHKPR(infos_, RET_ERR);
579 for (const auto &item : infos_->GetInfos()) {
580 DisplayBindInfo info;
581 info.inputDeviceId = item.GetInputDeviceId();
582 info.inputDeviceName = item.GetInputDeviceName();
583 info.displayId = item.GetDisplayId();
584 info.displayName = item.GetDisplayName();
585 infos.push_back(info);
586 }
587 return RET_OK;
588 }
589
SetDisplayBind(int32_t deviceId,int32_t displayId,std::string & msg)590 int32_t InputDisplayBindHelper::SetDisplayBind(int32_t deviceId, int32_t displayId, std::string &msg)
591 {
592 CALL_DEBUG_ENTER;
593 MMI_HILOGD("Param: deviceId:%{public}d, displayId:%{public}d", deviceId, displayId);
594 if ((deviceId == -1) || (displayId == -1)) {
595 msg = "The deviceId or displayId is invalid";
596 MMI_HILOGE("%s", msg.c_str());
597 return RET_ERR;
598 }
599 if (infos_ == nullptr) {
600 msg = "Infos_ is nullptr";
601 MMI_HILOGE("%s", msg.c_str());
602 return RET_ERR;
603 }
604
605 BindInfo bindByDevice;
606 BindInfo bindByDisplay;
607 for (const auto &item : infos_->GetInfos()) {
608 if (item.GetInputDeviceId() == deviceId) {
609 bindByDevice = item;
610 }
611 if (item.GetDisplayId() == displayId) {
612 bindByDisplay = item;
613 }
614 }
615 if (bindByDevice.GetInputDeviceId() == -1) {
616 msg = "The deviceId is invalid";
617 MMI_HILOGE("%s", msg.c_str());
618 return RET_ERR;
619 }
620 if (bindByDisplay.GetDisplayId() == -1) {
621 msg = "The displayId is invalid";
622 MMI_HILOGE("%s", msg.c_str());
623 return RET_ERR;
624 }
625
626 if (infos_->GetBindDisplayIdByInputDevice(deviceId) == displayId) {
627 msg = "The input device and display has alread bind";
628 MMI_HILOGE("%s", msg.c_str());
629 return RET_ERR;
630 }
631
632 infos_->UnbindInputDevice(bindByDevice.GetInputDeviceId());
633 infos_->UnbindInputDevice(bindByDisplay.GetInputDeviceId());
634 infos_->UnbindDisplay(bindByDevice.GetDisplayId());
635 infos_->UnbindDisplay(bindByDisplay.GetDisplayId());
636
637 BindInfo info1;
638 info1.AddInputDevice(bindByDevice.GetInputDeviceId(), bindByDevice.GetInputNodeName(),
639 bindByDevice.GetInputDeviceName());
640 info1.AddDisplay(bindByDisplay.GetDisplayId(), bindByDisplay.GetDisplayName());
641 infos_->Add(info1);
642
643 if ((bindByDevice.GetDisplayId() != -1) && (bindByDisplay.GetInputDeviceId() != -1)) {
644 MMI_HILOGD("Both display id and input device id are invalid");
645 BindInfo info2;
646 info2.AddInputDevice(bindByDisplay.GetInputDeviceId(), bindByDisplay.GetInputNodeName(),
647 bindByDisplay.GetInputDeviceName());
648 info2.AddDisplay(bindByDevice.GetDisplayId(), bindByDevice.GetDisplayName());
649 infos_->Add(info2);
650 return RET_OK;
651 }
652
653 if (bindByDevice.GetDisplayId() != -1) {
654 MMI_HILOGD("The display id is invalid");
655 AddDisplay(bindByDevice.GetDisplayId(), bindByDevice.GetDisplayName());
656 return RET_OK;
657 }
658
659 if (bindByDisplay.GetInputDeviceId() != -1) {
660 MMI_HILOGD("The input device id is invalid");
661 AddInputDevice(bindByDisplay.GetInputDeviceId(), bindByDisplay.GetInputNodeName(),
662 bindByDisplay.GetInputDeviceName());
663 return RET_OK;
664 }
665
666 msg = "Can not reach here";
667 return RET_ERR;
668 }
669
Load()670 void InputDisplayBindHelper::Load()
671 {
672 CALL_DEBUG_ENTER;
673 char realPath[PATH_MAX] = {};
674 CHKPV(realpath(fileName_.c_str(), realPath));
675 if (!IsValidJsonPath(realPath)) {
676 MMI_HILOGE("The file path is invalid");
677 return;
678 }
679 std::ifstream ifs(realPath);
680 MMI_HILOGEK("Open file end:%{private}s", realPath);
681 if (!ifs) {
682 MMI_HILOGE("Open file fail.%{private}s, errno:%{public}d", realPath, errno);
683 return;
684 }
685 ifs >> *configFileInfos_;
686 ifs.close();
687 }
688
Dumps() const689 std::string InputDisplayBindHelper::Dumps() const
690 {
691 CALL_DEBUG_ENTER;
692 CHKPO(infos_);
693 std::ostringstream oss;
694 oss << *infos_;
695 return oss.str();
696 }
697 } // namespace MMI
698 } // namespace OHOS
699