aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/cerence/hwr/plugin/t9writedictionary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cerence/hwr/plugin/t9writedictionary.cpp')
-rw-r--r--src/plugins/cerence/hwr/plugin/t9writedictionary.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/plugins/cerence/hwr/plugin/t9writedictionary.cpp b/src/plugins/cerence/hwr/plugin/t9writedictionary.cpp
new file mode 100644
index 00000000..14c3ae2f
--- /dev/null
+++ b/src/plugins/cerence/hwr/plugin/t9writedictionary.cpp
@@ -0,0 +1,281 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "t9writedictionary_p.h"
+#include <QLoggingCategory>
+
+QT_BEGIN_NAMESPACE
+namespace QtVirtualKeyboard {
+
+Q_DECLARE_LOGGING_CATEGORY(lcT9Write)
+
+// T9WriteAbstractSource
+
+T9WriteAbstractSource::T9WriteAbstractSource(const DECUMA_SRC_DICTIONARY_INFO &info) :
+ _info(info)
+{
+}
+
+T9WriteAbstractSource::~T9WriteAbstractSource()
+{
+}
+
+const DECUMA_SRC_DICTIONARY_INFO *T9WriteAbstractSource::info() const
+{
+ return &_info;
+}
+
+// T9WriteFileSource
+
+T9WriteFileSource::T9WriteFileSource(const DECUMA_SRC_DICTIONARY_INFO &info, const QString &fileName) :
+ T9WriteAbstractSource(info),
+ file(fileName),
+ _data(nullptr),
+ _size(0)
+{
+}
+
+bool T9WriteFileSource::load()
+{
+ if (!_data) {
+ if (file.open(QIODevice::ReadOnly)) {
+ _size = file.size();
+ _data = file.map(0, _size, QFile::NoOptions);
+ if (!_data) {
+ _size = 0;
+ qCWarning(lcT9Write) << "Could not read dictionary file" << file.fileName();
+ }
+ file.close();
+ }
+ }
+
+ return _data != nullptr;
+}
+
+bool T9WriteFileSource::create(qint64 createSize)
+{
+ close();
+
+ if (file.open(QIODevice::ReadWrite)) {
+ if (file.resize(createSize)) {
+ _size = file.size();
+ _data = file.map(0, _size, QFile::NoOptions);
+ if (!_data) {
+ _size = 0;
+ qCWarning(lcT9Write) << "Could not read dictionary file" << file.fileName();
+ }
+ } else {
+ qCWarning(lcT9Write) << "Could not resize dictionary file" << file.fileName();
+ }
+ file.close();
+ }
+
+ return _data != nullptr;
+}
+
+void T9WriteFileSource::close()
+{
+ if (_data) {
+ file.unmap(static_cast<uchar *>(_data));
+ _data = nullptr;
+ _size = 0;
+ }
+}
+
+QString T9WriteFileSource::name() const
+{
+ return file.fileName();
+}
+
+const void *T9WriteFileSource::data() const
+{
+ return _data;
+}
+
+qint64 T9WriteFileSource::size() const
+{
+ return _size;
+}
+
+// T9WriteStringSource
+
+T9WriteStringSource::T9WriteStringSource(const DECUMA_SRC_DICTIONARY_INFO &info, const QStringList &source, const QString &name) :
+ T9WriteAbstractSource(info),
+ source(source),
+ _name(name)
+{
+}
+
+bool T9WriteStringSource::load()
+{
+ _data = source.join(QLatin1Char('\r'));
+ return true;
+}
+
+QString T9WriteStringSource::name() const
+{
+ return _name;
+}
+
+const void *T9WriteStringSource::data() const
+{
+ return _data.utf16();
+}
+
+qint64 T9WriteStringSource::size() const
+{
+ return _data.size();
+}
+
+// T9WriteDictionary
+
+T9WriteDictionary::T9WriteDictionary(QSharedPointer<T9WriteAbstractSource> source,
+ DECUMA_SESSION *decumaSession,
+ const DECUMA_MEM_FUNCTIONS &memFuncs,
+ bool cjk) :
+ source(source),
+ decumaSession(decumaSession),
+ memFuncs(memFuncs),
+ cjk(cjk),
+ convertedData(nullptr),
+ convertedSize(0)
+{
+}
+
+T9WriteDictionary::~T9WriteDictionary()
+{
+ if (convertedData) {
+ DECUMA_STATUS status = DECUMA_API(DestroyConvertedDictionary)(&convertedData, &memFuncs);
+ Q_ASSERT(status == decumaNoError);
+ Q_ASSERT(convertedData == nullptr);
+ }
+}
+
+bool T9WriteDictionary::load()
+{
+ return source->load();
+}
+
+bool T9WriteDictionary::convert()
+{
+ if (!source->data() || convertedData)
+ return false;
+
+ DECUMA_STATUS status;
+ status = DECUMA_API(ConvertDictionary)(&convertedData, source->data(), static_cast<DECUMA_UINT32>(source->size()),
+ source->info(), &convertedSize, &memFuncs);
+
+ if (status != decumaNoError) {
+ qCWarning(lcT9Write) << "Could not convert dictionary";
+ }
+
+ return status == decumaNoError;
+}
+
+QString T9WriteDictionary::name() const
+{
+ return source->name();
+}
+
+const void *T9WriteDictionary::data() const
+{
+ return convertedData ? convertedData : source->data();
+}
+
+qint64 T9WriteDictionary::size() const
+{
+ return convertedData ? convertedSize : source->size();
+}
+
+T9WriteDynamicDictionary::T9WriteDynamicDictionary(QSharedPointer<T9WriteAbstractSource> source, int maxWords, const DECUMA_MEM_FUNCTIONS &memFuncs, bool cjk) :
+ source(source),
+ memFuncs(memFuncs),
+ cjk(cjk),
+ _data(nullptr)
+{
+ DECUMA_API(DynamicDictionaryCreate)(&_data, static_cast<DECUMA_UINT32>(maxWords), &memFuncs);
+}
+
+T9WriteDynamicDictionary::~T9WriteDynamicDictionary()
+{
+ if (_data) {
+ DECUMA_API(DynamicDictionaryDestroy)(&_data);
+ }
+}
+
+bool T9WriteDynamicDictionary::load()
+{
+ if (!_data)
+ return false;
+
+ DECUMA_STATUS status;
+ DECUMA_UINT32 nUnprocessedSize = 0;
+ if (source->load()) {
+ status = DECUMA_API(DynamicDictionaryAddWords)(_data, source->data(), static_cast<DECUMA_UINT32>(source->size()), &nUnprocessedSize);
+ if (status) {
+ qCWarning(lcT9Write) << "Could not load words to dynamic dictionary, error" << status;
+ }
+ source->close();
+ }
+
+ return true;
+}
+
+QString T9WriteDynamicDictionary::name() const
+{
+ return source->name();
+}
+
+const void *T9WriteDynamicDictionary::data() const
+{
+ return _data;
+}
+
+qint64 T9WriteDynamicDictionary::size() const
+{
+ return 0;
+}
+
+qint64 T9WriteDynamicDictionary::bufferSize() const
+{
+ DECUMA_UINT32 result = 0;
+ if (_data)
+ DECUMA_API(DynamicDictionaryGetWordsBufferSize)(_data, &result);
+ return result;
+}
+
+void T9WriteDynamicDictionary::save()
+{
+ if (_data) {
+ DECUMA_UINT32 nWordsWritten = 0;
+ DECUMA_UINT32 nBytesWritten = 0;
+ qint64 fileSize = bufferSize();
+ if (source->create(fileSize)) {
+ DECUMA_STATUS status = DECUMA_API(DynamicDictionaryGetWords)(_data, const_cast<void *>(source->data()), static_cast<DECUMA_UINT32>(fileSize), &nWordsWritten, &nBytesWritten);
+ source->close();
+ }
+ }
+}
+
+bool T9WriteDynamicDictionary::hasWord(const QString &word)
+{
+ if (!_data)
+ return false;
+
+ int found = 0;
+ DECUMA_API(DynamicDictionaryHasWord)(_data, word.utf16(), &found);
+
+ return found != 0;
+}
+
+bool T9WriteDynamicDictionary::removeWord(const QString &word)
+{
+ DECUMA_STATUS status;
+
+ status = DECUMA_API(DynamicDictionaryDeleteWord)(_data, word.utf16());
+
+ return !status;
+}
+
+} // namespace QtVirtualKeyboard
+QT_END_NAMESPACE