• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

okteta

  • sources
  • kde-4.12
  • kdesdk
  • okteta
  • kasten
  • controllers
  • view
  • structures
  • datatypes
datainformation.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the Okteta Kasten Framework, made within the KDE community.
3  *
4  * Copyright 2009, 2010, 2011, 2013 Alex Richardson <alex.richardson@gmx.de>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) version 3, or any
10  * later version accepted by the membership of KDE e.V. (or its
11  * successor approved by the membership of KDE e.V.), which shall
12  * act as a proxy defined in Section 6 of version 3 of the license.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21  */
22 #include "datainformation.h"
23 #include "topleveldatainformation.h"
24 #include "additionaldata.h"
25 #include "structviewpreferences.h"
26 #include "../script/scriptlogger.h"
27 #include "../script/safereference.h"
28 
29 #include <QScriptValue>
30 #include <QScriptEngine>
31 
32 #include <KLocale>
33 #include <KLineEdit>
34 #include <KIcon>
35 #include <KColorScheme>
36 
37 DataInformation::DataInformation(const QString& name, DataInformationBase* parent)
38  : mParent(parent), mName(name), mValidationSuccessful(false), mHasBeenValidated(false), mHasBeenUpdated(false),
39  mWasAbleToRead(false), mByteOrder(EndianessInherit), mLoggedData(ScriptLogger::LogInvalid)
40 {
41 }
42 
43 DataInformation::DataInformation(const DataInformation& d)
44  : mAdditionalData(d.mAdditionalData), mParent(0), mName(d.mName),
45  mValidationSuccessful(false), mHasBeenValidated(false), mHasBeenUpdated(false),
46  mWasAbleToRead(false), mByteOrder(d.mByteOrder), mLoggedData(ScriptLogger::LogInvalid)
47 {
48 }
49 
50 DataInformation::~DataInformation()
51 {
52  //references to this are no longer valid
53  SafeReferenceHolder::instance.invalidateAll(this);
54 }
55 
56 QString DataInformation::sizeString() const
57 {
58  if (size() % 8 == 0) //no bits remaining
59  {
60  return i18np("1 byte", "%1 bytes", size() / 8);
61  }
62  else
63  {
64  QString bytes = i18np("1 byte", "%1 bytes", size() / 8);
65  QString bits = i18np("1 bit", "%1 bits", size() % 8);
66  return i18nc("number of bytes, then number of bits", "%1 %2", bytes, bits);
67  }
68 }
69 
70 QString DataInformation::valueStringImpl() const
71 {
72  return QString();
73 }
74 
75 BitCount64 DataInformation::positionInFile(Okteta::Address start) const
76 {
77  Q_CHECK_PTR(mParent);
78  if (mParent->isTopLevel())
79  return start * 8; //this is the root of the structure
80 
81  const DataInformation* par = mParent->asDataInformation();
82  return par->childPosition(this, start);
83 }
84 
85 DataInformation* DataInformation::mainStructure()
86 {
87  Q_CHECK_PTR(mParent);
88  if (mParent->isTopLevel())
89  return this;
90  else
91  return mParent->asDataInformation()->mainStructure();
92 
93 }
94 
95 void DataInformation::setValidationError(QString errorMessage)
96 {
97  if (errorMessage.isEmpty())
98  mAdditionalData.remove(AdditionalData::ValidationError);
99  else
100  mAdditionalData.set(AdditionalData::ValidationError, errorMessage);
101 }
102 
103 void DataInformation::setCustomTypeName(const QString& customTypeName)
104 {
105  if (customTypeName.isEmpty())
106  mAdditionalData.remove(AdditionalData::CustomTypeName);
107  else
108  mAdditionalData.set(AdditionalData::CustomTypeName, customTypeName);
109 }
110 
111 void DataInformation::resetValidationState()
112 {
113  mAdditionalData.remove(AdditionalData::ValidationError);
114  mHasBeenValidated = false;
115  mValidationSuccessful = false;
116 }
117 
118 void DataInformation::beginRead()
119 {
120  mHasBeenUpdated = false;
121  mWasAbleToRead = false;
122  mHasBeenValidated = false;
123  mLoggedData = ScriptLogger::LogInvalid;
124  const uint numChildren = childCount();
125  if (numChildren > 0 && childAt(0)->isDummy())
126  return; //first child is dummy -> all are
127  //otherwise start read for all children
128  for (uint i = 0; i < childCount(); ++i)
129  {
130  childAt(i)->beginRead();
131  }
132 }
133 
134 ScriptLogger* DataInformation::logger() const
135 {
136  return topLevelDataInformation()->logger();
137 }
138 
139 void DataInformation::setAdditionalFunction(AdditionalData::AdditionalDataType entry, const QScriptValue& value,
140  const char* name)
141 {
142  if (!value.isValid() || value.isNull() || value.isUndefined())
143  {
144  //removal requested
145  mAdditionalData.remove(entry);
146  return;
147  }
148  if (!value.isFunction())
149  {
150  logError() << "cannot set" << name << "since" << value.toString() << "is not a function!";
151  return;
152  }
153  mAdditionalData.set(entry, QVariant::fromValue(value));
154 }
155 
156 QVariant DataInformation::data(int column, int role) const
157 {
158  if (role == Qt::DisplayRole)
159  {
160  if (column == ColumnName)
161  {
162  if (mParent && mParent->isArray())
163  return QString(QLatin1Char('[') + QString::number(row()) + QLatin1Char(']'));
164  else
165  return name();
166  }
167  if (column == ColumnType)
168  return typeName();
169  if (column == ColumnValue)
170  return mWasAbleToRead ? valueString() : eofReachedData(Qt::DisplayRole);
171  }
172  else if (role == Qt::ToolTipRole)
173  {
174  return tooltipString();
175  }
176  else if (role == Qt::DecorationRole && column == ColumnName)
177  {
178  //XXX better icons?
179  if (mHasBeenValidated)
180  return KIcon(QLatin1String(mValidationSuccessful ? "task-complete" : "dialog-warning"));
181  if (mLoggedData != ScriptLogger::LogInvalid)
182  return ScriptLogger::iconForLevel(mLoggedData);
183  }
184  else if (!mWasAbleToRead && column == ColumnValue)
185  return eofReachedData(role);
186  return QVariant();
187 }
188 
189 QVariant DataInformation::eofReachedData(int role)
190 {
191  //whenever color scheme changes application must be restarted to have the correct color
192  static KColorScheme scheme(QPalette::Active);
193 
194  if (role == Qt::DisplayRole)
195  return i18nc("invalid value (End of file reached)", "<EOF reached>");
196  else if (role == Qt::ForegroundRole)
197  return scheme.foreground(KColorScheme::NegativeText);
198  return QVariant();
199 }
200 
201 
202 QString DataInformation::tooltipString() const
203 {
204  QString valueStr = mWasAbleToRead ? valueString() : eofReachedData(Qt::DisplayRole).toString();
205  if (mHasBeenValidated && !mValidationSuccessful)
206  {
207  QString validationMsg = validationError();
208  if (validationMsg.isEmpty())
209  {
210  validationMsg = i18nc("not all values in this structure"
211  " are as they should be", "Validation failed.");
212  }
213  else
214  {
215  validationMsg = i18nc("not all values in this structure are as they should be",
216  "Validation failed: \"%1\"", validationMsg);
217  }
218  return i18n("Name: %1\nValue: %2\n\nType: %3\nSize: %4\n\n%5", name(),
219  valueStr, typeName(), sizeString(), validationMsg);
220  }
221  else
222  {
223  return i18n("Name: %1\nValue: %2\n\nType: %3\nSize: %4", name(),
224  valueStr, typeName(), sizeString());
225  }
226 }
227 
228 DataInformation* DataInformation::child(const QString& name) const
229 {
230  int size = childCount();
231  for (int i = 0; i < size; ++i)
232  {
233  DataInformation* child = childAt(i);
234  if (child->name() == name)
235  return child;
236  }
237  return 0;
238 }
239 
240 TopLevelDataInformation* DataInformation::topLevelDataInformation() const
241 {
242  Q_CHECK_PTR(mParent);
243  if (mParent->isTopLevel())
244  return mParent->asTopLevel();
245 
246  return mParent->asDataInformation()->topLevelDataInformation();
247 }
248 
249 int DataInformation::row() const
250 {
251  Q_CHECK_PTR(mParent);
252  if (mParent->isTopLevel())
253  return mParent->asTopLevel()->indexOf(this);
254  else
255  return mParent->asDataInformation()->indexOf(this);
256 }
257 
258 QString DataInformation::fullObjectPath() const
259 {
260  DataInformationBase* par = parent();
261  if (!par || par->isTopLevel())
262  {
263  return name();
264  }
265  QString result;
266  if (par->isArray())
267  result = QLatin1Char('[') + QString::number(par->asDataInformation()->indexOf(this))
268  + QLatin1Char(']');
269  else
270  result = QLatin1Char('.') + name();
271  result.prepend(par->asDataInformation()->fullObjectPath());
272  return result;
273 }
274 
275 QScriptValue DataInformation::toScriptValue(QScriptEngine* engine, ScriptHandlerInfo* handlerInfo)
276 {
277  return engine->newObject(scriptClass(handlerInfo),
278  engine->newVariant(QVariant::fromValue(SafeReference(this))));
279 }
280 
281 QSysInfo::Endian DataInformation::byteOrderFromSettings() const
282 {
283  return Kasten2::StructViewPreferences::byteOrder();
284 }
285 
286 
287 
288 QScriptValue DataInformation::toScriptValue(TopLevelDataInformation* top)
289 {
290  return toScriptValue(top->scriptEngine(), top->scriptHandler()->handlerInfo());
291 }
292 
293 QString DataInformation::customToString(const QScriptValue& func) const
294 {
295  if (!wasAbleToRead())
296  {
297  logError() << "Attempting to call custom to string function, but element could not be read";
298  return valueStringImpl();
299  }
300  Q_ASSERT(func.isFunction());
301  return topLevelDataInformation()->scriptHandler()->customToString(this, func);
302 }
303 
AdditionalData::remove
void remove(AdditionalDataType entry)
Definition: additionaldata.h:60
DataInformation::valueString
QString valueString() const
by default just returns an empty QString
Definition: datainformation.h:414
ScriptHandler::handlerInfo
ScriptHandlerInfo * handlerInfo()
Definition: scripthandler.h:71
DataInformation
Interface that must be implemented by all datatypes.
Definition: datainformation.h:67
Kasten2::StructViewPreferences::byteOrder
static QSysInfo::Endian byteOrder()
Get Byte order.
Definition: structviewpreferences.h:262
Okteta::Address
qint32 Address
Definition: address.h:34
DataInformation::name
QString name() const
Definition: datainformation.h:258
DataInformation::fullObjectPath
QString fullObjectPath() const
Definition: datainformation.cpp:258
DataInformation::topLevelDataInformation
TopLevelDataInformation * topLevelDataInformation() const
Definition: datainformation.cpp:240
DataInformation::mValidationSuccessful
bool mValidationSuccessful
Definition: datainformation.h:240
DataInformation::wasAbleToRead
bool wasAbleToRead() const
Definition: datainformation.h:283
datainformation.h
BitCount64
quint64 BitCount64
Definition: datainformationbase.h:42
DataInformation::childCount
virtual unsigned int childCount() const =0
Definition: datainformation.h:278
ScriptLogger::iconForLevel
static KIcon iconForLevel(LogLevel level)
Definition: scriptlogger.cpp:29
DataInformation::typeName
QString typeName() const
Definition: datainformation.h:406
DataInformation::tooltipString
virtual QString tooltipString() const
Definition: datainformation.cpp:202
structviewpreferences.h
AdditionalData::CustomTypeName
Definition: additionaldata.h:35
DataInformation::beginRead
void beginRead()
sets mWasAbleToRead to false for all children and this object.
Definition: datainformation.cpp:118
SafeReference
A class wrapping a DataInformation* As soon as that DataInformation is destroyed all references to it...
Definition: safereference.h:52
DataInformation::ColumnType
Definition: datainformation.h:84
DataInformation::logger
ScriptLogger * logger() const
Definition: datainformation.cpp:134
DataInformation::ColumnValue
Definition: datainformation.h:84
TopLevelDataInformation::logger
ScriptLogger * logger() const
Definition: topleveldatainformation.h:174
ScriptLogger::LogInvalid
Definition: scriptlogger.h:47
DataInformation::DataInformation
DataInformation(const DataInformation &)
Definition: datainformation.cpp:43
DataInformation::mainStructure
DataInformation * mainStructure()
Definition: datainformation.cpp:85
DataInformation::childAt
virtual DataInformation * childAt(unsigned int) const =0
Definition: datainformation.h:268
DataInformation::sizeString
virtual QString sizeString() const
needs to be virtual for bitfields
Definition: datainformation.cpp:56
DataInformation::mWasAbleToRead
bool mWasAbleToRead
Definition: datainformation.h:243
TopLevelDataInformation
Definition: topleveldatainformation.h:46
AdditionalData::AdditionalDataType
AdditionalDataType
Definition: additionaldata.h:34
DataInformation::mHasBeenUpdated
bool mHasBeenUpdated
Definition: datainformation.h:242
DataInformation::indexOf
virtual int indexOf(const DataInformation *const data) const =0
Find the index of a DataInformation in this object, needed to calculate the row.
TopLevelDataInformation::scriptEngine
QScriptEngine * scriptEngine() const
Definition: topleveldatainformation.cpp:71
ScriptLogger
NOT THREAD SAFE!
Definition: scriptlogger.h:35
topleveldatainformation.h
DataInformationBase::isTopLevel
virtual bool isTopLevel() const =0
DataInformationBase::asTopLevel
TopLevelDataInformation * asTopLevel()
Definition: datainformationbase.cpp:85
DataInformation::toScriptValue
virtual QScriptValue toScriptValue(QScriptEngine *engine, ScriptHandlerInfo *handlerInfo)
This method is virtual since DummyDataInformation has to override it.
Definition: datainformation.cpp:275
TopLevelDataInformation::indexOf
int indexOf(const DataInformation *const data) const
Definition: topleveldatainformation.cpp:254
DataInformation::child
virtual DataInformation * child(const QString &name) const
Looks for a child of this object with given name.
Definition: datainformation.cpp:228
DataInformation::ColumnName
Definition: datainformation.h:84
DataInformation::mAdditionalData
AdditionalData mAdditionalData
Definition: datainformation.h:237
DataInformation::mParent
DataInformationBase * mParent
Definition: datainformation.h:238
DataInformation::setCustomTypeName
void setCustomTypeName(const QString &customTypeName)
Set a custom string to be used for typeName() instead of the default.
Definition: datainformation.cpp:103
AdditionalData::ValidationError
Definition: additionaldata.h:35
ScriptHandler::customToString
QString customToString(const DataInformation *data, const QScriptValue &func)
Definition: scripthandler.cpp:148
DataInformation::data
virtual QVariant data(int column, int role) const
get the necessary data (for the model)
Definition: datainformation.cpp:156
DataInformationBase::asDataInformation
DataInformation * asDataInformation()
Definition: datainformationbase.h:107
DataInformation::validationError
QString validationError() const
Definition: datainformation.h:384
AdditionalData::set
void set(AdditionalDataType entry, const QVariant &value)
Definition: additionaldata.h:55
ScriptHandlerInfo
Definition: scripthandlerinfo.h:39
DataInformation::resetValidationState
virtual void resetValidationState()
Definition: datainformation.cpp:111
DataInformation::positionInFile
virtual BitCount64 positionInFile(Okteta::Address start) const
Definition: datainformation.cpp:75
TopLevelDataInformation::scriptHandler
ScriptHandler * scriptHandler() const
Definition: topleveldatainformation.h:179
DataInformation::parent
DataInformationBase * parent() const
Definition: datainformation.h:309
DataInformationBase::isDummy
virtual bool isDummy() const
Definition: datainformationbase.cpp:40
DataInformationBase
Definition: datainformationbase.h:44
DataInformation::mLoggedData
ScriptLogger::LogLevel mLoggedData
Definition: datainformation.h:245
DataInformation::childPosition
virtual BitCount64 childPosition(const DataInformation *child, Okteta::Address start) const =0
DataInformation::setAdditionalFunction
void setAdditionalFunction(AdditionalData::AdditionalDataType entry, const QScriptValue &value, const char *name)
Definition: datainformation.cpp:139
DataInformation::mHasBeenValidated
bool mHasBeenValidated
Definition: datainformation.h:241
DataInformation::row
int row() const
Definition: datainformation.cpp:249
SafeReferenceHolder::instance
static SafeReferenceHolder instance
Definition: safereference.h:41
DataInformation::size
virtual BitCount32 size() const =0
the size in bits of this element
DataInformation::~DataInformation
virtual ~DataInformation()
Definition: datainformation.cpp:50
DataInformation::eofReachedData
static QVariant eofReachedData(int role)
Definition: datainformation.cpp:189
DataInformation::logError
QDebug logError() const
just a shorthand for logger->error(this)
Definition: datainformation.h:324
SafeReferenceHolder::invalidateAll
void invalidateAll(DataInformation *data)
sets all refereces to this object to null
Definition: safereference.cpp:30
additionaldata.h
DataInformationBase::isArray
virtual bool isArray() const
Definition: datainformationbase.cpp:35
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:07 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okteta

Skip menu "okteta"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal