Quellcode durchsuchen

Merge pull request #453 from Type1J/master

Variant to Uint8Array mapping
JoshEngebretson vor 10 Jahren
Ursprung
Commit
eb957166fe

+ 1 - 1
Source/Atomic/Web/Web.h

@@ -32,7 +32,7 @@ namespace Atomic
 class WebRequest;
 class WebSocket;
 
-class WebPrivate;
+struct WebPrivate;
 
 /// %Web subsystem. Manages HTTP requests and WebSocket communications.
 class ATOMIC_API Web : public Object

+ 57 - 1
Source/AtomicJS/Javascript/JSAPI.cpp

@@ -235,6 +235,42 @@ void js_object_to_variantmap(duk_context* ctx, int objIdx, VariantMap &v)
 
 }
 
+duk_bool_t js_check_is_buffer_and_get_data(duk_context* ctx, duk_idx_t idx, void** data, duk_size_t* size)
+{
+    void* temp;
+    if (duk_is_buffer(ctx, idx))
+    {
+        temp = duk_get_buffer_data(ctx, idx, size);
+        if (data)
+        {
+            *data = temp;
+        }
+        return true;
+    }
+    if (!(duk_is_object(ctx, idx) &&
+        duk_has_prop_string(ctx, idx, "length") &&
+        duk_has_prop_string(ctx, idx, "byteLength") &&
+        duk_has_prop_string(ctx, idx, "byteOffset") &&
+        duk_has_prop_string(ctx, idx, "BYTES_PER_ELEMENT")))
+    {
+        if (data)
+        {
+            *data = nullptr;
+        }
+        if (size)
+        {
+            *size = 0;
+        }
+        return false;
+    }
+    temp = duk_require_buffer_data(ctx, idx, size);
+    if (data)
+    {
+        *data = temp;
+    }
+    return true;
+}
+
 void js_to_variant(duk_context* ctx, int variantIdx, Variant &v)
 {
     v.Clear();
@@ -313,7 +349,18 @@ void js_to_variant(duk_context* ctx, int variantIdx, Variant &v)
         return;
     }
 
-    // object check after array
+    {
+        void* bufferData;
+        duk_size_t bufferSize;
+        if (js_check_is_buffer_and_get_data(ctx, variantIdx, &bufferData, &bufferSize))
+        {
+            // copy the buffer into the variant
+            v.SetBuffer(bufferData, (unsigned)bufferSize);
+            return;
+        }
+    }
+
+    // object check after array and buffer object check
     if (duk_is_object(ctx, variantIdx))
     {
         RefCounted* o = js_to_class_instance<RefCounted>(ctx, variantIdx, 0);
@@ -473,6 +520,15 @@ void js_push_variant(duk_context *ctx, const Variant& v)
     case VAR_STRING:
         duk_push_string(ctx, v.GetString().CString());
         break;
+    case VAR_BUFFER:
+    {
+        const PODVector<unsigned char>& buffer(v.GetBuffer()); // The braces are to scope this reference.
+        duk_push_fixed_buffer(ctx, buffer.Size());
+        duk_push_buffer_object(ctx, -1, 0, buffer.Size(), DUK_BUFOBJ_UINT8ARRAY);
+        duk_replace(ctx, -2);
+        unsigned char* data((unsigned char*)duk_require_buffer_data(ctx, -1, (duk_size_t*)nullptr));
+        memcpy(data, buffer.Buffer(), buffer.Size());
+    }   break;
     case VAR_VECTOR2:
         vector2 = v.GetVector2();
         duk_push_array(ctx);

+ 2 - 0
Source/AtomicJS/Javascript/JSAPI.h

@@ -63,4 +63,6 @@ void js_to_variant(duk_context* ctx, int variantIdx, Variant &v);
 
 void js_object_to_variantmap(duk_context* ctx, int objIdx, VariantMap &v);
 
+/// Returns true if the item is a buffer, and if data and size are passed, they are given values to access the buffer data.
+duk_bool_t js_check_is_buffer_and_get_data(duk_context* ctx, duk_idx_t idx, void** data, duk_size_t* size);
 }