/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** 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 The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef T9WRITEWORKER_H #define T9WRITEWORKER_H #include "trace.h" #include #include #include #include #include #include #include #include #include "t9write.h" #include "t9writedictionary.h" namespace QtVirtualKeyboard { class T9WriteTask : public QObject { Q_OBJECT public: explicit T9WriteTask(QObject *parent = 0); virtual void run() = 0; void wait(); friend class T9WriteWorker; protected: DECUMA_SESSION *decumaSession; bool cjk; private: QSemaphore runSema; }; class T9WriteDictionaryTask : public T9WriteTask { Q_OBJECT public: explicit T9WriteDictionaryTask(QSharedPointer dictionary, const QString &dictionaryFileName, bool convertDictionary, const DECUMA_SRC_DICTIONARY_INFO &dictionaryInfo); void run(); QSharedPointer dictionary; const QString dictionaryFileName; bool convertDictionary; const DECUMA_SRC_DICTIONARY_INFO dictionaryInfo; signals: void completed(QSharedPointer dictionary); }; class T9WriteAddArcTask : public T9WriteTask { Q_OBJECT public: explicit T9WriteAddArcTask(Trace *trace); void run(); private: Trace *trace; }; class T9WriteRecognitionResult { Q_DISABLE_COPY(T9WriteRecognitionResult) public: explicit T9WriteRecognitionResult(int id, int maxResults, int maxCharsPerWord); DECUMA_STATUS status; QVector results; DECUMA_UINT16 numResults; int instantGesture; const int id; const int maxResults; const int maxCharsPerWord; private: QVector _chars; QVector _symbolChars; QVector _symbolStrokes; }; class T9WriteRecognitionTask : public T9WriteTask { Q_OBJECT public: explicit T9WriteRecognitionTask(QSharedPointer result, const DECUMA_INSTANT_GESTURE_SETTINGS &instantGestureSettings, BOOST_LEVEL boostLevel, const QString &stringStart); void run(); bool cancelRecognition(); int resultId() const; private: static int shouldAbortRecognize(void *pUserData); friend int shouldAbortRecognize(void *pUserData); private: QSharedPointer result; DECUMA_INSTANT_GESTURE_SETTINGS instantGestureSettings; BOOST_LEVEL boostLevel; QString stringStart; QMutex stateLock; bool stateCancelled; }; class T9WriteRecognitionResultsTask : public T9WriteTask { Q_OBJECT public: explicit T9WriteRecognitionResultsTask(QSharedPointer result); void run(); signals: void resultsAvailable(const QVariantList &resultList); void recognitionError(int status); private: QSharedPointer result; }; class T9WriteWorker : public QThread { Q_OBJECT public: explicit T9WriteWorker(DECUMA_SESSION *decumaSession, const bool cjk, QObject *parent = 0); ~T9WriteWorker(); void addTask(QSharedPointer task); int removeTask(QSharedPointer task); int removeAllTasks(); void waitForAllTasks(); int numberOfPendingTasks(); template int removeAllTasks() { QMutexLocker guard(&taskLock); int count = 0; for (int i = 0; i < taskList.size();) { QSharedPointer task(taskList[i].objectCast()); if (task) { taskList.removeAt(i); ++count; } else { ++i; } } return count; } protected: void run(); private: QList > taskList; QSemaphore idleSema; QSemaphore taskSema; QMutex taskLock; DECUMA_SESSION *decumaSession; QBasicAtomicInt abort; const bool cjk; }; } // namespace QtVirtualKeyboard #endif // T9WRITEWORKER_H