Browse Source

More QByteArray manipulation stuff

Neal Wilson 10 years ago
parent
commit
a9c19462b7
1 changed files with 108 additions and 12 deletions
  1. 108
    12
      src/typica.w

+ 108
- 12
src/typica.w View File

2051
 QScriptValue QIODevice_readBytes(QScriptContext *context, QScriptEngine *engine)
2051
 QScriptValue QIODevice_readBytes(QScriptContext *context, QScriptEngine *engine)
2052
 {
2052
 {
2053
 	QIODevice *self = getself<QIODevice *>(context);
2053
 	QIODevice *self = getself<QIODevice *>(context);
2054
-	return QScriptValue(engine->toScriptValue<QByteArray>(self->readAll()));
2054
+	QScriptValue value = engine->toScriptValue<QByteArray>(self->readAll());
2055
+	setQByteArrayProperties(value, engine);
2056
+	return value;
2055
 }
2057
 }
2056
 
2058
 
2057
 @ Wrappers around |peek()| and |read()| are also provided.
2059
 @ Wrappers around |peek()| and |read()| are also provided.
2060
 QScriptValue QIODevice_peek(QScriptContext *context, QScriptEngine *engine)
2062
 QScriptValue QIODevice_peek(QScriptContext *context, QScriptEngine *engine)
2061
 {
2063
 {
2062
 	QIODevice *self = getself<QIODevice *>(context);
2064
 	QIODevice *self = getself<QIODevice *>(context);
2063
-	return QScriptValue(engine->toScriptValue<QByteArray>(
2064
-		self->peek(argument<int>(0, context))));
2065
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2066
+		self->peek(argument<int>(0, context)));
2067
+	setQByteArrayProperties(value, engine);
2068
+	return value;
2065
 }
2069
 }
2066
 
2070
 
2067
 QScriptValue QIODevice_read(QScriptContext *context, QScriptEngine *engine)
2071
 QScriptValue QIODevice_read(QScriptContext *context, QScriptEngine *engine)
2068
 {
2072
 {
2069
 	QIODevice *self = getself<QIODevice *>(context);
2073
 	QIODevice *self = getself<QIODevice *>(context);
2070
-	return QScriptValue(engine->toScriptValue<QByteArray>(
2071
-		self->read(argument<int>(0, context))));
2074
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2075
+		self->read(argument<int>(0, context)));
2076
+	setQByteArrayProperties(value, engine);
2077
+	return value;
2072
 }
2078
 }
2073
 
2079
 
2074
 @ In order to work with |QByteArray| this should also be exposed to the host
2080
 @ In order to work with |QByteArray| this should also be exposed to the host
2084
 QScriptValue QByteArray_setAt(QScriptContext *context, QScriptEngine *engine);
2090
 QScriptValue QByteArray_setAt(QScriptContext *context, QScriptEngine *engine);
2085
 QScriptValue QByteArray_appendBytes(QScriptContext *context, QScriptEngine *engine);
2091
 QScriptValue QByteArray_appendBytes(QScriptContext *context, QScriptEngine *engine);
2086
 QScriptValue QByteArray_appendString(QScriptContext *context, QScriptEngine *engine);
2092
 QScriptValue QByteArray_appendString(QScriptContext *context, QScriptEngine *engine);
2093
+QScriptValue QByteArray_size(QScriptContext *context, QScriptEngine *engine);
2094
+QScriptValue QByteArray_left(QScriptContext *context, QScriptEngine *engine);
2095
+QScriptValue QByteArray_right(QScriptContext *context, QScriptEngine *engine);
2096
+QScriptValue QByteArray_mid(QScriptContext *context, QScriptEngine *engine);
2097
+QScriptValue QByteArray_chop(QScriptContext *context, QScriptEngine *engine);
2098
+QScriptValue QByteArray_remove(QScriptContext *context, QScriptEngine *engine);
2087
 
2099
 
2088
 @ First, we provide some functionns for moving array data across the
2100
 @ First, we provide some functionns for moving array data across the
2089
 language barrier.
2101
 language barrier.
2130
 	value.setProperty("setAt", engine->newFunction(QByteArray_setAt));
2142
 	value.setProperty("setAt", engine->newFunction(QByteArray_setAt));
2131
 	value.setProperty("appendBytes", engine->newFunction(QByteArray_appendBytes));
