1 /*
2     This file is part of the Okteta Kasten module, made within the KDE community.
3 
4     SPDX-FileCopyrightText: 2007 Friedrich W. H. Kossebau <kossebau@kde.org>
5 
6     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8 
9 #include "bytearrayvaluesstreamencoder.hpp"
10 
11 // lib
12 #include <bytearrayview.hpp>
13 // Okteta core
14 #include <Okteta/AbstractByteArrayModel>
15 #include <Okteta/ValueCodec>
16 // KF
17 #include <KLocalizedString>
18 // Qt
19 #include <QTextStream>
20 
21 namespace Kasten {
22 
ValuesStreamEncoderSettings()23 ValuesStreamEncoderSettings::ValuesStreamEncoderSettings()
24     : separation(QStringLiteral(" "))
25 {}
26 
ByteArrayValuesStreamEncoder()27 ByteArrayValuesStreamEncoder::ByteArrayValuesStreamEncoder()
28     : AbstractByteArrayStreamEncoder(i18nc("name of the encoding target", "Values"), QStringLiteral("text/plain"))
29 {}
30 
31 ByteArrayValuesStreamEncoder::~ByteArrayValuesStreamEncoder() = default;
32 
encodeDataToStream(QIODevice * device,const ByteArrayView * byteArrayView,const Okteta::AbstractByteArrayModel * byteArrayModel,const Okteta::AddressRange & range)33 bool ByteArrayValuesStreamEncoder::encodeDataToStream(QIODevice* device,
34                                                       const ByteArrayView* byteArrayView,
35                                                       const Okteta::AbstractByteArrayModel* byteArrayModel,
36                                                       const Okteta::AddressRange& range)
37 {
38     bool success = true;
39 
40     // settings
41     mSettings.undefinedChar = byteArrayView->undefinedChar();
42     mSettings.substituteChar = byteArrayView->substituteChar();
43     mSettings.valueCoding = (Okteta::ValueCoding)byteArrayView->valueCoding();
44 
45     // encode
46     QTextStream textStream(device);
47 
48     Okteta::ValueCodec* valueCodec = Okteta::ValueCodec::createCodec(mSettings.valueCoding);
49 
50     // prepare
51     QString valueString;
52     valueString.resize(valueCodec->encodingWidth());
53 
54     for (Okteta::Address i = range.start(); i <= range.end(); ++i) {
55         if (i > range.start()) {
56             textStream << mSettings.separation;
57         }
58 
59         valueCodec->encode(&valueString, 0, byteArrayModel->byte(i));
60 
61         textStream << valueString;
62     }
63 
64     // clean up
65     delete valueCodec;
66 
67     return success;
68 }
69 
70 }
71