File indexing completed on 2024-05-12 04:39:43

0001 /*
0002     SPDX-FileCopyrightText: 1999 John Birch <jbb@kdevelop.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "micommand.h"
0008 #include <QDateTime>
0009 
0010 using namespace KDevMI::MI;
0011 
0012 FunctionCommandHandler::FunctionCommandHandler(const FunctionCommandHandler::Function& callback, CommandFlags flags)
0013     : _flags(flags)
0014     , _callback(callback)
0015 {
0016 }
0017 
0018 bool FunctionCommandHandler::handlesError()
0019 {
0020     return _flags & CmdHandlesError;
0021 }
0022 
0023 void FunctionCommandHandler::handle(const ResultRecord& r)
0024 {
0025     _callback(r);
0026 }
0027 
0028 
0029 MICommand::MICommand(CommandType type, const QString& command, CommandFlags flags)
0030     : type_(type)
0031     , flags_(flags)
0032     , command_(command)
0033     , commandHandler_(nullptr)
0034     , stateReloading_(false)
0035     , m_thread(-1)
0036     , m_frame(-1)
0037 {
0038 }
0039 
0040 MICommand::~MICommand()
0041 {
0042     if (commandHandler_ && commandHandler_->autoDelete()) {
0043         delete commandHandler_;
0044     }
0045     commandHandler_ = nullptr;
0046 }
0047 
0048 QString MICommand::cmdToSend()
0049 {
0050     return initialString() + QLatin1Char('\n');
0051 }
0052 
0053 QString MICommand::initialString() const
0054 {
0055     QString result = QString::number(token());
0056 
0057     if (type() == NonMI) {
0058         result += command_;
0059     } else
0060     {
0061         result += miCommand();
0062 
0063         if (m_thread != -1)
0064             result += QStringLiteral(" --thread %1").arg(m_thread);
0065         if (m_frame != -1)
0066             result += QStringLiteral(" --frame %1").arg(m_frame);
0067 
0068         if (!command_.isEmpty())
0069             result += QLatin1Char(' ') + command_;
0070     }
0071 
0072     return result;
0073 }
0074 
0075 bool MICommand::isUserCommand() const
0076 {
0077     return false;
0078 }
0079 
0080 void MICommand::setHandler(MICommandHandler* handler)
0081 {
0082     if (commandHandler_ && commandHandler_->autoDelete())
0083         delete commandHandler_;
0084     commandHandler_ = handler;
0085 
0086     if (!commandHandler_) {
0087         flags_ = flags_ & ~CmdHandlesError;
0088     }
0089 }
0090 
0091 void MICommand::setHandler(const FunctionCommandHandler::Function& callback)
0092 {
0093     setHandler(new FunctionCommandHandler(callback, flags()));
0094 }
0095 
0096 bool MICommand::invokeHandler(const ResultRecord& r)
0097 {
0098     if (commandHandler_) {
0099         //ask before calling handler as it might deleted itself in handler
0100         bool autoDelete = commandHandler_->autoDelete();
0101 
0102         commandHandler_->handle(r);
0103         if (autoDelete) {
0104             delete commandHandler_;
0105         }
0106         commandHandler_ = nullptr;
0107         return true;
0108     } else {
0109         return false;
0110     }
0111 }
0112 
0113 void MICommand::newOutput(const QString& line)
0114 {
0115     lines.push_back(line);
0116 }
0117 
0118 const QStringList& MICommand::allStreamOutput() const
0119 {
0120     return lines;
0121 }
0122 
0123 bool MICommand::handlesError() const
0124 {
0125     return commandHandler_ ? commandHandler_->handlesError() : false;
0126 }
0127 
0128 UserCommand::UserCommand(CommandType type, const QString& s)
0129     : MICommand(type, s, CmdMaybeStartsRunning)
0130 {
0131 }
0132 
0133 bool UserCommand::isUserCommand() const
0134 {
0135     return true;
0136 }
0137 
0138 QString MICommand::miCommand() const
0139 {
0140     switch (type()) {
0141         case NonMI:
0142             return QStringLiteral("-");
0143         case BreakAfter:
0144             return QStringLiteral("-break-after");//"ignore"
0145         case BreakCommands:
0146             return QStringLiteral("-break-commands");
0147         case BreakCondition:
0148             return QStringLiteral("-break-condition");//"cond"
0149         case BreakDelete:
0150             return QStringLiteral("-break-delete");//"delete breakpoint"
0151         case BreakDisable:
0152             return QStringLiteral("-break-disable");//"disable breakpoint"
0153         case BreakEnable:
0154             return QStringLiteral("-break-enable");//"enable breakpoint"
0155         case BreakInfo:
0156             return QStringLiteral("-break-info");//"info break"
0157         case BreakInsert:
0158             return QStringLiteral("-break-insert -f");
0159         case BreakList:
0160             return QStringLiteral("-break-list");//"info break"
0161         case BreakWatch:
0162             return QStringLiteral("-break-watch");
0163 
0164         case DataDisassemble:
0165             return QStringLiteral("-data-disassemble");
0166         case DataEvaluateExpression:
0167             return QStringLiteral("-data-evaluate-expression");
0168         case DataListChangedRegisters:
0169             return QStringLiteral("-data-list-changed-registers");
0170         case DataListRegisterNames:
0171             return QStringLiteral("-data-list-register-names");
0172         case DataListRegisterValues:
0173             return QStringLiteral("-data-list-register-values");
0174         case DataReadMemory:
0175             return QStringLiteral("-data-read-memory");
0176         case DataWriteMemory:
0177             return QStringLiteral("-data-write-memory");
0178         case DataWriteRegisterVariables:
0179             return QStringLiteral("-data-write-register-values");
0180 
0181         case EnablePrettyPrinting:
0182             return QStringLiteral("-enable-pretty-printing");
0183         case EnableTimings:
0184             return QStringLiteral("-enable-timings");
0185 
0186         case EnvironmentCd:
0187             return QStringLiteral("-environment-cd");
0188         case EnvironmentDirectory:
0189             return QStringLiteral("-environment-directory");
0190         case EnvironmentPath:
0191             return QStringLiteral("-environment-path");
0192         case EnvironmentPwd:
0193             return QStringLiteral("-environment-pwd");
0194 
0195         case ExecAbort:
0196             return QStringLiteral("-exec-abort");
0197         case ExecArguments:
0198             return QStringLiteral("-exec-arguments");//"set args"
0199         case ExecContinue:
0200             return QStringLiteral("-exec-continue");
0201         case ExecFinish:
0202             return QStringLiteral("-exec-finish");
0203         case ExecInterrupt:
0204             return QStringLiteral("-exec-interrupt");
0205         case ExecNext:
0206             return QStringLiteral("-exec-next");
0207         case ExecNextInstruction:
0208             return QStringLiteral("-exec-next-instruction");
0209         case ExecRun:
0210             return QStringLiteral("-exec-run");
0211         case ExecStep:
0212             return QStringLiteral("-exec-step");
0213         case ExecStepInstruction:
0214             return QStringLiteral("-exec-step-instruction");
0215         case ExecUntil:
0216             return QStringLiteral("-exec-until");
0217 
0218         case FileExecAndSymbols:
0219             return QStringLiteral("-file-exec-and-symbols");//"file"
0220         case FileExecFile:
0221             return QStringLiteral("-file-exec-file");//"exec-file"
0222         case FileListExecSourceFile:
0223             return QStringLiteral("-file-list-exec-source-file");
0224         case FileListExecSourceFiles:
0225             return QStringLiteral("-file-list-exec-source-files");
0226         case FileSymbolFile:
0227             return QStringLiteral("-file-symbol-file");//"symbol-file"
0228 
0229         case GdbExit:
0230             return QStringLiteral("-gdb-exit");
0231         case GdbSet:
0232             return QStringLiteral("-gdb-set");//"set"
0233         case GdbShow:
0234             return QStringLiteral("-gdb-show");//"show"
0235         case GdbVersion:
0236             return QStringLiteral("-gdb-version");//"show version"
0237 
0238         case InferiorTtySet:
0239             return QStringLiteral("-inferior-tty-set");
0240         case InferiorTtyShow:
0241             return QStringLiteral("-inferior-tty-show");
0242 
0243         case InterpreterExec:
0244             return QStringLiteral("-interpreter-exec");
0245 
0246         case ListFeatures:
0247             return QStringLiteral("-list-features");
0248 
0249         case SignalHandle:
0250             return QStringLiteral("handle");
0251             //return QStringLiteral("-signal-handle");
0252 
0253         case StackInfoDepth:
0254             return QStringLiteral("-stack-info-depth");
0255         case StackInfoFrame:
0256             return QStringLiteral("-stack-info-frame");
0257         case StackListArguments:
0258             return QStringLiteral("-stack-list-arguments");
0259         case StackListFrames:
0260             return QStringLiteral("-stack-list-frames");
0261         case StackListLocals:
0262             return QStringLiteral("-stack-list-locals");
0263         case StackSelectFrame:
0264             return QStringLiteral("-stack-select-frame");
0265 
0266         case SymbolListLines:
0267             return QStringLiteral("-symbol-list-lines");
0268 
0269         case TargetAttach:
0270             return QStringLiteral("-target-attach");
0271         case TargetDetach:
0272             return QStringLiteral("-target-detach");//"detach"
0273         case TargetDisconnect:
0274             return QStringLiteral("-target-disconnect");//"disconnect"
0275         case TargetDownload:
0276             return QStringLiteral("-target-download");
0277         case TargetSelect:
0278             return QStringLiteral("-target-select");
0279 
0280         case ThreadInfo:
0281             return QStringLiteral("-thread-info");
0282         case ThreadListIds:
0283             return QStringLiteral("-thread-list-ids");
0284         case ThreadSelect:
0285             return QStringLiteral("-thread-select");
0286 
0287         case TraceFind:
0288             return QStringLiteral("-trace-find");
0289         case TraceStart:
0290             return QStringLiteral("-trace-start");
0291         case TraceStop:
0292             return QStringLiteral("-trace-stop");
0293 
0294         case VarAssign:
0295             return QStringLiteral("-var-assign");
0296         case VarCreate:
0297             return QStringLiteral("-var-create");
0298         case VarDelete:
0299             return QStringLiteral("-var-delete");
0300         case VarEvaluateExpression:
0301             return QStringLiteral("-var-evaluate-expression");
0302         case VarInfoPathExpression:
0303             return QStringLiteral("-var-info-path-expression");
0304         case VarInfoNumChildren:
0305             return QStringLiteral("-var-info-num-children");
0306         case VarInfoType:
0307             return QStringLiteral("-var-info-type");
0308         case VarListChildren:
0309             return QStringLiteral("-var-list-children");
0310         case VarSetFormat:
0311             return QStringLiteral("-var-set-format");
0312         case VarSetFrozen:
0313             return QStringLiteral("-var-set-frozen");
0314         case VarShowAttributes:
0315             return QStringLiteral("-var-show-attributes");
0316         case VarShowFormat:
0317             return QStringLiteral("-var-show-format");
0318         case VarUpdate:
0319             return QStringLiteral("-var-update");
0320     }
0321 
0322     return QStringLiteral("-unknown");
0323 }
0324 
0325 CommandType MICommand::type() const
0326 {
0327     return type_;
0328 }
0329 
0330 int MICommand::thread() const
0331 {
0332     return m_thread;
0333 }
0334 
0335 void MICommand::setThread(int thread)
0336 {
0337     m_thread = thread;
0338 }
0339 
0340 int MICommand::frame() const
0341 {
0342     return m_frame;
0343 }
0344 
0345 void MICommand::setFrame(int frame)
0346 {
0347     m_frame = frame;
0348 }
0349 
0350 QString MICommand::command() const
0351 {
0352     return command_;
0353 }
0354 
0355 void MICommand::setStateReloading(bool f)
0356 {
0357     stateReloading_ = f;
0358 }
0359 
0360 bool MICommand::stateReloading() const
0361 {
0362     return stateReloading_;
0363 }
0364 
0365 void MICommand::markAsEnqueued()
0366 {
0367     m_enqueueTimestamp = QDateTime::currentMSecsSinceEpoch();
0368 }
0369 
0370 void MICommand::markAsSubmitted()
0371 {
0372     m_submitTimestamp = QDateTime::currentMSecsSinceEpoch();
0373 }
0374 
0375 void MICommand::markAsCompleted()
0376 {
0377     m_completeTimestamp = QDateTime::currentMSecsSinceEpoch();
0378 }
0379 
0380 qint64 MICommand::gdbProcessingTime() const
0381 {
0382     return m_completeTimestamp - m_submitTimestamp;
0383 }
0384 
0385 qint64 MICommand::queueTime() const
0386 {
0387     return m_submitTimestamp - m_enqueueTimestamp;
0388 }
0389 
0390 qint64 MICommand::totalProcessingTime() const
0391 {
0392     return m_completeTimestamp - m_enqueueTimestamp;
0393 }
0394 
0395 #include "moc_micommand.cpp"