blob: 7d4009f398398594b14a23a491c37035d7cdaf8f [file] [log] [blame]
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001/*
2 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
Vadim Ioseviche76832c2017-11-05 09:09:14 +020030#include <sstream>
31#include <string>
32#include <set>
Vadim Iosevichd50ea462017-03-30 16:19:08 +030033#include "CommandsHandler.h"
34#include "Host.h"
Vadim Iosevich40679a12017-06-06 14:24:07 +030035#include "HostDefinitions.h"
36#include "FileReader.h"
Vadim Ioseviche76832c2017-11-05 09:09:14 +020037#include "JsonSerializeHelper.h"
Vadim Iosevich40679a12017-06-06 14:24:07 +030038
Vadim Ioseviche76832c2017-11-05 09:09:14 +020039#ifdef _WINDOWS
40#include "ioctl_if.h"
41#endif
42
43CommandsHandler::CommandsHandler(ServerType type, Host& host) :
44 m_host(host)
45{
46 if (stTcp == type) // TCP server
47 {
48 m_functionHandler.insert(make_pair("get_interfaces", &CommandsHandler::GetInterfaces));
49 m_functionHandler.insert(make_pair("open_interface", &CommandsHandler::OpenInterface));
50 m_functionHandler.insert(make_pair("close_interface", &CommandsHandler::CloseInterface));
51 m_functionHandler.insert(make_pair("r", &CommandsHandler::Read));
52 m_functionHandler.insert(make_pair("rb", &CommandsHandler::ReadBlock));
53 m_functionHandler.insert(make_pair("w", &CommandsHandler::Write));
54 m_functionHandler.insert(make_pair("wb", &CommandsHandler::WriteBlock));
55 m_functionHandler.insert(make_pair("interface_reset", &CommandsHandler::InterfaceReset));
56 m_functionHandler.insert(make_pair("sw_reset", &CommandsHandler::SwReset));
57 m_functionHandler.insert(make_pair("alloc_pmc", &CommandsHandler::AllocPmc));
58 m_functionHandler.insert(make_pair("dealloc_pmc", &CommandsHandler::DeallocPmc));
59 m_functionHandler.insert(make_pair("create_pmc_file", &CommandsHandler::CreatePmcFile));
60 m_functionHandler.insert(make_pair("read_pmc_file", &CommandsHandler::FindPmcFile));
61 m_functionHandler.insert(make_pair("send_wmi", &CommandsHandler::SendWmi));
62 m_functionHandler.insert(make_pair("set_host_alias", &CommandsHandler::SetHostAlias));
63 m_functionHandler.insert(make_pair("get_host_alias", &CommandsHandler::GetHostAlias));
64 m_functionHandler.insert(make_pair("get_time", &CommandsHandler::GetTime));
65 m_functionHandler.insert(make_pair("set_local_driver_mode", &CommandsHandler::SetDriverMode));
66 m_functionHandler.insert(make_pair("get_host_manager_version", &CommandsHandler::GetHostManagerVersion));
67 m_functionHandler.insert(make_pair("driver_control", &CommandsHandler::DriverControl));
68 m_functionHandler.insert(make_pair("driver_command", &CommandsHandler::DriverCommand));
69 m_functionHandler.insert(make_pair("set_silence_mode", &CommandsHandler::SetDeviceSilenceMode));
70 m_functionHandler.insert(make_pair("get_silence_mode", &CommandsHandler::GetDeviceSilenceMode));
71 m_functionHandler.insert(make_pair("get_connected_users", &CommandsHandler::GetConnectedUsers));
72 m_functionHandler.insert(make_pair("get_device_capabilities_mask", &CommandsHandler::GetDeviceCapabilities));
73 m_functionHandler.insert(make_pair("get_host_capabilities_mask", &CommandsHandler::GetHostCapabilities));
74 m_functionHandler.insert(make_pair("on_target_log_recording", &CommandsHandler::OnTargetLogRecording));
75 }
76 else // UDP server
77 {
78 m_functionHandler.insert(make_pair(/*"get_host_network_info"*/"GetHostIdentity", &CommandsHandler::GetHostNetworkInfo));
79 }
80}
81
82// *************************************************************************************************
Vadim Iosevichd50ea462017-03-30 16:19:08 +030083
84string CommandsHandler::DecorateResponseMessage(bool successStatus, string message)
85{
86 string status = successStatus ? "Success" : "Fail";
Vadim Ioseviche76832c2017-11-05 09:09:14 +020087 string decoratedResponse = Utils::GetCurrentLocalTimeString() + m_reply_feilds_delimiter + status;
Vadim Iosevichd50ea462017-03-30 16:19:08 +030088 if (message != "")
89 {
90 decoratedResponse += m_reply_feilds_delimiter + message;
91 }
92 return decoratedResponse;
93}
94
95// **************************************TCP commands handlers*********************************************************** //
96ResponseMessage CommandsHandler::GetInterfaces(vector<string> arguments, unsigned int numberOfArguments)
97{
98 //do something with params
99 (void)arguments;
100
101 LOG_VERBOSE << __FUNCTION__ << endl;
102 ResponseMessage response;
103 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
104 {
105 set<string> devices;
106 DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDevices(devices);
107
108 if (dmosSuccess != status)
109 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300110 LOG_ERROR << "Error while trying to get interfaces. Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300111 response.message = (dmosNoSuchConnectedDevice == status)? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
112 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
113 }
114 else
115 {
116 // create one string that contains all connected devices
117 stringstream devicesSs;
118 bool firstTime = true;
Vadim Iosevich1b1280c2017-05-09 15:16:01 +0300119
120 for (std::set<string>::const_iterator it = devices.begin(); it != devices.end(); ++it)
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300121 {
122 if (firstTime)
123 {
Vadim Iosevich1b1280c2017-05-09 15:16:01 +0300124 devicesSs << *it;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300125 firstTime = false;
126 continue;
127 }
Vadim Iosevich1b1280c2017-05-09 15:16:01 +0300128 devicesSs << m_device_delimiter << *it;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300129 }
130 response.message = DecorateResponseMessage(true, devicesSs.str());
131 }
132 }
133 response.type = REPLY_TYPE_BUFFER;
134 response.length = response.message.size();
135 return response;
136}
137// *************************************************************************************************
138
139ResponseMessage CommandsHandler::OpenInterface(vector<string> arguments, unsigned int numberOfArguments)
140{
141 LOG_VERBOSE << __FUNCTION__ << endl;
142 ResponseMessage response;
143 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
144 {
145 DeviceManagerOperationStatus status = m_host.GetDeviceManager().OpenInterface(arguments[0]);
146
147 if (dmosSuccess != status)
148 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300149 LOG_ERROR << "Error while trying to open interface " << arguments[0] + ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300150 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
151 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
152 }
153 else
154 {
155 response.message = DecorateResponseMessage(true, arguments[0]); // backward compatibility
156 }
157 }
158 response.type = REPLY_TYPE_BUFFER;
159 response.length = response.message.size();
160 return response;
161}
162// *************************************************************************************************
163
164ResponseMessage CommandsHandler::CloseInterface(vector<string> arguments, unsigned int numberOfArguments)
165{
166 LOG_VERBOSE << __FUNCTION__ << endl;
167 ResponseMessage response;
168 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
169 {
170 DeviceManagerOperationStatus status = m_host.GetDeviceManager().CloseInterface(arguments[0]);
171
172 if (dmosSuccess != status)
173 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300174 LOG_ERROR << "Error while trying to close interface " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300175 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
176 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
177 }
178 else
179 {
180 response.message = DecorateResponseMessage(true); // backward compatibility
181 }
182 }
183 response.type = REPLY_TYPE_BUFFER;
184 response.length = response.message.size();
185 return response;
186}
187// *************************************************************************************************
188
189ResponseMessage CommandsHandler::Read(vector<string> arguments, unsigned int numberOfArguments)
190{
191 LOG_VERBOSE << __FUNCTION__ << endl;
192 ResponseMessage response;
193 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
194 {
195 DWORD address;
196 if (!Utils::ConvertHexStringToDword(arguments[1], address))
197 {
198 LOG_WARNING << "Error in Read arguments: given address isn't starting with 0x" << endl;
199 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
200 }
201 else
202 {
203 DWORD value;
204 DeviceManagerOperationStatus status = m_host.GetDeviceManager().Read(arguments[0], address, value);
205 if (dmosSuccess != status)
206 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300207 if (dmosSilentDevice == status)
208 {
209 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
210 }
211 else
212 {
213 LOG_ERROR << "Error while trying to read address " << arguments[1] << " from " + arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
214 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
215 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
216
217 }
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300218 }
219 else
220 {
221 stringstream message;
222 message << "0x" << hex << value;
223 response.message = DecorateResponseMessage(true, message.str());
224 }
225 }
226 }
227 response.type = REPLY_TYPE_BUFFER;
228 response.length = response.message.size();
229 return response;
230}
231// *************************************************************************************************
232
233ResponseMessage CommandsHandler::Write(vector<string> arguments, unsigned int numberOfArguments)
234{
235 LOG_VERBOSE << __FUNCTION__ << endl;
236 ResponseMessage response;
237 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
238 {
239 DWORD address, value;
240 if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDword(arguments[2], value))
241 {
242 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
243 }
244 else
245 {
246 DeviceManagerOperationStatus status = m_host.GetDeviceManager().Write(arguments[0], address, value);
247 if (dmosSuccess != status)
248 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300249 if (dmosSilentDevice == status)
250 {
251 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
252 }
253 else
254 {
255 LOG_ERROR << "Error while trying to write value " << arguments[2] << " to " << arguments[1] + " on "
256 << arguments[0] + ". Error: "
257 << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
258 response.message = (dmosNoSuchConnectedDevice == status) ?
259 DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
260 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
261 }
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300262 }
263 else
264 {
265 response.message = DecorateResponseMessage(true);
266 }
267 }
268 }
269 response.type = REPLY_TYPE_BUFFER;
270 response.length = response.message.size();
271 return response;
272}
273// *************************************************************************************************
274
275ResponseMessage CommandsHandler::ReadBlock(vector<string> arguments, unsigned int numberOfArguments)
276{
277 LOG_VERBOSE << __FUNCTION__ << endl;
278 ResponseMessage response;
279 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
280 {
281 DWORD address, blockSize;
282 if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDword(arguments[2], blockSize))
283 {
284 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
285 }
286 else
287 {
288 vector<DWORD> values;
289 DeviceManagerOperationStatus status = m_host.GetDeviceManager().ReadBlock(arguments[0], address, blockSize, values);
290 if (dmosSuccess != status)
291 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300292 if (dmosSilentDevice == status)
293 {
294 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
295 }
296 else
297 {
298 LOG_ERROR << "Error while trying to read " << arguments[2] << " addresses starting at address "
299 << arguments[1] << " from " << arguments[0] << ". Error: "
300 << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
301 response.message = (dmosNoSuchConnectedDevice == status) ?
302 DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
303 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
304 }
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300305 }
306 else
307 {
308 stringstream responseSs;
309 auto it = values.begin();
310 if (it != values.end())
311 {
312 responseSs << "0x" << hex << *it;
313 ++it;
314 }
315 for (; it != values.end(); ++it)
316 {
317 responseSs << m_array_delimiter << "0x" << hex << *it;
318 }
319 response.message = DecorateResponseMessage(true, responseSs.str());
320 }
321 }
322 }
323 response.type = REPLY_TYPE_BUFFER;
324 response.length = response.message.size();
325 return response;
326}
327// *************************************************************************************************
328
329ResponseMessage CommandsHandler::WriteBlock(vector<string> arguments, unsigned int numberOfArguments)
330{
331 LOG_VERBOSE << __FUNCTION__ << endl;
332 ResponseMessage response;
333
334 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 3, response.message))
335 {
336 DWORD address;
337 vector<DWORD> values;
338 if (!Utils::ConvertHexStringToDword(arguments[1], address) || !Utils::ConvertHexStringToDwordVector(arguments[2], m_array_delimiter, values))
339 {
340 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
341 }
342 else
343 {
344 // perform write block
345 DeviceManagerOperationStatus status = m_host.GetDeviceManager().WriteBlock(arguments[0], address, values);
346 if (dmosSuccess != status)
347 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300348 if (dmosSilentDevice == status)
349 {
350 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
351 }
352 else
353 {
354 LOG_ERROR << "Error in write blocks. arguments are:\nDevice name - " << arguments[0]
355 << "\nStart address - " << arguments[1] <<
356 "\nValues - " << arguments[2] << endl;
357 response.message = (dmosNoSuchConnectedDevice == status) ?
358 DecorateResponseMessage(false,m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)):
359 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
360 }
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300361 }
362 else
363 {
364 response.message = DecorateResponseMessage(true);
365 }
366 }
367 }
368 response.type = REPLY_TYPE_BUFFER;
369 response.length = response.message.size();
370 return response;
371}
372// *************************************************************************************************
373
374ResponseMessage CommandsHandler::InterfaceReset(vector<string> arguments, unsigned int numberOfArguments)
375{
376 LOG_VERBOSE << __FUNCTION__ << endl;
377 ResponseMessage response;
378 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
379 {
380 DeviceManagerOperationStatus status = m_host.GetDeviceManager().InterfaceReset(arguments[0]);
381 if (dmosSuccess != status)
382 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300383 LOG_ERROR << "Failed to perform interface reset on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300384 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
385 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
386 }
387 else
388 {
389 response.message = DecorateResponseMessage(true);
390 }
391 }
392 response.type = REPLY_TYPE_BUFFER;
393 response.length = response.message.size();
394 return response;
395}
396// *************************************************************************************************
397
398ResponseMessage CommandsHandler::SwReset(vector<string> arguments, unsigned int numberOfArguments)
399{
400 LOG_VERBOSE << __FUNCTION__ << endl;
401 ResponseMessage response;
402 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
403 {
404 DeviceManagerOperationStatus status = m_host.GetDeviceManager().SwReset(arguments[0]);
405 if (dmosSuccess != status)
406 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300407 LOG_ERROR << "Failed to perform sw reset on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300408 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
409 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
410 }
411 else
412 {
413 response.message = DecorateResponseMessage(true);
414 }
415 }
416 response.type = REPLY_TYPE_BUFFER;
417 response.length = response.message.size();
418 return response;
419}
Vadim Iosevich40679a12017-06-06 14:24:07 +0300420
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300421// *************************************************************************************************
422
423ResponseMessage CommandsHandler::AllocPmc(vector<string> arguments, unsigned int numberOfArguments)
424{
425 //do something with params
426 (void)numberOfArguments;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300427 LOG_VERBOSE << __FUNCTION__ << endl;
428 stringstream ss;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300429 for (auto& s : arguments)
430 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300431 ss << "," << s;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300432 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300433 LOG_VERBOSE << ss.str() << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300434
435 ResponseMessage response;
436 if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 3, response.message))
437 {
438 unsigned descSize;
439 unsigned descNum;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300440 if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], descSize) ||
441 !Utils::ConvertDecimalStringToUnsignedInt(arguments[2], descNum))
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300442 {
443 stringstream error;
444 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
445 }
446 else
447 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300448 std::string errorMsg;
449 DeviceManagerOperationStatus status = m_host.GetDeviceManager().AllocPmc(arguments[0], descSize, descNum, errorMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300450 if (dmosSuccess != status)
451 {
452 stringstream error;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300453 LOG_ERROR << "PMC allocation Failed: " << errorMsg << std::endl;
454 response.message = DecorateResponseMessage(false, errorMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300455 }
456 else
457 {
458 response.message = DecorateResponseMessage(true);
459 }
460 }
461 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300462
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300463 response.type = REPLY_TYPE_BUFFER;
464 response.length = response.message.size();
465 return response;
466}
Vadim Iosevich40679a12017-06-06 14:24:07 +0300467
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300468// *************************************************************************************************
469
470ResponseMessage CommandsHandler::DeallocPmc(vector<string> arguments, unsigned int numberOfArguments)
471{
472 //do something with params
473 (void)numberOfArguments;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300474 LOG_VERBOSE << __FUNCTION__ << endl;
475 stringstream ss;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300476 for (auto& s : arguments)
477 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300478 ss << "," << s;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300479 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300480 LOG_VERBOSE << ss.str() << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300481
482 ResponseMessage response;
483 if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 1, response.message))
484 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300485 std::string errorMsg;
486 DeviceManagerOperationStatus status = m_host.GetDeviceManager().DeallocPmc(arguments[0], errorMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300487 if (dmosSuccess != status)
488 {
489 stringstream error;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300490 LOG_ERROR << "PMC de-allocation Failed: " << errorMsg << std::endl;
491 response.message = DecorateResponseMessage(false, errorMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300492 }
493 else
494 {
495 response.message = DecorateResponseMessage(true);
496 }
497 }
498 response.type = REPLY_TYPE_BUFFER;
499 response.length = response.message.size();
500 return response;
501}
Vadim Iosevich40679a12017-06-06 14:24:07 +0300502
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300503// *************************************************************************************************
504
505ResponseMessage CommandsHandler::CreatePmcFile(vector<string> arguments, unsigned int numberOfArguments)
506{
507 //do something with params
508 (void)numberOfArguments;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300509 LOG_VERBOSE << __FUNCTION__ << endl;
510 stringstream ss;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300511 for (auto& s : arguments)
512 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300513 ss << "," << s;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300514 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300515 LOG_VERBOSE << ss.str() << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300516
517 ResponseMessage response;
518 if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 2, response.message))
519 {
520 unsigned refNumber;
521 if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], refNumber))
522 {
523 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
524 }
525 else
526 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300527 std::string outMsg;
528 DeviceManagerOperationStatus status = m_host.GetDeviceManager().CreatePmcFile(arguments[0], refNumber, outMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300529 if (dmosSuccess != status)
530 {
531 stringstream error;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300532 LOG_ERROR << "PMC data file creation failed: " << outMsg << std::endl;
533 response.message = DecorateResponseMessage(false, outMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300534 }
535 else
536 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300537 response.message = DecorateResponseMessage(true, outMsg);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300538 }
539 }
540 }
541 response.type = REPLY_TYPE_BUFFER;
542 response.length = response.message.size();
543 return response;
544}
545// *************************************************************************************************
546
Vadim Iosevich40679a12017-06-06 14:24:07 +0300547ResponseMessage CommandsHandler::FindPmcFile(vector<string> arguments, unsigned int numberOfArguments)
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300548{
549 //do something with params
550 (void)numberOfArguments;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300551 LOG_VERBOSE << __FUNCTION__ << endl;
552 stringstream ss;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300553 for (auto& s : arguments)
554 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300555 ss << "," << s;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300556 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300557 LOG_VERBOSE << ss.str() << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300558
559 ResponseMessage response;
560 response.type = REPLY_TYPE_BUFFER;
561
562#ifdef _WINDOWS
563 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsLinuxSupportOnly));
564#else
Vadim Iosevich40679a12017-06-06 14:24:07 +0300565 if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 2, response.message))
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300566 {
567 unsigned refNumber;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300568 if (!Utils::ConvertDecimalStringToUnsignedInt(arguments[1], refNumber))
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300569 {
570 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
571 }
572 else
573 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300574 std::string outMessage;
575 DeviceManagerOperationStatus status = m_host.GetDeviceManager().FindPmcFile(arguments[0], refNumber, outMessage);
576 if (dmosSuccess != status)
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300577 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300578 stringstream error;
579 LOG_ERROR << "PMC data file lookup failed: " << outMessage << std::endl;
580 response.message = DecorateResponseMessage(false, outMessage);
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300581 }
582 else
583 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300584 response.message = outMessage;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300585 response.type = REPLY_TYPE_FILE;
586 }
587 }
588 }
589#endif // _WINDOWS
590 response.length = response.message.size();
591 return response;
592}
593// *************************************************************************************************
594
595ResponseMessage CommandsHandler::SendWmi(vector<string> arguments, unsigned int numberOfArguments)
596{
597 //do something with params
598 (void)numberOfArguments;
Vadim Iosevich40679a12017-06-06 14:24:07 +0300599 LOG_VERBOSE << __FUNCTION__ << endl;
600 stringstream ss;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300601 for (auto& s : arguments)
602 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300603 ss << "," << s;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300604 }
Vadim Iosevich40679a12017-06-06 14:24:07 +0300605 LOG_VERBOSE << ss.str() << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300606
607 ResponseMessage response;
608 if (ValidArgumentsNumber(__FUNCTION__, arguments.size(), 3, response.message))
609 {
610 DWORD command;
611 vector<DWORD> payload;
612 if (!Utils::ConvertHexStringToDword(arguments[1], command) || !Utils::ConvertHexStringToDwordVector(arguments[2], m_array_delimiter, payload))
613 {
614 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
615 }
616 DeviceManagerOperationStatus status = m_host.GetDeviceManager().SendWmi(arguments[0], command, payload);
617 if (dmosSuccess != status)
618 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300619 if (dmosSilentDevice == status)
620 {
621 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsDeviceIsSilent));
622 }
623 else
624 {
625 LOG_ERROR << __FUNCTION__ << ":" << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
626 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
627 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
628 }
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300629 }
630 else
631 {
632 response.message = DecorateResponseMessage(true);
633 }
634 }
635 response.type = REPLY_TYPE_BUFFER;
636 response.length = response.message.size();
637 return response;
638}
639// *************************************************************************************************
640
641ResponseMessage CommandsHandler::SetHostAlias(vector<string> arguments, unsigned int numberOfArguments)
642{
643 LOG_VERBOSE << __FUNCTION__ << endl;
644 ResponseMessage response;
645
646 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
647 {
648 if (m_host.GetHostInfo().SaveAliasToFile(arguments[0]))
649 {
650 response.message = DecorateResponseMessage(true);
651 }
652 else
653 {
654 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
655 }
656 }
657 response.type = REPLY_TYPE_BUFFER;
658 response.length = response.message.size();
659 return response;
660}
661// *************************************************************************************************
662
Vadim Iosevich20d50d82017-09-19 11:38:15 +0300663ResponseMessage CommandsHandler::GetHostAlias(vector<string> arguments, unsigned int numberOfArguments)
664{
665 LOG_VERBOSE << __FUNCTION__ << endl;
666 ResponseMessage response;
667
668 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
669 {
670 response.message = DecorateResponseMessage(true, m_host.GetHostInfo().GetAlias());
671 }
672 response.type = REPLY_TYPE_BUFFER;
673 response.length = response.message.size();
674 return response;
675}
676// *************************************************************************************************
677
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200678ResponseMessage CommandsHandler::GetHostCapabilities(vector<string> arguments, unsigned int numberOfArguments)
679{
680 LOG_VERBOSE << __FUNCTION__ << endl;
681 ResponseMessage response;
682
683 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
684 {
685 stringstream message;
686 message << m_host.GetHostInfo().GetHostCapabilities();
687 response.message = DecorateResponseMessage(true, message.str());
688 }
689 response.type = REPLY_TYPE_BUFFER;
690 response.length = response.message.size();
691 return response;
692}
693// *************************************************************************************************
694
695ResponseMessage CommandsHandler::OnTargetLogRecording(vector<string> arguments, unsigned int numberOfArguments)
696{
697 LOG_VERBOSE << __FUNCTION__ << endl;
698 ResponseMessage response;
699
700 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 4, response.message)) // arg0 - devices names, arg1 - cpu types, arg2 - operation, arg3 - parameter, arg4 - value
701 {
702 vector<string> deviceNames = Utils::Split(arguments[0], ',');
703 vector<string> cpuNames = Utils::Split(arguments[1], ',');
704
705 if ("start" == arguments[2]) // currently start and stop are done for all devices and cpus
706 {
707 if (m_host.GetDeviceManager().GetLogCollectionMode())
708 {
709 response.message = DecorateResponseMessage(false, "already recording logs");
710 }
711 else
712 {
713 m_host.GetDeviceManager().SetLogCollectionMode(true);
714 response.message = DecorateResponseMessage(true);
715 }
716 }
717 else if ("stop" == arguments[2]) // currently start and stop are done for all devices and cpus
718 {
719 if (!m_host.GetDeviceManager().GetLogCollectionMode())
720 {
721 response.message = DecorateResponseMessage(false, "logs aren't being recorded");
722 }
723 else
724 {
725 m_host.GetDeviceManager().SetLogCollectionMode(false);
726 response.message = DecorateResponseMessage(true);
727 }
728 }
729 else if ("set_config" == arguments[2])
730 {
731 string errorMsg;
732 if (!m_host.GetDeviceManager().SetLogCollectionConfiguration(deviceNames, cpuNames, arguments[3], arguments[4], errorMsg))
733 {
734 response.message = DecorateResponseMessage(false, errorMsg);
735 }
736 }
737 else if ("get_config" == arguments[2])
738 {
739 response.message = DecorateResponseMessage(true, m_host.GetDeviceManager().GetLogCollectionConfiguration(deviceNames, cpuNames, arguments[3]));
740 }
741 else if ("dump_config" == arguments[2])
742 {
743 response.message = DecorateResponseMessage(true, m_host.GetDeviceManager().DumpLogCollectionConfiguration(deviceNames, cpuNames));
744 }
745 else
746 {
747 response.message = DecorateResponseMessage(false, " Unknown on target log recording operation");
748 }
749 }
750 response.type = REPLY_TYPE_BUFFER;
751 response.length = response.message.size();
752 return response;
753}
754// *************************************************************************************************
755
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300756ResponseMessage CommandsHandler::GetTime(vector<string> arguments, unsigned int numberOfArguments)
757{
758 //do something with params
759 (void)arguments;
760 LOG_VERBOSE << __FUNCTION__ << endl;
761 ResponseMessage response;
762
763 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
764 {
765 response.message = DecorateResponseMessage(true);
766 }
767 response.type = REPLY_TYPE_BUFFER;
768 response.length = response.message.size();
769 return response;
770}
771// *************************************************************************************************
772
773// *************************************************************************************************
774ResponseMessage CommandsHandler::SetDriverMode(vector<string> arguments, unsigned int numberOfArguments)
775{
776 LOG_VERBOSE << __FUNCTION__ << endl;
777 ResponseMessage response;
778 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
779 {
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200780#ifdef _WINDOWS
Vadim Iosevich1b1280c2017-05-09 15:16:01 +0300781 int newMode = IOCTL_WBE_MODE;
782 int oldMode = IOCTL_WBE_MODE;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300783
784 if ("WBE_MODE" == arguments[1])
785 {
786 newMode = IOCTL_WBE_MODE;
787 }
788 else if ("WIFI_STA_MODE" == arguments[1])
789 {
790 newMode = IOCTL_WIFI_STA_MODE;
791 }
792 else if ("WIFI_SOFTAP_MODE" == arguments[1])
793 {
794 newMode = IOCTL_WIFI_SOFTAP_MODE;
795 }
796 else if ("CONCURRENT_MODE" == arguments[1])
797 {
798 newMode = IOCTL_CONCURRENT_MODE;
799 }
800 else if ("SAFE_MODE" == arguments[1])
801 {
802 newMode = IOCTL_SAFE_MODE;
803 }
804 else
805 {
806 // TODO
807 response.message = dmosFail;
808 response.type = REPLY_TYPE_BUFFER;
809 response.length = response.message.size();
810 return response;
811 }
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200812#else
813 int newMode = 0;
814 int oldMode = 0;
815#endif
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300816 DeviceManagerOperationStatus status = m_host.GetDeviceManager().SetDriverMode(arguments[0], newMode, oldMode);
817 if (dmosSuccess != status)
818 {
Vadim Iosevich40679a12017-06-06 14:24:07 +0300819 LOG_ERROR << "Failed to set driver mode on " << arguments[0] << ". Error: " << m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300820 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
821 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
822 }
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200823#ifdef _WINDOWS
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300824 else
825 {
826 string message;
827
828 switch (oldMode)
829 {
830 case IOCTL_WBE_MODE:
831 message = "WBE_MODE";
832 break;
833 case IOCTL_WIFI_STA_MODE:
834 message = "WIFI_STA_MODE";
835 break;
836 case IOCTL_WIFI_SOFTAP_MODE:
837 message = "WIFI_SOFTAP_MODE";
838 break;
839 case IOCTL_CONCURRENT_MODE:
840 message = "CONCURRENT_MODE";
841 break;
842 case IOCTL_SAFE_MODE:
843 message = "SAFE_MODE";
844 break;
845 default:
846 break;
847 }
848
849 response.message = DecorateResponseMessage(true, message);
850 }
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200851#endif
Vadim Iosevichd50ea462017-03-30 16:19:08 +0300852 }
853 response.type = REPLY_TYPE_BUFFER;
854 response.length = response.message.size();
855 return response;
856}
857// *************************************************************************************************
858
Vadim Iosevich40679a12017-06-06 14:24:07 +0300859ResponseMessage CommandsHandler::GetHostManagerVersion(vector<string> arguments, unsigned int numberOfArguments)
860{
861 //do something with params
862 (void)arguments;
863 LOG_VERBOSE << __FUNCTION__ << endl;
864 ResponseMessage response;
865
866 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
867 {
868 string res = m_host.GetHostInfo().GetVersion();
869 response.message = DecorateResponseMessage(true, res);
870 }
871 response.type = REPLY_TYPE_BUFFER;
872 response.length = response.message.size();
873 return response;
874}
875// *************************************************************************************************
876
Vadim Ioseviche76832c2017-11-05 09:09:14 +0200877ResponseMessage CommandsHandler::DriverCommand(vector<string> arguments, unsigned int numberOfArguments)
878{
879 ResponseMessage response;
880 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 5, response.message))
881 {
882 DWORD commandId, inBufSize, outBufSize;
883 std::vector<unsigned char> inputBuf;
884 if ( !(Utils::ConvertHexStringToDword(arguments[1], commandId)
885 && Utils::ConvertHexStringToDword(arguments[2], inBufSize)
886 && Utils::ConvertHexStringToDword(arguments[3], outBufSize)
887 && JsonSerializeHelper::Base64Decode(arguments[4], inputBuf)
888 && inputBuf.size() == inBufSize) ) // inBufSize is the size of the original binary buffer before Base64 encoding
889 {
890 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
891 }
892 else
893 {
894 std::vector<unsigned char> outputBuf(outBufSize, 0);
895
896 DeviceManagerOperationStatus status =
897 m_host.GetDeviceManager().DriverControl(arguments[0], commandId, inputBuf.data(), inBufSize, outBufSize? outputBuf.data() : nullptr, outBufSize);
898
899 if (dmosSuccess != status)
900 {
901 LOG_DEBUG << "Driver IO command handler: Failed to execute driver IOCTL operation" << endl;
902 response.message = (dmosNoSuchConnectedDevice == status) ?
903 DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
904 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
905 }
906 else
907 {
908 LOG_DEBUG << "Driver IO command handler: Success" << endl;
909 response.message = DecorateResponseMessage(true, JsonSerializeHelper::Base64Encode(outputBuf)); // empty string if the buffer is empty
910 }
911 }
912 }
913
914 response.type = REPLY_TYPE_BUFFER;
915 response.length = response.message.size();
916 return response;
917}
918
Vadim Iosevich40679a12017-06-06 14:24:07 +0300919// *************************************************************************************************
920ResponseMessage CommandsHandler::DriverControl(vector<string> arguments, unsigned int numberOfArguments)
921{
922 //cout << __FUNCTION__ << endl;
923 ResponseMessage response;
924 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 4, response.message))
925 {
926 DWORD inBufSize;
927 //vector<DWORD> inputValues;
928 if (!Utils::ConvertHexStringToDword(arguments[2], inBufSize))
929 {
930 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
931 }
932 response.inputBufSize = inBufSize;
933 }
934 response.internalParsedMessage = arguments;
935 response.type = REPLY_TYPE_WAIT_BINARY;
936 return response;
937}
938// *************************************************************************************************
939
940// *************************************************************************************************
941ResponseMessage CommandsHandler::GenericDriverIO(vector<string> arguments, void* inputBuf, unsigned int inputBufSize)
942{
943 //cout << __FUNCTION__ << endl;
944 ResponseMessage response;
945 DWORD id, inBufSize, outBufSize;
946 //vector<DWORD> inputValues;
947 if (!Utils::ConvertHexStringToDword(arguments[1], id) || !Utils::ConvertHexStringToDword(arguments[2], inBufSize) || !Utils::ConvertHexStringToDword(arguments[3], outBufSize))
948 {
949 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
950 }
951
952 else {
953 DeviceManagerOperationStatus status;
954
955 uint8_t* outputBuf = new uint8_t[outBufSize];
956 memset(outputBuf, 0, outBufSize);
957
Vadim Iosevich40679a12017-06-06 14:24:07 +0300958 status = m_host.GetDeviceManager().DriverControl(arguments[0], id, inputBuf, inBufSize, outputBuf, outBufSize);
959 response.length = outBufSize;
960
961 if (dmosSuccess != status)
962 {
963 LOG_DEBUG << "Driver IO command handler: Failed to execute driver IOCTL operation" << endl;
964 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
965 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
966 response.binaryMessage = (uint8_t*)"Failed to read from driver";
967 }
968 else
969 {
970 LOG_DEBUG << "Driver IO command handler: Success" << endl;
971 response.binaryMessage = (uint8_t*)outputBuf;
972 }
973 }
974
975 response.type = REPLY_TYPE_BINARY;
976 return response;
977}
978
979
980ResponseMessage CommandsHandler::GetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments)
981{
982 LOG_VERBOSE << __FUNCTION__ << endl;
983 ResponseMessage response;
984 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
985 {
986 bool silentMode;
987 DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDeviceSilentMode(arguments[0], silentMode);
988 if (dmosSuccess != status)
989 {
990 LOG_ERROR << "Error while trying to GetDeviceSilenceMode at " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
991 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
992 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
993 }
994 else
995 {
996 stringstream message;
997 message << (silentMode ? 1 : 0);
998 response.message = DecorateResponseMessage(true, message.str());
999 }
1000 }
1001 response.type = REPLY_TYPE_BUFFER;
1002 response.length = response.message.size();
1003 return response;
1004}
1005
1006ResponseMessage CommandsHandler::SetDeviceSilenceMode(vector<string> arguments, unsigned int numberOfArguments)
1007{
1008 LOG_VERBOSE << __FUNCTION__ << endl;
1009 ResponseMessage response;
1010 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 2, response.message))
1011 {
1012 {
1013 bool silentMode = false;
1014
1015 if (!Utils::ConvertStringToBool(arguments[1], silentMode))
1016 {
1017 response.message = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidArgument));
1018 }
1019
1020 DeviceManagerOperationStatus status = m_host.GetDeviceManager().SetDeviceSilentMode(arguments[0], silentMode);
1021 if (dmosSuccess != status)
1022 {
1023 LOG_ERROR << "Error while trying to SetDeviceSilenceMode at: " << arguments[0] << " to: " + arguments[1] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
1024 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
1025 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
1026 }
1027 else
1028 {
1029 string mode = silentMode ? "Silenced" : "UnSilenced";
1030 LOG_INFO << "Device:"<< arguments[0] <<"is now " << mode << endl;
1031 stringstream message;
1032 message << "Silent mode set to:" << silentMode;
1033 response.message = DecorateResponseMessage(true, message.str());
1034 }
1035 }
1036 }
1037 response.type = REPLY_TYPE_BUFFER;
1038 response.length = response.message.size();
1039 return response;
1040}
Vadim Ioseviche76832c2017-11-05 09:09:14 +02001041
1042ResponseMessage CommandsHandler::GetConnectedUsers(vector<string> arguments, unsigned int numberOfArguments)
1043{
1044 LOG_VERBOSE << __FUNCTION__ << endl;
1045 ResponseMessage response;
1046 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 0, response.message))
1047 {
1048
1049 std::set<std::string> connectedUserList = m_host.GetHostInfo().GetConnectedUsers();
1050 stringstream os;
1051 for (const string & cl : connectedUserList)
1052 {
1053 os << cl << " ";
1054 }
1055
1056 response.message = DecorateResponseMessage(true, os.str());
1057 }
1058 response.type = REPLY_TYPE_BUFFER;
1059 response.length = response.message.size();
1060 return response;
1061
1062}
1063ResponseMessage CommandsHandler::GetDeviceCapabilities(vector<string> arguments, unsigned int numberOfArguments)
1064{
1065 LOG_VERBOSE << __FUNCTION__ << endl;
1066 ResponseMessage response;
1067 if (ValidArgumentsNumber(__FUNCTION__, numberOfArguments, 1, response.message))
1068 {
1069 DWORD deviceCapabilitiesMask;
1070 DeviceManagerOperationStatus status = m_host.GetDeviceManager().GetDeviceCapabilities(arguments[0], deviceCapabilitiesMask);
1071 if (dmosSuccess != status)
1072 {
1073 LOG_ERROR << "Error while trying to GetDeviceCapabilities at " << arguments[0] << ". Error: " + m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status) << endl;
1074 response.message = (dmosNoSuchConnectedDevice == status) ? DecorateResponseMessage(false, m_host.GetDeviceManager().GetDeviceManagerOperationStatusString(status)) :
1075 DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsOperationFailure));
1076 }
1077 else
1078 {
1079 stringstream message;
1080 message << deviceCapabilitiesMask;
1081 response.message = DecorateResponseMessage(true, message.str());
1082 }
1083 }
1084 response.type = REPLY_TYPE_BUFFER;
1085 response.length = response.message.size();
1086 return response;
1087}
Vadim Iosevich40679a12017-06-06 14:24:07 +03001088// *************************************************************************************************
1089
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001090// **************************************UDP commands handlers*********************************************************** //
1091ResponseMessage CommandsHandler::GetHostNetworkInfo(vector<string> arguments, unsigned int numberOfArguments)
1092{
1093 //do something with params
1094 (void)numberOfArguments;
1095 LOG_VERBOSE << __FUNCTION__ << endl;
1096 ResponseMessage response;
1097
1098 if (arguments.size() != 0)
1099 {
1100 response.message = DecorateResponseMessage(false, "Failed to get host's info: expected zero argument");
1101 }
1102 else
1103 {
1104 response.message = "GetHostIdentity;" + m_host.GetHostInfo().GetIps().m_ip + ";" + m_host.GetHostInfo().GetAlias();
1105 }
1106
1107 response.type = REPLY_TYPE_BUFFER;
1108 response.length = response.message.size();
1109 return response;
1110}
1111// *************************************************************************************************
1112
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001113ConnectionStatus CommandsHandler::ExecuteCommand(string message, ResponseMessage &referencedResponse)
1114{
Vadim Ioseviche76832c2017-11-05 09:09:14 +02001115 MessageParser messageParser(message);
1116 string commandName = messageParser.GetCommandFromMessage();
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001117
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001118 if (m_functionHandler.find(commandName) == m_functionHandler.end())
1119 { //There's no such a command, the return value from the map would be null
1120 LOG_WARNING << "Unknown command from client: " << commandName << endl;
1121 referencedResponse.message = "Unknown command: " + commandName;
1122 referencedResponse.length = referencedResponse.message.size();
1123 referencedResponse.type = REPLY_TYPE_BUFFER;
1124 return KEEP_CONNECTION_ALIVE;
1125 }
Vadim Ioseviche76832c2017-11-05 09:09:14 +02001126 referencedResponse = (this->*m_functionHandler[commandName])(messageParser.GetArgsFromMessage(), messageParser.GetNumberOfArgs()); //call the function that fits commandName
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001127
Vadim Iosevich40679a12017-06-06 14:24:07 +03001128 return KEEP_CONNECTION_ALIVE;
1129}
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001130
Vadim Iosevich40679a12017-06-06 14:24:07 +03001131// *************************************************************************************************
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001132
Vadim Iosevich40679a12017-06-06 14:24:07 +03001133ConnectionStatus CommandsHandler::ExecuteBinaryCommand(uint8_t* binaryInput, ResponseMessage &referencedResponse)
1134{
1135 referencedResponse = GenericDriverIO(referencedResponse.internalParsedMessage, binaryInput, referencedResponse.inputBufSize);
Vadim Iosevichd50ea462017-03-30 16:19:08 +03001136
1137 return KEEP_CONNECTION_ALIVE;
1138}
Vadim Iosevich40679a12017-06-06 14:24:07 +03001139
Vadim Ioseviche76832c2017-11-05 09:09:14 +02001140// *************************************************************************************************
1141
1142string CommandsHandler::GetCommandsHandlerResponseStatusString(CommandsHandlerResponseStatus status)
1143{
1144 switch (status)
1145 {
1146 case chrsInvalidNumberOfArguments:
1147 return "Invalid arguments number";
1148 case chrsInvalidArgument:
1149 return "Invalid argument type";
1150 case chrsOperationFailure:
1151 return "Operation failure";
1152 case chrsLinuxSupportOnly:
1153 return "Linux support only";
1154 case chrsSuccess:
1155 return "Success";
1156 case chrsDeviceIsSilent:
1157 return "SilentDevice";
1158
1159 default:
1160 return "CommandsHandlerResponseStatus is unknown";
1161 }
1162}
1163
1164// *************************************************************************************************
1165
1166bool CommandsHandler::ValidArgumentsNumber(string functionName, size_t numberOfArguments, size_t expectedNumOfArguments, string& responseMessage)
1167{
1168 if (expectedNumOfArguments != numberOfArguments)
1169 {
1170 stringstream error;
1171 LOG_WARNING << "Mismatching number of arguments in " << functionName << ": expected " << expectedNumOfArguments << " but got " << numberOfArguments << endl;
1172 responseMessage = DecorateResponseMessage(false, GetCommandsHandlerResponseStatusString(chrsInvalidNumberOfArguments));
1173 return false;
1174 }
1175 return true;
1176}