• 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
stringscriptclass.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 "stringscriptclass.h"
25 #include "../../datatypes/strings/stringdatainformation.h"
26 #include "../../parsers/parserutils.h"
27 
28 #include <KDebug>
29 
30 StringScriptClass::StringScriptClass(QScriptEngine* eng, ScriptHandlerInfo* handlerInfo)
31  : DefaultScriptClass(eng, handlerInfo)
32 {
33  //read-only properties
34  s_lengthInCodepoints = eng->toStringHandle(ParserStrings::PROPERTY_CHAR_COUNT);
35  mIterableProperties.append(qMakePair(s_lengthInCodepoints, QScriptValue::ReadOnly | QScriptValue::Undeletable));
36  s_lengthInBytes = eng->toStringHandle(ParserStrings::PROPERTY_BYTE_COUNT);
37  mIterableProperties.append(qMakePair(s_lengthInBytes, QScriptValue::ReadOnly | QScriptValue::Undeletable));
38 
39  //read-write properties
40  s_maxByteCount = eng->toStringHandle(ParserStrings::PROPERTY_MAX_BYTE_COUNT);
41  mIterableProperties.append(qMakePair(s_maxByteCount, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
42  s_maxCharCount = eng->toStringHandle(ParserStrings::PROPERTY_MAX_CHAR_COUNT);
43  mIterableProperties.append(qMakePair(s_maxCharCount, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
44  s_terminatedBy = eng->toStringHandle(ParserStrings::PROPERTY_TERMINATED_BY);
45  mIterableProperties.append(qMakePair(s_terminatedBy, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
46  s_encoding = eng->toStringHandle(ParserStrings::PROPERTY_ENCODING);
47  mIterableProperties.append(qMakePair(s_encoding, QScriptValue::PropertyFlags(QScriptValue::Undeletable)));
48 
49  mStringPrototype = eng->newObject();
50  mStringPrototype.setProperty(QLatin1String("toString"), eng->newFunction(String_proto_toString));
51 }
52 
53 StringScriptClass::~StringScriptClass()
54 {
55 }
56 
57 bool StringScriptClass::queryAdditionalProperty(const DataInformation* data, const QScriptString& name, QScriptClass::QueryFlags* flags, uint* id)
58 {
59  Q_UNUSED(data)
60  //no need to modify flags since both read and write are handled
61  if (name == s_maxByteCount || name == s_maxCharCount || name == s_terminatedBy
62  || name == s_encoding)
63  return true;
64  else if (name == s_lengthInCodepoints || name == s_lengthInBytes)
65  {
66  *flags &= ~HandlesWriteAccess;
67  return true;
68  }
69  else
70  {
71  bool isArrayIndex;
72  quint32 pos = name.toArrayIndex(&isArrayIndex);
73  if (isArrayIndex && pos <= uint(data->asString()->stringLength()))
74  {
75  *id = pos + 1; //add 1 to distinguish from the default value of 0
76  *flags &= ~HandlesWriteAccess; //writing is not yet supported
77  return true;
78  }
79  }
80  return false; //not found
81 }
82 
83 bool StringScriptClass::additionalPropertyFlags(const DataInformation* data, const QScriptString& name, uint id, QScriptValue::PropertyFlags* flags)
84 {
85  Q_UNUSED(data)
86  Q_UNUSED(name)
87  if (id != 0 )
88  {
89  *flags |= QScriptValue::ReadOnly;
90  return true;
91  }
92  return false;
93 }
94 
95 
96 QScriptValue StringScriptClass::additionalProperty(const DataInformation* data, const QScriptString& name, uint id)
97 {
98  const StringDataInformation* sData = data->asString();
99 
100  if (id != 0)
101  {
102  quint32 pos = id - 1;
103  if (pos >= uint(sData->stringLength()))
104  {
105  return engine()->currentContext()->throwError(QScriptContext::RangeError,
106  QString(QLatin1String("Attempting to access string index %1, but length is %2")).arg(
107  QString::number(pos), QString::number(sData->stringLength())));
108  }
109  else
110  {
111  return sData->valueAt(pos);
112  }
113  }
114  else if (name == s_lengthInCodepoints)
115  return sData->stringLength();
116  else if (name == s_lengthInBytes)
117  return sData->stringByteLength();
118  else if (name == s_encoding)
119  return stringEncodings[sData->encoding()];
120  else if (name == s_maxCharCount)
121  return sData->maxCharCount();
122  else if (name == s_maxByteCount)
123  return sData->maxByteCount();
124  else if (name == s_terminatedBy)
125  return sData->terminationCodePoint();
126  return QScriptValue();
127 }
128 
129 bool StringScriptClass::setAdditionalProperty(DataInformation* data, const QScriptString& name, uint, const QScriptValue& value)
130 {
131  StringDataInformation* sData = data->asString();
132 
133  if (name == s_maxCharCount)
134  {
135  if (value.isNull())
136  {
137  sData->logInfo() << "Unsetting max char count.";
138  sData->unsetTerminationMode(StringData::CharCount);
139  }
140  else
141  {
142  ParsedNumber<uint> result = ParserUtils::uintFromScriptValue(value);
143  if (result.isValid)
144  sData->setMaxCharCount(result.value);
145  else
146  sData->logError() << "Could not set maximum char count, invalid argument: " << value.toString();
147  }
148  return true;
149  }
150  else if (name == s_maxByteCount)
151  {
152  if (value.isNull())
153  {
154  sData->logInfo() << "Unsetting max byte count.";
155  sData->unsetTerminationMode(StringData::ByteCount);
156  }
157  else
158  {
159  ParsedNumber<uint> result = ParserUtils::uintFromScriptValue(value);
160  if (result.isValid)
161  sData->setMaxByteCount(result.value);
162  else
163  sData->logError() << "Could not set maximum byte count, invalid argument: " << value.toString();
164  }
165  return true;
166  }
167  else if (name == s_terminatedBy)
168  {
169  if (value.isNull())
170  {
171  sData->logInfo() << "Unsetting termination character.";
172  sData->unsetTerminationMode(StringData::Sequence);
173  }
174  else
175  {
176  if (value.isString())
177  {
178  QString str = value.toString();
179  //we don't handle surrogate pairs, if you want to set that use a number instead.
180  if (str.length() != 1)
181  sData->logError() << "Setting termination char: expected one char or a code point number"
182  ", got a string with length " << str.length();
183  else
184  sData->setTerminationCodePoint(str[0].unicode());
185  }
186  else
187  {
188  ParsedNumber<uint> result = ParserUtils::uintFromScriptValue(value);
189  if (result.isValid)
190  sData->setTerminationCodePoint(result.value);
191  else
192  sData->logError() << "Could not set maximum byte count, invalid argument: " << value.toString();
193  }
194  }
195  return true;
196  }
197  else if (name == s_encoding)
198  {
199  QString enc = value.toString();
200  StringDataInformation::StringType encoding = ParserUtils::toStringEncoding(enc,
201  LoggerWithContext(sData->logger(), sData->fullObjectPath()));
202  if (encoding == StringDataInformation::InvalidEncoding)
203  sData->logError() << "Attempting to set invalid encoding:" << enc;
204  else
205  sData->setEncoding(encoding);
206  return true;
207  }
208  return false;
209 }
210 
211 QScriptValue StringScriptClass::prototype() const
212 {
213  return mStringPrototype;
214 }
215 
216 QScriptValue StringScriptClass::String_proto_toString(QScriptContext* ctx, QScriptEngine* eng)
217 {
218  DataInformation* data = toDataInformation(ctx->thisObject().data());
219  if (!data)
220  {
221  kWarning() << "could not cast data";
222  return eng->undefinedValue();
223  }
224  return data->wasAbleToRead() ? data->valueString() : eng->undefinedValue();
225 }
226 
227 
228 
229 
230 
231 
232 
DataInformation::valueString
QString valueString() const
by default just returns an empty QString
Definition: datainformation.h:414
DataInformation
Interface that must be implemented by all datatypes.
Definition: datainformation.h:67
DataInformation::fullObjectPath
QString fullObjectPath() const
Definition: datainformation.cpp:258
LoggerWithContext
Definition: scriptlogger.h:94
StringDataInformation::terminationCodePoint
uint terminationCodePoint() const
Definition: stringdatainformation.h:135
StringScriptClass::mStringPrototype
QScriptValue mStringPrototype
Definition: stringscriptclass.h:50
StringDataInformation::setTerminationCodePoint
void setTerminationCodePoint(uint term)
Definition: stringdatainformation.h:140
ParserStrings::PROPERTY_MAX_BYTE_COUNT
const QString PROPERTY_MAX_BYTE_COUNT
Definition: parserutils.h:143
DataInformation::wasAbleToRead
bool wasAbleToRead() const
Definition: datainformation.h:283
ParsedNumber::value
T value
Definition: parserutils.h:88
StringData::ByteCount
Definition: stringdata.h:45
StringScriptClass::queryAdditionalProperty
virtual bool queryAdditionalProperty(const DataInformation *data, const QScriptString &name, QScriptClass::QueryFlags *flags, uint *id)
Definition: stringscriptclass.cpp:57
StringScriptClass::s_terminatedBy
QScriptString s_terminatedBy
Definition: stringscriptclass.h:47
ParsedNumber
Holds a number that was converted either from a QScriptValue or a QString.
Definition: parserutils.h:84
ParserStrings::PROPERTY_BYTE_COUNT
const QString PROPERTY_BYTE_COUNT
Definition: parserutils.h:141
DataInformation::logger
ScriptLogger * logger() const
Definition: datainformation.cpp:134
StringDataInformation::setMaxCharCount
void setMaxCharCount(uint count)
Definition: stringdatainformation.h:130
StringDataInformation::unsetTerminationMode
void unsetTerminationMode(StringData::TerminationMode mode)
Removes this mode from the termination modes.
Definition: stringdatainformation.cpp:314
StringScriptClass::s_encoding
QScriptString s_encoding
Definition: stringscriptclass.h:46
ParserStrings::PROPERTY_ENCODING
const QString PROPERTY_ENCODING
Definition: parserutils.h:145
ParserUtils::uintFromScriptValue
ParsedNumber< uint > uintFromScriptValue(const QScriptValue &val)
Definition: parserutils.cpp:103
stringEncodings
const QLatin1String stringEncodings[]
Definition: stringdatainformation.h:34
DataInformation::logInfo
QDebug logInfo() const
just a shorthand for logger->info(this)
Definition: datainformation.h:314
StringDataInformation::InvalidEncoding
Definition: stringdatainformation.h:44
StringScriptClass::additionalProperty
virtual QScriptValue additionalProperty(const DataInformation *data, const QScriptString &name, uint id)
Definition: stringscriptclass.cpp:96
DataInformationBase::asString
StringDataInformation * asString()
ParserUtils::toStringEncoding
StringDataInformation::StringType toStringEncoding(const QString &str, const LoggerWithContext &logger)
Definition: parserutils.cpp:148
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
ParserStrings::PROPERTY_CHAR_COUNT
const QString PROPERTY_CHAR_COUNT
Definition: parserutils.h:140
StringData::Sequence
Definition: stringdata.h:43
StringScriptClass::StringScriptClass
StringScriptClass(QScriptEngine *engine, ScriptHandlerInfo *handlerInfo)
Definition: stringscriptclass.cpp:30
StringDataInformation::setEncoding
void setEncoding(StringType encoding)
Definition: stringdatainformation.cpp:183
StringDataInformation::StringType
StringType
Definition: stringdatainformation.h:43
StringScriptClass::String_proto_toString
static QScriptValue String_proto_toString(QScriptContext *ctx, QScriptEngine *eng)
Definition: stringscriptclass.cpp:216
DefaultScriptClass::mIterableProperties
PropertyInfoList mIterableProperties
Contains all properties of this class, classes inheriting should add their own properties to this lis...
Definition: defaultscriptclass.h:82
StringDataInformation::encoding
StringType encoding() const
Definition: stringdatainformation.h:110
StringScriptClass::s_lengthInCodepoints
QScriptString s_lengthInCodepoints
Definition: stringscriptclass.h:44
StringScriptClass::setAdditionalProperty
virtual bool setAdditionalProperty(DataInformation *data, const QScriptString &name, uint id, const QScriptValue &value)
Definition: stringscriptclass.cpp:129
StringDataInformation::maxByteCount
uint maxByteCount() const
Definition: stringdatainformation.h:115
StringScriptClass::additionalPropertyFlags
virtual bool additionalPropertyFlags(const DataInformation *data, const QScriptString &name, uint, QScriptValue::PropertyFlags *flags)
Definition: stringscriptclass.cpp:83
StringScriptClass::~StringScriptClass
virtual ~StringScriptClass()
Definition: stringscriptclass.cpp:53
StringDataInformation::stringLength
int stringLength() const
Definition: stringdatainformation.h:145
ScriptHandlerInfo
Definition: scripthandlerinfo.h:39
StringScriptClass::s_lengthInBytes
QScriptString s_lengthInBytes
Definition: stringscriptclass.h:45
StringScriptClass::s_maxByteCount
QScriptString s_maxByteCount
Definition: stringscriptclass.h:49
StringDataInformation::valueAt
QString valueAt(int index) const
Definition: stringdatainformation.h:160
DefaultScriptClass
Definition: defaultscriptclass.h:36
ParserStrings::PROPERTY_MAX_CHAR_COUNT
const QString PROPERTY_MAX_CHAR_COUNT
Definition: parserutils.h:142
StringDataInformation::maxCharCount
uint maxCharCount() const
Definition: stringdatainformation.h:125
StringDataInformation::setMaxByteCount
void setMaxByteCount(uint count)
Definition: stringdatainformation.h:120
ParsedNumber::isValid
bool isValid
Definition: parserutils.h:89
StringData::CharCount
Definition: stringdata.h:44
StringScriptClass::s_maxCharCount
QScriptString s_maxCharCount
Definition: stringscriptclass.h:48
StringDataInformation
Definition: stringdatainformation.h:39
StringScriptClass::prototype
virtual QScriptValue prototype() const
Definition: stringscriptclass.cpp:211
stringscriptclass.h
ParserStrings::PROPERTY_TERMINATED_BY
const QString PROPERTY_TERMINATED_BY
Definition: parserutils.h:144
DataInformation::logError
QDebug logError() const
just a shorthand for logger->error(this)
Definition: datainformation.h:324
StringDataInformation::stringByteLength
int stringByteLength() const
Definition: stringdatainformation.h:150
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