2143
 	value.setProperty("appendBytes", engine->newFunction(QByteArray_appendBytes));
2132
 	value.setProperty("appendString", engine->newFunction(QByteArray_appendString));
2144
 	value.setProperty("appendString", engine->newFunction(QByteArray_appendString));
2145
+	value.setProperty("size", engine->newFunction(QByteArray_size));
2146
+	value.setProperty("left", engine->newFunction(QByteArray_left));
2147
+	value.setProperty("right", engine->newFunction(QByteArray_right));
2148
+	value.setProperty("mid", engine->newFunction(QByteArray_mid));
2149
+	value.setProperty("chop", engine->newFunction(QByteArray_chop));
2150
+	value.setProperty("remove", engine->newFunction(QByteArray_remove));
2133
 }
2151
 }
2134
 
2152
 
2135
 @ Perhaps the easiest way to deal with fixed byte strings for serial
2153
 @ Perhaps the easiest way to deal with fixed byte strings for serial
2141
 	QByteArray self = getself<QByteArray>(context);
2159
 	QByteArray self = getself<QByteArray>(context);
2142
 	QByteArray retval;
2160
 	QByteArray retval;
2143
 	retval = self.fromHex(argument<QString>(0, context).toUtf8());
2161
 	retval = self.fromHex(argument<QString>(0, context).toUtf8());
2144
-	return engine->toScriptValue<QByteArray>(retval);
2162
+	QScriptValue value = engine->toScriptValue<QByteArray>(retval);
2163
+	setQByteArrayProperties(value, engine);
2164
+	return value;
2145
 }
2165
 }
2146
 
2166
 
2147
 @ A pair of methods is provided for getting and setting values at a particular
2167
 @ A pair of methods is provided for getting and setting values at a particular
2158
 {
2178
 {
2159
 	QByteArray self = getself<QByteArray>(context);
2179
 	QByteArray self = getself<QByteArray>(context);
2160
 	self[argument<int>(0, context)] = (char)(argument<int>(1, context));
2180
 	self[argument<int>(0, context)] = (char)(argument<int>(1, context));
2181
+	return QScriptValue();
2161
 }
2182
 }
2162
 
2183
 
2163
 @ Methods are provided for appending either another |QByteArray| or a string
2184
 @ Methods are provided for appending either another |QByteArray| or a string
2168
 QScriptValue QByteArray_appendBytes(QScriptContext *context, QScriptEngine *engine)
2189
 QScriptValue QByteArray_appendBytes(QScriptContext *context, QScriptEngine *engine)
2169
 {
2190
 {
2170
 	QByteArray self = getself<QByteArray>(context);
2191
 	QByteArray self = getself<QByteArray>(context);
2171
-	return engine->toScriptValue<QByteArray>(
2172
-		self.append(argument<QByteArray>(0, context)));
2192
+	QScriptValue value =
2193
+		engine->toScriptValue<QByteArray>(
2194
+			self.append(argument<QByteArray>(0, context)));
2195
+	setQByteArrayProperties(value, engine);
2196
+	return value;
2173
 }
2197
 }
2174
 
2198
 
2175
 QScriptValue QByteArray_appendString(QScriptContext *context, QScriptEngine *engine)
2199
 QScriptValue QByteArray_appendString(QScriptContext *context, QScriptEngine *engine)
