1 /*
2 * Copyright (c) 2022 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 "dcamera_source_hidumper.h"
17
18 #include "dcamera_hidumper.h"
19 #include "distributed_camera_errno.h"
20 #include "distributed_camera_source_service.h"
21 #include "distributed_hardware_log.h"
22
23 namespace OHOS {
24 namespace DistributedHardware {
25 IMPLEMENT_SINGLE_INSTANCE(DcameraSourceHidumper);
26
27 namespace {
28 const std::string ARGS_HELP = "-h";
29 const std::string ARGS_VERSION_INFO = "--version";
30 const std::string ARGS_REGISTERED_INFO = "--registered";
31 const std::string ARGS_CURRENTSTATE_INFO = "--curState";
32 const std::string ARGS_START_DUMP = "--startdump";
33 const std::string ARGS_STOP_DUMP = "--stopdump";
34 const std::string STATE_INT = "Init";
35 const std::string STATE_REGISTERED = "Registered";
36 const std::string STATE_OPENED = "Opened";
37 const std::string STATE_CONFIG_STREAM = "ConfigStream";
38 const std::string STATE_CAPTURE = "Capture";
39
40 const std::map<std::string, HidumpFlag> ARGS_MAP = {
41 { ARGS_HELP, HidumpFlag::GET_HELP },
42 { ARGS_REGISTERED_INFO, HidumpFlag::GET_REGISTERED_INFO },
43 { ARGS_CURRENTSTATE_INFO, HidumpFlag::GET_CURRENTSTATE_INFO },
44 { ARGS_VERSION_INFO, HidumpFlag::GET_VERSION_INFO },
45 { ARGS_START_DUMP, HidumpFlag::START_DUMP },
46 { ARGS_STOP_DUMP, HidumpFlag::STOP_DUMP },
47 };
48
49 const std::map<int32_t, std::string> STATE_MAP = {
50 { DCAMERA_STATE_INIT_DUMP, STATE_INT },
51 { DCAMERA_STATE_REGIST_DUMP, STATE_REGISTERED },
52 { DCAMERA_STATE_OPENED_DUMP, STATE_OPENED },
53 { DCAMERA_STATE_CONFIG_STREAM_DUMP, STATE_CONFIG_STREAM },
54 { DCAMERA_STATE_CAPTURE_DUMP, STATE_CAPTURE },
55 };
56 }
57
SetSourceDumpInfo(CameraDumpInfo & camDumpInfo_)58 void DcameraSourceHidumper::SetSourceDumpInfo(CameraDumpInfo& camDumpInfo_)
59 {
60 DistributedCameraSourceService::GetDumpInfo(camDumpInfo_);
61 }
62
Dump(const std::vector<std::string> & args,std::string & result)63 bool DcameraSourceHidumper::Dump(const std::vector<std::string>& args, std::string& result)
64 {
65 DHLOGI("DcameraSourceHidumper Dump args.size():%d.", args.size());
66 result.clear();
67 int32_t argsSize = static_cast<int32_t>(args.size());
68
69 if (args.empty()) {
70 ShowHelp(result);
71 return true;
72 } else if (args.size() > 1) {
73 ShowIllegalInfomation(result);
74 return true;
75 }
76
77 for (int32_t i = 0; i < argsSize; i++) {
78 DHLOGI("DcameraSourceHidumper Dump args[%d]: %s.", i, args.at(i).c_str());
79 }
80
81 if (ProcessDump(args[0], result) != DCAMERA_OK) {
82 return false;
83 }
84 return true;
85 }
86
ProcessDump(const std::string & args,std::string & result)87 int32_t DcameraSourceHidumper::ProcessDump(const std::string& args, std::string& result)
88 {
89 DHLOGI("ProcessDump Dump.");
90 HidumpFlag hf = HidumpFlag::UNKNOWN;
91 auto operatorIter = ARGS_MAP.find(args);
92 if (operatorIter != ARGS_MAP.end()) {
93 hf = operatorIter->second;
94 }
95
96 if (hf == HidumpFlag::GET_HELP) {
97 ShowHelp(result);
98 return DCAMERA_OK;
99 }
100 result.clear();
101 SetSourceDumpInfo(camDumpInfo_);
102 int32_t ret = DCAMERA_BAD_VALUE;
103 switch (hf) {
104 case HidumpFlag::GET_REGISTERED_INFO: {
105 ret = GetRegisteredInfo(result);
106 break;
107 }
108 case HidumpFlag::GET_CURRENTSTATE_INFO: {
109 ret = GetCurrentStateInfo(result);
110 break;
111 }
112 case HidumpFlag::GET_VERSION_INFO: {
113 ret = GetVersionInfo(result);
114 break;
115 }
116 case HidumpFlag::START_DUMP: {
117 ret = DcameraHidumper::GetInstance().StartDump();
118 result.append("Send dump order ok\n");
119 break;
120 }
121 case HidumpFlag::STOP_DUMP: {
122 ret = DcameraHidumper::GetInstance().StopDump();
123 result.append("Send stop dump order ok\n");
124 break;
125 }
126 default: {
127 ret = ShowIllegalInfomation(result);
128 break;
129 }
130 }
131
132 return ret;
133 }
134
GetRegisteredInfo(std::string & result)135 int32_t DcameraSourceHidumper::GetRegisteredInfo(std::string& result)
136 {
137 DHLOGI("GetRegisteredInfo Dump.");
138 result.append("CameraNumber: ")
139 .append(std::to_string(camDumpInfo_.regNumber));
140 return DCAMERA_OK;
141 }
142
GetCurrentStateInfo(std::string & result)143 int32_t DcameraSourceHidumper::GetCurrentStateInfo(std::string& result)
144 {
145 DHLOGI("GetCurrentStateInfo Dump.");
146 std::map<std::string, int32_t> devState = camDumpInfo_.curState;
147 result.append("CameraId\tState\n");
148 for (auto it = devState.begin(); it != devState.end(); it++) {
149 std::string deviceId("");
150 int32_t camState = 0;
151 deviceId = it->first;
152 camState = it->second;
153 DHLOGI("GetCurrentStateInfo camState is %d.", camState);
154 auto state = STATE_MAP.find(camState);
155 std::string curState("");
156 if (state != STATE_MAP.end()) {
157 curState = state->second;
158 }
159 result.append(deviceId)
160 .append("\t")
161 .append(curState)
162 .append("\n");
163 }
164 return DCAMERA_OK;
165 }
166
GetVersionInfo(std::string & result)167 int32_t DcameraSourceHidumper::GetVersionInfo(std::string& result)
168 {
169 DHLOGI("GetVersionInfo Dump.");
170 result.append("CameraVersion: ")
171 .append(camDumpInfo_.version);
172 return DCAMERA_OK;
173 }
174
ShowHelp(std::string & result)175 void DcameraSourceHidumper::ShowHelp(std::string& result)
176 {
177 DHLOGI("ShowHelp Dump.");
178 result.append("Usage:dump <command> [options]\n")
179 .append("Description:\n")
180 .append("-h ")
181 .append(": show help\n")
182 .append("--version ")
183 .append(": dump camera version in the system\n")
184 .append("--registered ")
185 .append(": dump number of registered cameras in the system\n")
186 .append("--curState ")
187 .append(": dump current state of the camera in the system\n")
188 .append("--startdump ")
189 .append(": dump camera data in /data/data/dcamera\n")
190 .append("--stopdump ")
191 .append(": stop dump camera data\n");
192 }
193
ShowIllegalInfomation(std::string & result)194 int32_t DcameraSourceHidumper::ShowIllegalInfomation(std::string& result)
195 {
196 DHLOGI("ShowIllegalInfomation Dump.");
197 result.append("unknown command, -h for help.");
198 return DCAMERA_OK;
199 }
200 } // namespace DistributedHardware
201 } // namespace OHOS