tools/runonphone/trk/launcher.cpp
branchRCL_3
changeset 5 d3bac044e0f0
parent 4 3b1da2848fc7
equal deleted inserted replaced
4:3b1da2848fc7 5:d3bac044e0f0
    74     // Debuggee state
    74     // Debuggee state
    75     Session m_session; // global-ish data (process id, target information)
    75     Session m_session; // global-ish data (process id, target information)
    76 
    76 
    77     CopyState m_copyState;
    77     CopyState m_copyState;
    78     QString m_fileName;
    78     QString m_fileName;
    79     QString m_commandLineArgs;
    79     QStringList m_commandLineArgs;
    80     QString m_installFileName;
    80     QString m_installFileName;
    81     int m_verbose;
    81     int m_verbose;
    82     Launcher::Actions m_startupActions;
    82     Launcher::Actions m_startupActions;
    83     bool m_closeDevice;
    83     bool m_closeDevice;
    84 };
    84 };
   157 void Launcher::setInstallFileName(const QString &name)
   157 void Launcher::setInstallFileName(const QString &name)
   158 {
   158 {
   159     d->m_installFileName = name;
   159     d->m_installFileName = name;
   160 }
   160 }
   161 
   161 
   162 void Launcher::setCommandLineArgs(const QString &args)
   162 void Launcher::setCommandLineArgs(const QStringList &args)
   163 {
   163 {
   164     d->m_commandLineArgs = args;
   164     d->m_commandLineArgs = args;
   165 }
   165 }
   166 
   166 
   167 void Launcher::setSerialFrame(bool b)
   167 void Launcher::setSerialFrame(bool b)
   187 
   187 
   188 bool Launcher::startServer(QString *errorMessage)
   188 bool Launcher::startServer(QString *errorMessage)
   189 {
   189 {
   190     errorMessage->clear();
   190     errorMessage->clear();
   191     if (d->m_verbose) {
   191     if (d->m_verbose) {
   192         const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Package=%3 Remote Package=%4 Install file=%5")
   192         const QString msg = QString::fromLatin1("Port=%1 Executable=%2 Arguments=%3 Package=%4 Remote Package=%5 Install file=%6")
   193                             .arg(d->m_trkServerName, d->m_fileName, d->m_copyState.sourceFileName, d->m_copyState.destinationFileName, d->m_installFileName);
   193                             .arg(d->m_trkServerName, d->m_fileName,
       
   194                                  d->m_commandLineArgs.join(QString(QLatin1Char(' '))),
       
   195                                  d->m_copyState.sourceFileName, d->m_copyState.destinationFileName, d->m_installFileName);
   194         logMessage(msg);
   196         logMessage(msg);
   195     }
   197     }
   196     if (d->m_startupActions & ActionCopy) {
   198     if (d->m_startupActions & ActionCopy) {
   197         if (d->m_copyState.sourceFileName.isEmpty()) {
   199         if (d->m_copyState.sourceFileName.isEmpty()) {
   198             qWarning("No local filename given for copying package.");
   200             qWarning("No local filename given for copying package.");
   294 {
   296 {
   295     Q_UNUSED(result)
   297     Q_UNUSED(result)
   296     disconnectTrk();
   298     disconnectTrk();
   297 }
   299 }
   298 
   300 
       
   301 QString Launcher::msgStopped(uint pid, uint tid, uint address, const QString &why)
       
   302 {
       
   303     return QString::fromLatin1("Process %1, thread %2 stopped at 0x%3: %4").
       
   304             arg(pid).arg(tid).arg(address, 0, 16).
       
   305             arg(why.isEmpty() ? QString::fromLatin1("<Unknown reason>") : why);
       
   306 }
       
   307 
       
   308 bool Launcher::parseNotifyStopped(const QByteArray &dataBA,
       
   309                                   uint *pid, uint *tid, uint *address,
       
   310                                   QString *why /* = 0 */)
       
   311 {
       
   312     if (why)
       
   313         why->clear();
       
   314     *address = *pid = *tid = 0;
       
   315     if (dataBA.size() < 12)
       
   316         return false;
       
   317     const char *data = dataBA.data();
       
   318     *address = extractInt(data);
       
   319     *pid = extractInt(data + 4);
       
   320     *tid = extractInt(data + 8);
       
   321     if (why && dataBA.size() >= 14) {
       
   322         const unsigned short len = extractShort(data + 12);
       
   323         if (len > 0)
       
   324             *why = QString::fromLatin1(data + 14, len);
       
   325     }
       
   326     return true;
       
   327 }
       
   328 
   299 void Launcher::handleResult(const TrkResult &result)
   329 void Launcher::handleResult(const TrkResult &result)
   300 {
   330 {
   301     QByteArray prefix = "READ BUF:                                       ";
   331     QByteArray prefix = "READ BUF:                                       ";
   302     QByteArray str = result.toString().toUtf8();
   332     QByteArray str = result.toString().toUtf8();
   303     if (result.isDebugOutput) { // handle application output
   333     if (result.isDebugOutput) { // handle application output
   313             //logMessage(prefix << "TOKEN: " << result.token);
   343             //logMessage(prefix << "TOKEN: " << result.token);
   314             logMessage(prefix + "ERROR: " + errorMessage(result.data.at(0)));
   344             logMessage(prefix + "ERROR: " + errorMessage(result.data.at(0)));
   315             break;
   345             break;
   316         }
   346         }
   317         case TrkNotifyStopped: { // Notified Stopped
   347         case TrkNotifyStopped: { // Notified Stopped
   318             logMessage(prefix + "NOTE: STOPPED  " + str);
       
   319             // 90 01   78 6a 40 40   00 00 07 23   00 00 07 24  00 00
       
   320             QString reason;
   348             QString reason;
   321             if (result.data.size() >= 14) {
   349             uint pc;
   322                 uint pc = extractInt(result.data.mid(0,4).constData());
   350             uint pid;
   323                 uint pid = extractInt(result.data.mid(4,4).constData());
   351             uint tid;
   324                 uint tid = extractInt(result.data.mid(8,4).constData());
   352             parseNotifyStopped(result.data, &pid, &tid, &pc, &reason);
   325                 ushort len = extractShort(result.data.mid(12,2).constData());
   353             logMessage(prefix + msgStopped(pid, tid, pc, reason));
   326                 if(len > 0)
   354             emit(processStopped(pc, pid, tid, reason));
   327                     reason = result.data.mid(14, len);
       
   328                 emit(stopped(pc, pid, tid, reason));
       
   329             } else {
       
   330                 emit(stopped(0, 0, 0, reason));
       
   331             }
       
   332             //const char *data = result.data.data();
       
   333 //            uint addr = extractInt(data); //code address: 4 bytes; code base address for the library
       
   334 //            uint pid = extractInt(data + 4); // ProcessID: 4 bytes;
       
   335 //            uint tid = extractInt(data + 8); // ThreadID: 4 bytes
       
   336             //logMessage(prefix << "      ADDR: " << addr << " PID: " << pid << " TID: " << tid);
       
   337             d->m_device->sendTrkAck(result.token);
   355             d->m_device->sendTrkAck(result.token);
   338             break;
   356             break;
   339         }
   357         }
   340         case TrkNotifyException: { // Notify Exception (obsolete)
   358         case TrkNotifyException: { // Notify Exception (obsolete)
   341             logMessage(prefix + "NOTE: EXCEPTION  " + str);
   359             logMessage(prefix + "NOTE: EXCEPTION  " + str);
   679     } else {
   697     } else {
   680         disconnectTrk();
   698         disconnectTrk();
   681     }
   699     }
   682 }
   700 }
   683 
   701 
   684 void Launcher::startInferiorIfNeeded()
   702 QByteArray Launcher::startProcessMessage(const QString &executable,
   685 {
   703                                          const QStringList &arguments)
   686     emit startingApplication();
   704 {
   687     if (d->m_session.pid != 0) {
       
   688         logMessage("Process already 'started'");
       
   689         return;
       
   690     }
       
   691     // It's not started yet
   705     // It's not started yet
   692     QByteArray ba;
   706     QByteArray ba;
   693     appendShort(&ba, 0, TargetByteOrder); // create new process
   707     appendShort(&ba, 0, TargetByteOrder); // create new process
   694     appendByte(&ba, 0); // options - currently unused
   708     appendByte(&ba, 0); // options - currently unused
   695 
   709     if(arguments.isEmpty()) {
   696     if(d->m_commandLineArgs.isEmpty()) {
   710         appendString(&ba, executable.toLocal8Bit(), TargetByteOrder);
   697         appendString(&ba, d->m_fileName.toLocal8Bit(), TargetByteOrder);
   711         return ba;
   698     } else {
   712     }
   699         QByteArray ba2;
   713     // Append full command line as one string (leading length information).
   700         ba2.append(d->m_fileName.toLocal8Bit());
   714     QByteArray commandLineBa;
   701         ba2.append('\0');
   715     commandLineBa.append(executable.toLocal8Bit());
   702         ba2.append(d->m_commandLineArgs.toLocal8Bit());
   716     commandLineBa.append('\0');
   703         appendString(&ba, ba2, TargetByteOrder);
   717     commandLineBa.append(arguments.join(QString(QLatin1Char(' '))).toLocal8Bit());
   704     }
   718     appendString(&ba, commandLineBa, TargetByteOrder);
   705     d->m_device->sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess), ba); // Create Item
   719     return ba;
   706 }
   720 }
   707 
   721 
   708 void Launcher::resume(uint pid, uint tid)
   722 void Launcher::startInferiorIfNeeded()
       
   723 {
       
   724     emit startingApplication();
       
   725     if (d->m_session.pid != 0) {
       
   726         logMessage("Process already 'started'");
       
   727         return;
       
   728     }
       
   729     d->m_device->sendTrkMessage(TrkCreateItem, TrkCallback(this, &Launcher::handleCreateProcess),
       
   730                                 startProcessMessage(d->m_fileName, d->m_commandLineArgs)); // Create Item
       
   731 }
       
   732 
       
   733 void Launcher::resumeProcess(uint pid, uint tid)
   709 {
   734 {
   710     QByteArray ba;
   735     QByteArray ba;
   711     appendInt(&ba, pid, BigEndian);
   736     appendInt(&ba, pid, BigEndian);
   712     appendInt(&ba, tid, BigEndian);
   737     appendInt(&ba, tid, BigEndian);
   713     d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");
   738     d->m_device->sendTrkMessage(TrkContinue, TrkCallback(), ba, "CONTINUE");