File indexing completed on 2024-06-30 05:51:26

0001 /*
0002     This file is part of the Okteta Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2011 Alex Richardson <alex.richardson@gmx.de>
0005     SPDX-FileCopyrightText: 2016 Aaron Bishop <erroneous@gmail.com>
0006 
0007     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0008 */
0009 
0010 #ifndef KASTEN_STRINGDATAINFORMATION_HPP
0011 #define KASTEN_STRINGDATAINFORMATION_HPP
0012 
0013 #include "../datainformation.hpp"
0014 #include "../dummydatainformation.hpp"
0015 #include "stringdata.hpp"
0016 // Std
0017 #include <memory>
0018 
0019 class StringDataInformation : public DataInformationWithDummyChildren
0020 {
0021     DATAINFORMATION_CLONE_DECL(StringDataInformation, DataInformationWithDummyChildren);
0022 
0023 public:
0024     enum class StringType
0025     {
0026         InvalidEncoding = -1,
0027         ASCII = 0,
0028         Latin1,
0029         UTF8,
0030         UTF16_LE,
0031         UTF16_BE,
0032         UTF32_LE,
0033         UTF32_BE,
0034         EBCDIC
0035     };
0036 
0037     StringDataInformation(const QString& name, StringType encoding, DataInformationBase* parent = nullptr);
0038     ~StringDataInformation() override;
0039 
0040     DataInformation* childAt(unsigned int) const override;
0041 
0042     bool setData(const QVariant& value, Okteta::AbstractByteArrayModel* input,
0043                  Okteta::Address address, BitCount64 bitsRemaining, quint8 bitOffset) override;
0044     bool setChildData(uint row, const QVariant& value, Okteta::AbstractByteArrayModel* out,
0045                       Okteta::Address address, BitCount64 bitsRemaining, quint8 bitOffset) override;
0046     qint64 readData(const Okteta::AbstractByteArrayModel* input, Okteta::Address address,
0047                     BitCount64 bitsRemaining, quint8* bitOffset) override;
0048 
0049     BitCount32 size() const override;
0050     void setWidgetData(QWidget* w) const override;
0051     QVariant dataFromWidget(const QWidget* w) const override;
0052     QWidget* createEditWidget(QWidget* parent) const override;
0053     unsigned int childCount() const override;
0054     Qt::ItemFlags flags(int column, bool fileLoaded = true) const override;
0055     bool isString() const override;
0056 
0057     QVariant data(int column, int role) const override;
0058     QVariant childData(int row, int column, int role) const override;
0059     Qt::ItemFlags childFlags(int row, int column, bool fileLoaded = true) const override;
0060     BitCount32 childSize(uint index) const override;
0061     QString childTypeName(uint index) const override;
0062     QString childString(uint index) const override;
0063     void setChildWidgetData(uint index, QWidget* w) const override;
0064     QVariant dataFromChildWidget(uint index, const QWidget* w) const override;
0065     QWidget* createChildEditWidget(uint index, QWidget* parent) const override;
0066     QScriptValue childToScriptValue(uint index, QScriptEngine* engine, ScriptHandlerInfo* handlerInfo) const override;
0067     BitCount64 childPosition(const DataInformation* child, Okteta::Address start) const override;
0068 
0069     StringType encoding() const;
0070     QString encodingName() const;
0071     void setEncoding(StringType encoding);
0072     uint terminationCodePoint() const;
0073     void setTerminationCodePoint(uint term);
0074     uint maxCharCount() const;
0075     void setMaxCharCount(uint count);
0076     uint maxByteCount() const;
0077     void setMaxByteCount(uint count);
0078     int stringLength() const;
0079     int stringByteLength() const;
0080     uint terminationMode() const;
0081     QString childNameAt(int index) const;
0082     QString valueAt(int index) const;
0083     /** Removes this mode from the termination modes. If none is left, changes string to null terminated
0084      * @param mode The mode to remove
0085      */
0086     void unsetTerminationMode(StringData::TerminationMode mode);
0087 
0088 private:
0089     QScriptClass* scriptClass(ScriptHandlerInfo* handlerInfo) const override;
0090     QString typeNameImpl() const override;
0091     QString valueStringImpl() const override;
0092 
0093 private:
0094     mutable DummyDataInformation mDummy;
0095     std::unique_ptr<StringData> mData;
0096     StringType mEncoding = StringType::InvalidEncoding;
0097 
0098     static const QString encodingNames[static_cast<int>(StringDataInformation::StringType::EBCDIC)+2];
0099 };
0100 
0101 inline StringDataInformation::StringType StringDataInformation::encoding() const
0102 {
0103     return mEncoding;
0104 }
0105 inline QString StringDataInformation::encodingName() const
0106 {
0107     return encodingNames[static_cast<int>(mEncoding)+1];
0108 }
0109 
0110 inline uint StringDataInformation::maxByteCount() const
0111 {
0112     return mData->maxByteCount();
0113 }
0114 
0115 inline void StringDataInformation::setMaxByteCount(uint count)
0116 {
0117     mData->setMaxByteCount(count);
0118 }
0119 
0120 inline uint StringDataInformation::maxCharCount() const
0121 {
0122     return mData->terminationCodePoint();
0123 }
0124 
0125 inline void StringDataInformation::setMaxCharCount(uint count)
0126 {
0127     mData->setMaxCharCount(count);
0128 }
0129 
0130 inline uint StringDataInformation::terminationCodePoint() const
0131 {
0132     return mData->terminationCodePoint();
0133 }
0134 
0135 inline void StringDataInformation::setTerminationCodePoint(uint term)
0136 {
0137     mData->setTerminationCodePoint(term);
0138 }
0139 
0140 inline int StringDataInformation::stringLength() const
0141 {
0142     return mData->count();
0143 }
0144 
0145 inline int StringDataInformation::stringByteLength() const
0146 {
0147     return mData->size() / 8;
0148 }
0149 
0150 inline uint StringDataInformation::terminationMode() const
0151 {
0152     return mData->terminationMode();
0153 }
0154 
0155 inline QString StringDataInformation::childNameAt(int index) const
0156 {
0157     Q_ASSERT((uint)index < mData->count());
0158     // TODO termination char
0159     return QString(QLatin1Char('[') + QString::number(index) + QLatin1Char(']'));
0160 }
0161 
0162 inline QString StringDataInformation::valueAt(int index) const
0163 {
0164     Q_ASSERT((uint)index < mData->count());
0165     return mData->stringValue(index);
0166 }
0167 
0168 #endif // KASTEN_STRINGDATAINFORMATION_HPP