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"