Warning, file /utilities/okteta/kasten/controllers/view/libbytearraysearch/bytearraysearchjob.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008-2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "bytearraysearchjob.hpp"
0010 
0011 // Okteta core
0012 #include <Okteta/AbstractByteArrayModel>
0013 #include <Okteta/CharCodec>
0014 // Qt
0015 #include <QCoreApplication>
0016 
0017 namespace Kasten {
0018 
0019 ByteArraySearchJob::ByteArraySearchJob(const Okteta::AbstractByteArrayModel* model,
0020                                        const QByteArray& searchData,
0021                                        Okteta::Address startIndex, Okteta::Address endIndex,
0022                                        Qt::CaseSensitivity caseSensitivity, const QString& charCodecName)
0023     : mByteArrayModel(model)
0024     , mSearchData(searchData)
0025     , mStartIndex(startIndex)
0026     , mEndIndex(endIndex)
0027     , mCaseSensitivity(caseSensitivity)
0028     , mCharCodec(Okteta::CharCodec::createCodec(charCodecName))
0029 {
0030 }
0031 
0032 ByteArraySearchJob::~ByteArraySearchJob()
0033 {
0034     delete mCharCodec;
0035 }
0036 
0037 Okteta::AddressRange ByteArraySearchJob::exec()
0038 {
0039     start();
0040     // no own event loop here or mutex, we know that start is sync call currently
0041     return m_result;
0042 }
0043 
0044 void ByteArraySearchJob::start()
0045 {
0046     // TODO: what kind of signal could a filter send?
0047     connect(mByteArrayModel, &Okteta::AbstractByteArrayModel::searchedBytes, this, &ByteArraySearchJob::onBytesSearched);
0048 
0049     const bool searchForward = (mStartIndex < mEndIndex);
0050     Okteta::Address resultIndex;
0051     if (searchForward) {
0052         resultIndex = (mCaseSensitivity == Qt::CaseSensitive) ?
0053                  mByteArrayModel->indexOf(mSearchData, mStartIndex, mEndIndex) :
0054                  mByteArrayModel->indexOfCaseInsensitive(mCharCodec, mSearchData, mStartIndex, mEndIndex);
0055     } else {
0056         const Okteta::Address lastFromIndex = mStartIndex - mSearchData.size() + 1;
0057         // Does not fit? Also prevent negative value for lastFromIndex,
0058         // as fromOffset arg of lastIndexOf() handles -1 differently and is undefined for other < 0 values.
0059         if (lastFromIndex < mEndIndex) {
0060             resultIndex = -1;
0061         } else {
0062             resultIndex = (mCaseSensitivity == Qt::CaseSensitive) ?
0063                  mByteArrayModel->lastIndexOf(mSearchData, lastFromIndex, mEndIndex) :
0064                  mByteArrayModel->lastIndexOfCaseInsensitive(mCharCodec, mSearchData, lastFromIndex, mEndIndex);
0065         }
0066     }
0067 
0068     m_result = (resultIndex != -1) ? Okteta::AddressRange::fromWidth(resultIndex, mSearchData.size()) : Okteta::AddressRange();
0069     Q_EMIT finished(m_result);
0070 
0071     deleteLater(); // TODO: could be reused on next search
0072 }
0073 
0074 void ByteArraySearchJob::onBytesSearched()
0075 {
0076     QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
0077 }
0078 
0079 }
0080 
0081 #include "moc_bytearraysearchjob.cpp"