| 1 | /* |
|---|---|
| 2 | SPDX-FileCopyrightText: 2015 Vishesh Handa <vhanda@kde.org> |
| 3 | |
| 4 | SPDX-License-Identifier: LGPL-2.1-or-later |
| 5 | */ |
| 6 | |
| 7 | #include "doctermscodec.h" |
| 8 | |
| 9 | using namespace Baloo; |
| 10 | |
| 11 | QByteArray DocTermsCodec::encode(const QVector<QByteArray>& terms) |
| 12 | { |
| 13 | Q_ASSERT(!terms.isEmpty()); |
| 14 | |
| 15 | QByteArray full; |
| 16 | full.append(a: terms.first()); |
| 17 | full.append(c: '\0'); |
| 18 | |
| 19 | for (int i = 1; i < terms.size(); i++) { |
| 20 | const QByteArray term = terms[i]; |
| 21 | const QByteArray prevTerm = terms[i-1]; |
| 22 | |
| 23 | if (term.startsWith(bv: prevTerm)) { |
| 24 | full.append(a: term.mid(index: prevTerm.size())); |
| 25 | full.append(c: static_cast<char>(1)); |
| 26 | } else { |
| 27 | full.append(a: term); |
| 28 | full.append(c: '\0'); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | return full; |
| 33 | } |
| 34 | |
| 35 | QVector<QByteArray> DocTermsCodec::decode(const QByteArray& full) |
| 36 | { |
| 37 | Q_ASSERT(full.size()); |
| 38 | |
| 39 | QVector<QByteArray> list; |
| 40 | |
| 41 | int prevWordBoundary = 0; |
| 42 | for (int i = 0; i < full.size(); i++) { |
| 43 | if (full[i] == 1) { |
| 44 | if (list.isEmpty()) { |
| 45 | // corrupted entry - no way to recover |
| 46 | return list; |
| 47 | } |
| 48 | |
| 49 | QByteArray arr(full.constData() + prevWordBoundary, i - prevWordBoundary); |
| 50 | |
| 51 | list << list.last() + arr; |
| 52 | prevWordBoundary = i + 1; |
| 53 | continue; |
| 54 | } |
| 55 | |
| 56 | if (full[i] == '\0') { |
| 57 | QByteArray arr(full.constData() + prevWordBoundary, i - prevWordBoundary); |
| 58 | |
| 59 | list << arr; |
| 60 | prevWordBoundary = i + 1; |
| 61 | continue; |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | return list; |
| 66 | } |
| 67 |
