void ReverseHashDServer::processTextMessage(QString message) { QWebSocket *pClient = qobject_cast<QWebSocket *>(sender()); std::cout << QDateTime::currentDateTimeUtc().toString().toStdString() << " [WS] <<< " << message.toStdString() << "\n"; QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8()); QJsonObject jsonData = doc.object(); int id = 0; if(jsonData.contains("id")){ id = jsonData["id"].toInt(); } if(!jsonData.contains("cmd")){ this->sendMessageError(pClient, "cmd", id, Error(400, "Invalid command format (Not found cmd)")); return; } QString cmd = jsonData["cmd"].toString(); if(m_mapCmdHandlers.contains(cmd)){ ICmdHandler *pCmdHandler = m_mapCmdHandlers[cmd]; pCmdHandler->handle(pClient, this, jsonData); }else{ qDebug() << "Unknown command: " << cmd; this->sendMessageError(pClient, cmd, id, Error(404, "Unknown command")); } }
int TelnetCmdManager::handleCmd(const unsigned theStart, const unsigned theEnd) { CmdArgsList argsList; //trim unsigned start = theStart; unsigned end = theEnd; while (' ' == cmdBufferM[start] || '\t' == cmdBufferM[start] || '\r' == cmdBufferM[start] || '\n' == cmdBufferM[start]) { start++; if (start >= theEnd) { break; } } while (end > start && ( ' ' == cmdBufferM[end - 1] || '\t' == cmdBufferM[end - 1] || '\r' == cmdBufferM[end - 1] || '\n' == cmdBufferM[end - 1])) { end--; if (end <= start) { break; } } if (start < end) { LOG_DEBUG("handle telnet cmd:" << std::string(cmdBufferM + start, cmdBufferM + end)); } unsigned argsStart = start; unsigned i = start; for (; i < end; i++) { if (' ' == cmdBufferM[i] || '\t' == cmdBufferM[i]) { if (argsStart < i) argsList.push_back(std::string(cmdBufferM + argsStart, cmdBufferM + i)); argsStart = i + 1; } } if (argsStart < i) { argsList.push_back(std::string(cmdBufferM + argsStart, cmdBufferM + i)); } if (subCmdStackM.empty()) { if (argsList.empty()) { sendPrompt(); return 0; } // the cmdHandler is not thread-safe, // please make sure it is valid until the man Processor stops std::string cmd = argsList.front(); argsList.pop_front(); ICmdHandler* cmdHandler = NULL; { boost::shared_lock<boost::shared_mutex> lock(topCmdMutexM); CmdMap::iterator it = allTopCmdsM.find(cmd); if (it == allTopCmdsM.end()) { const char* const errstr = "command not found!\r\n"; send(errstr, strlen(errstr)); sendPrompt(); return 0; } cmdHandler = it->second; } cmdHandler->handle(this, argsList); } else { assert(!subCmdDataStackM.empty()); subCmdStackM.back()->handle(this, argsList, subCmdDataStackM.back()); } return 0; }