• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "CommandLine.h"
17 
18 #include <algorithm>
19 #include <regex>
20 #include <sstream>
21 
22 #include "CommandLineInterface.h"
23 #include "CommandParser.h"
24 #include "Interrupter.h"
25 #include "JsApp.h"
26 #include "JsAppImpl.h"
27 #include "JsonReader.h"
28 #include "LanguageManagerImpl.h"
29 #include "ModelConfig.h"
30 #include "ModelManager.h"
31 #include "MouseInputImpl.h"
32 #include "MouseWheelImpl.h"
33 #include "KeyInputImpl.h"
34 #include "PreviewerEngineLog.h"
35 #include "SharedData.h"
36 #include "VirtualMessageImpl.h"
37 #include "VirtualScreenImpl.h"
38 
CommandLine(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)39 CommandLine::CommandLine(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
40     : args(arg), cliSocket(socket), type(commandType), commandName("")
41 {
42 }
43 
~CommandLine()44 CommandLine::~CommandLine()
45 {
46 }
47 
CheckAndRun()48 void CommandLine::CheckAndRun()
49 {
50     if (!IsArgValid()) {
51         ELOG("CheckAndRun: invalid command params");
52         SetCommandResult("result", JsonReader::CreateBool(false));
53         SendResult();
54         return;
55     }
56     Run();
57     SendResult();
58 }
59 
SendResult()60 void CommandLine::SendResult()
61 {
62     if (commandResult.IsNull() || !commandResult.IsValid()) {
63         return;
64     }
65     cliSocket << commandResult.ToStyledString();
66     ELOG("SendResult commandResult: %s", commandResult.ToStyledString().c_str());
67     commandResult.Clear();
68 }
69 
RunAndSendResultToManager()70 void CommandLine::RunAndSendResultToManager()
71 {
72     Run();
73     SendResultToManager();
74 }
75 
SendResultToManager()76 void CommandLine::SendResultToManager()
77 {
78     if (commandResultToManager.IsNull() || !commandResultToManager.IsValid()) {
79         return;
80     }
81     cliSocket << commandResultToManager.ToStyledString();
82     commandResultToManager.Clear();
83 }
84 
IsArgValid() const85 bool CommandLine::IsArgValid() const
86 {
87     if (type == CommandType::GET) {
88         return IsGetArgValid();
89     }
90     if (type == CommandType::SET) {
91         return IsSetArgValid();
92     }
93     if (type == CommandType::ACTION) {
94         return IsActionArgValid();
95     }
96     return true;
97 }
98 
ToUint8(std::string str) const99 uint8_t CommandLine::ToUint8(std::string str) const
100 {
101     int value = atoi(str.data());
102     if (value > UINT8_MAX) {
103         ELOG("CommandLine::ToUint8 value is overflow, value: %d", value);
104     }
105     return static_cast<uint8_t>(value);
106 }
107 
SetCommandName(std::string command)108 void CommandLine::SetCommandName(std::string command)
109 {
110     this->commandName = command;
111 }
112 
SetCommandResult(const std::string & resultType,const Json2::Value & resultContent)113 void CommandLine::SetCommandResult(const std::string& resultType, const Json2::Value& resultContent)
114 {
115     this->commandResult.Add("version", CommandLineInterface::COMMAND_VERSION.c_str());
116     this->commandResult.Add("command", this->commandName.c_str());
117     this->commandResult.Add(resultType.c_str(), resultContent);
118 }
119 
SetResultToManager(const std::string & resultType,const Json2::Value & resultContent,const std::string & messageType)120 void CommandLine::SetResultToManager(const std::string& resultType,
121                                      const Json2::Value& resultContent,
122                                      const std::string& messageType)
123 {
124     this->commandResultToManager.Add("MessageType", messageType.c_str());
125     this->commandResultToManager.Add(resultType.c_str(), resultContent);
126 }
127 
Run()128 void CommandLine::Run()
129 {
130     if (type == CommandType::GET) {
131         RunGet();
132     } else if (type == CommandType::SET) {
133         RunSet();
134     } else if (type == CommandType::ACTION) {
135         RunAction();
136     }
137 }
138 
IsBoolType(std::string arg) const139 bool CommandLine::IsBoolType(std::string arg) const
140 {
141     std::regex tofrx("^(true)|(false)$");
142     if (regex_match(arg, tofrx)) {
143         return true;
144     }
145     return false;
146 }
147 
IsIntType(std::string arg) const148 bool CommandLine::IsIntType(std::string arg) const
149 {
150     std::regex isInt("^\\d+$");
151     return regex_match(arg, isInt);
152 }
153 
IsOneDigitFloatType(std::string arg,bool allowNegativeNumber) const154 bool CommandLine::IsOneDigitFloatType(std::string arg, bool allowNegativeNumber) const
155 {
156     if (allowNegativeNumber) {
157         std::regex isFloat("^-?\\d+(\\.\\d+)?$");
158         return regex_match(arg, isFloat);
159     } else {
160         std::regex isFloat("^\\d(\\.\\d+)?$");
161         return regex_match(arg, isFloat);
162     }
163 }
164 
SetEventParams(EventParams & params)165 void TouchAndMouseCommand::SetEventParams(EventParams& params)
166 {
167     if (CommandParser::GetInstance().GetScreenMode() == CommandParser::ScreenMode::STATIC) {
168         return;
169     }
170     MouseInputImpl::GetInstance().SetMousePosition(params.x, params.y);
171     MouseInputImpl::GetInstance().SetMouseStatus(params.type);
172     MouseInputImpl::GetInstance().SetMouseButton(params.button);
173     MouseInputImpl::GetInstance().SetMouseAction(params.action);
174     MouseInputImpl::GetInstance().SetSourceType(params.sourceType);
175     MouseInputImpl::GetInstance().SetSourceTool(params.sourceTool);
176     MouseInputImpl::GetInstance().SetPressedBtns(params.pressedBtnsVec);
177     MouseInputImpl::GetInstance().SetAxisValues(params.axisVec);
178     MouseInputImpl::GetInstance().DispatchOsTouchEvent();
179     std::stringstream ss;
180     ss << "[";
181     for (double val : params.axisVec) {
182         ss << " " << val << " ";
183     }
184     ss << "]" << std::endl;
185     ILOG("%s(%f,%f,%d,%d,%d,%d,%d,%d,%d,%s)", params.name.c_str(), params.x, params.y, params.type, params.button,
186         params.action, params.sourceType, params.sourceTool, params.pressedBtnsVec.size(), params.axisVec.size(),
187         ss.str().c_str());
188 }
189 
IsActionArgValid() const190 bool TouchPressCommand::IsActionArgValid() const
191 {
192     if (args.IsNull() || !args.IsMember("x") || !args.IsMember("y") ||
193         !args["x"].IsInt() || !args["y"].IsInt()) {
194         return false;
195     }
196     int32_t pointX = args["x"].AsInt();
197     int32_t pointY = args["y"].AsInt();
198     if (pointX < 0 || pointX > VirtualScreenImpl::GetInstance().GetCurrentWidth()) {
199         ELOG("X coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentWidth());
200         return false;
201     }
202     if (pointY < 0 || pointY > VirtualScreenImpl::GetInstance().GetCurrentHeight()) {
203         ELOG("Y coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentHeight());
204         return false;
205     }
206     return true;
207 }
208 
TouchPressCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)209 TouchPressCommand::TouchPressCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
210     : CommandLine(commandType, arg, socket)
211 {
212 }
213 
RunAction()214 void TouchPressCommand::RunAction()
215 {
216     int type = 0;
217     EventParams param;
218     param.x = args["x"].AsDouble();
219     param.y = args["y"].AsDouble();
220     param.type = type;
221     param.name = "TouchPress";
222     param.button = MouseInputImpl::GetInstance().defaultButton;
223     param.action = MouseInputImpl::GetInstance().defaultAction;
224     param.sourceType = MouseInputImpl::GetInstance().defaultSourceType;
225     param.sourceTool = MouseInputImpl::GetInstance().defaultSourceTool;
226     SetEventParams(param);
227     SetCommandResult("result", JsonReader::CreateBool(true));
228 }
229 
IsActionArgValid() const230 bool MouseWheelCommand::IsActionArgValid() const
231 {
232     if (args.IsNull() || !args.IsMember("rotate") || !args["rotate"].IsDouble()) {
233         return false;
234     }
235     return true;
236 }
237 
MouseWheelCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)238 MouseWheelCommand::MouseWheelCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
239     : CommandLine(commandType, arg, socket)
240 {
241 }
242 
RunAction()243 void MouseWheelCommand::RunAction()
244 {
245     if (CommandParser::GetInstance().GetScreenMode() == CommandParser::ScreenMode::STATIC) {
246         return;
247     }
248     MouseWheelImpl::GetInstance().SetRotate(args["rotate"].AsDouble());
249     SetCommandResult("result", JsonReader::CreateBool(true));
250     ILOG("CrownRotate (%f)", args["rotate"].AsDouble());
251 }
252 
IsActionArgValid() const253 bool TouchReleaseCommand::IsActionArgValid() const
254 {
255     if (args.IsNull() || !args.IsMember("x") || !args.IsMember("y") ||
256         !args["x"].IsInt() || !args["y"].IsInt()) {
257         return false;
258     }
259     int32_t pX = args["x"].AsInt();
260     int32_t pY = args["y"].AsInt();
261     if (pY < 0 || pY > VirtualScreenImpl::GetInstance().GetCurrentHeight()) {
262         ELOG("Y coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentHeight());
263         return false;
264     }
265     if (pX < 0 || pX > VirtualScreenImpl::GetInstance().GetCurrentWidth()) {
266         ELOG("X coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentWidth());
267         return false;
268     }
269     return true;
270 }
271 
TouchReleaseCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)272 TouchReleaseCommand::TouchReleaseCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
273     : CommandLine(commandType, arg, socket)
274 {
275 }
276 
RunAction()277 void TouchReleaseCommand::RunAction()
278 {
279     int type = 1;
280     EventParams param;
281     param.x = args["x"].AsDouble();
282     param.y = args["y"].AsDouble();
283     param.type = type;
284     param.name = "TouchRelease";
285     param.button = MouseInputImpl::GetInstance().defaultButton;
286     param.action = MouseInputImpl::GetInstance().defaultAction;
287     param.sourceType = MouseInputImpl::GetInstance().defaultSourceType;
288     param.sourceTool = MouseInputImpl::GetInstance().defaultSourceTool;
289     SetEventParams(param);
290     SetCommandResult("result", JsonReader::CreateBool(true));
291 }
292 
IsActionArgValid() const293 bool TouchMoveCommand::IsActionArgValid() const
294 {
295     if (args.IsNull() || !args.IsMember("x") || !args.IsMember("y") ||
296         !args["x"].IsInt() || !args["y"].IsInt()) {
297         return false;
298     }
299     int32_t pX = args["x"].AsInt();
300     int32_t pY = args["y"].AsInt();
301     if (pX < 0 || pX > VirtualScreenImpl::GetInstance().GetCurrentWidth()) {
302         ELOG("X coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentWidth());
303         return false;
304     }
305     if (pY < 0 || pY > VirtualScreenImpl::GetInstance().GetCurrentHeight()) {
306         ELOG("Y coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentHeight());
307         return false;
308     }
309     return true;
310 }
311 
TouchMoveCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)312 TouchMoveCommand::TouchMoveCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
313     : CommandLine(commandType, arg, socket)
314 {
315 }
316 
RunAction()317 void TouchMoveCommand::RunAction()
318 {
319     int type = 2;
320     EventParams param;
321     param.x = args["x"].AsDouble();
322     param.y = args["y"].AsDouble();
323     param.type = type;
324     param.name = "TouchMove";
325     param.button = MouseInputImpl::GetInstance().defaultButton;
326     param.action = MouseInputImpl::GetInstance().defaultAction;
327     param.sourceType = MouseInputImpl::GetInstance().defaultSourceType;
328     param.sourceTool = MouseInputImpl::GetInstance().defaultSourceTool;
329     SetEventParams(param);
330     SetCommandResult("result", JsonReader::CreateBool(true));
331 }
332 
PowerCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)333 PowerCommand::PowerCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
334     : CommandLine(commandType, arg, socket)
335 {
336 }
337 
IsSetArgValid() const338 bool PowerCommand::IsSetArgValid() const
339 {
340     if (args.IsNull() || !args.IsMember("Power") || !args["Power"].IsDouble()) {
341         ELOG("Invalid number of arguments!");
342         return false;
343     }
344     double val = args["Power"].AsDouble();
345     if (!SharedData<double>::IsValid(SharedDataType::BATTERY_LEVEL, val)) {
346         ELOG("PowerCommand invalid value: %f", val);
347         return false;
348     }
349     return true;
350 }
351 
RunGet()352 void PowerCommand::RunGet()
353 {
354     double power = SharedData<double>::GetData(SharedDataType::BATTERY_LEVEL);
355     Json2::Value resultContent = JsonReader::CreateObject();
356     resultContent.Add("Power", power);
357     SetCommandResult("result", resultContent);
358     ILOG("Get power run finished");
359 }
360 
RunSet()361 void PowerCommand::RunSet()
362 {
363     double val = args["Power"].AsDouble();
364     SharedData<double>::SetData(SharedDataType::BATTERY_LEVEL, val);
365     SetCommandResult("result", JsonReader::CreateBool(true));
366     ILOG("Set power run finished, the value is: %f", val);
367 }
368 
VolumeCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)369 VolumeCommand::VolumeCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
370     : CommandLine(commandType, arg, socket)
371 {
372 }
373 
IsSetArgValid() const374 bool VolumeCommand::IsSetArgValid() const
375 {
376     return true;
377 }
378 
RunGet()379 void VolumeCommand::RunGet()
380 {
381     SetCommandResult("result", JsonReader::CreateString("Command offline"));
382     ILOG("Command offline");
383 }
384 
RunSet()385 void VolumeCommand::RunSet()
386 {
387     SetCommandResult("result", JsonReader::CreateString("Command offline"));
388     ILOG("Command offline");
389 }
390 
BarometerCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)391 BarometerCommand::BarometerCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
392     : CommandLine(commandType, arg, socket)
393 {
394 }
395 
IsSetArgValid() const396 bool BarometerCommand::IsSetArgValid() const
397 {
398     if (args.IsNull() || !args.IsMember("Barometer") || !args["Barometer"].IsUInt()) {
399         ELOG("Invalid number of arguments!");
400         return false;
401     }
402     uint32_t val = args["Barometer"].AsUInt();
403     if (!SharedData<uint32_t>::IsValid(SharedDataType::PRESSURE_VALUE, val)) {
404         ELOG("Barometer invalid value: %d", val);
405         return false;
406     }
407     return true;
408 }
409 
RunGet()410 void BarometerCommand::RunGet()
411 {
412     int barometer = static_cast<int>(SharedData<uint32_t>::GetData(SharedDataType::PRESSURE_VALUE));
413     Json2::Value resultContent = JsonReader::CreateObject();
414     resultContent.Add("Barometer", barometer);
415     SetCommandResult("result", resultContent);
416     ILOG("Get barometer run finished");
417 }
418 
RunSet()419 void BarometerCommand::RunSet()
420 {
421     uint32_t val = args["Barometer"].AsUInt();
422     SharedData<uint32_t>::SetData(SharedDataType::PRESSURE_VALUE, val);
423     SetCommandResult("result", JsonReader::CreateBool(true));
424     ILOG("Set barometer run finished, the value is: %d", val);
425 }
426 
ResolutionSwitchCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)427 ResolutionSwitchCommand::ResolutionSwitchCommand(CommandType commandType,
428                                                  const Json2::Value& arg,
429                                                  const LocalSocket& socket)
430     : CommandLine(commandType, arg, socket)
431 {
432 }
433 
IsSetArgValid() const434 bool ResolutionSwitchCommand::IsSetArgValid() const
435 {
436     if (args.IsNull() || !args.IsMember("originWidth") || !args.IsMember("originHeight") || !args.IsMember("width") ||
437         !args.IsMember("height") || !args.IsMember("screenDensity")) {
438         ELOG("Invalid param of arguments!");
439         return false;
440     }
441     if (!args["originWidth"].IsInt() || !args["originHeight"].IsInt() ||
442         !args["screenDensity"].IsInt() || !args["width"].IsInt() || !args["height"].IsInt()) {
443         ELOG("Invalid number of arguments!");
444         return false;
445     }
446     if (!IsIntValValid()) {
447         return false;
448     }
449     if (args.IsMember("reason")) {
450         if (!args["reason"].IsString()) {
451             return false;
452         }
453         std::string reason = args["reason"].AsString();
454         if (reason != "rotation" && reason != "resize" && reason != "undefined") {
455             ELOG("Invalid value of reason!");
456             return false;
457         }
458     }
459     return true;
460 }
461 
IsIntValValid() const462 bool ResolutionSwitchCommand::IsIntValValid() const
463 {
464     if (args["originWidth"].AsInt() < minWidth || args["originWidth"].AsInt() > maxWidth ||
465         args["originHeight"].AsInt() < minWidth || args["originHeight"].AsInt() > maxWidth ||
466         args["width"].AsInt() < minWidth || args["width"].AsInt() > maxWidth ||
467         args["height"].AsInt() < minWidth || args["height"].AsInt() > maxWidth) {
468         ELOG("width or height is out of range %d-%d", minWidth, maxWidth);
469         return false;
470     }
471     if (args["screenDensity"].AsInt() < minDpi || args["screenDensity"].AsInt() > maxDpi) {
472         ELOG("screenDensity is out of range %d-%d", minDpi, maxDpi);
473         return false;
474     }
475     return true;
476 }
477 
RunSet()478 void ResolutionSwitchCommand::RunSet()
479 {
480     int32_t originWidth = args["originWidth"].AsInt();
481     int32_t originHeight = args["originHeight"].AsInt();
482     int32_t width = args["width"].AsInt();
483     int32_t height = args["height"].AsInt();
484     int32_t screenDensity = args["screenDensity"].AsInt();
485     std::string reason = "undefined";
486     if (args.IsMember("reason")) {
487         reason = args["reason"].AsString();
488     }
489     ResolutionParam param(originWidth, originHeight, width, height);
490     JsAppImpl::GetInstance().ResolutionChanged(param, screenDensity, reason);
491     SetCommandResult("result", JsonReader::CreateBool(true));
492     ILOG("ResolutionSwitch run finished.");
493 }
494 
OrientationCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)495 OrientationCommand::OrientationCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
496     : CommandLine(commandType, arg, socket)
497 {
498 }
499 
IsSetArgValid() const500 bool OrientationCommand::IsSetArgValid() const
501 {
502     if (args.IsNull() || !args.IsMember("Orientation") || !args["Orientation"].IsString()) {
503         ELOG("Invalid number of arguments!");
504         return false;
505     }
506     if (args["Orientation"].AsString() != "portrait" && args["Orientation"].AsString() != "landscape") {
507         ELOG("Orientation just support [portrait,landscape].");
508         return false;
509     }
510     return true;
511 }
512 
RunSet()513 void OrientationCommand::RunSet()
514 {
515     std::string commandOrientation = args["Orientation"].AsString();
516     std::string currentOrientation = JsAppImpl::GetInstance().GetOrientation();
517     if (commandOrientation != currentOrientation) {
518         JsAppImpl::GetInstance().OrientationChanged(commandOrientation);
519     }
520     SetCommandResult("result", JsonReader::CreateBool(true));
521     ILOG("Set Orientation run finished, Orientation is: %s", args["Orientation"].AsString().c_str());
522 }
523 
ColorModeCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)524 ColorModeCommand::ColorModeCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
525     : CommandLine(commandType, arg, socket)
526 {
527 }
528 
IsSetArgValid() const529 bool ColorModeCommand::IsSetArgValid() const
530 {
531     if (args.IsNull() || !args.IsMember("ColorMode") || !args["ColorMode"].IsString()) {
532         ELOG("Invalid number of arguments!");
533         return false;
534     }
535 
536     if (args["ColorMode"].AsString() != "light" && args["ColorMode"].AsString() != "dark") {
537         ELOG("ColorMode just support [light,dark]");
538         return false;
539     }
540     return true;
541 }
542 
RunSet()543 void ColorModeCommand::RunSet()
544 {
545     std::string commandColorMode = args["ColorMode"].AsString();
546     std::string currentColorMode = JsAppImpl::GetInstance().GetColorMode();
547     if (commandColorMode != currentColorMode) {
548         JsAppImpl::GetInstance().SetArgsColorMode(args["ColorMode"].AsString());
549         JsAppImpl::GetInstance().ColorModeChanged(commandColorMode);
550     }
551     SetCommandResult("result", JsonReader::CreateBool(true));
552     ILOG("Set ColorMode run finished, ColorMode is: %s", args["ColorMode"].AsString().c_str());
553 }
554 
FontSelectCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)555 FontSelectCommand::FontSelectCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
556     : CommandLine(commandType, arg, socket)
557 {
558 }
559 
IsSetArgValid() const560 bool FontSelectCommand::IsSetArgValid() const
561 {
562     if (args.IsNull() || !args.IsMember("FontSelect") || !args["FontSelect"].IsBool()) {
563         ELOG("Invalid number of arguments!");
564         return false;
565     }
566     return true;
567 }
568 
RunSet()569 void FontSelectCommand::RunSet()
570 {
571     SetCommandResult("result", JsonReader::CreateBool(true));
572     ILOG("FontSelect finished, currentSelect is: %s", args["FontSelect"].AsBool() ? "true" : "false");
573 }
574 
MemoryRefreshCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)575 MemoryRefreshCommand::MemoryRefreshCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
576     : CommandLine(commandType, arg, socket)
577 {
578 }
579 
IsSetArgValid() const580 bool MemoryRefreshCommand::IsSetArgValid() const
581 {
582     if (args.IsNull()) {
583         ELOG("Invalid MemoryRefresh of arguments!");
584         return false;
585     }
586     return true;
587 }
588 
RunSet()589 void MemoryRefreshCommand::RunSet()
590 {
591     ILOG("MemoryRefreshCommand begin.");
592     bool ret = JsAppImpl::GetInstance().MemoryRefresh(args.ToStyledString());
593     SetCommandResult("result", JsonReader::CreateBool(ret));
594     ILOG("MemoryRefresh finished.");
595 }
596 
LoadDocumentCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)597 LoadDocumentCommand::LoadDocumentCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
598     : CommandLine(commandType, arg, socket)
599 {
600 }
601 
IsSetArgValid() const602 bool LoadDocumentCommand::IsSetArgValid() const
603 {
604     if (args.IsNull() || !args.IsMember("url") || !args.IsMember("className") || !args.IsMember("previewParam") ||
605         !args["url"].IsString() || !args["className"].IsString() || !args["previewParam"].IsObject()) {
606         return false;
607     }
608     Json2::Value previewParam = args["previewParam"];
609     if (!previewParam["width"].IsInt() || !previewParam["height"].IsInt() || !previewParam["dpi"].IsInt() ||
610         !previewParam["locale"].IsString() || !previewParam["colorMode"].IsString() ||
611         !previewParam["orientation"].IsString() || !previewParam["deviceType"].IsString()) {
612         return false;
613     }
614     if (!IsIntValValid(previewParam) || !IsStrValVailid(previewParam)) {
615         return false;
616     }
617     return true;
618 }
619 
IsIntValValid(const Json2::Value & previewParam) const620 bool LoadDocumentCommand::IsIntValValid(const Json2::Value& previewParam) const
621 {
622     int width = previewParam["width"].AsInt();
623     int height = previewParam["height"].AsInt();
624     int dpi = previewParam["dpi"].AsInt();
625     if (width < minLoadDocWidth || width > maxLoadDocWidth || height < minLoadDocWidth ||
626         height > maxLoadDocWidth || dpi < minDpi || dpi > maxDpi) {
627         return false;
628     }
629     return true;
630 }
631 
IsStrValVailid(const Json2::Value & previewParam) const632 bool LoadDocumentCommand::IsStrValVailid(const Json2::Value& previewParam) const
633 {
634     std::string locale = previewParam["locale"].AsString();
635     bool isLiteDevice = JsApp::IsLiteDevice(CommandParser::GetInstance().GetDeviceType());
636     if (isLiteDevice) {
637         if (std::find(liteSupportedLanguages.begin(), liteSupportedLanguages.end(), locale) ==
638             liteSupportedLanguages.end()) {
639             return false;
640         }
641     } else {
642         if (std::find(richSupportedLanguages.begin(), richSupportedLanguages.end(), locale) ==
643             richSupportedLanguages.end()) {
644             return false;
645         }
646     }
647     if (previewParam["colorMode"].AsString() != "light" && previewParam["colorMode"].AsString() != "dark") {
648         return false;
649     }
650     if (previewParam["orientation"].AsString() != "portrait" &&
651         previewParam["orientation"].AsString() != "landscape") {
652         return false;
653     }
654     if (std::find(LoadDocDevs.begin(), LoadDocDevs.end(), previewParam["deviceType"].AsString()) ==
655         LoadDocDevs.end()) {
656         return false;
657     }
658     return true;
659 }
660 
RunSet()661 void LoadDocumentCommand::RunSet()
662 {
663     VirtualScreenImpl::GetInstance().SetLoadDocFlag(VirtualScreen::LoadDocType::START);
664     ILOG("LoadDocumentCommand begin.");
665     std::string pageUrl = args["url"].AsString();
666     std::string className = args["className"].AsString();
667     VirtualScreenImpl::GetInstance().InitFlushEmptyTime();
668     JsAppImpl::GetInstance().LoadDocument(pageUrl, className, args["previewParam"]);
669     VirtualScreenImpl::GetInstance().SetLoadDocFlag(VirtualScreen::LoadDocType::FINISHED);
670     SetCommandResult("result", JsonReader::CreateBool(true));
671     ILOG("LoadDocumentCommand finished.");
672 }
673 
ReloadRuntimePageCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)674 ReloadRuntimePageCommand::ReloadRuntimePageCommand(CommandType commandType,
675                                                    const Json2::Value& arg,
676                                                    const LocalSocket& socket)
677     : CommandLine(commandType, arg, socket)
678 {
679 }
680 
IsSetArgValid() const681 bool ReloadRuntimePageCommand::IsSetArgValid() const
682 {
683     if (args.IsNull() || !args.IsMember("ReloadRuntimePage") || !args["ReloadRuntimePage"].IsString()) {
684         ELOG("Invalid number of arguments!");
685         return false;
686     }
687     return true;
688 }
689 
RunSet()690 void ReloadRuntimePageCommand::RunSet()
691 {
692     std::string currentPage = args["ReloadRuntimePage"].AsString();
693     JsAppImpl::GetInstance().ReloadRuntimePage(currentPage);
694     SetCommandResult("result", JsonReader::CreateBool(true));
695     ILOG("ReloadRuntimePage finished, currentPage is: %s", args["ReloadRuntimePage"].AsString().c_str());
696 }
697 
CurrentRouterCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)698 CurrentRouterCommand::CurrentRouterCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
699     : CommandLine(commandType, arg, socket)
700 {
701 }
702 
RunGet()703 void CurrentRouterCommand::RunGet()
704 {
705     Json2::Value resultContent = JsonReader::CreateObject();
706     std::string currentRouter = VirtualScreenImpl::GetInstance().GetCurrentRouter();
707     resultContent.Add("CurrentRouter", currentRouter.c_str());
708     SetResultToManager("args", resultContent, "CurrentJsRouter");
709     ILOG("Get CurrentRouter run finished.");
710 }
711 
LoadContentCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)712 LoadContentCommand::LoadContentCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
713     : CommandLine(commandType, arg, socket)
714 {
715 }
716 
RunGet()717 void LoadContentCommand::RunGet()
718 {
719     Json2::Value resultContent = JsonReader::CreateObject();
720     std::string currentRouter = VirtualScreenImpl::GetInstance().GetAbilityCurrentRouter();
721     resultContent.Add("AbilityCurrentRouter", currentRouter.c_str());
722     SetResultToManager("args", resultContent, "AbilityCurrentJsRouter");
723     ILOG("Get AbilityCurrentRouter run finished.");
724 }
725 
LanguageCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)726 LanguageCommand::LanguageCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
727     : CommandLine(commandType, arg, socket)
728 {
729 }
730 
IsSetArgValid() const731 bool LanguageCommand::IsSetArgValid() const
732 {
733     if (args.IsNull() || !args.IsMember("Language") || !args["Language"].IsString()) {
734         ELOG("Invalid number of arguments!");
735         return false;
736     }
737 
738     CommandParser& cmdParser = CommandParser::GetInstance();
739     std::string deviceType = cmdParser.GetDeviceType();
740     bool isLiteDevice = JsApp::IsLiteDevice(deviceType);
741     if (isLiteDevice) {
742         if (std::find(liteSupportedLanguages.begin(), liteSupportedLanguages.end(), args["Language"].AsString()) ==
743             liteSupportedLanguages.end()) {
744             ELOG("Language not support liteDevice : %s", args["Language"].AsString().c_str());
745             return false;
746         }
747     } else {
748         if (std::find(richSupportedLanguages.begin(), richSupportedLanguages.end(), args["Language"].AsString()) ==
749             richSupportedLanguages.end()) {
750             ELOG("Language not support richDevice : %s", args["Language"].AsString().c_str());
751             return false;
752         }
753     }
754     return true;
755 }
756 
RunGet()757 void LanguageCommand::RunGet()
758 {
759     std::string language = SharedData<std::string>::GetData(SharedDataType::LANGUAGE);
760     Json2::Value resultContent = JsonReader::CreateObject();
761     resultContent.Add("Language", language.c_str());
762     SetCommandResult("result", resultContent);
763     ILOG("Get language run finished.");
764 }
765 
RunSet()766 void LanguageCommand::RunSet()
767 {
768     std::string language(args["Language"].AsString());
769     SharedData<std::string>::SetData(SharedDataType::LANGUAGE, language);
770     SetCommandResult("result", JsonReader::CreateBool(true));
771     ILOG("Set language run finished, language is: %s", language.c_str());
772 }
773 
SupportedLanguagesCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)774 SupportedLanguagesCommand::SupportedLanguagesCommand(CommandType commandType,
775                                                      const Json2::Value& arg,
776                                                      const LocalSocket& socket)
777     : CommandLine(commandType, arg, socket)
778 {
779 }
780 
RunGet()781 void SupportedLanguagesCommand::RunGet()
782 {
783     Json2::Value resultContent = JsonReader::CreateObject();
784     Json2::Value languageList = JsonReader::CreateArray();
785     std::string deviceType = CommandParser::GetInstance().GetDeviceType();
786     bool isLiteDevice = JsApp::IsLiteDevice(deviceType);
787     if (!deviceType.empty() && !isLiteDevice) {
788         for (auto iter = richSupportedLanguages.begin(); iter != richSupportedLanguages.end(); iter++) {
789             languageList.Add((*iter).c_str());
790         }
791     } else {
792         for (auto iter = liteSupportedLanguages.begin(); iter != liteSupportedLanguages.end(); iter++) {
793             languageList.Add((*iter).c_str());
794         }
795     }
796     resultContent.Add("SupportedLanguages", languageList);
797     SetCommandResult("result", resultContent);
798     ILOG("Get supportedLanguages run finished.");
799 }
800 
LocationCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)801 LocationCommand::LocationCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
802     : CommandLine(commandType, arg, socket)
803 {
804 }
805 
IsSetArgValid() const806 bool LocationCommand::IsSetArgValid() const
807 {
808     if (args.IsNull() || !args.IsMember("latitude") || !args.IsMember("longitude")) {
809         ELOG("Invalid number of arguments!");
810         return false;
811     }
812     std::string latitude(args["latitude"].AsString());
813     std::string longitude(args["longitude"].AsString());
814     std::regex isDob("^([\\-]*[0-9]{1,}[\\.][0-9]*)$");
815     if (!regex_match(latitude, isDob) || !regex_match(longitude, isDob)) {
816         ELOG("Invalid arguments!");
817         return false;
818     }
819 
820     if (!SharedData<double>::IsValid(SharedDataType::LATITUDE, atof(latitude.data()))) {
821         ELOG("LocationCommand invalid latitude value: %f", atof(latitude.data()));
822         return false;
823     }
824 
825     if (!SharedData<double>::IsValid(SharedDataType::LONGITUDE, atof(longitude.data()))) {
826         ELOG("LocationCommand invalid longitude value: %f", atof(longitude.data()));
827         return false;
828     }
829     return true;
830 }
831 
RunGet()832 void LocationCommand::RunGet()
833 {
834     double longitude = SharedData<double>::GetData(SharedDataType::LONGITUDE);
835     double latitude = SharedData<double>::GetData(SharedDataType::LATITUDE);
836     Json2::Value resultContent = JsonReader::CreateObject();
837     resultContent.Add("latitude", latitude);
838     resultContent.Add("longitude", longitude);
839     SetCommandResult("result", resultContent);
840     ILOG("Get location run finished");
841 }
842 
RunSet()843 void LocationCommand::RunSet()
844 {
845     std::string latitude(args["latitude"].AsString());
846     std::string longitude(args["longitude"].AsString());
847     SharedData<double>::SetData(SharedDataType::LONGITUDE, atof(longitude.data()));
848     SharedData<double>::SetData(SharedDataType::LATITUDE, atof(latitude.data()));
849     Json2::Value resultContent = JsonReader::CreateBool(true);
850     SetCommandResult("result", resultContent);
851     ILOG("Set location run finished, latitude: %s,longitude: %s", latitude.c_str(), longitude.c_str());
852 }
853 
DistributedCommunicationsCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)854 DistributedCommunicationsCommand::DistributedCommunicationsCommand(CommandType commandType,
855                                                                    const Json2::Value& arg,
856                                                                    const LocalSocket& socket)
857     : CommandLine(commandType, arg, socket)
858 {
859 }
860 
RunAction()861 void DistributedCommunicationsCommand::RunAction()
862 {
863     MessageInfo info;
864     info.deviceID = args["DeviceId"].AsString();
865     info.bundleName = args["bundleName"].AsString();
866     info.abilityName = args["abilityName"].AsString();
867     info.message = args["message"].AsString();
868     VirtualMessageImpl::GetInstance().SendVirtualMessage(info);
869     Json2::Value resultContent = JsonReader::CreateBool(true);
870     SetCommandResult("result", resultContent);
871     ILOG("Send distributedCommunications run finished");
872 }
873 
IsActionArgValid() const874 bool DistributedCommunicationsCommand::IsActionArgValid() const
875 {
876     if (args.IsNull() || !args.IsMember("DeviceId") || !args.IsMember("bundleName") || !args.IsMember("abilityName") ||
877         !args.IsMember("message")) {
878         ELOG("Invalid number of arguments!");
879         return false;
880     }
881     if (args["DeviceId"].AsString().empty() || args["bundleName"].AsString().empty() ||
882         args["abilityName"].AsString().empty() || args["message"].AsString().empty()) {
883         ELOG("Invalid arguments!");
884         return false;
885     }
886     return true;
887 }
888 
StringToCharVector(std::string str) const889 std::vector<char> DistributedCommunicationsCommand::StringToCharVector(std::string str) const
890 {
891     std::vector<char> vec(str.begin(), str.end());
892     vec.push_back('\0');
893     return vec;
894 }
895 
KeepScreenOnStateCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)896 KeepScreenOnStateCommand::KeepScreenOnStateCommand(CommandType commandType,
897                                                    const Json2::Value& arg,
898                                                    const LocalSocket& socket)
899     : CommandLine(commandType, arg, socket)
900 {
901 }
902 
RunGet()903 void KeepScreenOnStateCommand::RunGet()
904 {
905     Json2::Value result = JsonReader::CreateObject();
906     result.Add("KeepScreenOnState", SharedData<bool>::GetData(SharedDataType::KEEP_SCREEN_ON));
907     SetCommandResult("result", result);
908     ILOG("Get keepScreenOnState run finished");
909 }
910 
RunSet()911 void KeepScreenOnStateCommand::RunSet()
912 {
913     SharedData<bool>::SetData(SharedDataType::KEEP_SCREEN_ON, args["KeepScreenOnState"].AsBool());
914     SetCommandResult("result", JsonReader::CreateBool(true));
915     ILOG("Set keepScreenOnState run finished, the value is: %s",
916         args["KeepScreenOnState"].AsBool() ? "true" : "false");
917 }
918 
IsSetArgValid() const919 bool KeepScreenOnStateCommand::IsSetArgValid() const
920 {
921     if (args.IsNull() || !args.IsMember("KeepScreenOnState")) {
922         ELOG("Invalid number of arguments!");
923         return false;
924     }
925     if (!args["KeepScreenOnState"].IsBool()) {
926         ELOG("arg KeepScreenOnState id not bool");
927         return false;
928     }
929     return true;
930 }
931 
WearingStateCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)932 WearingStateCommand::WearingStateCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
933     : CommandLine(commandType, arg, socket)
934 {
935 }
936 
RunGet()937 void WearingStateCommand::RunGet()
938 {
939     Json2::Value result = JsonReader::CreateObject();
940     result.Add("WearingState", SharedData<bool>::GetData(SharedDataType::WEARING_STATE));
941     SetCommandResult("result", result);
942     ILOG("Get wearingState run finished");
943 }
944 
RunSet()945 void WearingStateCommand::RunSet()
946 {
947     SharedData<bool>::SetData(SharedDataType::WEARING_STATE, args["WearingState"].AsBool());
948     SetCommandResult("result", JsonReader::CreateBool(true));
949     ILOG("Set wearingState run finished, the value is: %s", args["WearingState"].AsBool() ? "true" : "false");
950 }
951 
IsSetArgValid() const952 bool WearingStateCommand::IsSetArgValid() const
953 {
954     if (args.IsNull() || !args.IsMember("WearingState")) {
955         ELOG("Invalid number of arguments!");
956         return false;
957     }
958     if (!args["WearingState"].IsBool()) {
959         ILOG("arg WearingState is not bool");
960         return false;
961     }
962     return true;
963 }
964 
BrightnessModeCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)965 BrightnessModeCommand::BrightnessModeCommand(CommandType commandType, const Json2::Value& arg,
966     const LocalSocket& socket) : CommandLine(commandType, arg, socket)
967 {
968 }
969 
RunGet()970 void BrightnessModeCommand::RunGet()
971 {
972     Json2::Value result = JsonReader::CreateObject();
973     result.Add("BrightnessMode", SharedData<uint8_t>::GetData(SharedDataType::BRIGHTNESS_MODE));
974     SetCommandResult("result", result);
975     ILOG("Get brightnessMode run finished");
976 }
977 
RunSet()978 void BrightnessModeCommand::RunSet()
979 {
980     SharedData<uint8_t>::SetData(SharedDataType::BRIGHTNESS_MODE,
981                                  static_cast<uint8_t>(args["BrightnessMode"].AsInt()));
982     SetCommandResult("result", JsonReader::CreateBool(true));
983     ILOG("Set brightnessMode run finished, the value is: %d", args["BrightnessMode"].AsInt());
984 }
985 
IsSetArgValid() const986 bool BrightnessModeCommand::IsSetArgValid() const
987 {
988     if (args.IsNull() || !args.IsMember("BrightnessMode")) {
989         ELOG("Invalid number of arguments!");
990         return false;
991     }
992     if (!args["BrightnessMode"].IsInt()) {
993         ELOG("BrightnessMode is not int");
994         return false;
995     }
996     uint8_t temp = static_cast<uint8_t>(args["BrightnessMode"].AsInt());
997     if (!SharedData<uint8_t>::IsValid(SharedDataType::BRIGHTNESS_MODE, temp)) {
998         ELOG("BrightnessModeCommand invalid value: %d", temp);
999         return false;
1000     }
1001     return true;
1002 }
1003 
ChargeModeCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1004 ChargeModeCommand::ChargeModeCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1005     : CommandLine(commandType, arg, socket)
1006 {
1007 }
1008 
RunGet()1009 void ChargeModeCommand::RunGet()
1010 {
1011     Json2::Value result = JsonReader::CreateObject();
1012     result.Add("ChargeMode", SharedData<uint8_t>::GetData(SharedDataType::BATTERY_STATUS));
1013     SetCommandResult("result", result);
1014     ILOG("Get chargeMode run finished");
1015 }
1016 
RunSet()1017 void ChargeModeCommand::RunSet()
1018 {
1019     SharedData<uint8_t>::SetData(SharedDataType::BATTERY_STATUS,
1020                                  static_cast<uint8_t>(args["ChargeMode"].AsInt()));
1021     SetCommandResult("result", JsonReader::CreateBool(true));
1022     ILOG("Set chargeMode run finished, the value is: %d", args["ChargeMode"].AsInt());
1023 }
1024 
IsSetArgValid() const1025 bool ChargeModeCommand::IsSetArgValid() const
1026 {
1027     if (args.IsNull() || !args.IsMember("ChargeMode")) {
1028         ELOG("Invalid number of arguments!");
1029         return false;
1030     }
1031     if (!args["ChargeMode"].IsInt()) {
1032         ELOG("ChargeMode is not int");
1033         return false;
1034     }
1035     uint8_t temp = static_cast<uint8_t>(args["ChargeMode"].AsInt());
1036     if (!SharedData<uint8_t>::IsValid(SharedDataType::BATTERY_STATUS, temp)) {
1037         ELOG("ChargeModeCommand invalid value: %d", temp);
1038         return false;
1039     }
1040     return true;
1041 }
1042 
BrightnessCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1043 BrightnessCommand::BrightnessCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1044     : CommandLine(commandType, arg, socket)
1045 {
1046 }
1047 
RunGet()1048 void BrightnessCommand::RunGet()
1049 {
1050     Json2::Value result = JsonReader::CreateObject();
1051     result.Add("Brightness", SharedData<uint8_t>::GetData(SharedDataType::BRIGHTNESS_VALUE));
1052     SetCommandResult("result", result);
1053     ILOG("Get brightness run finished");
1054 }
1055 
RunSet()1056 void BrightnessCommand::RunSet()
1057 {
1058     SharedData<uint8_t>::SetData(SharedDataType::BRIGHTNESS_VALUE,
1059                                  static_cast<uint8_t>(args["Brightness"].AsInt()));
1060     Json2::Value result = JsonReader::CreateBool(true);
1061     SetCommandResult("result", result);
1062     ILOG("Set brightness run finished, the value is: %d", args["Brightness"].AsInt());
1063 }
1064 
IsSetArgValid() const1065 bool BrightnessCommand::IsSetArgValid() const
1066 {
1067     if (args.IsNull() || !args.IsMember("Brightness")) {
1068         ELOG("Invalid number of arguments!");
1069         return false;
1070     }
1071     if (!args["Brightness"].IsInt()) {
1072         ELOG("Brightness is not int");
1073         return false;
1074     }
1075     uint8_t temp = static_cast<uint8_t>(args["Brightness"].AsInt());
1076     if (!SharedData<uint8_t>::IsValid(SharedDataType::BRIGHTNESS_VALUE, temp)) {
1077         ELOG("BrightnessCommand invalid value: ", temp);
1078         return false;
1079     }
1080     return true;
1081 }
1082 
HeartRateCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1083 HeartRateCommand::HeartRateCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1084     : CommandLine(commandType, arg, socket)
1085 {
1086 }
1087 
RunGet()1088 void HeartRateCommand::RunGet()
1089 {
1090     Json2::Value result = JsonReader::CreateObject();
1091     result.Add("HeartRate", SharedData<uint8_t>::GetData(SharedDataType::HEARTBEAT_VALUE));
1092     SetCommandResult("result", result);
1093     ILOG("Get heartRate run finished");
1094 }
1095 
RunSet()1096 void HeartRateCommand::RunSet()
1097 {
1098     SharedData<uint8_t>::SetData(SharedDataType::HEARTBEAT_VALUE,
1099                                  static_cast<uint8_t>(args["HeartRate"].AsInt()));
1100     SetCommandResult("result", JsonReader::CreateBool(true));
1101     ILOG("Set heartRate run finished, the value is: %d", args["HeartRate"].AsInt());
1102 }
1103 
IsSetArgValid() const1104 bool HeartRateCommand::IsSetArgValid() const
1105 {
1106     if (args.IsNull() || !args.IsMember("HeartRate")) {
1107         ELOG("Invalid number of arguments!");
1108         return false;
1109     }
1110     if (!args["HeartRate"].IsInt()) {
1111         ELOG("HeartRate is not int");
1112         return false;
1113     }
1114     if (args["HeartRate"].AsInt() > UINT8_MAX) {
1115         ELOG("Invalid arguments!");
1116         return false;
1117     }
1118     uint8_t temp = static_cast<uint8_t>(args["HeartRate"].AsInt());
1119     if (!SharedData<uint8_t>::IsValid(SharedDataType::HEARTBEAT_VALUE, temp)) {
1120         ELOG("HeartRateCommand invalid value: %d", temp);
1121         return false;
1122     }
1123     return true;
1124 }
1125 
StepCountCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1126 StepCountCommand::StepCountCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1127     : CommandLine(commandType, arg, socket)
1128 {
1129 }
1130 
RunGet()1131 void StepCountCommand::RunGet()
1132 {
1133     Json2::Value result = JsonReader::CreateObject();
1134     result.Add("StepCount", SharedData<uint32_t>::GetData(SharedDataType::SUMSTEP_VALUE));
1135     SetCommandResult("result", result);
1136     ILOG("Get stepCount run finished");
1137 }
1138 
RunSet()1139 void StepCountCommand::RunSet()
1140 {
1141     SharedData<uint32_t>::SetData(SharedDataType::SUMSTEP_VALUE,
1142                                   static_cast<uint32_t>(args["StepCount"].AsInt()));
1143     SetCommandResult("result", JsonReader::CreateBool(true));
1144     ILOG("Set stepCount run finished, the value is: %d", args["StepCount"].AsInt());
1145 }
1146 
IsSetArgValid() const1147 bool StepCountCommand::IsSetArgValid() const
1148 {
1149     if (args.IsNull() || !args.IsMember("StepCount")) {
1150         ELOG("Invalid number of arguments!");
1151         return false;
1152     }
1153     if (!args["StepCount"].IsInt()) {
1154         ELOG("StepCount is not int");
1155         return false;
1156     }
1157 
1158     uint32_t temp = args["StepCount"].AsUInt();
1159     if (!SharedData<uint32_t>::IsValid(SharedDataType::SUMSTEP_VALUE, temp)) {
1160         ELOG("StepCountCommand invalid value: %d", temp);
1161         return false;
1162     }
1163     return true;
1164 }
1165 
InspectorJSONTree(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1166 InspectorJSONTree::InspectorJSONTree(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1167     : CommandLine(commandType, arg, socket)
1168 {
1169 }
1170 
RunAction()1171 void InspectorJSONTree::RunAction()
1172 {
1173     ILOG("GetJsonTree run!");
1174     std::string str = JsAppImpl::GetInstance().GetJSONTree();
1175     if (str == "null") {
1176         str = "{\"children\":\"empty json tree\"}";
1177     }
1178     SetCommandResult("result", JsonReader::CreateString(str));
1179     ILOG("SendJsonTree end!");
1180 }
1181 
InspectorDefault(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1182 InspectorDefault::InspectorDefault(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1183     : CommandLine(commandType, arg, socket)
1184 {
1185 }
1186 
RunAction()1187 void InspectorDefault::RunAction()
1188 {
1189     ILOG("GetDefaultJsonTree run!");
1190     std::string str = JsAppImpl::GetInstance().GetDefaultJSONTree();
1191     SetCommandResult("result", JsonReader::CreateString(str));
1192     ILOG("SendDefaultJsonTree end!");
1193 }
1194 
ExitCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1195 ExitCommand::ExitCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1196     : CommandLine(commandType, arg, socket)
1197 {
1198 }
1199 
RunAction()1200 void ExitCommand::RunAction()
1201 {
1202     ILOG("ExitCommand run.");
1203     SetCommandResult("result", JsonReader::CreateBool(true));
1204     SendResult();
1205     Interrupter::Interrupt();
1206     ILOG("Ready to exit");
1207 }
1208 
DeviceTypeCommand(CommandLine::CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1209 DeviceTypeCommand::DeviceTypeCommand(CommandLine::CommandType commandType,
1210                                      const Json2::Value& arg,
1211                                      const LocalSocket& socket)
1212     : CommandLine(commandType, arg, socket)
1213 {
1214 }
1215 
RunSet()1216 void DeviceTypeCommand::RunSet() {}
1217 
ResolutionCommand(CommandLine::CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1218 ResolutionCommand::ResolutionCommand(CommandLine::CommandType commandType,
1219                                      const Json2::Value& arg,
1220                                      const LocalSocket& socket)
1221     : CommandLine(commandType, arg, socket)
1222 {
1223 }
1224 
RunSet()1225 void ResolutionCommand::RunSet() {}
1226 
BackClickedCommand(CommandLine::CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1227 BackClickedCommand::BackClickedCommand(CommandLine::CommandType commandType,
1228                                        const Json2::Value& arg,
1229                                        const LocalSocket& socket)
1230     : CommandLine(commandType, arg, socket)
1231 {
1232 }
1233 
RunAction()1234 void BackClickedCommand::RunAction()
1235 {
1236     MouseInputImpl::GetInstance().DispatchOsBackEvent();
1237     ILOG("BackClickCommand run");
1238     SetCommandResult("result", JsonReader::CreateBool(true));
1239     ILOG("BackClickCommand end");
1240 }
1241 
RestartCommand(CommandLine::CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1242 RestartCommand::RestartCommand(CommandLine::CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1243     : CommandLine(commandType, arg, socket)
1244 {
1245 }
1246 
RunAction()1247 void RestartCommand::RunAction()
1248 {
1249     ILOG("RestartCommand start");
1250     JsAppImpl::GetInstance().Restart();
1251     SetCommandResult("result", JsonReader::CreateBool(true));
1252     ILOG("RestartCommand end");
1253 }
1254 
FastPreviewMsgCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1255 FastPreviewMsgCommand::FastPreviewMsgCommand(CommandType commandType, const Json2::Value& arg,
1256     const LocalSocket& socket) : CommandLine(commandType, arg, socket)
1257 {
1258 }
1259 
RunGet()1260 void FastPreviewMsgCommand::RunGet()
1261 {
1262     Json2::Value resultContent = JsonReader::CreateObject();
1263     std::string fastPreviewMsg = VirtualScreenImpl::GetInstance().GetFastPreviewMsg();
1264     resultContent.Add("FastPreviewMsg", fastPreviewMsg.c_str());
1265     SetResultToManager("args", resultContent, "MemoryRefresh");
1266     ILOG("Get FastPreviewMsgCommand run finished.");
1267 }
1268 
DropFrameCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1269 DropFrameCommand::DropFrameCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1270     : CommandLine(commandType, arg, socket)
1271 {
1272 }
1273 
IsSetArgValid() const1274 bool DropFrameCommand::IsSetArgValid() const
1275 {
1276     if (args.IsNull() || !args.IsMember("frequency") || !args["frequency"].IsInt()) {
1277         ELOG("Invalid DropFrame of arguments!");
1278         return false;
1279     }
1280     if (args["frequency"].AsInt() < 0) {
1281         ELOG("DropFrame param frequency must greater than or equal to 0");
1282         return false;
1283     }
1284     return true;
1285 }
1286 
RunSet()1287 void DropFrameCommand::RunSet()
1288 {
1289     ILOG("Set DropFrame frequency start.");
1290     int frequency = args["frequency"].AsInt();
1291     VirtualScreenImpl::GetInstance().SetDropFrameFrequency(frequency);
1292     SetCommandResult("result", JsonReader::CreateBool(true));
1293     ILOG("Set DropFrame frequency: %dms.", frequency);
1294 }
1295 
IsActionArgValid() const1296 bool KeyPressCommand::IsActionArgValid() const
1297 {
1298     if (args.IsNull() || !args.IsMember("isInputMethod") || !args["isInputMethod"].IsBool()) {
1299         ELOG("Param isInputMethod's value is invalid.");
1300         return false;
1301     }
1302     bool isInputMethod = args["isInputMethod"].AsBool();
1303     if (isInputMethod) {
1304         return IsImeArgsValid();
1305     } else {
1306         return IsKeyArgsValid();
1307     }
1308 }
1309 
IsImeArgsValid() const1310 bool KeyPressCommand::IsImeArgsValid() const
1311 {
1312     if (!args.IsMember("codePoint") || !args["codePoint"].IsInt()) {
1313         ELOG("Param codePoint's value is invalid.");
1314         return false;
1315     }
1316     return true;
1317 }
1318 
IsKeyArgsValid() const1319 bool KeyPressCommand::IsKeyArgsValid() const
1320 {
1321     if (!args.IsMember("keyCode") || !args["keyCode"].IsInt() || !args["keyAction"].IsInt() ||
1322         !args.IsMember("keyAction") || !args["keyAction"].IsInt() ||
1323         !args.IsMember("pressedCodes") || !args["pressedCodes"].IsArray() ||
1324         args["pressedCodes"].GetArraySize() < 1 || (args.IsMember("keyString") && !args["keyString"].IsString())) {
1325         ELOG("Param keyEvent's value is invalid.");
1326         return false;
1327     }
1328     if (!args.IsMember("keyString")) {
1329         ILOG("Param keyString is lost, it will be empty string.");
1330     }
1331     if (args["keyAction"].AsInt() < minActionVal || args["keyAction"].AsInt() > maxActionVal) {
1332         ELOG("Param keyAction's value is invalid,value range %d-%d.", minActionVal, maxActionVal);
1333         return false;
1334     }
1335     int keyCode = args["keyCode"].AsInt();
1336     if (keyCode > maxKeyVal || keyCode < minKeyVal) {
1337         ELOG("Param pressedCode value is invalid,value range %d-%d.", minKeyVal, maxKeyVal);
1338         return false;
1339     }
1340     Json2::Value arrayNum = args["pressedCodes"];
1341     for (unsigned int i = 0; i < arrayNum.GetArraySize(); i++) {
1342         if (!arrayNum.GetArrayItem(i).IsInt()) {
1343             ELOG("Param pressedCodes's value is invalid.");
1344             return false;
1345         }
1346         int pressedCode = arrayNum.GetArrayItem(i).AsInt();
1347         if (pressedCode > maxKeyVal || pressedCode < minKeyVal) {
1348             ELOG("Param pressedCode value is invalid,value range %d-%d.", minKeyVal, maxKeyVal);
1349             return false;
1350         }
1351     }
1352     return true;
1353 }
1354 
KeyPressCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1355 KeyPressCommand::KeyPressCommand(CommandType commandType, const Json2::Value& arg,
1356                                  const LocalSocket& socket)
1357     : CommandLine(commandType, arg, socket)
1358 {
1359 }
1360 
RunAction()1361 void KeyPressCommand::RunAction()
1362 {
1363     if (CommandParser::GetInstance().GetScreenMode() == CommandParser::ScreenMode::STATIC) {
1364         return;
1365     }
1366     bool isInputMethod = args["isInputMethod"].AsBool();
1367     if (isInputMethod) {
1368         VirtualScreen::inputMethodCountPerMinute++;
1369         unsigned int codePoint = args["codePoint"].AsInt();
1370         KeyInputImpl::GetInstance().SetCodePoint(codePoint);
1371         KeyInputImpl::GetInstance().DispatchOsInputMethodEvent();
1372     } else {
1373         VirtualScreen::inputKeyCountPerMinute++;
1374         int32_t keyCode = args["keyCode"].AsInt();
1375         int32_t keyAction = args["keyAction"].AsInt();
1376         Json2::Value pressedCodes = args["pressedCodes"];
1377         std::vector<int32_t> pressedCodesVec;
1378         for (unsigned int i = 0; i < pressedCodes.GetArraySize(); i++) {
1379             pressedCodesVec.push_back(pressedCodes.GetArrayItem(i).AsInt());
1380         }
1381         std::string keyString = "";
1382         if (args.IsMember("keyString") && args["keyString"].IsString()) {
1383             keyString = args["keyString"].AsString();
1384         }
1385         KeyInputImpl::GetInstance().SetKeyEvent(keyCode, keyAction, pressedCodesVec, keyString);
1386         KeyInputImpl::GetInstance().DispatchOsKeyEvent();
1387     }
1388     SetCommandResult("result", JsonReader::CreateBool(true));
1389     ILOG("KeyPressCommand run finished.");
1390 }
1391 
IsActionArgValid() const1392 bool PointEventCommand::IsActionArgValid() const
1393 {
1394     return IsArgsExist() && IsArgsValid();
1395 }
1396 
IsArgsExist() const1397 bool PointEventCommand::IsArgsExist() const
1398 {
1399     if (args.IsNull() || !args.IsMember("x") || !args.IsMember("y") ||
1400         !args["x"].IsInt() || !args["y"].IsInt()) {
1401         return false;
1402     }
1403     if (!args.IsMember("button") || !args.IsMember("action") ||
1404         !args["button"].IsInt() || !args["action"].IsInt()) {
1405         return false;
1406     }
1407     if (!args.IsMember("sourceType") || !args.IsMember("sourceTool") ||
1408         !args["sourceType"].IsInt() || !args["sourceTool"].IsInt()) {
1409         return false;
1410     }
1411     if (!args.IsMember("axisValues") || !args["axisValues"].IsArray()) {
1412         return false;
1413     }
1414     return true;
1415 }
1416 
IsArgsValid() const1417 bool PointEventCommand::IsArgsValid() const
1418 {
1419     int32_t pointX = args["x"].AsInt();
1420     int32_t pointY = args["y"].AsInt();
1421     int32_t button = args["button"].AsInt();
1422     int32_t action = args["action"].AsInt();
1423     int32_t sourceType = args["sourceType"].AsInt();
1424     int32_t sourceTool = args["sourceTool"].AsInt();
1425     if (pointX < 0 || pointX > VirtualScreenImpl::GetInstance().GetCurrentWidth()) {
1426         ELOG("X coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentWidth());
1427         return false;
1428     }
1429     if (pointY < 0 || pointY > VirtualScreenImpl::GetInstance().GetCurrentHeight()) {
1430         ELOG("Y coordinate range %d ~ %d", 0, VirtualScreenImpl::GetInstance().GetCurrentHeight());
1431         return false;
1432     }
1433     if (button < -1 || action < 0 || sourceType < 0 || sourceTool < 0) {
1434         ELOG("action,sourceType,sourceTool must >= 0, button must >= -1");
1435         return false;
1436     }
1437     Json2::Value axisArrayNum = args["axisValues"];
1438     for (unsigned int i = 0; i < axisArrayNum.GetArraySize(); i++) {
1439         if (!axisArrayNum.GetArrayItem(i).IsDouble()) {
1440             ELOG("Param axisValues's value is invalid.");
1441             return false;
1442         }
1443     }
1444     return true;
1445 }
1446 
PointEventCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1447 PointEventCommand::PointEventCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1448     : CommandLine(commandType, arg, socket)
1449 {
1450 }
1451 
RunAction()1452 void PointEventCommand::RunAction()
1453 {
1454     int type = 9;
1455     EventParams param;
1456     if (args.IsMember("pressedButtons") && args["pressedButtons"].IsArray()) {
1457         Json2::Value pressedCodes = args["pressedButtons"];
1458         for (unsigned int i = 0; i < pressedCodes.GetArraySize(); i++) {
1459             Json2::Value val = pressedCodes.GetArrayItem(i);
1460             if (!val.IsInt() || val.AsInt() < -1) {
1461                 continue;
1462             }
1463             param.pressedBtnsVec.insert(val.AsInt());
1464         }
1465     }
1466     std::vector<double> axisVec; // 13 is array size
1467     Json2::Value axisCodes = args["axisValues"];
1468     for (unsigned int i = 0; i < axisCodes.GetArraySize(); i++) {
1469         param.axisVec.push_back(axisCodes.GetArrayItem(i).AsDouble());
1470     }
1471     param.x = args["x"].AsDouble();
1472     param.y = args["y"].AsDouble();
1473     param.type = type;
1474     param.button = args["button"].AsInt();
1475     param.action = args["action"].AsInt();
1476     param.sourceType = args["sourceType"].AsInt();
1477     param.sourceTool = args["sourceTool"].AsInt();
1478     param.name = "PointEvent";
1479     SetEventParams(param);
1480     SetCommandResult("result", JsonReader::CreateBool(true));
1481 }
1482 
FoldStatusCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1483 FoldStatusCommand::FoldStatusCommand(CommandType commandType, const Json2::Value& arg, const LocalSocket& socket)
1484     : CommandLine(commandType, arg, socket)
1485 {
1486 }
1487 
IsSetArgValid() const1488 bool FoldStatusCommand::IsSetArgValid() const
1489 {
1490     if (args.IsNull() || !args.IsMember("FoldStatus") || !args["FoldStatus"].IsString()) {
1491         ELOG("Invalid FoldStatus of arguments!");
1492         return false;
1493     }
1494     if (!args.IsMember("width") || !args["width"].IsInt() ||
1495         !args.IsMember("height") || !args["height"].IsInt()) {
1496         ELOG("Invalid width and height of arguments!");
1497         return false;
1498     }
1499     if (args["width"].AsInt() < minWidth || args["width"].AsInt() > maxWidth ||
1500         args["height"].AsInt() < minWidth || args["height"].AsInt() > maxWidth) {
1501         ELOG("width or height is out of range %d-%d", minWidth, maxWidth);
1502         return false;
1503     }
1504     if (args["FoldStatus"].AsString() == "fold" || args["FoldStatus"].AsString() == "unfold" ||
1505         args["FoldStatus"].AsString() == "unknown" || args["FoldStatus"].AsString() == "half_fold") {
1506         return true;
1507     }
1508     ELOG("FoldStatus param must be \"fold\" or \"unfold\" or \"unknown\" or \"half_fold\"");
1509     return false;
1510 }
1511 
RunSet()1512 void FoldStatusCommand::RunSet()
1513 {
1514     std::string commandStatus = args["FoldStatus"].AsString();
1515     int32_t width = args["width"].AsInt();
1516     int32_t height = args["height"].AsInt();
1517     std::string currentStatus = VirtualScreenImpl::GetInstance().GetFoldStatus();
1518     if (commandStatus != currentStatus) {
1519         JsAppImpl::GetInstance().FoldStatusChanged(commandStatus, width, height);
1520     }
1521     SetCommandResult("result", JsonReader::CreateBool(true));
1522     ILOG("Set FoldStatus run finished, FoldStatus is: %s", args["FoldStatus"].AsString().c_str());
1523 }
1524 
AvoidAreaCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1525 AvoidAreaCommand::AvoidAreaCommand(CommandType commandType, const Json2::Value& arg,
1526     const LocalSocket& socket) : CommandLine(commandType, arg, socket)
1527 {
1528 }
1529 
IsSetArgValid() const1530 bool AvoidAreaCommand::IsSetArgValid() const
1531 {
1532     if (args.IsNull() || !args.IsMember("topRect") || !args.IsMember("bottomRect") ||
1533         !args.IsMember("leftRect") || !args.IsMember("rightRect")) {
1534         ELOG("AvoidAreaCommand missing arguments!");
1535         return false;
1536     }
1537     if (!args["topRect"].IsObject() || !args["bottomRect"].IsObject() || !args["leftRect"].IsObject()
1538         || !args["rightRect"].IsObject()) {
1539         ELOG("Invalid values of arguments!");
1540         return false;
1541     }
1542     Json2::Value topRect = args.GetValue("topRect");
1543     Json2::Value bottomRect = args.GetValue("bottomRect");
1544     Json2::Value leftRect = args.GetValue("leftRect");
1545     Json2::Value rightRect = args.GetValue("rightRect");
1546     if (!IsObjectValid(topRect) || !IsObjectValid(bottomRect) ||
1547         !IsObjectValid(leftRect) || !IsObjectValid(rightRect)) {
1548         ELOG("Invalid values of arguments!");
1549         return false;
1550     }
1551     return true;
1552 }
1553 
IsObjectValid(const Json2::Value & val) const1554 bool AvoidAreaCommand::IsObjectValid(const Json2::Value& val) const
1555 {
1556     if (val.IsNull() || !val.IsMember("posX") || !val["posY"].IsInt() ||
1557         !val.IsMember("width") || !val.IsMember("height")) {
1558         ELOG("AvoidAreaCommand missing arguments!");
1559         return false;
1560     }
1561     if (!val["posX"].IsInt() || !val["posY"].IsInt() || !val["width"].IsUInt()
1562         || !val["height"].IsUInt()) {
1563         ELOG("Invalid values of arguments!");
1564         return false;
1565     }
1566     if (val["posX"].AsInt() < 0 || val["posY"].AsInt() < 0 ||
1567         val["width"].AsUInt() < 0 || val["height"].AsUInt() < 0) {
1568         ELOG("Invalid values of arguments!");
1569         return false;
1570     }
1571     return true;
1572 }
1573 
RunSet()1574 void AvoidAreaCommand::RunSet()
1575 {
1576     Json2::Value topRectObj = args.GetValue("topRect");
1577     AvoidRect topRect = AvoidRect(topRectObj["posX"].AsInt(), topRectObj["posY"].AsInt(),
1578         topRectObj["width"].AsUInt(), topRectObj["height"].AsUInt());
1579     Json2::Value bottomRectObj = args.GetValue("bottomRect");
1580     AvoidRect bottomRect = AvoidRect(bottomRectObj["posX"].AsInt(), bottomRectObj["posY"].AsInt(),
1581         bottomRectObj["width"].AsUInt(), bottomRectObj["height"].AsUInt());
1582     Json2::Value leftRectObj = args.GetValue("leftRect");
1583     AvoidRect leftRect = AvoidRect(leftRectObj["posX"].AsInt(), leftRectObj["posY"].AsInt(),
1584         leftRectObj["width"].AsUInt(), leftRectObj["height"].AsUInt());
1585     Json2::Value rightRectObj = args.GetValue("rightRect");
1586     AvoidRect rightRect = AvoidRect(rightRectObj["posX"].AsInt(), rightRectObj["posY"].AsInt(),
1587         rightRectObj["width"].AsUInt(), rightRectObj["height"].AsUInt());
1588     JsAppImpl::GetInstance().SetAvoidArea(AvoidAreas(topRect, leftRect, rightRect, bottomRect));
1589     SetCommandResult("result", JsonReader::CreateBool(true));
1590     ILOG("Set AvoidArea run finished");
1591 }
1592 
AvoidAreaChangedCommand(CommandType commandType,const Json2::Value & arg,const LocalSocket & socket)1593 AvoidAreaChangedCommand::AvoidAreaChangedCommand(CommandType commandType, const Json2::Value& arg,
1594     const LocalSocket& socket) : CommandLine(commandType, arg, socket)
1595 {
1596 }
1597 
RunGet()1598 void AvoidAreaChangedCommand::RunGet()
1599 {
1600     SetResultToManager("args", args, "AvoidAreaChanged");
1601     ILOG("Get AvoidAreaChangedCommand run finished.");
1602 }