diff options
31 files changed, 30 insertions, 2490 deletions
diff --git a/examples/serialport/blockingmaster/blockingmaster.pro b/examples/serialport/blockingmaster/blockingmaster.pro index 5f21cdb..8f3e0a1 100644 --- a/examples/serialport/blockingmaster/blockingmaster.pro +++ b/examples/serialport/blockingmaster/blockingmaster.pro @@ -1,8 +1,4 @@ -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += widgets serialport TARGET = blockingmaster TEMPLATE = app diff --git a/examples/serialport/blockingslave/blockingslave.pro b/examples/serialport/blockingslave/blockingslave.pro index 5a5fb78..2477b52 100644 --- a/examples/serialport/blockingslave/blockingslave.pro +++ b/examples/serialport/blockingslave/blockingslave.pro @@ -1,8 +1,4 @@ -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += widgets serialport TARGET = blockingslave TEMPLATE = app diff --git a/examples/serialport/cenumerator/cenumerator.pro b/examples/serialport/cenumerator/cenumerator.pro index 7f87034..f5494fd 100644 --- a/examples/serialport/cenumerator/cenumerator.pro +++ b/examples/serialport/cenumerator/cenumerator.pro @@ -1,10 +1,5 @@ QT = core - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport CONFIG += console CONFIG -= app_bundle diff --git a/examples/serialport/creaderasync/creaderasync.pro b/examples/serialport/creaderasync/creaderasync.pro index 27b17dc..3565dc9 100644 --- a/examples/serialport/creaderasync/creaderasync.pro +++ b/examples/serialport/creaderasync/creaderasync.pro @@ -1,10 +1,5 @@ QT = core - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport CONFIG += console CONFIG -= app_bundle diff --git a/examples/serialport/creadersync/creadersync.pro b/examples/serialport/creadersync/creadersync.pro index 3e9a199..ee9eaf2 100644 --- a/examples/serialport/creadersync/creadersync.pro +++ b/examples/serialport/creadersync/creadersync.pro @@ -1,10 +1,5 @@ QT = core - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport CONFIG += console CONFIG -= app_bundle diff --git a/examples/serialport/cwriterasync/cwriterasync.pro b/examples/serialport/cwriterasync/cwriterasync.pro index 8a64ceb..0945f1d 100644 --- a/examples/serialport/cwriterasync/cwriterasync.pro +++ b/examples/serialport/cwriterasync/cwriterasync.pro @@ -1,10 +1,5 @@ QT = core - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport CONFIG += console CONFIG -= app_bundle diff --git a/examples/serialport/cwritersync/cwritersync.pro b/examples/serialport/cwritersync/cwritersync.pro index 14cba72..08f50a2 100644 --- a/examples/serialport/cwritersync/cwritersync.pro +++ b/examples/serialport/cwritersync/cwritersync.pro @@ -1,10 +1,5 @@ QT = core - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport CONFIG += console CONFIG -= app_bundle diff --git a/examples/serialport/enumerator/enumerator.pro b/examples/serialport/enumerator/enumerator.pro index 21233a8..9819fd7 100644 --- a/examples/serialport/enumerator/enumerator.pro +++ b/examples/serialport/enumerator/enumerator.pro @@ -1,8 +1,4 @@ -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += widgets serialport TARGET = enumerator TEMPLATE = app diff --git a/examples/serialport/serialport.pro b/examples/serialport/serialport.pro index ba8d167..c0e77df 100644 --- a/examples/serialport/serialport.pro +++ b/examples/serialport/serialport.pro @@ -1,8 +1,4 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS = cenumerator creaderasync creadersync cwriterasync cwritersync -greaterThan(QT_MAJOR_VERSION, 4) { - !isEmpty(QT.widgets.name):SUBDIRS += enumerator terminal blockingmaster blockingslave -} else { - SUBDIRS += enumerator terminal blockingmaster blockingslave master slave -} +!isEmpty(QT.widgets.name):SUBDIRS += enumerator terminal blockingmaster blockingslave diff --git a/examples/serialport/terminal/terminal.pro b/examples/serialport/terminal/terminal.pro index 0a5b545..1e45e55 100644 --- a/examples/serialport/terminal/terminal.pro +++ b/examples/serialport/terminal/terminal.pro @@ -1,8 +1,4 @@ -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += widgets serialport TARGET = terminal TEMPLATE = app diff --git a/qtserialport.pro b/qtserialport.pro index 3220d2f..b3ebb8b 100644 --- a/qtserialport.pro +++ b/qtserialport.pro @@ -1,14 +1,8 @@ -requires(!winrt) - lessThan(QT_MAJOR_VERSION, 5) { - TEMPLATE = subdirs - SUBDIRS = src examples tests - CONFIG += ordered - - !infile($$OUT_PWD/.qmake.cache, QTSERIALPORT_PROJECT_ROOT) { - system("echo QTSERIALPORT_PROJECT_ROOT = $$PWD >> $$OUT_PWD/.qmake.cache") - system("echo QTSERIALPORT_BUILD_ROOT = $$OUT_PWD >> $$OUT_PWD/.qmake.cache") - } -} else { - load(qt_parts) + message("Cannot build current QtSerialPort sources with Qt version $${QT_VERSION}.") + error("Use at least Qt 5.0.0 or try to download QtSerialPort for Qt4.") } + +requires(!winrt) + +load(qt_parts) diff --git a/src/serialport/qserialport.cpp b/src/serialport/qserialport.cpp index 82bcde3..04685cd 100644 --- a/src/serialport/qserialport.cpp +++ b/src/serialport/qserialport.cpp @@ -41,8 +41,6 @@ #include "qserialport_wince_p.h" #elif defined (Q_OS_WIN) #include "qserialport_win_p.h" -#elif defined (Q_OS_SYMBIAN) -#include "qserialport_symbian_p.h" #elif defined (Q_OS_UNIX) #include "qserialport_unix_p.h" #else @@ -467,10 +465,6 @@ void QSerialPort::setPort(const QSerialPortInfo &serialPortInfo) \li Removes the suffix ":" from the system location and returns the remainder of the string. \row - \li Symbian - \li Returns the system location as it is, - as it is equivalent to the port name. - \row \li GNU/Linux \li Removes the prefix "/dev/" from the system location and returns the remainder of the string. @@ -618,10 +612,9 @@ bool QSerialPort::settingsRestoredOnClose() const after that the opening of the port succeeds. \warning Setting the AllDirections flag is only supported on - the Windows, Windows CE, and Symbian platforms. + the Windows, Windows CE platforms. - \warning Returns equal baud rate in any direction on Windows, Windows CE, and - Symbian. + \warning Returns equal baud rate in any direction on Windows, Windows CE. The default value is Baud9600, i.e. 9600 bits per second. */ diff --git a/src/serialport/qserialport_symbian.cpp b/src/serialport/qserialport_symbian.cpp deleted file mode 100644 index ec7e96d..0000000 --- a/src/serialport/qserialport_symbian.cpp +++ /dev/null @@ -1,556 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Denis Shienkov <denis.shienkov@gmail.com> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtSerialPort module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qserialport_symbian_p.h" - -#include <QtCore/qmap.h> - -#include <e32base.h> -//#include <e32test.h> -#include <f32file.h> - -QT_BEGIN_NAMESPACE - -// Physical device driver. -#ifdef __WINS__ -_LIT(KPddName, "ECDRV"); -#else // defined (__EPOC32__) -_LIT(KPddName, "EUART"); -#endif - -// Logical device driver. -_LIT(KLddName,"ECOMM"); - -// Modules names. -_LIT(KRS232ModuleName, "ECUART"); -_LIT(KBluetoothModuleName, "BTCOMM"); -_LIT(KInfraRedModuleName, "IRCOMM"); -_LIT(KACMModuleName, "ECACM"); - -// Return false on error load. -static bool loadDevices() -{ - TInt r = KErrNone; -#ifdef __WINS__ - RFs fileServer; - r = User::LeaveIfError(fileServer.Connect()); - if (r != KErrNone) - return false; - fileServer.Close (); -#endif - - r = User::LoadPhysicalDevice(KPddName); - if (r != KErrNone && r != KErrAlreadyExists) - return false; //User::Leave(r); - - r = User::LoadLogicalDevice(KLddName); - if (r != KErrNone && r != KErrAlreadyExists) - return false; //User::Leave(r); - -#ifndef __WINS__ - r = StartC32(); - if (r != KErrNone && r != KErrAlreadyExists) - return false; //User::Leave(r); -#endif - - return true; -} - -QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q) - : QSerialPortPrivateData(q) - , errnum(KErrNone) -{ -} - -bool QSerialPortPrivate::open(QIODevice::OpenMode mode) -{ - Q_Q(QSerialPort); - - // FIXME: Maybe need added check an ReadWrite open mode? - Q_UNUSED(mode) - - if (!loadDevices()) { - q->setError(QSerialPort::UnknownError); - return false; - } - - RCommServ server; - errnum = server.Connect(); - if (errnum != KErrNone) { - q->setError(decodeSystemError()); - return false; - } - - if (systemLocation.contains("BTCOMM")) - errnum = server.LoadCommModule(KBluetoothModuleName); - else if (systemLocation.contains("IRCOMM")) - errnum = server.LoadCommModule(KInfraRedModuleName); - else if (systemLocation.contains("ACM")) - errnum = server.LoadCommModule(KACMModuleName); - else - errnum = server.LoadCommModule(KRS232ModuleName); - - if (errnum != KErrNone) { - q->setError(decodeSystemError()); - return false; - } - - // In Symbian OS port opening only in R/W mode? - TPtrC portName(static_cast<const TUint16*>(systemLocation.utf16()), systemLocation.length()); - errnum = descriptor.Open(server, portName, ECommExclusive); - - if (errnum != KErrNone) { - q->setError(decodeSystemError()); - return false; - } - - // Save current port settings. - errnum = descriptor.Config(restoredSettings); - if (errnum != KErrNone) { - q->setError(decodeSystemError()); - return false; - } - - return true; -} - -void QSerialPortPrivate::close() -{ - if (settingsRestoredOnClose) - descriptor.SetConfig(restoredSettings); - descriptor.Close(); -} - -QSerialPort::PinoutSignals QSerialPortPrivate::pinoutSignals() -{ - QSerialPort::PinoutSignals ret = QSerialPort::NoSignal; - - TUint signalMask = 0; - descriptor.Signals(signalMask); - - if (signalMask & KSignalCTS) - ret |= QSerialPort::ClearToSendSignal; - if (signalMask & KSignalDSR) - ret |= QSerialPort::DataSetReadySignal; - if (signalMask & KSignalDCD) - ret |= QSerialPort::DataCarrierDetectSignal; - if (signalMask & KSignalRNG) - ret |= QSerialPort::RingIndicatorSignal; - if (signalMask & KSignalRTS) - ret |= QSerialPort::RequestToSendSignal; - if (signalMask & KSignalDTR) - ret |= QSerialPort::DataTerminalReadySignal; - - //if (signalMask & KSignalBreak) - // ret |= - return ret; -} - -bool QSerialPortPrivate::setDataTerminalReady(bool set) -{ - TInt r; - if (set) - r = descriptor.SetSignalsToMark(KSignalDTR); - else - r = descriptor.SetSignalsToSpace(KSignalDTR); - - return r == KErrNone; -} - -bool QSerialPortPrivate::setRequestToSend(bool set) -{ - TInt r; - if (set) - r = descriptor.SetSignalsToMark(KSignalRTS); - else - r = descriptor.SetSignalsToSpace(KSignalRTS); - - return r == KErrNone; -} - -bool QSerialPortPrivate::flush() -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::clear(QSerialPort::Directions directions) -{ - TUint flags = 0; - if (directions & QSerialPort::Input) - flags |= KCommResetRx; - if (directions & QSerialPort::Output) - flags |= KCommResetTx; - TInt r = descriptor.ResetBuffers(flags); - return r == KErrNone; -} - -bool QSerialPortPrivate::sendBreak(int duration) -{ - TRequestStatus status; - descriptor.Break(status, TTimeIntervalMicroSeconds32(duration * 1000)); - return false; -} - -bool QSerialPortPrivate::setBreakEnabled(bool set) -{ - // TODO: Implement me - return false; -} - -void QSerialPortPrivate::startWriting() -{ - // TODO: Implement me -} - -bool QSerialPortPrivate::waitForReadyRead(int msec) -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::waitForBytesWritten(int msec) -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::setBaudRate() -{ - return setBaudRate(inputBaudRate, QSerialPort::AllDirections); -} - -bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions directions) -{ - Q_Q(QSerialPort); - - if (directions != QSerialPort::AllDirections) { - q->setError(QSerialPort::UnsupportedOperationError); - return false; - } - - baudRate = settingFromBaudRate(baudRate); - if (baudRate) - currentSettings().iRate = static_cast<TBps>(baudRate); - else { - q->setError(QSerialPort::UnsupportedOperationError); - return false; - } - - return updateCommConfig(); -} - -bool QSerialPortPrivate::setDataBits(QSerialPort::DataBits dataBits) -{ - switch (dataBits) { - case QSerialPort::Data5: - currentSettings().iDataBits = EData5; - break; - case QSerialPort::Data6: - currentSettings().iDataBits = EData6; - break; - case QSerialPort::Data7: - currentSettings().iDataBits = EData7; - break; - case QSerialPort::Data8: - currentSettings().iDataBits = EData8; - break; - default: - currentSettings().iDataBits = EData8; - break; - } - - return updateCommConfig(); -} - -bool QSerialPortPrivate::setParity(QSerialPort::Parity parity) -{ - switch (parity) { - case QSerialPort::NoParity: - currentSettings().iParity = EParityNone; - break; - case QSerialPort::EvenParity: - currentSettings().iParity = EParityEven; - break; - case QSerialPort::OddParity: - currentSettings().iParity = EParityOdd; - break; - case QSerialPort::MarkParity: - currentSettings().iParity = EParityMark; - break; - case QSerialPort::SpaceParity: - currentSettings().iParity = EParitySpace; - break; - default: - currentSettings().iParity = EParityNone; - break; - } - - return updateCommConfig(); -} - -bool QSerialPortPrivate::setStopBits(QSerialPort::StopBits stopBits) -{ - switch (stopBits) { - case QSerialPort::OneStop: - currentSettings().iStopBits = EStop1; - break; - case QSerialPort::TwoStop: - currentSettings().iStopBits = EStop2; - break; - default: - currentSettings().iStopBits = EStop1; - break; - } - - return updateCommConfig(); -} - -bool QSerialPortPrivate::setFlowControl(QSerialPort::FlowControl flowControl) -{ - switch (flowControl) { - case QSerialPort::NoFlowControl: - currentSettings().iHandshake = KConfigFailDSR; - break; - case QSerialPort::HardwareControl: - currentSettings().iHandshake = KConfigObeyCTS | KConfigFreeRTS; - break; - case QSerialPort::SoftwareControl: - currentSettings().iHandshake = KConfigObeyXoff | KConfigSendXoff; - break; - default: - currentSettings().iHandshake = KConfigFailDSR; - break; - } - - return updateCommConfig(); -} - -bool QSerialPortPrivate::setDataErrorPolicy(QSerialPort::DataErrorPolicy policy) -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::notifyRead() -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::notifyWrite() -{ - // TODO: Implement me - return false; -} - -bool QSerialPortPrivate::updateCommConfig() -{ - Q_Q(QSerialPort); - - if (descriptor.SetConfig(currentSettings) != KErrNone) { - q->setError(QSerialPort::UnsupportedOperationError); - return false; - } - return true; -} - -QSerialPort::SerialPortError QSerialPortPrivate::decodeSystemError() const -{ - QSerialPort::SerialPortError error; - switch (errnum) { - case KErrPermissionDenied: - error = QSerialPort::DeviceNotFoundError; - break; - case KErrLocked: - error = QSerialPort::PermissionError; - break; - case KErrAccessDenied: - error = QSerialPort::PermissionError; - break; - default: - error = QSerialPort::UnknownError; - break; - } - return error; -} - -bool QSerialPortPrivate::waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, - bool checkRead, bool checkWrite, - int msecs, bool *timedOut) -{ - - // FIXME: I'm not sure in implementation this method. - // Someone needs to check and correct. - - TRequestStatus timerStatus; - TRequestStatus readStatus; - TRequestStatus writeStatus; - - if (msecs > 0) { - if (!selectTimer.Handle()) { - if (selectTimer.CreateLocal() != KErrNone) - return false; - } - selectTimer.HighRes(timerStatus, msecs * 1000); - } - - if (checkRead) - descriptor.NotifyDataAvailable(readStatus); - - if (checkWrite) - descriptor.NotifyOutputEmpty(writeStatus); - - enum { STATUSES_COUNT = 3 }; - TRequestStatus *statuses[STATUSES_COUNT]; - TInt num = 0; - statuses[num++] = &timerStatus; - statuses[num++] = &readStatus; - statuses[num++] = &writeStatus; - - User::WaitForNRequest(statuses, num); - - bool result = false; - - // By timeout? - if (timerStatus != KRequestPending) { - Q_ASSERT(selectForRead); - *selectForRead = false; - Q_ASSERT(selectForWrite); - *selectForWrite = false; - } else { - selectTimer.Cancel(); - User::WaitForRequest(timerStatus); - - // By read? - if (readStatus != KRequestPending) { - Q_ASSERT(selectForRead); - *selectForRead = true; - } - - // By write? - if (writeStatus != KRequestPending) { - Q_ASSERT(selectForWrite); - *selectForWrite = true; - } - - if (checkRead) - descriptor.NotifyDataAvailableCancel(); - if (checkWrite) - descriptor.NotifyOutputEmptyCancel(); - - result = true; - } - return result; -} - -QString QSerialPortPrivate::portNameToSystemLocation(const QString &port) -{ - // Port name is equval to port systemLocation. - return port; -} - -QString QSerialPortPrivate::portNameFromSystemLocation(const QString &location) -{ - // Port name is equval to port systemLocation. - return location; -} - -typedef QMap<qint32, qint32> BaudRateMap; - -// This table contains correspondences standard pairs values of -// baud rates that are defined in files -// - d32comm.h for Symbian^3 -// - d32public.h for Symbian SR1 - -static const BaudRateMap createStandardBaudRateMap() -{ - BaudRateMap baudRateMap; - - baudRateMap.insert(50, EBps50) - baudRateMap.insert(75, EBps75) - baudRateMap.insert(110, EBps110) - baudRateMap.insert(134, EBps134) - baudRateMap.insert(150, EBps150) - baudRateMap.insert(300, EBps300) - baudRateMap.insert(600, EBps600) - baudRateMap.insert(1200, EBps1200) - baudRateMap.insert(1800, EBps1800) - baudRateMap.insert(2000, EBps2000) - baudRateMap.insert(2400, EBps2400) - baudRateMap.insert(3600, EBps3600) - baudRateMap.insert(4800, EBps4800) - baudRateMap.insert(7200, EBps7200) - baudRateMap.insert(9600, EBps9600) - baudRateMap.insert(19200, EBps19200) - baudRateMap.insert(38400, EBps38400) - baudRateMap.insert(57600, EBps57600) - baudRateMap.insert(115200, EBps115200) - baudRateMap.insert(230400, EBps230400) - baudRateMap.insert(460800, EBps460800) - baudRateMap.insert(576000, EBps576000) - baudRateMap.insert(921600, EBps921600) - baudRateMap.insert(1152000, EBps1152000) - // << baudRateMap.insert(1843200, EBps1843200) only for Symbian SR1 - baudRateMap.insert(4000000, EBps4000000); - - return baudRateMap; -} - -static const BaudRateMap& standardBaudRateMap() -{ - static const BaudRateMap baudRateMap = createStandardBaudRateMap(); - return baudRateMap; -} - -qint32 QSerialPortPrivate::baudRateFromSetting(qint32 setting) -{ - return standardBaudRateMap().key(setting); -} - -qint32 QSerialPortPrivate::settingFromBaudRate(qint32 baudRate) -{ - return standardBaudRateMap().value(baudRate); -} - -QList<qint32> QSerialPortPrivate::standardBaudRates() -{ - return standardBaudRateMap().keys(); -} - -QSerialPort::Handle QSerialPort::handle() const -{ - return -1; -} - -QT_END_NAMESPACE diff --git a/src/serialport/qserialport_symbian_p.h b/src/serialport/qserialport_symbian_p.h deleted file mode 100644 index 2c52d1c..0000000 --- a/src/serialport/qserialport_symbian_p.h +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Denis Shienkov <denis.shienkov@gmail.com> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtSerialPort module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSERIALPORT_SYMBIAN_P_H -#define QSERIALPORT_SYMBIAN_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qserialport_p.h" - -#include <c32comm.h> - -QT_BEGIN_NAMESPACE - -class QSerialPortPrivate : public QSerialPortPrivateData -{ - Q_DECLARE_PUBLIC(QSerialPort) - -public: - QSerialPortPrivate(QSerialPort *q); - - bool open(QIODevice::OpenMode mode); - void close(); - - QSerialPort::PinoutSignals pinoutSignals(); - - bool setDataTerminalReady(bool set); - bool setRequestToSend(bool set); - - bool flush(); - bool clear(QSerialPort::Directions directions); - - bool sendBreak(int duration); - bool setBreakEnabled(bool set); - - void startWriting(); - - bool waitForReadyRead(int msec); - bool waitForBytesWritten(int msec); - - bool setBaudRate(); - bool setBaudRate(qint32 baudRate, QSerialPort::Directions directions); - bool setDataBits(QSerialPort::DataBits dataBits); - bool setParity(QSerialPort::Parity parity); - bool setStopBits(QSerialPort::StopBits stopBits); - bool setFlowControl(QSerialPort::FlowControl flowControl); - bool setDataErrorPolicy(QSerialPort::DataErrorPolicy policy); - - bool notifyRead(); - bool notifyWrite(); - - static QString portNameToSystemLocation(const QString &port); - static QString portNameFromSystemLocation(const QString &location); - - static qint32 baudRateFromSetting(qint32 setting); - static qint32 settingFromBaudRate(qint32 baudRate); - - static QList<qint32> standardBaudRates(); - - TCommConfig currentSettings; - TCommConfig restoredSettings; - RComm descriptor; - mutable RTimer selectTimer; - TInt errnum; - -private: - bool updateCommConfig(); - - QSerialPort::SerialPortError decodeSystemError() const; - - bool waitForReadOrWrite(bool *selectForRead, bool *selectForWrite, - bool checkRead, bool checkWrite, - int msecs, bool *timedOut); -}; - -QT_END_NAMESPACE - -#endif // QSERIALPORT_SYMBIAN_P_H diff --git a/src/serialport/qserialportglobal.h b/src/serialport/qserialportglobal.h index 7aa5caa..b984593 100644 --- a/src/serialport/qserialportglobal.h +++ b/src/serialport/qserialportglobal.h @@ -50,11 +50,6 @@ QT_BEGIN_NAMESPACE # define Q_SERIALPORT_EXPORT #endif -// These macros have been available only since Qt 5.0 -#ifndef QT_DEPRECATED_SINCE -#define QT_DEPRECATED_SINCE(major, minor) 1 -#endif - #ifndef Q_DECL_OVERRIDE #define Q_DECL_OVERRIDE #endif diff --git a/src/serialport/qserialportinfo_symbian.cpp b/src/serialport/qserialportinfo_symbian.cpp deleted file mode 100644 index d320b11..0000000 --- a/src/serialport/qserialportinfo_symbian.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011-2012 Denis Shienkov <denis.shienkov@gmail.com> -** Copyright (C) 2011 Sergey Belyashov <Sergey.Belyashov@gmail.com> -** Copyright (C) 2012 Laszlo Papp <lpapp@kde.org> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtSerialPort module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qserialportinfo.h" -#include "qserialportinfo_p.h" -#include "qserialport_symbian_p.h" - -#include <e32base.h> -#include <c32comm.h> -#include <f32file.h> - -#include <QtCore/qobject.h> - -QT_BEGIN_NAMESPACE - -#ifdef __WINS__ -_LIT(KPddName, "ECDRV"); -#else -_LIT(KPddName, "EUART"); -#endif - -_LIT(KLddName,"ECOMM"); - -_LIT(KRS232ModuleName , "ECUART"); -_LIT(KBluetoothModuleName , "BTCOMM"); -_LIT(KInfraRedModuleName , "IRCOMM"); -_LIT(KACMModuleName, "ECACM"); - -static bool loadDevices() -{ - TInt r = KErrNone; -#ifdef __WINS__ - RFs fileServer; - r = User::LeaveIfError(fileServer.Connect()); - if (r != KErrNone) - return false; - fileServer.Close (); -#endif - - r = User::LoadPhysicalDevice(KPddName); - if (r != KErrNone && r != KErrAlreadyExists) - return false; - - r = User::LoadLogicalDevice(KLddName); - if (r != KErrNone && r != KErrAlreadyExists) - return false; - -#ifndef __WINS__ - r = StartC32(); - if (r != KErrNone && r != KErrAlreadyExists) - return false; -#endif - - return true; -} - -QList<QSerialPortInfo> QSerialPortInfo::availablePorts() -{ - QList<QSerialPortInfo> serialPortInfoList; - - if (!loadDevices()) - return serialPortInfoList; - - RCommServ server; - TInt r = server.Connect(); - if (r != KErrNone) - return serialPortInfoList; - - TSerialInfo nativeSerialInfo; - QString s("%1::%2"); - - // FIXME: Get info about RS232 ports. - r = server.LoadCommModule(KRS232ModuleName); - if (r == KErrNone) { - r = server.GetPortInfo(KRS232ModuleName, nativeSerialInfo); - if (r == KErrNone) { - for (quint32 i = nativeSerialInfo.iLowUnit; i < nativeSerialInfo.iHighUnit + 1; ++i) { - - QSerialPortInfo serialPortInfo; - - serialPortInfo.d_ptr->device = s - .arg(QString::fromUtf16(nativeSerialInfo.iName.Ptr(), nativeSerialInfo.iName.Length())) - .arg(i); - serialPortInfo.d_ptr->portName = serialPortInfo.d_ptr->device; - serialPortInfo.d_ptr->description = - QString::fromUtf16(nativeSerialInfo.iDescription.Ptr(), nativeSerialInfo.iDescription.Length()); - serialPortInfo.d_ptr->manufacturer = QString(QObject::tr("Unknown.")); - serialPortInfo.d_ptr->serialNumber = QString(QObject::tr("Unknown.")); - serialPortInfoList.append(serialPortInfo); - } - } - } - - // FIXME: Get info about Bluetooth ports. - r = server.LoadCommModule(KBluetoothModuleName); - if (r == KErrNone) { - r = server.GetPortInfo(KBluetoothModuleName, nativeSerialInfo); - if (r == KErrNone) { - for (quint32 i = nativeSerialInfo.iLowUnit; i < nativeSerialInfo.iHighUnit + 1; ++i) { - - QSerialPortInfo serialPortInfo; - - serialPortInfo.d_ptr->device = s - .arg(QString::fromUtf16(nativeSerialInfo.iName.Ptr(), nativeSerialInfo.iName.Length())) - .arg(i); - serialPortInfo.d_ptr->portName = serialPortInfo.d_ptr->device; - serialPortInfo.d_ptr->description = - QString::fromUtf16(nativeSerialInfo.iDescription.Ptr(), nativeSerialInfo.iDescription.Length()); - serialPortInfo.d_ptr->manufacturer = QString(QObject::tr("Unknown.")); - serialPortInfo.d_ptr->serialNumber = QString(QObject::tr("Unknown.")); - serialPortInfoList.append(serialPortInfo); - } - } - } - - // FIXME: Get info about InfraRed ports. - r = server.LoadCommModule(KInfraRedModuleName); - if (r == KErrNone) { - r = server.GetPortInfo(KInfraRedModuleName, nativeSerialInfo); - if (r == KErrNone) { - for (quint32 i = nativeSerialInfo.iLowUnit; i < nativeSerialInfo.iHighUnit + 1; ++i) { - - QSerialPortInfo serialPortInfo; - - serialPortInfo.d_ptr->device = s - .arg(QString::fromUtf16(nativeSerialInfo.iName.Ptr(), nativeSerialInfo.iName.Length())) - .arg(i); - serialPortInfo.d_ptr->portName = serialPortInfo.d_ptr->device; - serialPortInfo.d_ptr->description = - QString::fromUtf16(nativeSerialInfo.iDescription.Ptr(), nativeSerialInfo.iDescription.Length()); - serialPortInfo.d_ptr->manufacturer = QString(QObject::tr("Unknown.")); - serialPortInfoList.append(serialPortInfo); - } - } - } - - // FIXME: Get info about ACM ports. - r = server.LoadCommModule(KACMModuleName); - if (r == KErrNone) { - r = server.GetPortInfo(KACMModuleName, nativeSerialInfo); - if (r == KErrNone) { - for (quint32 i = nativeSerialInfo.iLowUnit; i < nativeSerialInfo.iHighUnit + 1; ++i) { - - QSerialPortInfo serialPortInfo; - - serialPortInfo.d_ptr->device = s - .arg(QString::fromUtf16(nativeSerialInfo.iName.Ptr(), nativeSerialInfo.iName.Length())) - .arg(i); - serialPortInfo.d_ptr->portName = QSerialPortPrivate::portNameFromSystemLocation(serialPortInfo.d_ptr->device); - serialPortInfo.d_ptr->description = - QString::fromUtf16(nativeSerialInfo.iDescription.Ptr(), nativeSerialInfo.iDescription.Length()); - serialPortInfo.d_ptr->manufacturer = QString(QObject::tr("Unknown.")); - serialPortInfoList.append(serialPortInfo); - } - } - } - - return serialPortInfoList; -} - -QList<qint32> QSerialPortInfo::standardBaudRates() -{ - return QSerialPortPrivate::standardBaudRates(); -} - -bool QSerialPortInfo::isBusy() const -{ - if (!loadDevices()) - return false; - - RCommServ server; - TInt r = server.Connect(); - if (r != KErrNone) - return false; - - RComm port; - TPtrC portName(static_cast<const TUint16*>(systemLocation().utf16()), systemLocation().length()); - r = port.Open(server, portName, ECommExclusive); - if (r == KErrNone) - port.Close(); - return r == KErrLocked; -} - -bool QSerialPortInfo::isValid() const -{ - if (!loadDevices()) - return false; - - RCommServ server; - TInt r = server.Connect(); - if (r != KErrNone) - return false; - - RComm port; - TPtrC portName(static_cast<const TUint16*>(systemLocation().utf16()), systemLocation().length()); - r = port.Open(server, portName, ECommExclusive); - if (r == KErrNone) - port.Close(); - return r == KErrNone || r == KErrLocked; -} - -QT_END_NAMESPACE diff --git a/src/serialport/qt4support/include/QtCore/qlockfile.h b/src/serialport/qt4support/include/QtCore/qlockfile.h deleted file mode 100644 index a35eee5..0000000 --- a/src/serialport/qt4support/include/QtCore/qlockfile.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QLOCKFILE_H -#define QLOCKFILE_H - -#include <QtCore/qstring.h> -#include <QtCore/qscopedpointer.h> - -QT_BEGIN_NAMESPACE - -class QLockFilePrivate; - -class Q_CORE_EXPORT QLockFile -{ -public: - QLockFile(const QString &fileName); - ~QLockFile(); - - bool lock(); - bool tryLock(int timeout = 0); - void unlock(); - - void setStaleLockTime(int); - int staleLockTime() const; - - bool isLocked() const; - bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const; - bool removeStaleLockFile(); - - enum LockError { - NoError = 0, - LockFailedError = 1, - PermissionError = 2, - UnknownError = 3 - }; - LockError error() const; - -protected: - QScopedPointer<QLockFilePrivate> d_ptr; - -private: - Q_DECLARE_PRIVATE(QLockFile) - Q_DISABLE_COPY(QLockFile) -}; - -QT_END_NAMESPACE - -#endif // QLOCKFILE_H diff --git a/src/serialport/qt4support/include/QtCore/qwineventnotifier.h b/src/serialport/qt4support/include/QtCore/qwineventnotifier.h deleted file mode 100644 index 6d83592..0000000 --- a/src/serialport/qt4support/include/QtCore/qwineventnotifier.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINEVENTNOTIFIER_H -#define QWINEVENTNOTIFIER_H - -#include "QtCore/qobject.h" - -#ifdef Q_OS_WIN -#include "QtCore/qt_windows.h" - -QT_BEGIN_NAMESPACE - -class Q_CORE_EXPORT QWinEventNotifier : public QObject -{ - Q_OBJECT - Q_DECLARE_PRIVATE(QObject) - -public: - explicit QWinEventNotifier(QObject *parent = 0); - explicit QWinEventNotifier(HANDLE hEvent, QObject *parent = 0); - ~QWinEventNotifier(); - - void setHandle(HANDLE hEvent); - HANDLE handle() const; - - bool isEnabled() const; - -public Q_SLOTS: - void setEnabled(bool enable); - -Q_SIGNALS: - void activated(HANDLE hEvent); - -protected: - bool event(QEvent * e); - -private: - Q_DISABLE_COPY(QWinEventNotifier) - - HANDLE handleToEvent; - bool enabled; -}; - -QT_END_NAMESPACE - -#endif // Q_OS_WIN - -#endif // QWINEVENTNOTIFIER_H diff --git a/src/serialport/qt4support/include/private/qcore_mac_p.h b/src/serialport/qt4support/include/private/qcore_mac_p.h deleted file mode 100644 index a5c79fa..0000000 --- a/src/serialport/qt4support/include/private/qcore_mac_p.h +++ /dev/null @@ -1,140 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QCORE_MAC_P_H -#define QCORE_MAC_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of other Qt classes. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#ifndef __IMAGECAPTURE__ -# define __IMAGECAPTURE__ -#endif - -#if defined(QT_BOOTSTRAPPED) -#include <ApplicationServices/ApplicationServices.h> -#else -#include <CoreFoundation/CoreFoundation.h> -#endif - -#include "qglobal.h" - -#ifdef Q_OS_MACX -#include <CoreServices/CoreServices.h> -#endif - -#ifdef __OBJC__ -#include <Foundation/Foundation.h> -#endif - -#include "qstring.h" - -#if defined( __OBJC__) && defined(QT_NAMESPACE) -#define QT_NAMESPACE_ALIAS_OBJC_CLASS(__KLASS__) @compatibility_alias __KLASS__ QT_MANGLE_NAMESPACE(__KLASS__) -#else -#define QT_NAMESPACE_ALIAS_OBJC_CLASS(__KLASS__) -#endif - -QT_BEGIN_NAMESPACE - -/* - Helper class that automates refernce counting for CFtypes. - After constructing the QCFType object, it can be copied like a - value-based type. - - Note that you must own the object you are wrapping. - This is typically the case if you get the object from a Core - Foundation function with the word "Create" or "Copy" in it. If - you got the object from a "Get" function, either retain it or use - constructFromGet(). One exception to this rule is the - HIThemeGet*Shape functions, which in reality are "Copy" functions. -*/ -template <typename T> -class Q_CORE_EXPORT QCFType -{ -public: - inline QCFType(const T &t = 0) : type(t) {} - inline QCFType(const QCFType &helper) : type(helper.type) { if (type) CFRetain(type); } - inline ~QCFType() { if (type) CFRelease(type); } - inline operator T() { return type; } - inline QCFType operator =(const QCFType &helper) - { - if (helper.type) - CFRetain(helper.type); - CFTypeRef type2 = type; - type = helper.type; - if (type2) - CFRelease(type2); - return *this; - } - inline T *operator&() { return &type; } - template <typename X> X as() const { return reinterpret_cast<X>(type); } - static QCFType constructFromGet(const T &t) - { - CFRetain(t); - return QCFType<T>(t); - } -protected: - T type; -}; - -class Q_CORE_EXPORT QCFString : public QCFType<CFStringRef> -{ -public: - inline QCFString(const QString &str) : QCFType<CFStringRef>(0), string(str) {} - inline QCFString(const CFStringRef cfstr = 0) : QCFType<CFStringRef>(cfstr) {} - inline QCFString(const QCFType<CFStringRef> &other) : QCFType<CFStringRef>(other) {} - operator QString() const; - operator CFStringRef() const; - static QString toQString(CFStringRef cfstr); - static CFStringRef toCFStringRef(const QString &str); -#ifdef __OBJC__ - static QString toQString(const NSString *nsstr); - static NSString *toNSString(const QString &string); -#endif - -private: - QString string; -}; - -QT_END_NAMESPACE - -#endif // QCORE_MAC_P_H diff --git a/src/serialport/qt4support/include/private/qcore_unix_p.h b/src/serialport/qt4support/include/private/qcore_unix_p.h deleted file mode 100644 index 6a7fb72..0000000 --- a/src/serialport/qt4support/include/private/qcore_unix_p.h +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QCORE_UNIX_P_H -#define QCORE_UNIX_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of Qt code on Unix. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qplatformdefs.h" - -#ifndef Q_OS_UNIX -# error "qcore_unix_p.h included on a non-Unix system" -#endif - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <errno.h> -#include <fcntl.h> - -#define EINTR_LOOP(var, cmd) \ - do { \ - var = cmd; \ - } while (var == -1 && errno == EINTR) - -QT_BEGIN_NAMESPACE - -// don't call QT_OPEN or ::open -// call qt_safe_open -static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 0777) -{ -#ifdef O_CLOEXEC - flags |= O_CLOEXEC; -#endif - register int fd; - EINTR_LOOP(fd, QT_OPEN(pathname, flags, mode)); - - // unknown flags are ignored, so we have no way of verifying if - // O_CLOEXEC was accepted - if (fd != -1) - ::fcntl(fd, F_SETFD, FD_CLOEXEC); - return fd; -} -#undef QT_OPEN -#define QT_OPEN qt_safe_open - -static inline qint64 qt_safe_read(int fd, void *data, qint64 maxlen) -{ - qint64 ret = 0; - EINTR_LOOP(ret, QT_READ(fd, data, maxlen)); - return ret; -} -#undef QT_READ -#define QT_READ qt_safe_read - -static inline qint64 qt_safe_write(int fd, const void *data, qint64 len) -{ - qint64 ret = 0; - EINTR_LOOP(ret, QT_WRITE(fd, data, len)); - return ret; -} -#undef QT_WRITE -#define QT_WRITE qt_safe_write - -static inline int qt_safe_close(int fd) -{ - register int ret; - EINTR_LOOP(ret, QT_CLOSE(fd)); - return ret; -} -#undef QT_CLOSE -#define QT_CLOSE qt_safe_close - -QT_END_NAMESPACE - -#endif diff --git a/src/serialport/qt4support/include/private/qlockfile_p.h b/src/serialport/qt4support/include/private/qlockfile_p.h deleted file mode 100644 index ec36733..0000000 --- a/src/serialport/qt4support/include/private/qlockfile_p.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QLOCKFILE_P_H -#define QLOCKFILE_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtCore/qlockfile.h> -#include <QtCore/qfile.h> - -#ifdef Q_OS_WIN -#include <qt_windows.h> -#endif - -QT_BEGIN_NAMESPACE - -class QLockFilePrivate -{ -public: - QLockFilePrivate(const QString &fn) - : fileName(fn), -#ifdef Q_OS_WIN - fileHandle(INVALID_HANDLE_VALUE), -#else - fileHandle(-1), -#endif - staleLockTime(30 * 1000), // 30 seconds - lockError(QLockFile::NoError), - isLocked(false) - { - } - QLockFile::LockError tryLock_sys(); - bool removeStaleLock(); - bool getLockInfo(qint64 *pid, QString *hostname, QString *appname) const; - // Returns \c true if the lock belongs to dead PID, or is old. - // The attempt to delete it will tell us if it was really stale or not, though. - bool isApparentlyStale() const; - -#ifdef Q_OS_UNIX - static int checkFcntlWorksAfterFlock(); -#endif - - QString fileName; -#ifdef Q_OS_WIN - Qt::HANDLE fileHandle; -#else - int fileHandle; -#endif - int staleLockTime; // "int milliseconds" is big enough for 24 days - QLockFile::LockError lockError; - bool isLocked; -}; - -QT_END_NAMESPACE - -#endif /* QLOCKFILE_P_H */ diff --git a/src/serialport/qt4support/include/private/qringbuffer_p.h b/src/serialport/qt4support/include/private/qringbuffer_p.h deleted file mode 100644 index 2279f1b..0000000 --- a/src/serialport/qt4support/include/private/qringbuffer_p.h +++ /dev/null @@ -1,311 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QRINGBUFFER_P_H -#define QRINGBUFFER_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of a number of Qt sources files. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// - -#include <QtCore/qbytearray.h> -#include <QtCore/qlist.h> - -QT_BEGIN_NAMESPACE - -class QRingBuffer -{ -public: - explicit inline QRingBuffer(int growth = 4096) : - head(0), tail(0), tailBuffer(0), basicBlockSize(growth), bufferSize(0) { - buffers.append(QByteArray()); - } - - inline int nextDataBlockSize() const { - return (tailBuffer == 0 ? tail : buffers.first().size()) - head; - } - - inline const char *readPointer() const { - return buffers.isEmpty() ? 0 : (buffers.first().constData() + head); - } - - // access the bytes at a specified position - // the out-variable length will contain the amount of bytes readable - // from there, e.g. the amount still the same QByteArray - inline const char *readPointerAtPosition(qint64 pos, qint64 &length) const { - if (pos >= 0) { - pos += head; - for (int i = 0; i < buffers.size(); ++i) { - length = (i == tailBuffer ? tail : buffers[i].size()); - if (length > pos) { - length -= pos; - return buffers[i].constData() + pos; - } - pos -= length; - } - } - - length = 0; - return 0; - } - - inline void free(int bytes) { - while (bytes > 0) { - int blockSize = buffers.first().size() - head; - - if (tailBuffer == 0 || blockSize > bytes) { - bufferSize -= bytes; - if (bufferSize <= 0) - clear(); // try to minify/squeeze us - else - head += bytes; - return; - } - - bufferSize -= blockSize; - bytes -= blockSize; - buffers.removeFirst(); - --tailBuffer; - head = 0; - } - } - - inline char *reserve(int bytes) { - if (bytes <= 0) - return 0; - - // if need buffer reallocation - if (tail + bytes > buffers.last().size()) { - if (tail >= basicBlockSize) { - // shrink this buffer to its current size - buffers.last().resize(tail); - - // create a new QByteArray - buffers.append(QByteArray()); - ++tailBuffer; - tail = 0; - } - buffers.last().resize(qMax(basicBlockSize, tail + bytes)); - } - - char *writePtr = buffers.last().data() + tail; - bufferSize += bytes; - tail += bytes; - return writePtr; - } - - inline void truncate(int pos) { - if (pos < size()) - chop(size() - pos); - } - - inline void chop(int bytes) { - while (bytes > 0) { - if (tailBuffer == 0 || tail > bytes) { - bufferSize -= bytes; - if (bufferSize <= 0) - clear(); // try to minify/squeeze us - else - tail -= bytes; - return; - } - - bufferSize -= tail; - bytes -= tail; - buffers.removeLast(); - --tailBuffer; - tail = buffers.last().size(); - } - } - - inline bool isEmpty() const { - return tailBuffer == 0 && tail == 0; - } - - inline int getChar() { - if (isEmpty()) - return -1; - char c = *readPointer(); - free(1); - return int(uchar(c)); - } - - inline void putChar(char c) { - char *ptr = reserve(1); - *ptr = c; - } - - inline void ungetChar(char c) { - --head; - if (head < 0) { - buffers.prepend(QByteArray()); - buffers.first().resize(basicBlockSize); - head = basicBlockSize - 1; - ++tailBuffer; - } - buffers.first()[head] = c; - ++bufferSize; - } - - inline int size() const { - return bufferSize; - } - - inline void clear() { - buffers.erase(buffers.begin() + 1, buffers.end()); - buffers.first().clear(); - - head = tail = 0; - tailBuffer = 0; - bufferSize = 0; - } - - inline int indexOf(char c) const { - int index = 0; - int j = head; - for (int i = 0; i < buffers.size(); ++i) { - const char *ptr = buffers[i].constData() + j; - j = index + (i == tailBuffer ? tail : buffers[i].size()) - j; - - while (index < j) { - if (*ptr++ == c) - return index; - ++index; - } - j = 0; - } - return -1; - } - - inline int indexOf(char c, int maxLength) const { - int index = 0; - int j = head; - for (int i = 0; index < maxLength && i < buffers.size(); ++i) { - const char *ptr = buffers[i].constData() + j; - j = qMin(index + (i == tailBuffer ? tail : buffers[i].size()) - j, maxLength); - - while (index < j) { - if (*ptr++ == c) - return index; - ++index; - } - j = 0; - } - return -1; - } - - inline int read(char *data, int maxLength) { - int bytesToRead = qMin(size(), maxLength); - int readSoFar = 0; - while (readSoFar < bytesToRead) { - int bytesToReadFromThisBlock = qMin(bytesToRead - readSoFar, nextDataBlockSize()); - if (data) - memcpy(data + readSoFar, readPointer(), bytesToReadFromThisBlock); - readSoFar += bytesToReadFromThisBlock; - free(bytesToReadFromThisBlock); - } - return readSoFar; - } - - // read an unspecified amount (will read the first buffer) - inline QByteArray read() { - if (bufferSize == 0) - return QByteArray(); - - QByteArray qba(buffers.takeFirst()); - - qba.reserve(0); // avoid that resizing needlessly reallocates - if (tailBuffer == 0) { - qba.resize(tail); - tail = 0; - buffers.append(QByteArray()); - } else { - --tailBuffer; - } - qba.remove(0, head); // does nothing if head is 0 - head = 0; - bufferSize -= qba.size(); - return qba; - } - - // append a new buffer to the end - inline void append(const QByteArray &qba) { - if (tail == 0) { - buffers.last() = qba; - } else { - buffers.last().resize(tail); - buffers.append(qba); - ++tailBuffer; - } - tail = qba.size(); - bufferSize += tail; - } - - inline int skip(int length) { - return read(0, length); - } - - inline int readLine(char *data, int maxLength) { - if (!data || --maxLength <= 0) - return -1; - - int i = indexOf('\n', maxLength); - i = read(data, i >= 0 ? (i + 1) : maxLength); - - // Terminate it. - data[i] = '\0'; - return i; - } - - inline bool canReadLine() const { - return indexOf('\n') >= 0; - } - -private: - QList<QByteArray> buffers; - int head, tail; - int tailBuffer; // always buffers.size() - 1 - const int basicBlockSize; - int bufferSize; -}; - -QT_END_NAMESPACE - -#endif // QRINGBUFFER_P_H diff --git a/src/serialport/qt4support/install-helper.pri b/src/serialport/qt4support/install-helper.pri deleted file mode 100644 index a860758..0000000 --- a/src/serialport/qt4support/install-helper.pri +++ /dev/null @@ -1,52 +0,0 @@ -QTSERIALPORT_PROJECT_INCLUDEDIR = $$QTSERIALPORT_BUILD_ROOT/include/QtSerialPort -QTSERIALPORT_PROJECT_INCLUDEDIR ~=s,/,$$QMAKE_DIR_SEP, - -system("$$QMAKE_MKDIR $$QTSERIALPORT_PROJECT_INCLUDEDIR") - -for(header_file, PUBLIC_HEADERS) { - header_file ~=s,/,$$QMAKE_DIR_SEP, - system("$$QMAKE_COPY \"$${header_file}\" \"$$QTSERIALPORT_PROJECT_INCLUDEDIR\"") -} - -unix:!symbian { - SOURCES += \ - $$PWD/src/qlockfile.cpp \ - $$PWD/src/qlockfile_unix.cpp -} - -# This is a quick workaround for generating forward header with Qt4. - -!equals(QMAKE_HOST.os, Windows): maybe_quote = "\'" -system("echo $${maybe_quote}$${LITERAL_HASH}include \"qserialport.h\"$${maybe_quote} > \"$$QTSERIALPORT_PROJECT_INCLUDEDIR/QSerialPort\"") -system("echo $${maybe_quote}$${LITERAL_HASH}include \"qserialportinfo.h\"$${maybe_quote} > \"$$QTSERIALPORT_PROJECT_INCLUDEDIR/QSerialPortInfo\"") - -PUBLIC_HEADERS += \ - $$PUBLIC_HEADERS \ - \"$$QTSERIALPORT_PROJECT_INCLUDEDIR/QSerialPort\" \ - \"$$QTSERIALPORT_PROJECT_INCLUDEDIR/QSerialPortInfo\" - -target_headers.files = $$PUBLIC_HEADERS -target_headers.path = $$[QT_INSTALL_HEADERS]/QtSerialPort -INSTALLS += target_headers - -mkspecs_features.files = $$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf -mkspecs_features.path = $$[QT_INSTALL_DATA]/mkspecs/features -INSTALLS += mkspecs_features - -win32 { - dlltarget.path = $$[QT_INSTALL_BINS] - INSTALLS += dlltarget -} - -target.path = $$[QT_INSTALL_LIBS] -INSTALLS += target - -INCLUDEPATH += $$QTSERIALPORT_BUILD_ROOT/include $$QTSERIALPORT_BUILD_ROOT/include/QtSerialPort -lessThan(QT_MAJOR_VERSION, 5) { - QTSERIALPORT_PROJECT_QT4SUPPORT_INCLUDEDIR = $$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/include - INCLUDEPATH += \ - $$QTSERIALPORT_PROJECT_QT4SUPPORT_INCLUDEDIR \ - $$QTSERIALPORT_PROJECT_QT4SUPPORT_INCLUDEDIR/QtCore \ - $$QTSERIALPORT_PROJECT_QT4SUPPORT_INCLUDEDIR/private -} -DEFINES += QT_BUILD_SERIALPORT_LIB diff --git a/src/serialport/qt4support/serialport.prf b/src/serialport/qt4support/serialport.prf deleted file mode 100644 index b1d65e1..0000000 --- a/src/serialport/qt4support/serialport.prf +++ /dev/null @@ -1,27 +0,0 @@ -!mac:qtAddLibrary(QtSerialPort) - -!isEmpty(QTSERIALPORT_BUILD_ROOT) { - INCLUDEPATH -= $$QMAKE_INCDIR_QT/QtSerialPort - QMAKE_INCDIR += $$QTSERIALPORT_BUILD_ROOT/include $$QTSERIALPORT_BUILD_ROOT/include/QtSerialPort - - QTSERIALPORT_BUILD_SUBDIR = src/serialport - debug_and_release_target { - CONFIG(debug, debug|release) { - QTSERIALPORT_BUILD_SUBDIR = $$QTSERIALPORT_BUILD_SUBDIR/debug - } else { - QTSERIALPORT_BUILD_SUBDIR = $$QTSERIALPORT_BUILD_SUBDIR/release - } - } - - QMAKE_LIBDIR += $$QTSERIALPORT_BUILD_ROOT/$$QTSERIALPORT_BUILD_SUBDIR -} - -mac { - INCLUDEPATH += $$[QT_INSTALL_HEADERS]/QtSerialPort - - if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { - LIBS += -lQtSerialPort$${QT_LIBINFIX}_debug - } else { - LIBS += -lQtSerialPort$${QT_LIBINFIX} - } -} diff --git a/src/serialport/qt4support/src/qlockfile.cpp b/src/serialport/qt4support/src/qlockfile.cpp deleted file mode 100644 index 1f406cf..0000000 --- a/src/serialport/qt4support/src/qlockfile.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qlockfile.h" -#include "qlockfile_p.h" - -#include <QtCore/qthread.h> -#include <QtCore/qelapsedtimer.h> -#include <QtCore/qdatetime.h> - -QT_BEGIN_NAMESPACE - -class QLockFileThread : public QThread -{ -public: - static void msleep(unsigned long msecs) { QThread::msleep(msecs); } -}; - -/*! - \class QLockFile - \inmodule QtCore - \brief The QLockFile class provides locking between processes using a file. - \since 5.1 - - A lock file can be used to prevent multiple processes from accessing concurrently - the same resource. For instance, a configuration file on disk, or a socket, a port, - a region of shared memory... - - Serialization is only guaranteed if all processes that access the shared resource - use QLockFile, with the same file path. - - QLockFile supports two use cases: - to protect a resource for a short-term operation (e.g. verifying if a configuration - file has changed before saving new settings), and for long-lived protection of a - resource (e.g. a document opened by a user in an editor) for an indefinite amount of time. - - When protecting for a short-term operation, it is acceptable to call lock() and wait - until any running operation finishes. - When protecting a resource over a long time, however, the application should always - call setStaleLockTime(0) and then tryLock() with a short timeout, in order to - warn the user that the resource is locked. - - If the process holding the lock crashes, the lock file stays on disk and can prevent - any other process from accessing the shared resource, ever. For this reason, QLockFile - tries to detect such a "stale" lock file, based on the process ID written into the file, - and (in case that process ID got reused meanwhile), on the last modification time of - the lock file (30s by default, for the use case of a short-lived operation). - If the lock file is found to be stale, it will be deleted. - - For the use case of protecting a resource over a long time, you should therefore call - setStaleLockTime(0), and when tryLock() returns LockFailedError, inform the user - that the document is locked, possibly using getLockInfo() for more details. -*/ - -/*! - \enum QLockFile::LockError - - This enum describes the result of the last call to lock() or tryLock(). - - \value NoError The lock was acquired successfully. - \value LockFailedError The lock could not be acquired because another process holds it. - \value PermissionError The lock file could not be created, for lack of permissions - in the parent directory. - \value UnknownError Another error happened, for instance a full partition - prevented writing out the lock file. -*/ - -/*! - Constructs a new lock file object. - The object is created in an unlocked state. - When calling lock() or tryLock(), a lock file named \a fileName will be created, - if it doesn't already exist. - - \sa lock(), unlock() -*/ -QLockFile::QLockFile(const QString &fileName) - : d_ptr(new QLockFilePrivate(fileName)) -{ -} - -/*! - Destroys the lock file object. - If the lock was acquired, this will release the lock, by deleting the lock file. -*/ -QLockFile::~QLockFile() -{ - unlock(); -} - -/*! - Sets \a staleLockTime to be the time in milliseconds after which - a lock file is considered stale. - The default value is 30000, i.e. 30 seconds. - If your application typically keeps the file locked for more than 30 seconds - (for instance while saving megabytes of data for 2 minutes), you should set - a bigger value using setStaleLockTime(). - - The value of \a staleLockTime is used by lock() and tryLock() in order - to determine when an existing lock file is considered stale, i.e. left over - by a crashed process. This is useful for the case where the PID got reused - meanwhile, so the only way to detect a stale lock file is by the fact that - it has been around for a long time. - - \sa staleLockTime() -*/ -void QLockFile::setStaleLockTime(int staleLockTime) -{ - Q_D(QLockFile); - d->staleLockTime = staleLockTime; -} - -/*! - Returns the time in milliseconds after which - a lock file is considered stale. - - \sa setStaleLockTime() -*/ -int QLockFile::staleLockTime() const -{ - Q_D(const QLockFile); - return d->staleLockTime; -} - -/*! - Returns \c true if the lock was acquired by this QLockFile instance, - otherwise returns \c false. - - \sa lock(), unlock(), tryLock() -*/ -bool QLockFile::isLocked() const -{ - Q_D(const QLockFile); - return d->isLocked; -} - -/*! - Creates the lock file. - - If another process (or another thread) has created the lock file already, - this function will block until that process (or thread) releases it. - - Calling this function multiple times on the same lock from the same - thread without unlocking first is not allowed. This function will - \e dead-lock when the file is locked recursively. - - Returns \c true if the lock was acquired, false if it could not be acquired - due to an unrecoverable error, such as no permissions in the parent directory. - - \sa unlock(), tryLock() -*/ -bool QLockFile::lock() -{ - return tryLock(-1); -} - -/*! - Attempts to create the lock file. This function returns \c true if the - lock was obtained; otherwise it returns \c false. If another process (or - another thread) has created the lock file already, this function will - wait for at most \a timeout milliseconds for the lock file to become - available. - - Note: Passing a negative number as the \a timeout is equivalent to - calling lock(), i.e. this function will wait forever until the lock - file can be locked if \a timeout is negative. - - If the lock was obtained, it must be released with unlock() - before another process (or thread) can successfully lock it. - - Calling this function multiple times on the same lock from the same - thread without unlocking first is not allowed, this function will - \e always return false when attempting to lock the file recursively. - - \sa lock(), unlock() -*/ -bool QLockFile::tryLock(int timeout) -{ - Q_D(QLockFile); - QElapsedTimer timer; - if (timeout > 0) - timer.start(); - int sleepTime = 100; - forever { - d->lockError = d->tryLock_sys(); - switch (d->lockError) { - case NoError: - d->isLocked = true; - return true; - case PermissionError: - case UnknownError: - return false; - case LockFailedError: - if (!d->isLocked && d->isApparentlyStale()) { - // Stale lock from another thread/process - // Ensure two processes don't remove it at the same time - QLockFile rmlock(d->fileName + QLatin1String(".rmlock")); - if (rmlock.tryLock()) { - if (d->isApparentlyStale() && d->removeStaleLock()) - continue; - } - } - break; - } - if (timeout == 0 || (timeout > 0 && timer.hasExpired(timeout))) - return false; - QLockFileThread::msleep(sleepTime); - if (sleepTime < 5 * 1000) - sleepTime *= 2; - } - // not reached - return false; -} - -/*! - \fn void QLockFile::unlock() - Releases the lock, by deleting the lock file. - - Calling unlock() without locking the file first, does nothing. - - \sa lock(), tryLock() -*/ - -/*! - Retrieves information about the current owner of the lock file. - - If tryLock() returns \c false, and error() returns LockFailedError, - this function can be called to find out more information about the existing - lock file: - \list - \li the PID of the application (returned in \a pid) - \li the \a hostname it's running on (useful in case of networked filesystems), - \li the name of the application which created it (returned in \a appname), - \endlist - - Note that tryLock() automatically deleted the file if there is no - running application with this PID, so LockFailedError can only happen if there is - an application with this PID (it could be unrelated though). - - This can be used to inform users about the existing lock file and give them - the choice to delete it. After removing the file using removeStaleLockFile(), - the application can call tryLock() again. - - This function returns \c true if the information could be successfully retrieved, false - if the lock file doesn't exist or doesn't contain the expected data. - This can happen if the lock file was deleted between the time where tryLock() failed - and the call to this function. Simply call tryLock() again if this happens. -*/ -bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const -{ - Q_D(const QLockFile); - return d->getLockInfo(pid, hostname, appname); -} - -bool QLockFilePrivate::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const -{ - QFile reader(fileName); - if (!reader.open(QIODevice::ReadOnly)) - return false; - - QByteArray pidLine = reader.readLine(); - pidLine.chop(1); - QByteArray appNameLine = reader.readLine(); - appNameLine.chop(1); - QByteArray hostNameLine = reader.readLine(); - hostNameLine.chop(1); - if (pidLine.isEmpty() || appNameLine.isEmpty()) - return false; - - qint64 thePid = pidLine.toLongLong(); - if (pid) - *pid = thePid; - if (appname) - *appname = QString::fromUtf8(appNameLine); - if (hostname) - *hostname = QString::fromUtf8(hostNameLine); - return thePid > 0; -} - -/*! - Attempts to forcefully remove an existing lock file. - - Calling this is not recommended when protecting a short-lived operation: QLockFile - already takes care of removing lock files after they are older than staleLockTime(). - - This method should only be called when protecting a resource for a long time, i.e. - with staleLockTime(0), and after tryLock() returned LockFailedError, and the user - agreed on removing the lock file. - - Returns \c true on success, false if the lock file couldn't be removed. This happens - on Windows, when the application owning the lock is still running. -*/ -bool QLockFile::removeStaleLockFile() -{ - Q_D(QLockFile); - if (d->isLocked) { - qWarning("removeStaleLockFile can only be called when not holding the lock"); - return false; - } - return d->removeStaleLock(); -} - -/*! - Returns the lock file error status. - - If tryLock() returns \c false, this function can be called to find out - the reason why the locking failed. -*/ -QLockFile::LockError QLockFile::error() const -{ - Q_D(const QLockFile); - return d->lockError; -} - -QT_END_NAMESPACE diff --git a/src/serialport/qt4support/src/qlockfile_unix.cpp b/src/serialport/qt4support/src/qlockfile_unix.cpp deleted file mode 100644 index fbcb57e..0000000 --- a/src/serialport/qt4support/src/qlockfile_unix.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 David Faure <faure+bluesystems@kde.org> -** Contact: http://www.qt-project.org/legal -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL21$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "private/qlockfile_p.h" - -#include "QtCore/qtemporaryfile.h" -#include "QtCore/qcoreapplication.h" -#include "QtCore/qfileinfo.h" -#include "QtCore/qdebug.h" -#include "QtCore/qdatetime.h" - -#include <sys/file.h> // flock -#include <sys/types.h> // kill -#include <signal.h> // kill -#include <unistd.h> - -#include <errno.h> - -QT_BEGIN_NAMESPACE - -#define EINTR_LOOP(var, cmd) \ - do { \ - var = cmd; \ - } while (var == -1 && errno == EINTR) - -// don't call QT_OPEN or ::open -// call qt_safe_open -static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 0777) -{ -#ifdef O_CLOEXEC - flags |= O_CLOEXEC; -#endif - int fd; - EINTR_LOOP(fd, ::open(pathname, flags, mode)); - - // unknown flags are ignored, so we have no way of verifying if - // O_CLOEXEC was accepted - if (fd != -1) - ::fcntl(fd, F_SETFD, FD_CLOEXEC); - return fd; -} - -static inline qint64 qt_safe_write(int fd, const void *data, qint64 len) -{ - qint64 ret = 0; - EINTR_LOOP(ret, ::write(fd, data, len)); - return ret; -} - -static QString localHostName() // from QHostInfo::localHostName() -{ - char hostName[512]; - if (gethostname(hostName, sizeof(hostName)) == -1) - return QString(); - hostName[sizeof(hostName) - 1] = '\0'; - return QString::fromLocal8Bit(hostName); -} - -// ### merge into qt_safe_write? -static qint64 qt_write_loop(int fd, const char *data, qint64 len) -{ - qint64 pos = 0; - while (pos < len) { - const qint64 ret = qt_safe_write(fd, data + pos, len - pos); - if (ret == -1) // e.g. partition full - return pos; - pos += ret; - } - return pos; -} - -static bool setNativeLocks(int fd) -{ -#if defined(LOCK_EX) && defined(LOCK_NB) - if (flock(fd, LOCK_EX | LOCK_NB) == -1) // other threads, and other processes on a local fs - return false; -#endif - struct flock flockData; - flockData.l_type = F_WRLCK; - flockData.l_whence = SEEK_SET; - flockData.l_start = 0; - flockData.l_len = 0; // 0 = entire file - flockData.l_pid = getpid(); - if (fcntl(fd, F_SETLK, &flockData) == -1) // for networked filesystems - return false; - return true; -} - -QLockFile::LockError QLockFilePrivate::tryLock_sys() -{ - // Assemble data, to write in a single call to write - // (otherwise we'd have to check every write call) - // Use operator% from the fast builder to avoid multiple memory allocations. - QByteArray fileData = QByteArray::number(QCoreApplication::applicationPid()) + '\n' - + qAppName().toUtf8() + '\n' - + localHostName().toUtf8() + '\n'; - - const QByteArray lockFileName = QFile::encodeName(fileName); - const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY | O_CREAT | O_EXCL, 0644); - if (fd < 0) { - switch (errno) { - case EEXIST: - return QLockFile::LockFailedError; - case EACCES: - case EROFS: - return QLockFile::PermissionError; - default: - return QLockFile::UnknownError; - } - } - // Ensure nobody else can delete the file while we have it - if (!setNativeLocks(fd)) - qWarning() << "setNativeLocks failed:" << strerror(errno); - - // We hold the lock, continue. - fileHandle = fd; - - QLockFile::LockError error = QLockFile::NoError; - if (qt_write_loop(fd, fileData.constData(), fileData.size()) < fileData.size()) - error = QLockFile::UnknownError; // partition full - return error; -} - -bool QLockFilePrivate::removeStaleLock() -{ - const QByteArray lockFileName = QFile::encodeName(fileName); - const int fd = qt_safe_open(lockFileName.constData(), O_WRONLY, 0644); - if (fd < 0) // gone already? - return false; - bool success = setNativeLocks(fd) && (::unlink(lockFileName) == 0); - close(fd); - return success; -} - -bool QLockFilePrivate::isApparentlyStale() const -{ - qint64 pid; - QString hostname, appname; - if (!getLockInfo(&pid, &hostname, &appname)) - return false; - if (hostname == localHostName()) { - if (::kill(pid, 0) == -1 && errno == ESRCH) - return true; // PID doesn't exist anymore - } - const qint64 age = QFileInfo(fileName).lastModified().msecsTo(QDateTime::currentDateTime()); - return staleLockTime > 0 && age > staleLockTime; -} - -void QLockFile::unlock() -{ - Q_D(QLockFile); - if (!d->isLocked) - return; - close(d->fileHandle); - d->fileHandle = -1; - QFile::remove(d->fileName); - d->lockError = QLockFile::NoError; - d->isLocked = false; -} - -QT_END_NAMESPACE diff --git a/src/serialport/serialport-lib.pri b/src/serialport/serialport-lib.pri index 9c9b076..fa355eb 100644 --- a/src/serialport/serialport-lib.pri +++ b/src/serialport/serialport-lib.pri @@ -1,19 +1,9 @@ INCLUDEPATH += $$PWD -unix { - greaterThan(QT_MAJOR_VERSION, 4) { - contains(QT_CONFIG, libudev) { - DEFINES += LINK_LIBUDEV - INCLUDEPATH += $$QMAKE_INCDIR_LIBUDEV - LIBS_PRIVATE += $$QMAKE_LIBS_LIBUDEV - } - } else { - packagesExist(libudev) { - CONFIG += link_pkgconfig - DEFINES += LINK_LIBUDEV - PKGCONFIG += libudev - } - } +unix:contains(QT_CONFIG, libudev) { + DEFINES += LINK_LIBUDEV + INCLUDEPATH += $$QMAKE_INCDIR_LIBUDEV + LIBS_PRIVATE += $$QMAKE_LIBS_LIBUDEV } PUBLIC_HEADERS += \ @@ -49,30 +39,6 @@ wince* { $$PWD/qserialportinfo_wince.cpp } -symbian { - MMP_RULES += EXPORTUNFROZEN - #MMP_RULES += DEBUGGABLE_UDEBONLY - TARGET.UID3 = 0xE7E62DFD - TARGET.CAPABILITY = - TARGET.EPOCALLOWDLLDATA = 1 - addFiles.sources = QtSerialPort.dll - addFiles.path = !:/sys/bin - DEPLOYMENT += addFiles - - # FIXME !!! - #INCLUDEPATH += c:/Nokia/devices/Nokia_Symbian3_SDK_v1.0/epoc32/include/platform - INCLUDEPATH += c:/QtSDK/Symbian/SDKs/Symbian3Qt473/epoc32/include/platform - - PRIVATE_HEADERS += \ - $$PWD/qserialport_symbian_p.h - - SOURCES += \ - $$PWD/qserialport_symbian.cpp \ - $$PWD/qserialportinfo_symbian.cpp - - LIBS_PRIVATE += -leuser -lefsrv -lc32 -} - unix:!symbian { PRIVATE_HEADERS += \ $$PWD/qserialport_unix_p.h diff --git a/src/serialport/serialport.pro b/src/serialport/serialport.pro index feb6e9c..40c0339 100644 --- a/src/serialport/serialport.pro +++ b/src/serialport/serialport.pro @@ -1,19 +1,10 @@ -QT = core +TARGET = QtSerialPort +QT = core-private QMAKE_DOCS = $$PWD/doc/qtserialport.qdocconf -include($$PWD/serialport-lib.pri) -greaterThan(QT_MAJOR_VERSION, 4) { - load(qt_build_config) - QT += core-private - TARGET = QtSerialPort - load(qt_module) -} else { - TEMPLATE = lib - TARGET = $$qtLibraryTarget(QtSerialPort$$QT_LIBINFIX) - include($$PWD/qt4support/install-helper.pri) - CONFIG += module create_prl - mac:QMAKE_FRAMEWORK_BUNDLE_NAME = $$TARGET -} +load(qt_module) + +include($$PWD/serialport-lib.pri) PRECOMPILED_HEADER = diff --git a/tests/auto/qserialport/qserialport.pro b/tests/auto/qserialport/qserialport.pro index c16cd5e..5435fa3 100644 --- a/tests/auto/qserialport/qserialport.pro +++ b/tests/auto/qserialport/qserialport.pro @@ -2,10 +2,6 @@ QT = core testlib TARGET = tst_qserialport #CONFIG += testcase -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport SOURCES = tst_qserialport.cpp diff --git a/tests/manual/qserialport/qserialport.pro b/tests/manual/qserialport/qserialport.pro index 504e766..3858b6b 100644 --- a/tests/manual/qserialport/qserialport.pro +++ b/tests/manual/qserialport/qserialport.pro @@ -2,10 +2,6 @@ TEMPLATE = app TARGET = tst_qserialport QT = core testlib -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport SOURCES += tst_qserialport.cpp diff --git a/tests/manual/qserialportinfo/qserialportinfo.pro b/tests/manual/qserialportinfo/qserialportinfo.pro index 8e08264..57f6ea6 100644 --- a/tests/manual/qserialportinfo/qserialportinfo.pro +++ b/tests/manual/qserialportinfo/qserialportinfo.pro @@ -2,10 +2,6 @@ TEMPLATE = app TARGET = tst_qserialportinfo QT = core testlib -greaterThan(QT_MAJOR_VERSION, 4) { - QT += serialport -} else { - include($$QTSERIALPORT_PROJECT_ROOT/src/serialport/qt4support/serialport.prf) -} +QT += serialport SOURCES += tst_qserialportinfo.cpp |