• 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
  • script
  • classes
structunionscriptclass.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 2011, 2012 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 
23 
24 #include "structunionscriptclass.h"
25 #include "../../datatypes/datainformationwithchildren.h"
26 #include "../../datatypes/topleveldatainformation.h"
27 #include "../../parsers/parserutils.h"
28 #include "../scriptlogger.h"
29 
30 #include <KDebug>
31 
32 StructUnionScriptClass::StructUnionScriptClass(QScriptEngine* engine, ScriptHandlerInfo* handlerInfo)
33  : DefaultScriptClass(engine, handlerInfo)
34 {
35  s_childCount = engine->toStringHandle(ParserStrings::PROPERTY_CHILD_COUNT); //read-only
36  mIterableProperties.append(qMakePair(s_childCount, QScriptValue::ReadOnly | QScriptValue::Undeletable));
37  s_children = engine->toStringHandle(ParserStrings::PROPERTY_CHILDREN); //write-only
38 
39  mStructUnionPrototype = engine->newObject();
40  mStructUnionPrototype.setProperty(QLatin1String("toString"),
41  engine->newFunction(StructUnion_proto_toString));
42  mStructUnionPrototype.setProperty(QLatin1String("setChildren"),
43  engine->newFunction(StructUnion_proto_setChildren));
44  mStructUnionPrototype.setProperty(QLatin1String("child"),
45  engine->newFunction(StructUnion_proto_child));
46 }
47 
48 StructUnionScriptClass::~StructUnionScriptClass()
49 {
50 }
51 
52 bool StructUnionScriptClass::queryAdditionalProperty(const DataInformation* data, const QScriptString& name, QScriptClass::QueryFlags* flags, uint* id)
53 {
54  Q_UNUSED(data)
55  //no need to modify flags since both read and write are handled
56  if (name == s_childCount)
57  {
58  *flags &= ~HandlesWriteAccess;
59  return true;
60  }
61  else if (name == s_children)
62  {
63  *flags &= ~HandlesReadAccess;
64  return true;
65  }
66  else
67  {
68  bool isArrayIndex;
69  quint32 pos = name.toArrayIndex(&isArrayIndex);
70  uint count = data->childCount();
71  bool isValidChild = false;
72  if (isArrayIndex && pos < count)
73  {
74  isValidChild = true;
75  }
76  else
77  {
78  //compare name, names that match special properties/functions will be
79  //hidden since these were checked before
80  QString objName = name.toString();
81  for (uint i = 0 ; i < count; ++i)
82  {
83  if (objName == data->childAt(i)->name())
84  {
85  isValidChild = true;
86  pos = i;
87  break;
88  }
89  }
90  }
91  if (isValidChild)
92  {
93  *id = pos + 1; //add 1 to distinguish from the default value of 0
94  *flags &= ~HandlesWriteAccess; //writing is not yet supported
95  return true;
96  }
97  }
98  return false; //not found
99 }
100 
101 bool StructUnionScriptClass::additionalPropertyFlags(const DataInformation* data, const QScriptString& name, uint id, QScriptValue::PropertyFlags* flags)
102 {
103  Q_UNUSED(data)
104  //no need to modify flags since both read and write are handled
105  if (id != 0)
106  {
107  *flags |= QScriptValue::ReadOnly;
108  return true;
109  }
110  //TODO is this necessary, will there be any way a child has no id set?
111  //check named children
112  QString objName = name.toString();
113  uint count = data->childCount();
114  for (uint i = 0 ; i < count; ++i)
115  {
116  DataInformation* child = data->childAt(i);
117  Q_CHECK_PTR(child);
118  if (objName == child->name())
119  {
120  *flags |= QScriptValue::ReadOnly;
121  return true;
122  }
123  }
124  return false;
125 }
126 
127 
128 QScriptValue StructUnionScriptClass::additionalProperty(const DataInformation* data, const QScriptString& name, uint id)
129 {
130  const DataInformationWithChildren* dataW = static_cast<const DataInformationWithChildren*>(data);
131  //do a dynamic cast in debug mode to ensure the static cast was valid
132  Q_CHECK_PTR(dynamic_cast<const DataInformationWithChildren*>(dataW));
133 
134  if (id != 0)
135  {
136  quint32 pos = id - 1;
137  if (pos >= data->childCount())
138  {
139  dataW->logError() << "attempting to access out of bounds child: index was" << pos
140  << ", maximum is" << (data->childCount() - 1);
141  return engine()->currentContext()->throwError(QScriptContext::RangeError,
142  QString(QLatin1String("Attempting to access struct index %1, but length is %2")).arg(
143  QString::number(pos), QString::number(data->childCount())));
144  }
145  else
146  {
147  Q_CHECK_PTR(data->childAt(pos));
148  return data->childAt(pos)->toScriptValue(engine(), mHandlerInfo);
149  }
150  }
151  else if (name == s_childCount)
152  return dataW->childCount();
153  else if (name == s_children)
154  {
155  dataW->logError() << "attempting to read read-only property" << s_children.toString();
156  return engine()->undefinedValue();
157  }
158  else
159  {
160  //TODO is this necessary, will there be any way a child has no id set?
161  //TODO testing seems to indicate this is not necessary, will leave it thought until I'm sure
162  //check named children
163  QString objName = name.toString();
164  uint count = data->childCount();
165  for (uint i = 0 ; i < count; ++i)
166  {
167  DataInformation* child = data->childAt(i);
168  Q_CHECK_PTR(child);
169  if (objName == child->name())
170  {
171  return child->toScriptValue(engine(), mHandlerInfo);
172  }
173  }
174  }
175  return QScriptValue();
176 }
177 
178 bool StructUnionScriptClass::setAdditionalProperty(DataInformation* data, const QScriptString& name, uint, const QScriptValue& value)
179 {
180  DataInformationWithChildren* dataW = static_cast<DataInformationWithChildren*>(data);
181  //do a dynamic cast in debug mode to ensure the static cast was valid
182  Q_CHECK_PTR(dynamic_cast<DataInformationWithChildren*>(dataW));
183 
184  if (name == s_children)
185  {
186  dataW->setChildren(value);
187  return true;
188  }
189  //TODO set children!!
190  return false;
191 }
192 
193 QScriptValue StructUnionScriptClass::prototype() const
194 {
195  return mStructUnionPrototype;
196 }
197 
198 QScriptValue StructUnionScriptClass::StructUnion_proto_toString(QScriptContext* ctx, QScriptEngine* eng)
199 {
200  DataInformation* data = toDataInformation(ctx->thisObject());
201  if (!data)
202  {
203  kWarning() << "could not cast data";
204  return eng->undefinedValue();
205  }
206  return data->typeName(); //TODO better toString
207 }
208 
209 QScriptValue StructUnionScriptClass::StructUnion_proto_child(QScriptContext* ctx, QScriptEngine* eng)
210 {
211  if (ctx->argumentCount() < 1)
212  {
213  ctx->throwError(QScriptContext::RangeError,
214  QLatin1String("(struct/union).child(name) needs at least one argument"));
215  return eng->undefinedValue();
216  }
217  QScriptValue arg = ctx->argument(0);
218  if (!arg.isString())
219  {
220  ctx->throwError(QScriptContext::TypeError,
221  QLatin1String("(struct/union).child(name) argument has to be a string"));
222  return QScriptValue::UndefinedValue;
223  }
224  DataInformation* data = toDataInformation(ctx->thisObject());
225  if (!data)
226  {
227  kWarning() << "could not cast data";
228  return eng->undefinedValue();
229  }
230  uint count = data->childCount();
231  QString name = arg.toString();
232  for (uint i = 0; i < count; i++)
233  {
234  DataInformation* child = data->childAt(i);
235  if (child->name() == name)
236  return child->toScriptValue(eng, data->topLevelDataInformation()->scriptHandler()->handlerInfo());
237  }
238  return eng->nullValue();
239 }
240 
241 QScriptValue StructUnionScriptClass::StructUnion_proto_setChildren(QScriptContext* ctx, QScriptEngine* eng)
242 {
243  if (ctx->argumentCount() < 1)
244  {
245  return ctx->throwError(QScriptContext::RangeError,
246  QLatin1String("(struct/union).child(children) needs one argument"));
247  }
248  DataInformation* data = toDataInformation(ctx->thisObject());
249  if (!data)
250  {
251  kWarning() << "could not cast data";
252  return eng->undefinedValue();
253  }
254  DataInformationWithChildren* dataW = static_cast<DataInformationWithChildren*>(data);
255  //do a dynamic cast in debug mode to ensure the static cast was valid
256  Q_CHECK_PTR(dynamic_cast<DataInformationWithChildren*>(dataW));
257 
258  dataW->setChildren(ctx->argument(0));
259  return eng->undefinedValue();
260 }
ScriptHandler::handlerInfo
ScriptHandlerInfo * handlerInfo()
Definition: scripthandler.h:71
DataInformation
Interface that must be implemented by all datatypes.
Definition: datainformation.h:67
DataInformation::name
QString name() const
Definition: datainformation.h:258
ParserStrings::PROPERTY_CHILD_COUNT
const QString PROPERTY_CHILD_COUNT
Definition: parserutils.h:137
DataInformation::topLevelDataInformation
TopLevelDataInformation * topLevelDataInformation() const
Definition: datainformation.cpp:240
DataInformationWithChildren::childCount
virtual unsigned int childCount() const
Definition: datainformationwithchildren.h:77
StructUnionScriptClass::mStructUnionPrototype
QScriptValue mStructUnionPrototype
Definition: structunionscriptclass.h:50
DataInformation::childCount
virtual unsigned int childCount() const =0
Definition: datainformation.h:278
DataInformation::typeName
QString typeName() const
Definition: datainformation.h:406
StructUnionScriptClass::~StructUnionScriptClass
virtual ~StructUnionScriptClass()
Definition: structunionscriptclass.cpp:48
StructUnionScriptClass::StructUnion_proto_setChildren
static QScriptValue StructUnion_proto_setChildren(QScriptContext *ctx, QScriptEngine *eng)
Definition: structunionscriptclass.cpp:241
StructUnionScriptClass::additionalPropertyFlags
virtual bool additionalPropertyFlags(const DataInformation *data, const QScriptString &name, uint, QScriptValue::PropertyFlags *flags)
Definition: structunionscriptclass.cpp:101
DataInformationWithChildren::setChildren
void setChildren(const QVector< DataInformation * > &newChildren)
Definition: datainformationwithchildren.cpp:135
DataInformationWithChildren
Definition: datainformationwithchildren.h:29
DataInformation::childAt
virtual DataInformation * childAt(unsigned int) const =0
Definition: datainformation.h:268
StructUnionScriptClass::StructUnion_proto_toString
static QScriptValue StructUnion_proto_toString(QScriptContext *ctx, QScriptEngine *eng)
Definition: structunionscriptclass.cpp:198
DefaultScriptClass::mHandlerInfo
ScriptHandlerInfo * mHandlerInfo
Definition: defaultscriptclass.h:84
DefaultScriptClass::toDataInformation
static DataInformation * toDataInformation(const QScriptValue &val)
Convert a QScriptValue to DataInformation than qscriptvalue_cast, since we know exactly what to expec...
Definition: defaultscriptclass.cpp:75
DataInformation::toScriptValue
virtual QScriptValue toScriptValue(QScriptEngine *engine, ScriptHandlerInfo *handlerInfo)
This method is virtual since DummyDataInformation has to override it.
Definition: datainformation.cpp:275
StructUnionScriptClass::queryAdditionalProperty
virtual bool queryAdditionalProperty(const DataInformation *data, const QScriptString &name, QScriptClass::QueryFlags *flags, uint *id)
Definition: structunionscriptclass.cpp:52
StructUnionScriptClass::StructUnionScriptClass
StructUnionScriptClass(QScriptEngine *engine, ScriptHandlerInfo *handlerInfo)
Definition: structunionscriptclass.cpp:32
StructUnionScriptClass::additionalProperty
virtual QScriptValue additionalProperty(const DataInformation *data, const QScriptString &name, uint id)
Definition: structunionscriptclass.cpp:128
StructUnionScriptClass::StructUnion_proto_child
static QScriptValue StructUnion_proto_child(QScriptContext *ctx, QScriptEngine *eng)
Definition: structunionscriptclass.cpp:209
DefaultScriptClass::mIterableProperties
PropertyInfoList mIterableProperties
Contains all properties of this class, classes inheriting should add their own properties to this lis...
Definition: defaultscriptclass.h:82
StructUnionScriptClass::s_children
QScriptString s_children
Definition: structunionscriptclass.h:49
StructUnionScriptClass::setAdditionalProperty
virtual bool setAdditionalProperty(DataInformation *data, const QScriptString &name, uint id, const QScriptValue &value)
Definition: structunionscriptclass.cpp:178
StructUnionScriptClass::prototype
virtual QScriptValue prototype() const
Definition: structunionscriptclass.cpp:193
ScriptHandlerInfo
Definition: scripthandlerinfo.h:39
TopLevelDataInformation::scriptHandler
ScriptHandler * scriptHandler() const
Definition: topleveldatainformation.h:179
structunionscriptclass.h
StructUnionScriptClass::s_childCount
QScriptString s_childCount
Definition: structunionscriptclass.h:48
DefaultScriptClass
Definition: defaultscriptclass.h:36
ParserStrings::PROPERTY_CHILDREN
const QString PROPERTY_CHILDREN
Definition: parserutils.h:136
DataInformation::logError
QDebug logError() const
just a shorthand for logger->error(this)
Definition: datainformation.h:324
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:04:09 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