1 /*
2  * Copyright (c) 2024 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 #ifndef NWEB_WEBVIEW_CREAT_PDF_EXECUTE_CALLBACK_H
16 #define NWEB_WEBVIEW_CREAT_PDF_EXECUTE_CALLBACK_H
17 
18 #include <string>
19 #include <uv.h>
20 
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 #include "napi_parse_utils.h"
24 #include "nweb_value_callback.h"
25 #include "nweb_web_message.h"
26 
27 namespace OHOS::NWeb {
28 class NapiArrayBufferExt {
29 public:
30     NapiArrayBufferExt() = default;
31     ~NapiArrayBufferExt() = default;
32 
33     static napi_value JsConstructor(napi_env env, napi_callback_info info);
34 
35     static napi_value GetArrayBuffer(napi_env env, napi_callback_info info);
36 };
37 
38 class WebJsArrayBufferExt {
39 public:
WebJsArrayBufferExt(const char * value,const long size)40     explicit WebJsArrayBufferExt(const char* value, const long size) : size_(size)
41     {
42         if (value != nullptr && size > 0) {
43             value_ = new (std::nothrow) char[size];
44             if (value_ != nullptr) {
45                 if (memcpy_s(value_, size, value, size) != 0) {
46                     WVLOG_E("[CreatePDF] memcpy failed");
47                     delete[] value_;
48                     value_ = nullptr;
49                     size_ = 0;
50                 }
51             }
52         }
53     };
~WebJsArrayBufferExt()54     ~WebJsArrayBufferExt()
55     {
56         size_ = 0;
57         if (value_ != nullptr) {
58             delete[] value_;
59             value_ = nullptr;
60         }
61     }
62 
GetPDFResult()63     const char* GetPDFResult() const
64     {
65         return value_;
66     }
67 
GetPDFSize()68     long GetPDFSize() const
69     {
70         return size_;
71     }
72 
73 private:
74     char* value_ = nullptr;
75     long size_ = 0;
76 };
77 
78 class WebviewCreatePDFExecuteCallback : public NWebArrayBufferValueCallback {
79 public:
WebviewCreatePDFExecuteCallback(napi_env env,napi_ref callbackRef,napi_deferred deferred)80     explicit WebviewCreatePDFExecuteCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred)
81         : env_(env), callbackRef_(callbackRef), deferred_(deferred)
82     {}
83     ~WebviewCreatePDFExecuteCallback() = default;
84     void OnReceiveValue(const char* value, const long size) override;
85 
86 private:
87     struct ArrayBufferExecuteParam {
88         napi_env env_;
89         napi_ref callbackRef_;
90         napi_deferred deferred_;
91         char* result_;
92         long size_;
93     };
94 
95     napi_env env_ = nullptr;
96     napi_ref callbackRef_ = nullptr;
97     napi_deferred deferred_ = nullptr;
98 
99     static void UvAfterWorkCb(uv_work_t* work, int status);
100     static void UvAfterWorkCbAsync(napi_env env, napi_ref callbackRef, const char* result, const long size);
101     static void UvAfterWorkCbPromise(napi_env env, napi_deferred deferred, const char* result, const long size);
102     static void ReleaseArrayBufferExecuteParamAndUvWork(ArrayBufferExecuteParam* param, uv_work_t* work);
103 
104 public:
105     static void InitJSExcute(napi_env env, napi_value exports);
106 };
107 
108 } // namespace OHOS::NWeb
109 #endif
110