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