2176
 {
2200
 {
2177
 	QByteArray self = getself<QByteArray>(context);
2201
 	QByteArray self = getself<QByteArray>(context);
2178
-	return engine->toScriptValue<QByteArray>(
2202
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2179
 		self.append(argument<QString>(0, context)));
2203
 		self.append(argument<QString>(0, context)));
2204
+	setQByteArrayProperties(value, engine);
2205
+	return value;
2206
+}
2207
+
2208
+@ Checking the size of our byte array frequently a requirement.
2209
+
2210
+@<Functions for scripting@>=
2211
+QScriptValue QByteArray_size(QScriptContext *context, QScriptEngine *)
2212
+{
2213
+	QByteArray self = getself<QByteArray>(context);
2214
+	return QScriptValue(self.size());
2215
+}
2216
+
2217
+@ It is also frequently useful to be able to work with specific parts of a byte
2218
+array, so a few methods are provided for carving these up.
2219
+
2220
+@<Functions for scripting@>=
2221
+QScriptValue QByteArray_left(QScriptContext *context, QScriptEngine *engine)
2222
+{
2223
+	QByteArray self = getself<QByteArray>(context);
2224
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2225
+		self.left(argument<int>(0, context)));
2226
+	setQByteArrayProperties(value, engine);
2227
+	return value;
2228
+}
2229
+
2230
+QScriptValue QByteArray_right(QScriptContext *context, QScriptEngine *engine)
2231
+{
2232
+	QByteArray self = getself<QByteArray>(context);
2233
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2234
+		self.right(argument<int>(0, context)));
2235
+	setQByteArrayProperties(value, engine);
2236
+	return value;
2237
+}
2238
+
2239
+QScriptValue QByteArray_mid(QScriptContext *context, QScriptEngine *engine)
2240
+{
2241
+	QByteArray self = getself<QByteArray>(context);
2242
+	int length = -1;
2243
+	if(context->argumentCount() > 1)
2244
+	{
2245
+		length = argument<int>(1, context);
2246
+	}
2247
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2248
+		self.mid(argument<int>(0, context), length));
2249
+	setQByteArrayProperties(value, engine);
2250
+	return value;
2251
+}
2252
+
2253
+@ We may also want to remove bytes from an array.
2254
+
2255
+@<Functions for scripting@>=
2256
+QScriptValue QByteArray_chop(QScriptContext *context, QScriptEngine *)
2257
+{
2258
+	QByteArray self = getself<QByteArray>(context);
2259
+	self.chop(argument<int>(0, context));
2260
+	return QScriptValue();
2261
+}
2262
+
2263
+QScriptValue QByteArray_remove(QScriptContext *context, QScriptEngine *engine)
2264
+{
2265
+	QByteArray self = getself<QByteArray>(context);
2266
+	QScriptValue value = engine->toScriptValue<QByteArray>(
2267
+		self.remove(argument<int>(0, context), argument<int>(1, context)));
2268
+	setQByteArrayProperties(value, engine);
2269
+	return value;
2180
 }
2270
 }
2181
 
2271
 
2182
 @ Some protocols require manipulating larger than 8 bit numbers as a sequence
2272
 @ Some protocols require manipulating larger than 8 bit numbers as a sequence
2206
 	QByteArray retval;
2296
 	QByteArray retval;
2207
 	retval.resize(1);
2297
 	retval.resize(1);
2208
 	retval[0] = bytes[0];
2298
 	retval[0] = bytes[0];
2209
-	return engine->toScriptValue<QByteArray>(retval);
2299
+	QScriptValue v = engine->toScriptValue<QByteArray>(retval);
2300
+	setQByteArrayProperties(v, engine);
2301
+	return v;
2210
 }
2302
 }
2211
 
2303
 
2212
 QScriptValue bytesFromInt16(QScriptContext *context, QScriptEngine *engine)
2304
 QScriptValue bytesFromInt16(QScriptContext *context, QScriptEngine *engine)
2217
 	retval.resize(2);
2309
 	retval.resize(2);
2218
 	retval[0] = bytes[0];
2310
 	retval[0] = bytes[0];
2219
 	retval[1] = bytes[1];
2311
 	retval[1] = bytes[1];
2220
-	return engine->toScriptValue<QByteArray>(retval);
2312
+	QScriptValue v = engine->toScriptValue<QByteArray>(retval);
2313
+	setQByteArrayProperties(v, engine);
2314
+	return v;
2221
 }
2315
 }
2222
 
2316
 
2223
 QScriptValue bytesFromInt32(QScriptContext *context, QScriptEngine *engine)
2317
 QScriptValue bytesFromInt32(QScriptContext *context, QScriptEngine *engine)
2230
 	retval[1] = bytes[1];
2324
 	retval[1] = bytes[1];
2231
 	retval[2] = bytes[2];
2325
 	retval[2] = bytes[2];
2232
 	retval[3] = bytes[3];
2326
 	retval[3] = bytes[3];
2233
-	return engine->toScriptValue<QByteArray>(retval);
2327
+	QScriptValue v = engine->toScriptValue<QByteArray>(retval);
2328
+	setQByteArrayProperties(v, engine);
2329
+	return v;
2234
 }
2330
 }
2235
 
2331
 
2236
 @* Scripting QBuffer.
2332
 @* Scripting QBuffer.

Loading…
Cancel
Save