• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "quickjs_native_buffer.h"
16 
17 struct QuickJSBufferCallback {
CreateNewInstanceQuickJSBufferCallback18     static QuickJSBufferCallback* CreateNewInstance()
19     {
20         return new QuickJSBufferCallback();
21     }
22     NativeEngine* engine = nullptr;
23     NativeFinalize cb = nullptr;
24     void* hint = nullptr;
25 };
26 
QuickJSNativeBuffer(QuickJSNativeEngine * engine,JSValue value)27 QuickJSNativeBuffer::QuickJSNativeBuffer(QuickJSNativeEngine* engine, JSValue value)
28     : QuickJSNativeObject(engine, value)
29 {
30     SetPriviteProperty(engine_->GetContext(), value);
31 }
32 
QuickJSNativeBuffer(QuickJSNativeEngine * engine,uint8_t ** value,size_t length)33 QuickJSNativeBuffer::QuickJSNativeBuffer(QuickJSNativeEngine* engine, uint8_t** value, size_t length)
34     : QuickJSNativeBuffer(engine, JS_NULL)
35 {
36     size_t size = 0;
37     value_ = JS_NewArrayBufferCopy(engine_->GetContext(), nullptr, length);
38     SetPriviteProperty(engine_->GetContext(), value_);
39     *value = JS_GetArrayBuffer(engine_->GetContext(), &size, value_);
40 }
41 
QuickJSNativeBuffer(QuickJSNativeEngine * engine,uint8_t ** value,size_t length,const void * data)42 QuickJSNativeBuffer::QuickJSNativeBuffer(QuickJSNativeEngine* engine, uint8_t** value, size_t length, const void* data)
43     : QuickJSNativeBuffer(engine, JS_NULL)
44 {
45     size_t size = 0;
46     if (data != nullptr) {
47         value_ = JS_NewArrayBufferCopy(engine_->GetContext(), (uint8_t*)data, length);
48         SetPriviteProperty(engine_->GetContext(), value_);
49         *value = JS_GetArrayBuffer(engine_->GetContext(), &size, value_);
50     }
51 }
52 
QuickJSNativeBuffer(QuickJSNativeEngine * engine,uint8_t * data,size_t length,NativeFinalize cb,void * hint)53 QuickJSNativeBuffer::QuickJSNativeBuffer(
54     QuickJSNativeEngine* engine, uint8_t* data, size_t length, NativeFinalize cb, void* hint)
55     : QuickJSNativeObject(engine, JS_NULL)
56 {
57     auto cbinfo = QuickJSBufferCallback::CreateNewInstance();
58     if (cbinfo != nullptr) {
59         cbinfo->engine = engine_;
60         cbinfo->cb = cb;
61         cbinfo->hint = hint;
62     }
63     value_ = JS_NewArrayBuffer(
64         engine_->GetContext(), data, length,
65         [](JSRuntime* rt, void* opaque, void* ptr) -> void {
66             auto cbinfo = reinterpret_cast<QuickJSBufferCallback*>(opaque);
67             if (cbinfo != nullptr && cbinfo->cb != nullptr) {
68                 cbinfo->cb(cbinfo->engine, ptr, cbinfo->hint);
69                 delete cbinfo;
70             }
71         },
72         (void*)cbinfo, false);
73     SetPriviteProperty(engine_->GetContext(), value_);
74 }
75 
~QuickJSNativeBuffer()76 QuickJSNativeBuffer::~QuickJSNativeBuffer() {}
77 
GetInterface(int interfaceId)78 void* QuickJSNativeBuffer::GetInterface(int interfaceId)
79 {
80     return (NativeBuffer::INTERFACE_ID == interfaceId) ? (NativeBuffer*)this
81                                                        : QuickJSNativeObject::GetInterface(interfaceId);
82 }
83 
GetBuffer()84 void* QuickJSNativeBuffer::GetBuffer()
85 {
86     void* buffer = nullptr;
87     size_t bufferSize = 0;
88     buffer = JS_GetArrayBuffer(engine_->GetContext(), &bufferSize, value_);
89     return buffer;
90 }
91 
GetLength()92 size_t QuickJSNativeBuffer::GetLength()
93 {
94     void* buffer = nullptr;
95     size_t bufferSize = 0;
96     buffer = JS_GetArrayBuffer(engine_->GetContext(), &bufferSize, value_);
97     return bufferSize;
98 }
99 
SetPriviteProperty(JSContext * context,JSValue value)100 void QuickJSNativeBuffer::SetPriviteProperty(JSContext* context, JSValue value)
101 {
102     JSAtom key = JS_NewAtom(context, "napi_buffer");
103     JSValue keyValue = JS_NewBool(context, true);
104     JS_SetPropertyInternal(context, value, key, JS_DupValue(context, keyValue), JS_PROP_C_W_E | JS_PROP_THROW);
105 
106     JS_FreeValue(engine_->GetContext(), keyValue);
107     JS_FreeAtom(engine_->GetContext(), key);
108 }
109