From a30d696c09d0c8c84ee4ba7ca6bb961a2081d201 Mon Sep 17 00:00:00 2001 From: con Date: Thu, 30 Jul 2009 10:18:16 +0200 Subject: [PATCH 1/6] Don't block, and be able to terminate remote application. --- .../qt-s60/s60devicerunconfiguration.cpp | 7 ++++--- tests/manual/trk/launcher.cpp | 20 +++++++++++++++++-- tests/manual/trk/launcher.h | 4 ++++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 5c73ae0488d..79075d50b68 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -411,7 +411,7 @@ RunControl* S60DeviceRunConfigurationRunner::run(QSharedPointer runConfiguration) - : RunControl(runConfiguration) + : RunControl(runConfiguration), m_adapter(0) { m_makesis = new QProcess(this); connect(m_makesis, SIGNAL(readyReadStandardError()), @@ -471,7 +471,7 @@ void S60DeviceRunControl::stop() { m_makesis->kill(); m_signsis->kill(); - //m_adapter->terminate(); + m_adapter->terminate(); } bool S60DeviceRunControl::isRunning() const @@ -533,7 +533,6 @@ void S60DeviceRunControl::signsisProcessFinished() emit finished(); return; } - //TODO m_adapter = new trk::Adapter; connect(m_adapter, SIGNAL(finished()), this, SLOT(runFinished())); //TODO com selection, sisx destination and file path user definable @@ -549,6 +548,8 @@ void S60DeviceRunControl::signsisProcessFinished() void S60DeviceRunControl::runFinished() { + m_adapter->deleteLater(); + m_adapter = 0; emit addToOutputWindow(this, tr("Finished.")); emit finished(); } diff --git a/tests/manual/trk/launcher.cpp b/tests/manual/trk/launcher.cpp index 201dda4dfc1..7443a4ad17e 100644 --- a/tests/manual/trk/launcher.cpp +++ b/tests/manual/trk/launcher.cpp @@ -40,10 +40,14 @@ BOOL WINAPI TryReadFile(HANDLE hFile, LPOVERLAPPED lpOverlapped) { COMSTAT comStat; - if(!ClearCommError(hFile, NULL, &comStat)){ + if (!ClearCommError(hFile, NULL, &comStat)){ qDebug() << "ClearCommError() failed"; return FALSE; } + if (comStat.cbInQue == 0) { + *lpNumberOfBytesRead = 0; + return FALSE; + } return ReadFile(hFile, lpBuffer, qMin(comStat.cbInQue, nNumberOfBytesToRead), @@ -66,7 +70,6 @@ Adapter::Adapter() #endif m_trkWriteToken = 0; m_trkWriteBusy = false; - startTimer(100); } Adapter::~Adapter() @@ -88,6 +91,7 @@ bool Adapter::startServer() qDebug("Unable to connect to TRK server"); return false; } + m_timerId = startTimer(100); qDebug("Connecting"); sendTrkInitialPing(); sendTrkMessage(TrkConnect); // Connect @@ -197,6 +201,14 @@ void Adapter::waitForTrkFinished(const TrkResult &result) sendTrkMessage(TrkPing, CB(handleWaitForFinished)); } +void Adapter::terminate() +{ + QByteArray ba; + appendShort(&ba, 0x0000, TargetByteOrder); + appendInt(&ba, m_session.pid, TargetByteOrder); + sendTrkMessage(TrkDeleteItem, CB(waitForTrkFinished), ba); +} + void Adapter::sendTrkAck(byte token) { logMessage(QString("SENDING ACKNOWLEDGEMENT FOR TOKEN %1").arg(int(token))); @@ -262,6 +274,9 @@ void Adapter::tryTrkRead() if (isValidTrkResult(m_trkReadQueue)) break; } + if (charsRead == 0 && m_trkReadQueue.isEmpty()) { + return; + } #else // USE_NATIVE if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty()) { return; @@ -475,6 +490,7 @@ void Adapter::handleCreateProcess(const TrkResult &result) void Adapter::handleWaitForFinished(const TrkResult &result) { logMessage(" FINISHED: " + stringFromArray(result.data)); + killTimer(m_timerId); emit finished(); } diff --git a/tests/manual/trk/launcher.h b/tests/manual/trk/launcher.h index 656d6514186..09d2fed4486 100644 --- a/tests/manual/trk/launcher.h +++ b/tests/manual/trk/launcher.h @@ -64,6 +64,9 @@ public: signals: void finished(); +public slots: + void terminate(); + private: // // TRK @@ -137,6 +140,7 @@ private: // Debuggee state Session m_session; // global-ish data (process id, target information) + int m_timerId; QString m_fileName; QString m_copySrcFileName; QString m_copyDstFileName; From 3419c2561b52ec72d7bf23cd681edd6c783ca968 Mon Sep 17 00:00:00 2001 From: con Date: Thu, 30 Jul 2009 10:32:50 +0200 Subject: [PATCH 2/6] Add some progress information. --- .../qt-s60/s60devicerunconfiguration.cpp | 28 ++++++++++++++++++- .../qt-s60/s60devicerunconfiguration.h | 4 +++ tests/manual/trk/launcher.cpp | 25 ++++++++++------- tests/manual/trk/launcher.h | 5 ++++ 4 files changed, 51 insertions(+), 11 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 79075d50b68..3f9456991e0 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -471,7 +471,8 @@ void S60DeviceRunControl::stop() { m_makesis->kill(); m_signsis->kill(); - m_adapter->terminate(); + if (m_adapter) + m_adapter->terminate(); } bool S60DeviceRunControl::isRunning() const @@ -535,6 +536,11 @@ void S60DeviceRunControl::signsisProcessFinished() } m_adapter = new trk::Adapter; connect(m_adapter, SIGNAL(finished()), this, SLOT(runFinished())); + connect(m_adapter, SIGNAL(copyingStarted()), this, SLOT(printCopyingNotice())); + connect(m_adapter, SIGNAL(installingStarted()), this, SLOT(printInstallingNotice())); + connect(m_adapter, SIGNAL(startingApplication()), this, SLOT(printStartingNotice())); + connect(m_adapter, SIGNAL(applicationRunning(uint)), this, SLOT(printRunNotice(uint))); + //TODO com selection, sisx destination and file path user definable m_adapter->setTrkServerName("COM5"); const QString copySrc(m_baseFileName + ".sisx"); @@ -546,6 +552,26 @@ void S60DeviceRunControl::signsisProcessFinished() m_adapter->startServer(); } +void S60DeviceRunControl::printCopyingNotice() +{ + emit addToOutputWindow(this, tr("Copying install file to device...")); +} + +void S60DeviceRunControl::printInstallingNotice() +{ + emit addToOutputWindow(this, tr("Installing application...")); +} + +void S60DeviceRunControl::printStartingNotice() +{ + emit addToOutputWindow(this, tr("Starting...")); +} + +void S60DeviceRunControl::printRunNotice(uint pid) +{ + emit addToOutputWindow(this, tr("Application started with pid %1.").arg(pid)); +} + void S60DeviceRunControl::runFinished() { m_adapter->deleteLater(); diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index c9896372734..0c2198f4061 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -149,6 +149,10 @@ private slots: void makesisProcessFinished(); void signsisProcessFailed(); void signsisProcessFinished(); + void printCopyingNotice(); + void printInstallingNotice(); + void printStartingNotice(); + void printRunNotice(uint pid); void runFinished(); private: diff --git a/tests/manual/trk/launcher.cpp b/tests/manual/trk/launcher.cpp index 7443a4ad17e..83d7648e985 100644 --- a/tests/manual/trk/launcher.cpp +++ b/tests/manual/trk/launcher.cpp @@ -109,7 +109,6 @@ void Adapter::installAndRun() { if (!m_installFileName.isEmpty()) { installRemotePackageSilently(m_installFileName); - startInferiorIfNeeded(); } else { startInferiorIfNeeded(); } @@ -477,10 +476,11 @@ void Adapter::handleCreateProcess(const TrkResult &result) m_session.tid = extractInt(data + 5); m_session.codeseg = extractInt(data + 9); m_session.dataseg = extractInt(data + 13); - qDebug() << " READ PID: " << m_session.pid; - qDebug() << " READ TID: " << m_session.tid; - qDebug() << " READ CODE: " << m_session.codeseg; - qDebug() << " READ DATA: " << m_session.dataseg; + logMessage(QString(" READ PID: %1").arg(m_session.pid)); + logMessage(QString(" READ TID: %1").arg(m_session.tid)); + logMessage(QString(" READ CODE: %1").arg(m_session.codeseg)); + logMessage(QString(" READ DATA: %1").arg(m_session.dataseg)); + emit applicationRunning(m_session.pid); QByteArray ba; appendInt(&ba, m_session.pid); appendInt(&ba, m_session.tid); @@ -564,7 +564,7 @@ void Adapter::cleanUp() void Adapter::copyFileToRemote() { - qDebug("Copying file"); + emit copyingStarted(); QByteArray ba; appendByte(&ba, 0x10); appendString(&ba, m_copyDstFileName.toLocal8Bit(), TargetByteOrder, false); @@ -573,18 +573,23 @@ void Adapter::copyFileToRemote() void Adapter::installRemotePackageSilently(const QString &fileName) { - qDebug("Installing file"); + emit installingStarted(); QByteArray ba; appendByte(&ba, 'C'); appendString(&ba, fileName.toLocal8Bit(), TargetByteOrder, false); - sendTrkMessage(TrkInstallFile, 0, ba); + sendTrkMessage(TrkInstallFile, CB(handleInstallPackageFinished), ba); +} + +void Adapter::handleInstallPackageFinished(const TrkResult &) +{ + startInferiorIfNeeded(); } void Adapter::startInferiorIfNeeded() { - qDebug("Starting"); + emit startingApplication(); if (m_session.pid != 0) { - qDebug() << "Process already 'started'"; + logMessage("Process already 'started'"); return; } // It's not started yet diff --git a/tests/manual/trk/launcher.h b/tests/manual/trk/launcher.h index 09d2fed4486..42b46a7ad63 100644 --- a/tests/manual/trk/launcher.h +++ b/tests/manual/trk/launcher.h @@ -62,6 +62,10 @@ public: bool startServer(); signals: + void copyingStarted(); + void installingStarted(); + void startingApplication(); + void applicationRunning(uint pid); void finished(); public slots: @@ -106,6 +110,7 @@ private: void handleFileCreation(const TrkResult &result); void handleFileCreated(const TrkResult &result); + void handleInstallPackageFinished(const TrkResult &result); void handleCpuType(const TrkResult &result); void handleCreateProcess(const TrkResult &result); void handleWaitForFinished(const TrkResult &result); From 8cadee7b99d0ed8aa25407c1f5944fe57acddd28 Mon Sep 17 00:00:00 2001 From: con Date: Thu, 30 Jul 2009 11:46:30 +0200 Subject: [PATCH 3/6] Make port selectable. --- .../qt4projectmanager/qt-s60/qt-s60-todo.txt | 1 - .../qt-s60/s60devicerunconfiguration.cpp | 38 +++++++++++++++++-- .../qt-s60/s60devicerunconfiguration.h | 5 +++ tests/manual/trk/launcher.cpp | 3 +- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt index 81636f56bd1..93836090436 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt @@ -26,7 +26,6 @@ * auto-create run configurations the first time s60 qt is selected. * Run on device - * Finish runner when application exits * passphrase for signing * time stamp of copied sisx is ridiculous * maybe don't copy the sisx all the time diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 3f9456991e0..6caec355e16 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -52,6 +52,7 @@ S60DeviceRunConfiguration::S60DeviceRunConfiguration(Project *project, const QSt : RunConfiguration(project), m_proFilePath(proFilePath), m_cachedTargetInformationValid(false), + m_serialPortName("COM5"), m_signingMode(SignSelf) { if (!m_proFilePath.isEmpty()) @@ -95,6 +96,7 @@ void S60DeviceRunConfiguration::save(PersistentSettingsWriter &writer) const writer.saveValue("SigningMode", (int)m_signingMode); writer.saveValue("CustomSignaturePath", m_customSignaturePath); writer.saveValue("CustomKeyPath", m_customKeyPath); + writer.saveValue("SerialPortName", m_serialPortName); RunConfiguration::save(writer); } @@ -106,6 +108,17 @@ void S60DeviceRunConfiguration::restore(const PersistentSettingsReader &reader) m_signingMode = (SigningMode)reader.restoreValue("SigningMode").toInt(); m_customSignaturePath = reader.restoreValue("CustomSignaturePath").toString(); m_customKeyPath = reader.restoreValue("CustomKeyPath").toString(); + m_serialPortName = reader.restoreValue("SerialPortName").toString().trimmed(); +} + +QString S60DeviceRunConfiguration::serialPortName() const +{ + return m_serialPortName; +} + +void S60DeviceRunConfiguration::setSerialPortName(const QString &name) +{ + m_serialPortName = name.trimmed(); } QString S60DeviceRunConfiguration::targetName() const @@ -251,6 +264,12 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunCon m_sisxFileLabel = new QLabel(m_runConfiguration->basePackageFilePath() + ".sisx"); formLayout->addRow(tr("Install File:"), m_sisxFileLabel); + QComboBox *serialPorts = new QComboBox; + serialPorts->addItems(QStringList() << "COM1" << "COM2" << "COM3" << "COM4" << "COM5" << "COM6" << "COM7" << "COM8" << "COM9"); + serialPorts->setCurrentIndex(m_runConfiguration->serialPortName().mid(3).toInt()-1); + connect(serialPorts, SIGNAL(activated(QString)), this, SLOT(setSerialPort(QString))); + formLayout->addRow(tr("Device on Serial Port:"), serialPorts); + QWidget *signatureWidget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(); signatureWidget->setLayout(layout); @@ -312,6 +331,11 @@ void S60DeviceRunConfigurationWidget::updateTargetInformation() m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + ".sisx"); } +void S60DeviceRunConfigurationWidget::setSerialPort(const QString &portName) +{ + m_runConfiguration->setSerialPortName(portName.trimmed()); +} + void S60DeviceRunConfigurationWidget::selfSignToggled(bool toggle) { if (toggle) @@ -440,6 +464,7 @@ void S60DeviceRunControl::start() Qt4Project *project = qobject_cast(rc->project()); + m_serialPortName = rc->serialPortName(); m_targetName = rc->targetName(); m_baseFileName = rc->basePackageFilePath(); m_workingDirectory = QFileInfo(m_baseFileName).absolutePath(); @@ -541,15 +566,21 @@ void S60DeviceRunControl::signsisProcessFinished() connect(m_adapter, SIGNAL(startingApplication()), this, SLOT(printStartingNotice())); connect(m_adapter, SIGNAL(applicationRunning(uint)), this, SLOT(printRunNotice(uint))); - //TODO com selection, sisx destination and file path user definable - m_adapter->setTrkServerName("COM5"); + //TODO sisx destination and file path user definable + m_adapter->setTrkServerName(m_serialPortName); const QString copySrc(m_baseFileName + ".sisx"); const QString copyDst = QString("C:\\Data\\%1.sisx").arg(QFileInfo(m_baseFileName).fileName()); const QString runFileName = QString("C:\\sys\\bin\\%1.exe").arg(m_targetName); m_adapter->setCopyFileName(copySrc, copyDst); m_adapter->setInstallFileName(copyDst); m_adapter->setFileName(runFileName); - m_adapter->startServer(); + if (!m_adapter->startServer()) { + delete m_adapter; + m_adapter = 0; + error(this, tr("Could not connect to phone on port %1. " + "Check if the phone is connected and if it runs the TRK application.").arg(m_serialPortName)); + emit finished(); + } } void S60DeviceRunControl::printCopyingNotice() @@ -594,4 +625,5 @@ void S60DeviceRunControl::processFailed(const QString &program, QProcess::Proces errorString = tr("Some error has occurred while running %1."); } error(this, errorString.arg(program)); + emit finished(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index 0c2198f4061..f68d8a3d610 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -60,6 +60,8 @@ public: void save(ProjectExplorer::PersistentSettingsWriter &writer) const; void restore(const ProjectExplorer::PersistentSettingsReader &reader); + QString serialPortName() const; + void setSerialPortName(const QString &name); QString targetName() const; QString basePackageFilePath() const; SigningMode signingMode() const; @@ -82,6 +84,7 @@ private: QString m_targetName; QString m_baseFileName; bool m_cachedTargetInformationValid; + QString m_serialPortName; SigningMode m_signingMode; QString m_customSignaturePath; QString m_customKeyPath; @@ -97,6 +100,7 @@ public: private slots: void nameEdited(const QString &text); void updateTargetInformation(); + void setSerialPort(const QString &portName); void selfSignToggled(bool toggle); void customSignatureToggled(bool toggle); void signaturePathChanged(const QString &path); @@ -158,6 +162,7 @@ private slots: private: void processFailed(const QString &program, QProcess::ProcessError errorCode); + QString m_serialPortName; QString m_targetName; QString m_baseFileName; QString m_workingDirectory; diff --git a/tests/manual/trk/launcher.cpp b/tests/manual/trk/launcher.cpp index 83d7648e985..f1796da7075 100644 --- a/tests/manual/trk/launcher.cpp +++ b/tests/manual/trk/launcher.cpp @@ -88,11 +88,10 @@ Adapter::~Adapter() bool Adapter::startServer() { if (!openTrkPort(m_trkServerName)) { - qDebug("Unable to connect to TRK server"); + logMessage("Unable to connect to TRK server"); return false; } m_timerId = startTimer(100); - qDebug("Connecting"); sendTrkInitialPing(); sendTrkMessage(TrkConnect); // Connect sendTrkMessage(TrkSupported, CB(handleSupportMask)); From 1cad9748cc2e41e26b2b56b87a5a1f6865b70b44 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 30 Jul 2009 16:44:16 +0200 Subject: [PATCH 4/6] Fixed tr()-glitches. --- src/plugins/coreplugin/generalsettings.ui | 2 +- src/plugins/cvs/settingspage.ui | 2 +- src/plugins/debugger/breakwindow.cpp | 6 +++--- src/plugins/debugger/debuggermanager.cpp | 9 +++++---- src/plugins/designer/cpp/cppsettingspagewidget.ui | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/plugins/coreplugin/generalsettings.ui b/src/plugins/coreplugin/generalsettings.ui index e2b84b73225..269d1461657 100644 --- a/src/plugins/coreplugin/generalsettings.ui +++ b/src/plugins/coreplugin/generalsettings.ui @@ -183,7 +183,7 @@ - Reload all unmodified files + Reload all modified files diff --git a/src/plugins/cvs/settingspage.ui b/src/plugins/cvs/settingspage.ui index 6798485edb1..efff37aadd8 100644 --- a/src/plugins/cvs/settingspage.ui +++ b/src/plugins/cvs/settingspage.ui @@ -30,7 +30,7 @@ When checked, all files touched by a commit will be displayed when clicking on a revision number in the annotation view (retrieved via commit id). Otherwise, only the respective file will be displayed. - Describe by commit id + Describe all files matching commit id: diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 92d342983ac..543a9e3bd67 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -136,10 +136,10 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) const int rowCount = itemModel->rowCount(); - QAction *deleteAction = new QAction(tr("Delete breakpoint", 0, si.size()), &menu); + QAction *deleteAction = new QAction(tr("Delete breakpoint"), &menu); deleteAction->setEnabled(si.size() > 0); - QAction *deleteAllAction = new QAction(tr("Delete all breakpoints", 0, si.size()), &menu); + QAction *deleteAllAction = new QAction(tr("Delete all breakpoints"), &menu); deleteAllAction->setEnabled(si.size() > 0); // Delete by file: Find indexes of breakpoints of the same file @@ -168,7 +168,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) alwaysAdjustAction->setCheckable(true); alwaysAdjustAction->setChecked(m_alwaysResizeColumnsToContents); - QAction *editConditionAction = new QAction(tr("Edit condition...", 0, si.size()), &menu); + QAction *editConditionAction = new QAction(tr("Edit condition..."), &menu); editConditionAction->setEnabled(si.size() > 0); QAction *synchronizeAction = new QAction(tr("Synchronize breakpoints"), &menu); diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index b3ca55f0dc1..a2adb1baa6e 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -1525,10 +1525,11 @@ QString DebuggerManager::qtDumperLibraryName() const QStringList DebuggerManager::qtDumperLibraryLocations() const { - if (theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool()) - return QStringList() << - ( theDebuggerAction(CustomDebuggingHelperLocation)->value().toString() - + tr(" (explicitly set in the Debugger Options)")); + if (theDebuggerAction(UseCustomDebuggingHelperLocation)->value().toBool()) { + const QString customLocation = theDebuggerAction(CustomDebuggingHelperLocation)->value().toString(); + const QString location = tr("%1 (explicitly set in the Debugger Options)").arg(customLocation); + return QStringList(location); + } return m_dumperLibLocations; } diff --git a/src/plugins/designer/cpp/cppsettingspagewidget.ui b/src/plugins/designer/cpp/cppsettingspagewidget.ui index 8a34601df91..b06c43da415 100644 --- a/src/plugins/designer/cpp/cppsettingspagewidget.ui +++ b/src/plugins/designer/cpp/cppsettingspagewidget.ui @@ -68,7 +68,7 @@ - Include Qt module name + Use Qt module name in #include-directive From f0a482a11f8a4ec8e919bcc5efafe3479ec42f0d Mon Sep 17 00:00:00 2001 From: con Date: Thu, 30 Jul 2009 16:47:21 +0200 Subject: [PATCH 5/6] Add some listing of serial devices with friendly names. This doesn't update at all yet, so you'll need to recreate the run configuration or restart creator. --- .../qt4projectmanager/qt-s60/qt-s60.pri | 6 +- .../qt-s60/s60devicerunconfiguration.cpp | 24 ++++--- .../qt-s60/s60devicerunconfiguration.h | 4 +- .../qt-s60/serialdevicelister.cpp | 63 +++++++++++++++++++ .../qt-s60/serialdevicelister.h | 57 +++++++++++++++++ 5 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp create mode 100644 src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri index 00895244cef..bfc53ae98e1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri @@ -8,14 +8,16 @@ SUPPORT_QT_S60 = $$(QTCREATOR_WITH_S60) $$PWD/winscwtoolchain.cpp \ $$PWD/gccetoolchain.cpp \ $$PWD/s60emulatorrunconfiguration.cpp \ - $$PWD/s60devicerunconfiguration.cpp + $$PWD/s60devicerunconfiguration.cpp \ + $$PWD/serialdevicelister.cpp HEADERS += $$PWD/s60devices.h \ $$PWD/s60devicespreferencepane.h \ $$PWD/s60manager.h \ $$PWD/winscwtoolchain.h \ $$PWD/gccetoolchain.h \ $$PWD/s60emulatorrunconfiguration.h \ - $$PWD/s60devicerunconfiguration.h + $$PWD/s60devicerunconfiguration.h \ + $$PWD/serialdevicelister.h FORMS += $$PWD/s60devicespreferencepane.ui OTHER_FILES += $$PWD/qt-s60-todo.txt diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 6caec355e16..e03349e5a2b 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -34,6 +34,7 @@ #include "profilereader.h" #include "s60manager.h" #include "s60devices.h" +#include "serialdevicelister.h" #include #include @@ -264,11 +265,20 @@ S60DeviceRunConfigurationWidget::S60DeviceRunConfigurationWidget(S60DeviceRunCon m_sisxFileLabel = new QLabel(m_runConfiguration->basePackageFilePath() + ".sisx"); formLayout->addRow(tr("Install File:"), m_sisxFileLabel); - QComboBox *serialPorts = new QComboBox; - serialPorts->addItems(QStringList() << "COM1" << "COM2" << "COM3" << "COM4" << "COM5" << "COM6" << "COM7" << "COM8" << "COM9"); - serialPorts->setCurrentIndex(m_runConfiguration->serialPortName().mid(3).toInt()-1); - connect(serialPorts, SIGNAL(activated(QString)), this, SLOT(setSerialPort(QString))); - formLayout->addRow(tr("Device on Serial Port:"), serialPorts); + QString runConfigurationPortName = m_runConfiguration->serialPortName(); + QList serialDevices = SerialDeviceLister().serialDevices(); + m_serialPorts = new QComboBox; + for (int i = 0; i < serialDevices.size(); ++i) { + const SerialDeviceLister::SerialDevice &device = serialDevices.at(i); + m_serialPorts->addItem(device.friendlyName, device.portName); + if (device.portName == runConfigurationPortName) + m_serialPorts->setCurrentIndex(i); + } + QString selectedPortName = m_serialPorts->itemData(m_serialPorts->currentIndex()).toString(); + if (m_serialPorts->count() > 0 && runConfigurationPortName != selectedPortName) + m_runConfiguration->setSerialPortName(selectedPortName); + connect(m_serialPorts, SIGNAL(activated(int)), this, SLOT(setSerialPort(int))); + formLayout->addRow(tr("Device on Serial Port:"), m_serialPorts); QWidget *signatureWidget = new QWidget(); QVBoxLayout *layout = new QVBoxLayout(); @@ -331,9 +341,9 @@ void S60DeviceRunConfigurationWidget::updateTargetInformation() m_sisxFileLabel->setText(m_runConfiguration->basePackageFilePath() + ".sisx"); } -void S60DeviceRunConfigurationWidget::setSerialPort(const QString &portName) +void S60DeviceRunConfigurationWidget::setSerialPort(int index) { - m_runConfiguration->setSerialPortName(portName.trimmed()); + m_runConfiguration->setSerialPortName(m_serialPorts->itemData(index).toString()); } void S60DeviceRunConfigurationWidget::selfSignToggled(bool toggle) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index f68d8a3d610..3e4d7572a08 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -38,6 +38,7 @@ #include #include #include +#include namespace Qt4ProjectManager { namespace Internal { @@ -100,7 +101,7 @@ public: private slots: void nameEdited(const QString &text); void updateTargetInformation(); - void setSerialPort(const QString &portName); + void setSerialPort(int index); void selfSignToggled(bool toggle); void customSignatureToggled(bool toggle); void signaturePathChanged(const QString &path); @@ -108,6 +109,7 @@ private slots: private: S60DeviceRunConfiguration *m_runConfiguration; + QComboBox *m_serialPorts; QLineEdit *m_nameLineEdit; QLabel *m_sisxFileLabel; }; diff --git a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp new file mode 100644 index 00000000000..948b7241e09 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.cpp @@ -0,0 +1,63 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "serialdevicelister.h" + +#include +#include +#include + +using namespace Qt4ProjectManager::Internal; + +namespace { + const char * const REGKEY_CURRENT_CONTROL_SET = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet"; + const char * const USBSER = "Services/usbser/Enum"; +} + +SerialDeviceLister::SerialDeviceLister() +{ +} + +QList SerialDeviceLister::serialDevices() const +{ + QList devices; + QSettings registry(REGKEY_CURRENT_CONTROL_SET, QSettings::NativeFormat); + int count = registry.value(QString::fromLatin1("%1/Count").arg(USBSER)).toInt(); + for (int i = 0; i < count; ++i) { + QString driver = registry.value(QString::fromLatin1("%1/%2").arg(USBSER).arg(i)).toString(); + if (driver.contains("JAVACOMM")) { + driver.replace('\\', '/'); + SerialDeviceLister::SerialDevice device; + device.friendlyName = registry.value(QString::fromLatin1("Enum/%1/FriendlyName").arg(driver)).toString(); + device.portName = registry.value(QString::fromLatin1("Enum/%1/Device Parameters/PortName").arg(driver)).toString(); + devices.append(device); + } + } + return devices; +} diff --git a/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h new file mode 100644 index 00000000000..c314dd19758 --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/serialdevicelister.h @@ -0,0 +1,57 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef SERIALDEVICELISTER_H +#define SERIALDEVICELISTER_H + +#include +#include +#include + +namespace Qt4ProjectManager { +namespace Internal { + +class SerialDeviceLister : public QObject +{ + Q_OBJECT +public: + + struct SerialDevice { + QString portName; + QString friendlyName; + }; + + SerialDeviceLister(); + QList serialDevices() const; +}; + +} // Internal +} // Qt4ProjectManager + +#endif // SERIALDEVICELISTER_H From 99136262ce23755d998438955a36b92364eb2d35 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Thu, 30 Jul 2009 18:05:20 +0200 Subject: [PATCH 6/6] S60: Fix target name for release builds --- .../qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index e03349e5a2b..71ef6338383 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -230,7 +230,7 @@ void S60DeviceRunConfiguration::updateTarget() if (projectBuildConfiguration & QtVersion::DebugBuild) m_baseFileName += "_udeb"; else - m_baseFileName += "_rel"; + m_baseFileName += "_urel"; delete reader; m_cachedTargetInformationValid = true;