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