Skip to content

Commit 86bb580

Browse files
committed
support GValues with GByteArray in them
1 parent cfa4c02 commit 86bb580

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

src/value.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,6 +1416,8 @@ bool CanConvertV8ToGValue(GValue *gvalue, Local<Value> value) {
14161416
} else if (G_VALUE_HOLDS_OBJECT (gvalue)) {
14171417
return ValueIsInstanceOfGType(value, G_VALUE_TYPE (gvalue));
14181418
} else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1419+
if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY)
1420+
return value->IsUint8Array();
14191421
return ValueIsInstanceOfGType(value, G_VALUE_TYPE (gvalue));
14201422
} else if (G_VALUE_HOLDS_PARAM (gvalue)) {
14211423
return value->IsObject();
@@ -1488,6 +1490,19 @@ bool V8ToGValue(GValue *gvalue, Local<Value> value, bool mustCopy) {
14881490
}
14891491
g_value_set_object (gvalue, GObjectFromWrapper (value));
14901492
} else if (G_VALUE_HOLDS_BOXED (gvalue)) {
1493+
if (G_VALUE_TYPE (gvalue) == G_TYPE_BYTE_ARRAY) {
1494+
if (!value->IsUint8Array()) {
1495+
Throw::CannotConvertGType("GByteArray", G_VALUE_TYPE (gvalue));
1496+
return false;
1497+
}
1498+
auto array = value.As<v8::Uint8Array>();
1499+
auto garray = g_byte_array_sized_new(array->ByteLength());
1500+
g_byte_array_set_size(garray, array->ByteLength());
1501+
array->CopyContents(garray->data, garray->len);
1502+
g_value_take_boxed(gvalue, garray);
1503+
return true;
1504+
}
1505+
14911506
if (!ValueIsInstanceOfGType(value, G_VALUE_TYPE (gvalue))) {
14921507
Throw::CannotConvertGType("boxed", G_VALUE_TYPE (gvalue));
14931508
return false;
@@ -1555,6 +1570,11 @@ Local<Value> GValueToV8(const GValue *gvalue, bool mustCopy) {
15551570
return WrapperFromGObject (G_OBJECT (g_value_get_object (gvalue)));
15561571
} else if (G_VALUE_HOLDS_BOXED (gvalue)) {
15571572
GType gtype = G_VALUE_TYPE (gvalue);
1573+
if (gtype == G_TYPE_BYTE_ARRAY) {
1574+
auto garray = (GByteArray*) g_value_get_boxed(gvalue);
1575+
return Nan::CopyBuffer((char*)garray->data, garray->len).ToLocalChecked();
1576+
}
1577+
15581578
GIBaseInfo *info = g_irepository_find_by_gtype(NULL, gtype);
15591579
if (info == NULL) {
15601580
Throw::InvalidGType(gtype);

0 commit comments

Comments
 (0)