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"