v2.0.0
Loading...
Searching...
No Matches
command_parser.cpp
Go to the documentation of this file.
1//=============================================================================================================
22
23//=============================================================================================================
24// INCLUDES
25//=============================================================================================================
26
27#include "command_parser.h"
28#include "command_manager.h"
29
30//=============================================================================================================
31// QT INCLUDES
32//=============================================================================================================
33
34#include <QDebug>
35#include <QStringList>
36#include <QJsonObject>
37#include <QJsonDocument>
38#include <QDebug>
39
40//=============================================================================================================
41// USED NAMESPACES
42//=============================================================================================================
43
44using namespace COMLIB;
45
46//=============================================================================================================
47// DEFINE MEMBER METHODS
48//=============================================================================================================
49
51: QObject(parent)
52{
53}
54
55//=============================================================================================================
56
57bool CommandParser::exists(const QString& p_sCommand)
58{
59 Subject::t_Observers::Iterator itObservers;
60 for (itObservers = this->observers().begin(); itObservers != this->observers().end(); ++itObservers) {
61 CommandManager* t_pCommandManager = static_cast<CommandManager*>(*itObservers);
62 if (t_pCommandManager->hasCommand(p_sCommand))
63 return true;
64 }
65 return false;
66}
67
68//=============================================================================================================
69
70bool CommandParser::parse(const QString& p_sInput, QStringList& p_qListCommandsParsed)
71{
72 if (p_sInput.size() <= 0)
73 return false;
74
75 p_qListCommandsParsed.clear();
76
77 //Check if JSON format;
78 bool isJson = false;
79 if (QString::compare(p_sInput.at(0), QString("{")) == 0)
80 isJson = true;
81
82 if (isJson) {
83 qDebug() << "JSON command recognized";
84
85 QJsonObject t_jsonObjectCommand;
86 QJsonObject t_jsonObjectParameters;
87 QJsonDocument t_jsonDocument(QJsonDocument::fromJson(p_sInput.toUtf8()));
88
89 //Switch to command object
90 if (t_jsonDocument.isObject() && t_jsonDocument.object().value(QString("commands")) != QJsonValue::Undefined)
91 t_jsonObjectCommand = t_jsonDocument.object().value(QString("commands")).toObject();
92 else
93 return false;
94
95 //iterate over commands
96 QJsonObject::Iterator it;
97 QJsonObject::Iterator itParam;
98 for (it = t_jsonObjectCommand.begin(); it != t_jsonObjectCommand.end(); ++it) {
99 //Print Command
100 qInfo("%s\r\n", it.key().toUtf8().constData());
101
102 if (exists(it.key())) {
103 RawCommand t_rawCommand(it.key(), true);
104 m_rawCommand = t_rawCommand;
105 t_jsonObjectParameters = it.value().toObject();
106
107 // push command to processed commands
108 p_qListCommandsParsed.push_back(it.key());
109
110 //append the parameters
111 for (itParam = t_jsonObjectParameters.begin(); itParam != t_jsonObjectParameters.end(); ++itParam) {
112 qInfo(" %s", itParam.value().toString().toUtf8().constData());
113 //ToDo do a cross check with the param naming and key
114 m_rawCommand.pValues().append(itParam.value().toString());
115 // qDebug() << itParam.key() << " + " << itParam.value().toString();
116 }
117
118 //Notify attached command manager
119 notify();
120 }
121 qInfo("\r\n");
122 }
123 } else {
124 QStringList t_qCommandList = p_sInput.split(" ");
125
126 //Print command
127 qInfo("%s\r\n", t_qCommandList[0].toUtf8().constData());
128
129 if (!exists(t_qCommandList[0])) {
130 qInfo("\r\n");
131 return false;
132 }
133
134 RawCommand t_rawCommand(t_qCommandList[0], false);
135 m_rawCommand = t_rawCommand;
136
137 // push command to processed commands
138 p_qListCommandsParsed.push_back(t_qCommandList[0]);
139
140 if (t_qCommandList.size() > 1) //Parameter parsing
141 {
142 //Parse Parameters
143 for (qint32 i = 1; i < t_qCommandList.size(); ++i) {
144 qInfo(" %s", t_qCommandList[i].toUtf8().constData());
145 m_rawCommand.pValues().append(t_qCommandList[i]);
146 }
147 }
148 qInfo("\r\n");
149 notify();
150 }
151
152 return true;
153}
Front-end tokeniser that turns incoming JSON or CLI payloads into COMLIB::RawCommand objects and noti...
Per-component registry of COMLIB::Command schemas; receives COMLIB::RawCommand from the parser and di...
Real-time client/server communication primitives for talking to mne_rt_server.
Observer-side registry of Command schemas a subsystem accepts from the shared CommandParser.
bool hasCommand(const QString &p_sCommand) const
bool exists(const QString &p_sCommand)
CommandParser(QObject *parent=0)
bool parse(const QString &p_sInput, QStringList &p_qListCommandsParsed)
Tokenised but unresolved command: a keyword plus a list of raw string arguments awaiting type binding...
Definition raw_command.h:71
t_Observers & observers()