Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/tools/runonphone/symbianutils/trkdevice.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    5353#include <QtCore/QWaitCondition>
    5454#include <QtCore/QSharedPointer>
     55#include <QtCore/QScopedPointer>
    5556#include <QtCore/QMetaType>
    5657
     
    103104enum { verboseTrk = 0 };
    104105
     106static inline QString msgAccessingClosedDevice(const QString &msg)
     107{
     108    return QString::fromLatin1("Error: Attempt to access device '%1', which is closed.").arg(msg);
     109}
     110
    105111namespace trk {
    106112
     
    156162
    157163class TrkWriteQueue
    158 {   
     164{
    159165    Q_DISABLE_COPY(TrkWriteQueue)
    160166public:
    161167    explicit TrkWriteQueue();
     168    void clear();
    162169
    163170    // Enqueue messages.
     
    209216}
    210217
     218void TrkWriteQueue::clear()
     219{
     220    m_trkWriteToken = 0;
     221    m_trkWriteBusy = false;
     222    m_trkWriteQueue.clear();
     223    const int discarded = m_writtenTrkMessages.size();
     224    m_writtenTrkMessages.clear();
     225    if (verboseTrk)
     226        qDebug() << "TrkWriteQueue::clear: discarded " << discarded;
     227}
     228
    211229byte TrkWriteQueue::nextTrkWriteToken()
    212230{
     
    215233        ++m_trkWriteToken;
    216234    if (verboseTrk)
    217         qDebug() << "Write token: " << m_trkWriteToken;
     235        qDebug() << "nextTrkWriteToken:" << m_trkWriteToken;
    218236    return m_trkWriteToken;
    219237}
     
    350368    Q_OBJECT
    351369    Q_DISABLE_COPY(WriterThread)
    352 public:           
     370public:
    353371    explicit WriterThread(const QSharedPointer<DeviceContext> &context);
    354372
     
    358376    void queueTrkInitialPing();
    359377
     378    void clearWriteQueue();
     379
    360380    // Call this from the device read notification with the results.
    361381    void slotHandleResult(const TrkResult &result);
     
    375395    void invokeNoopMessage(const trk::TrkMessage &);
    376396
    377 private:   
     397private:
    378398    bool write(const QByteArray &data, QString *errorMessage);
    379399    inline int writePendingMessage();
     
    463483    wait();
    464484    m_terminate = false;
     485    m_queue.clear();
    465486}
    466487
     
    562583}
    563584
     585void WriterThread::clearWriteQueue()
     586{
     587    m_dataMutex.lock();
     588    m_queue.clear();
     589    m_dataMutex.unlock();
     590}
     591
    564592void WriterThread::queueTrkInitialPing()
    565593{
     
    593621public:
    594622
     623    int bytesPending() const { return m_trkReadBuffer.size(); }
     624
    595625signals:
    596626    void messageReceived(const trk::TrkResult &result, const QByteArray &rawData);
     
    607637
    608638    QByteArray m_trkReadBuffer;
     639    bool linkEstablishmentMode;
    609640};
    610641
    611642ReaderThreadBase::ReaderThreadBase(const QSharedPointer<DeviceContext> &context) :
    612     m_context(context)
     643    m_context(context), linkEstablishmentMode(true)
    613644{
    614645    static const int trkResultMetaId = qRegisterMetaType<trk::TrkResult>();
     
    633664    TrkResult r;
    634665    QByteArray rawData;
    635     while (extractResult(&m_trkReadBuffer, m_context->serialFrame, &r, &rawData)) {
     666    while (extractResult(&m_trkReadBuffer, m_context->serialFrame, &r, linkEstablishmentMode, &rawData)) {
    636667        emit messageReceived(r, rawData);
    637668    }
     
    693724        emit error(QString::fromLatin1("ClearCommError failed: %1").arg(winErrorMessage(GetLastError())));
    694725        return -7;
    695     }   
     726    }
    696727    const DWORD bytesToRead = qMax(DWORD(1), qMin(comStat.cbInQue, DWORD(BufSize)));
    697728    // Trigger read
     
    709740        emit error(QString::fromLatin1("Read error: %1").arg(winErrorMessage(readError)));
    710741        return -1;
    711     }   
     742    }
    712743    // Wait for either termination or data
    713744    const DWORD wr = WaitForMultipleObjects(HandleCount, m_handles, false, INFINITE);
     
    784815};
    785816
    786 UnixReaderThread::UnixReaderThread(const QSharedPointer<DeviceContext> &context) : 
     817UnixReaderThread::UnixReaderThread(const QSharedPointer<DeviceContext> &context) :
    787818    ReaderThreadBase(context)
    788819{
     
    878909
    879910    QSharedPointer<DeviceContext> deviceContext;
    880     QSharedPointer<WriterThread> writerThread;
    881     QSharedPointer<ReaderThread> readerThread;
     911    QScopedPointer<WriterThread> writerThread;
     912    QScopedPointer<ReaderThread> readerThread;
    882913
    883914    QByteArray trkReadBuffer;
     
    918949bool TrkDevice::open(QString *errorMessage)
    919950{
    920     if (d->verbose)
     951    if (d->verbose || verboseTrk)
    921952        qDebug() << "Opening" << port() << "is open: " << isOpen() << " serialFrame=" << serialFrame();
     953    if (isOpen())
     954        return true;
    922955    if (d->port.isEmpty()) {
    923956        *errorMessage = QLatin1String("Internal error: No port set on TrkDevice");
    924957        return false;
    925958    }
    926 
    927     close();
    928959#ifdef Q_OS_WIN
    929960    const QString fullPort = QLatin1String("\\\\.\\") + d->port;
     
    9761007    }
    9771008#endif
    978     d->readerThread = QSharedPointer<ReaderThread>(new ReaderThread(d->deviceContext));
     1009    d->readerThread.reset(new ReaderThread(d->deviceContext));
    9791010    connect(d->readerThread.data(), SIGNAL(error(QString)), this, SLOT(emitError(QString)),
    9801011            Qt::QueuedConnection);
     
    9841015    d->readerThread->start();
    9851016
    986     d->writerThread = QSharedPointer<WriterThread>(new WriterThread(d->deviceContext));
     1017    d->writerThread.reset(new WriterThread(d->deviceContext));
    9871018    connect(d->writerThread.data(), SIGNAL(error(QString)), this, SLOT(emitError(QString)),
    988             Qt::QueuedConnection);   
    989     d->writerThread->start();   
    990 
    991     if (d->verbose)
    992         qDebug() << "Opened" << d->port;
     1019            Qt::QueuedConnection);
     1020    d->writerThread->start();
     1021
     1022    if (d->verbose || verboseTrk)
     1023        qDebug() << "Opened" << d->port << d->readerThread.data() << d->writerThread.data();
    9931024    return true;
    9941025}
     
    9961027void TrkDevice::close()
    9971028{
     1029    if (verboseTrk)
     1030        qDebug() << "close" << d->port << " is open: " << isOpen()
     1031        << " read pending " << (d->readerThread.isNull() ? 0 : d->readerThread->bytesPending())
     1032        << sender();
    9981033    if (!isOpen())
    9991034        return;
     
    10111046    d->deviceContext->file.close();
    10121047#endif
     1048
    10131049    if (d->verbose)
    10141050        emitLogMessage("Close");
     
    10311067void TrkDevice::setPort(const QString &p)
    10321068{
     1069    if (verboseTrk)
     1070        qDebug() << "setPort" << p;
    10331071    d->port = p;
    10341072}
     
    10461084void TrkDevice::setSerialFrame(bool f)
    10471085{
     1086    if (verboseTrk)
     1087        qDebug() << "setSerialFrame" << f;
    10481088    d->deviceContext->serialFrame = f;
    10491089}
     
    10611101void TrkDevice::slotMessageReceived(const trk::TrkResult &result, const QByteArray &rawData)
    10621102{
    1063     d->writerThread->slotHandleResult(result);
    1064     if (d->verbose > 1)
    1065         qDebug() << "Received: " << result.toString();
    1066     emit messageReceived(result);   
    1067     if (!rawData.isEmpty())
    1068         emit rawDataReceived(rawData);
     1103    if (isOpen()) { // Might receive bytes after closing due to queued connections.
     1104        d->writerThread->slotHandleResult(result);
     1105        if (d->verbose > 1)
     1106            qDebug() << "Received: " << result.toString();
     1107        emit messageReceived(result);
     1108        if (!rawData.isEmpty())
     1109            emit rawDataReceived(rawData);
     1110    }
    10691111}
    10701112
     
    10761118}
    10771119
     1120void TrkDevice::clearWriteQueue()
     1121{
     1122    if (isOpen())
     1123        d->writerThread->clearWriteQueue();
     1124}
     1125
    10781126void TrkDevice::sendTrkMessage(byte code, TrkCallback callback,
    10791127     const QByteArray &data, const QVariant &cookie)
    10801128{
     1129    if (!isOpen()) {
     1130        emitError(msgAccessingClosedDevice(d->port));
     1131        return;
     1132    }
    10811133    if (!d->writerThread.isNull()) {
    10821134        if (d->verbose > 1) {
    1083             QByteArray msg = "Sending:  ";
     1135            QByteArray msg = "Sending:  0x";
    10841136            msg += QByteArray::number(code, 16);
    10851137            msg += ": ";
    10861138            msg += stringFromArray(data).toLatin1();
     1139            if (cookie.isValid())
     1140                msg += " Cookie: " + cookie.toString().toLatin1();
    10871141            qDebug("%s", msg.data());
    10881142        }
     
    10931147void TrkDevice::sendTrkInitialPing()
    10941148{
     1149    if (!isOpen()) {
     1150        emitError(msgAccessingClosedDevice(d->port));
     1151        return;
     1152    }
    10951153    if (!d->writerThread.isNull())
    10961154        d->writerThread->queueTrkInitialPing();
     
    10991157bool TrkDevice::sendTrkAck(byte token)
    11001158{
     1159    if (!isOpen()) {
     1160        emitError(msgAccessingClosedDevice(d->port));
     1161        return false;
     1162    }
    11011163    if (d->writerThread.isNull())
    11021164        return false;
Note: See TracChangeset for help on using the changeset viewer.