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 <cstddef>
16 #include "pastedata_napi.h"
17 #include "pastedata_record_napi.h"
18 #include "pasteboard_common.h"
19 #include "pasteboard_hilog.h"
20 #include "napi_common.h"
21 #include "pasteboard_js_err.h"
22 using namespace OHOS::MiscServices;
23 using namespace OHOS::Media;
24
25 namespace OHOS {
26 namespace MiscServicesNapi {
27 namespace {
28 constexpr int ARGC_TYPE_SET0 = 0;
29 constexpr int ARGC_TYPE_SET1 = 1;
30 constexpr int ARGC_TYPE_SET2 = 2;
31 const int32_t STR_MAX_SIZE = 256;
32 constexpr int32_t MIMETYPE_MAX_SIZE = 1024;
33 constexpr int32_t MAX_TEXT_LEN = 20 * 1024 * 1024;
34 constexpr size_t STR_TAIL_LENGTH = 1;
35 constexpr size_t MAX_RECORD_NUM = 512;
36 } // namespace
37 static thread_local napi_ref g_pasteData = nullptr;
38
PasteDataNapi()39 PasteDataNapi::PasteDataNapi() : env_(nullptr), wrapper_(nullptr)
40 {
41 value_ = std::make_shared<PasteData>();
42 }
43
~PasteDataNapi()44 PasteDataNapi::~PasteDataNapi()
45 {
46 napi_delete_reference(env_, wrapper_);
47 }
48
AddHtmlRecord(napi_env env,napi_callback_info info)49 napi_value PasteDataNapi::AddHtmlRecord(napi_env env, napi_callback_info info)
50 {
51 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddHtmlRecord is called!");
52 size_t argc = 1;
53 napi_value argv[1] = {0};
54 napi_value thisVar = nullptr;
55
56 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
57 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
58
59 std::string str;
60 bool ret = GetValue(env, argv[0], str);
61 if (!ret) {
62 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
63 return nullptr;
64 }
65
66 PasteDataNapi *obj = nullptr;
67 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
68 if ((status != napi_ok) || (obj == nullptr)) {
69 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddHtmlRecord object failed");
70 return nullptr;
71 }
72 obj->value_->AddHtmlRecord(str);
73 return nullptr;
74 }
75
AddPixelMapRecord(napi_env env,napi_callback_info info)76 napi_value PasteDataNapi::AddPixelMapRecord(napi_env env, napi_callback_info info)
77 {
78 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddPixelMapRecord is called begin!");
79 size_t argc = ARGC_TYPE_SET1;
80 napi_value argv[ARGC_TYPE_SET1] = { 0 };
81 napi_value thisVar = nullptr;
82
83 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
84 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
85
86 napi_valuetype valueType = napi_undefined;
87 NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
88 NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
89
90 std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[0]);
91 if (pixelMap == nullptr) {
92 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetPixelMap!");
93 return nullptr;
94 }
95
96 PasteDataNapi *obj = nullptr;
97 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
98 if ((status != napi_ok) || (obj == nullptr)) {
99 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "unwrap failed");
100 return nullptr;
101 }
102 obj->value_->AddPixelMapRecord(pixelMap);
103 return nullptr;
104 }
105
AddTextRecord(napi_env env,napi_callback_info info)106 napi_value PasteDataNapi::AddTextRecord(napi_env env, napi_callback_info info)
107 {
108 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddTextRecord is called!");
109 size_t argc = 1;
110 napi_value argv[1] = {0};
111 napi_value thisVar = nullptr;
112
113 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
114 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
115
116 std::string str;
117 bool ret = GetValue(env, argv[0], str);
118 if (!ret) {
119 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
120 return nullptr;
121 }
122
123 PasteDataNapi *obj = nullptr;
124 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
125 if ((status != napi_ok) || (obj == nullptr)) {
126 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddTextRecord object failed");
127 return nullptr;
128 }
129 obj->value_->AddTextRecord(str);
130 return nullptr;
131 }
132
AddUriRecord(napi_env env,napi_callback_info info)133 napi_value PasteDataNapi::AddUriRecord(napi_env env, napi_callback_info info)
134 {
135 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddUriRecord is called!");
136 size_t argc = 1;
137 napi_value argv[1] = {0};
138 napi_value thisVar = nullptr;
139
140 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
141 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
142
143 std::string str;
144 bool ret = GetValue(env, argv[0], str);
145 if (!ret) {
146 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
147 return nullptr;
148 }
149
150 PasteDataNapi *obj = nullptr;
151 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
152 if ((status != napi_ok) || (obj == nullptr)) {
153 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddUriRecord object failed");
154 return nullptr;
155 }
156 obj->value_->AddUriRecord(OHOS::Uri(str));
157 return nullptr;
158 }
159
GetPrimaryHtml(napi_env env,napi_callback_info info)160 napi_value PasteDataNapi::GetPrimaryHtml(napi_env env, napi_callback_info info)
161 {
162 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryHtml is called!");
163 size_t argc = 1;
164 napi_value argv[1] = {0};
165 napi_value thisVar = nullptr;
166
167 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
168 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
169
170 PasteDataNapi *obj = nullptr;
171 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
172 if ((status != napi_ok) || (obj == nullptr)) {
173 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryHtml object failed");
174 return nullptr;
175 }
176
177 std::shared_ptr<std::string> p = obj->value_->GetPrimaryHtml();
178 if (p == nullptr) {
179 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryHtml failed");
180 return nullptr;
181 }
182
183 napi_value result = nullptr;
184 napi_create_string_utf8(env, p->c_str(), NAPI_AUTO_LENGTH, &result);
185 return result;
186 }
187
GetPrimaryPixelMap(napi_env env,napi_callback_info info)188 napi_value PasteDataNapi::GetPrimaryPixelMap(napi_env env, napi_callback_info info)
189 {
190 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryPixelMap is called!");
191 size_t argc = ARGC_TYPE_SET1;
192 napi_value argv[ARGC_TYPE_SET1] = { 0 };
193 napi_value thisVar = nullptr;
194
195 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
196 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
197
198 PasteDataNapi *obj = nullptr;
199 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
200 if ((status != napi_ok) || (obj == nullptr)) {
201 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "unwrap failed");
202 return nullptr;
203 }
204
205 std::shared_ptr<PixelMap> pixelMap = obj->value_->GetPrimaryPixelMap();
206 if (!pixelMap) {
207 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "pixelMap is nullptr");
208 return nullptr;
209 }
210
211 napi_value jsPixelMap = PixelMapNapi::CreatePixelMap(env, pixelMap);
212 return jsPixelMap;
213 }
214
GetPrimaryText(napi_env env,napi_callback_info info)215 napi_value PasteDataNapi::GetPrimaryText(napi_env env, napi_callback_info info)
216 {
217 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryText is called!");
218 size_t argc = 1;
219 napi_value argv[1] = {0};
220 napi_value thisVar = nullptr;
221
222 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
223 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
224
225 PasteDataNapi *obj = nullptr;
226 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
227 if ((status != napi_ok) || (obj == nullptr)) {
228 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryText object failed");
229 return nullptr;
230 }
231
232 std::shared_ptr<std::string> p = obj->value_->GetPrimaryText();
233 if (p == nullptr) {
234 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryText failed");
235 return nullptr;
236 }
237
238 napi_value result = nullptr;
239 napi_create_string_utf8(env, p->c_str(), NAPI_AUTO_LENGTH, &result);
240 return result;
241 }
242
GetPrimaryUri(napi_env env,napi_callback_info info)243 napi_value PasteDataNapi::GetPrimaryUri(napi_env env, napi_callback_info info)
244 {
245 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryUri is called!");
246 size_t argc = 1;
247 napi_value argv[1] = {0};
248 napi_value thisVar = nullptr;
249
250 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
251 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
252
253 PasteDataNapi *obj = nullptr;
254 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
255 if ((status != napi_ok) || (obj == nullptr)) {
256 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryUri object failed");
257 return nullptr;
258 }
259
260 std::shared_ptr<OHOS::Uri> p = obj->value_->GetPrimaryUri();
261 if (p == nullptr) {
262 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryUri failed");
263 return nullptr;
264 }
265
266 std::string text = p->ToString();
267 napi_value result = nullptr;
268 napi_create_string_utf8(env, text.c_str(), NAPI_AUTO_LENGTH, &result);
269 return result;
270 }
271
HasMimeType(napi_env env,napi_callback_info info)272 napi_value PasteDataNapi::HasMimeType(napi_env env, napi_callback_info info)
273 {
274 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "HasMimeType is called!");
275 size_t argc = 1;
276 napi_value argv[1] = { 0 };
277 napi_value thisVar = nullptr;
278
279 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
280 if ((!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
281 "Parameter error. Wrong number of arguments."))
282 || (!CheckArgsType(env, argv[0], napi_string, "Parameter error. The type of mimeType must be string."))) {
283 return nullptr;
284 }
285
286 std::string mimeType;
287 if (!GetValue(env, argv[0], mimeType)) {
288 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
289 return nullptr;
290 }
291
292 PasteDataNapi *obj = nullptr;
293 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
294 if ((status != napi_ok) || (obj == nullptr)) {
295 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddHtmlRecord object failed");
296 return nullptr;
297 }
298
299 bool ret = obj->value_->HasMimeType(mimeType);
300 napi_value result = nullptr;
301 napi_get_boolean(env, ret, &result);
302 return result;
303 }
304
HasType(napi_env env,napi_callback_info info)305 napi_value PasteDataNapi::HasType(napi_env env, napi_callback_info info)
306 {
307 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "HasType is called!");
308 return HasMimeType(env, info);
309 }
310
RemoveAndGetRecordCommon(napi_env env,napi_callback_info info,uint32_t & index)311 PasteDataNapi* PasteDataNapi::RemoveAndGetRecordCommon(napi_env env, napi_callback_info info, uint32_t &index)
312 {
313 size_t argc = 1;
314 napi_value argv[1] = {0};
315 napi_value thisVar = nullptr;
316 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
317
318 if ((!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
319 "Parameter error. Wrong number of arguments."))
320 || (!CheckArgsType(env, argv[0], napi_number, "Parameter error. The type of mimeType must be number."))) {
321 return nullptr;
322 }
323 PasteDataNapi *obj = nullptr;
324 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
325 if ((status != napi_ok) || (obj == nullptr)) {
326 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get RemoveRecord object failed");
327 return nullptr;
328 }
329 NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
330 return obj;
331 }
332
RemoveRecordAt(napi_env env,napi_callback_info info)333 napi_value PasteDataNapi::RemoveRecordAt(napi_env env, napi_callback_info info)
334 {
335 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecordAt is called!");
336 uint32_t index = 0;
337 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
338 if (obj == nullptr) {
339 return nullptr;
340 }
341 bool ret = obj->value_->RemoveRecordAt(index);
342 napi_value result = nullptr;
343 napi_get_boolean(env, ret, &result);
344 return result;
345 }
346
RemoveRecord(napi_env env,napi_callback_info info)347 napi_value PasteDataNapi::RemoveRecord(napi_env env, napi_callback_info info)
348 {
349 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecord is called!");
350 uint32_t index = 0;
351 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
352 if (obj == nullptr
353 || !CheckExpression(env, index < obj->value_->GetRecordCount(),
354 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
355 return nullptr;
356 }
357 obj->value_->RemoveRecordAt(index);
358 return nullptr;
359 }
360
GetPrimaryMimeType(napi_env env,napi_callback_info info)361 napi_value PasteDataNapi::GetPrimaryMimeType(napi_env env, napi_callback_info info)
362 {
363 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryMimeType is called!");
364 size_t argc = 1;
365 napi_value argv[1] = {0};
366 napi_value thisVar = nullptr;
367
368 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
369 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
370
371 PasteDataNapi *obj = nullptr;
372 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
373 if ((status != napi_ok) || (obj == nullptr)) {
374 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType object failed");
375 return nullptr;
376 }
377 std::shared_ptr<std::string> mimeType = obj->value_->GetPrimaryMimeType();
378 if (mimeType == nullptr) {
379 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType failed");
380 return nullptr;
381 }
382 napi_value result = nullptr;
383 napi_create_string_utf8(env, mimeType->c_str(), NAPI_AUTO_LENGTH, &result);
384
385 return result;
386 }
387
GetRecordCount(napi_env env,napi_callback_info info)388 napi_value PasteDataNapi::GetRecordCount(napi_env env, napi_callback_info info)
389 {
390 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecordCount is called!");
391 size_t argc = 1;
392 napi_value argv[1] = {0};
393 napi_value thisVar = nullptr;
394
395 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
396 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
397
398 PasteDataNapi *obj = nullptr;
399 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
400 if ((status != napi_ok) || (obj == nullptr)) {
401 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetRecordCount object failed");
402 return nullptr;
403 }
404
405 size_t count = obj->value_->GetRecordCount();
406 napi_value result = nullptr;
407 napi_create_int64(env, count, &result);
408
409 return result;
410 }
411
GetTag(napi_env env,napi_callback_info info)412 napi_value PasteDataNapi::GetTag(napi_env env, napi_callback_info info)
413 {
414 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetTag is called!");
415 size_t argc = 1;
416 napi_value argv[1] = {0};
417 napi_value thisVar = nullptr;
418
419 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
420 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
421
422 PasteDataNapi *obj = nullptr;
423 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
424 if ((status != napi_ok) || (obj == nullptr)) {
425 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetTag object failed");
426 return nullptr;
427 }
428 std::string tag = obj->value_->GetTag();
429 napi_value result = nullptr;
430 napi_create_string_utf8(env, tag.c_str(), NAPI_AUTO_LENGTH, &result);
431
432 return result;
433 }
434
GetMimeTypes(napi_env env,napi_callback_info info)435 napi_value PasteDataNapi::GetMimeTypes(napi_env env, napi_callback_info info)
436 {
437 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetMimeTypes is called!");
438 size_t argc = 1;
439 napi_value argv[1] = {0};
440 napi_value thisVar = nullptr;
441
442 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
443 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
444
445 PasteDataNapi *obj = nullptr;
446 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
447 if ((status != napi_ok) || (obj == nullptr)) {
448 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetMimeTypes object failed");
449 return nullptr;
450 }
451 std::vector<std::string> mimeTypes = obj->value_->GetMimeTypes();
452 if (mimeTypes.size() == 0) {
453 return nullptr;
454 }
455
456 napi_value nMimeTypes = nullptr;
457 if (napi_create_array(env, &nMimeTypes) != napi_ok) {
458 return nullptr;
459 }
460 size_t index = 0;
461 napi_value value = nullptr;
462 for (auto type : mimeTypes) {
463 napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &value);
464 napi_set_element(env, nMimeTypes, index, value);
465 index++;
466 }
467 return nMimeTypes;
468 }
469
AddRecord(napi_env env,napi_value * argv,size_t argc,PasteDataNapi * obj)470 void PasteDataNapi::AddRecord(napi_env env, napi_value *argv, size_t argc, PasteDataNapi *obj)
471 {
472 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddRecordV9!");
473 if (!CheckExpression(env, obj->value_->GetRecordCount() < MAX_RECORD_NUM, JSErrorCode::RECORD_EXCEEDS_LIMIT,
474 "The count of records in PasteData exceeds MAX_RECORD_NUM.")) {
475 return;
476 }
477 std::string mimeType;
478 if (!CheckArgs(env, argv, argc, mimeType)) {
479 return;
480 }
481 bool isArrayBuffer = false;
482 NAPI_CALL_RETURN_VOID(env, napi_is_arraybuffer(env, argv[1], &isArrayBuffer));
483 if (isArrayBuffer) {
484 void *data = nullptr;
485 size_t dataLen = 0;
486 NAPI_CALL_RETURN_VOID(env, napi_get_arraybuffer_info(env, argv[1], &data, &dataLen));
487 obj->value_->AddKvRecord(mimeType,
488 std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
489 return;
490 }
491 if (mimeType == MIMETYPE_PIXELMAP) {
492 std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[1]);
493 obj->value_->AddPixelMapRecord(pixelMap);
494 return;
495 } else if (mimeType == MIMETYPE_TEXT_WANT) {
496 OHOS::AAFwk::Want want;
497 AppExecFwk::UnwrapWant(env, argv[1], want);
498 obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
499 return;
500 }
501
502 std::string str;
503 bool ret = GetValue(env, argv[1], str);
504 if (!ret) {
505 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
506 return;
507 }
508 if (mimeType == MIMETYPE_TEXT_HTML) {
509 obj->value_->AddHtmlRecord(str);
510 } else if (mimeType == MIMETYPE_TEXT_PLAIN) {
511 obj->value_->AddTextRecord(str);
512 } else {
513 obj->value_->AddUriRecord(OHOS::Uri(str));
514 }
515 }
516
SetStringProp(napi_env env,const std::string & propName,napi_value & propValueNapi,PasteDataRecord::Builder & builder)517 bool PasteDataNapi::SetStringProp(
518 napi_env env, const std::string &propName, napi_value &propValueNapi, PasteDataRecord::Builder &builder)
519 {
520 std::string propValue;
521 bool ret = GetValue(env, propValueNapi, propValue);
522 if (!ret) {
523 return false;
524 }
525 if ((propName == "mimeType") && (propValue.size() <= MIMETYPE_MAX_SIZE)) {
526 builder.SetMimeType(propValue);
527 } else if ((propName == "htmlText") && (propValue.size() <= MAX_TEXT_LEN)) {
528 builder.SetHtmlText(std::make_shared<std::string>(propValue));
529 } else if ((propName == "plainText") && (propValue.size() <= MAX_TEXT_LEN)) {
530 builder.SetPlainText(std::make_shared<std::string>(propValue));
531 } else if (propName == "uri") {
532 builder.SetUri(std::make_shared<OHOS::Uri>(Uri(propValue)));
533 } else {
534 return false;
535 }
536 return true;
537 }
538
ParseRecord(napi_env env,napi_value & recordNapi)539 std::shared_ptr<MiscServices::PasteDataRecord> PasteDataNapi::ParseRecord(napi_env env, napi_value &recordNapi)
540 {
541 napi_value propNames = nullptr;
542 NAPI_CALL(env, napi_get_property_names(env, recordNapi, &propNames));
543 uint32_t propNameNums = 0;
544 NAPI_CALL(env, napi_get_array_length(env, propNames, &propNameNums));
545 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propNameNums = %{public}d", propNameNums);
546 PasteDataRecord::Builder builder("");
547 for (uint32_t i = 0; i < propNameNums; i++) {
548 napi_value propNameNapi = nullptr;
549 NAPI_CALL(env, napi_get_element(env, propNames, i, &propNameNapi));
550 size_t len = 0;
551 char str[STR_MAX_SIZE] = { 0 };
552 NAPI_CALL(env, napi_get_value_string_utf8(env, propNameNapi, str, STR_MAX_SIZE - STR_TAIL_LENGTH, &len));
553 napi_value propValueNapi = nullptr;
554 NAPI_CALL(env, napi_get_named_property(env, recordNapi, str, &propValueNapi));
555 std::string propName = str;
556 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propName = %{public}s,", propName.c_str());
557
558 if (propName == "mimeType" || propName == "htmlText" || propName == "plainText" || propName == "uri") {
559 if (!SetStringProp(env, propName, propValueNapi, builder)) {
560 return nullptr;
561 }
562 } else if (propName == "want") {
563 AAFwk::Want want;
564 if (OHOS::AppExecFwk::UnwrapWant(env, propValueNapi, want) != true) {
565 return nullptr;
566 }
567 builder.SetWant(std::make_shared<AAFwk::Want>(want));
568 } else if (propName == "pixelMap") {
569 std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, propValueNapi);
570 if (pixelMap == nullptr) {
571 return nullptr;
572 }
573 builder.SetPixelMap(pixelMap);
574 } else if (propName == "data") {
575 std::shared_ptr<MineCustomData> customData = PasteDataRecordNapi::GetNativeKvData(env, propValueNapi);
576 if (customData == nullptr) {
577 return nullptr;
578 }
579 builder.SetCustomData(customData);
580 }
581 }
582 return builder.Build();
583 }
584
AddRecord(napi_env env,napi_value argv,PasteDataNapi * obj)585 void PasteDataNapi::AddRecord(napi_env env, napi_value argv, PasteDataNapi *obj)
586 {
587 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddPasteDataRecord!");
588
589 napi_valuetype valueType = napi_undefined;
590 NAPI_CALL_RETURN_VOID(env, napi_typeof(env, argv, &valueType));
591 NAPI_ASSERT_RETURN_VOID(env, valueType == napi_object, "Wrong argument type. Object expected.");
592
593 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv);
594 if (pasteDataRecord == nullptr) {
595 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
596 return;
597 }
598 obj->value_->AddRecord(*pasteDataRecord);
599 }
600
AddRecord(napi_env env,napi_callback_info info)601 napi_value PasteDataNapi::AddRecord(napi_env env, napi_callback_info info)
602 {
603 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddRecord is called!");
604 size_t argc = ARGC_TYPE_SET2;
605 napi_value argv[ARGC_TYPE_SET2] = { 0 };
606 napi_value thisVar = nullptr;
607 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
608 NAPI_ASSERT(env, argc > 0, "Wrong number of arguments");
609 PasteDataNapi *obj = nullptr;
610 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
611 if ((status != napi_ok) || (obj == nullptr)) {
612 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddRecord object failed");
613 return nullptr;
614 }
615
616 if (argc == ARGC_TYPE_SET1) {
617 AddRecord(env, argv[0], obj);
618 return nullptr;
619 }
620 AddRecord(env, argv, argc, obj);
621 return nullptr;
622 }
623
ReplaceRecordAt(napi_env env,napi_callback_info info)624 napi_value PasteDataNapi::ReplaceRecordAt(napi_env env, napi_callback_info info)
625 {
626 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecordAt is called!");
627 size_t argc = ARGC_TYPE_SET2;
628 napi_value argv[ARGC_TYPE_SET2] = { 0 };
629 napi_value thisVar = nullptr;
630 napi_value result = nullptr;
631 napi_get_boolean(env, false, &result);
632
633 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL), result);
634 NAPI_ASSERT(env, argc > ARGC_TYPE_SET1, "Wrong number of arguments");
635 napi_valuetype valueType = napi_undefined;
636 NAPI_CALL_BASE(env, napi_typeof(env, argv[0], &valueType), result);
637 NAPI_ASSERT(env, valueType == napi_number, "Wrong argument type. number expected.");
638 NAPI_CALL_BASE(env, napi_typeof(env, argv[1], &valueType), result);
639 NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
640
641 PasteDataNapi *obj = nullptr;
642 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
643 if ((status != napi_ok) || (obj == nullptr)) {
644 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecordAt object failed");
645 return result;
646 }
647
648 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
649 if (pasteDataRecord == nullptr) {
650 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
651 return result;
652 }
653
654 int64_t number = 0;
655 napi_get_value_int64(env, argv[0], &number);
656 bool ret = obj->value_->ReplaceRecordAt(number, pasteDataRecord);
657 napi_get_boolean(env, ret, &result);
658
659 return result;
660 }
661
ReplaceRecord(napi_env env,napi_callback_info info)662 napi_value PasteDataNapi::ReplaceRecord(napi_env env, napi_callback_info info)
663 {
664 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecord is called!");
665 size_t argc = ARGC_TYPE_SET2;
666 napi_value argv[ARGC_TYPE_SET2] = { 0 };
667 napi_value thisVar = nullptr;
668 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
669 if (!CheckExpression(env, argc > ARGC_TYPE_SET1, JSErrorCode::INVALID_PARAMETERS, "Wrong number of arguments.")
670 || !CheckArgsType(env, argv[0], napi_number, "The type of mimeType must be number.")) {
671 return nullptr;
672 }
673
674 PasteDataNapi *obj = nullptr;
675 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
676 if ((status != napi_ok) || (obj == nullptr)) {
677 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecord object failed");
678 return nullptr;
679 }
680 uint32_t index = 0;
681 NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
682 if (!CheckExpression(env, index < obj->value_->GetRecordCount(),
683 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
684 return nullptr;
685 }
686
687 if (!CheckArgsType(env, argv[1], napi_object, "The type of record must be PasteDataRecord.")) {
688 return nullptr;
689 }
690 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
691 if (!CheckExpression(env, pasteDataRecord != nullptr, JSErrorCode::INVALID_PARAMETERS,
692 "The type of record must be PasteDataRecord.")) {
693 return nullptr;
694 }
695 obj->value_->ReplaceRecordAt(index, pasteDataRecord);
696 return nullptr;
697 }
698
AddWantRecord(napi_env env,napi_callback_info info)699 napi_value PasteDataNapi::AddWantRecord(napi_env env, napi_callback_info info)
700 {
701 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "AddWantRecord is called!");
702 size_t argc = 1;
703 napi_value argv[1] = {0};
704 napi_value thisVar = nullptr;
705
706 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
707 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
708
709 napi_valuetype valueType = napi_undefined;
710 NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
711 NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
712 OHOS::AAFwk::Want want;
713 if (!OHOS::AppExecFwk::UnwrapWant(env, argv[0], want)) {
714 return nullptr;
715 }
716
717 PasteDataNapi *obj = nullptr;
718 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
719 if ((status != napi_ok) || (obj == nullptr)) {
720 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddWantRecord object failed");
721 return nullptr;
722 }
723
724 obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
725 return nullptr;
726 }
727
GetPrimaryWant(napi_env env,napi_callback_info info)728 napi_value PasteDataNapi::GetPrimaryWant(napi_env env, napi_callback_info info)
729 {
730 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryWant is called!");
731 size_t argc = 1;
732 napi_value argv[1] = {0};
733 napi_value thisVar = nullptr;
734
735 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
736 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
737
738 PasteDataNapi *obj = nullptr;
739 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
740 if ((status != napi_ok) || (obj == nullptr)) {
741 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryWant object failed");
742 return nullptr;
743 }
744
745 std::shared_ptr<OHOS::AAFwk::Want> want = obj->value_->GetPrimaryWant();
746 if (!want) {
747 return nullptr;
748 }
749 return OHOS::AppExecFwk::WrapWant(env, *want);
750 }
751
SetNapiProperty(napi_env env,const PasteDataProperty & property,napi_value & nProperty)752 bool PasteDataNapi::SetNapiProperty(napi_env env, const PasteDataProperty &property, napi_value &nProperty)
753 {
754 napi_value value = nullptr;
755 napi_value arr = nullptr;
756 int count = 0;
757
758 // additions : {[key: string]: object}
759 value = OHOS::AppExecFwk::WrapWantParams(env, property.additions);
760 napi_set_named_property(env, nProperty, "additions", value);
761
762 // mimeTypes: Array<string>
763 napi_create_array(env, &arr);
764 for (auto vec : property.mimeTypes) {
765 napi_create_string_utf8(env, vec.c_str(), NAPI_AUTO_LENGTH, &value);
766 napi_set_element(env, arr, count, value);
767 count++;
768 }
769 napi_set_named_property(env, nProperty, "mimeTypes", arr);
770
771 // tag: string
772 napi_create_string_utf8(env, property.tag.c_str(), NAPI_AUTO_LENGTH, &value);
773 napi_set_named_property(env, nProperty, "tag", value);
774
775 // timestamp: number
776 napi_create_int64(env, property.timestamp, &value);
777 napi_set_named_property(env, nProperty, "timestamp", value);
778
779 // localOnly: boolean
780 napi_get_boolean(env, property.localOnly, &value);
781 napi_set_named_property(env, nProperty, "localOnly", value);
782
783 napi_create_int32(env, static_cast<int32_t>(property.shareOption), &value);
784 napi_set_named_property(env, nProperty, "shareOption", value);
785 return true;
786 }
787
GetProperty(napi_env env,napi_callback_info info)788 napi_value PasteDataNapi::GetProperty(napi_env env, napi_callback_info info)
789 {
790 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetProperty is called!");
791 size_t argc = 1;
792 napi_value argv[1] = {0};
793 napi_value thisVar = nullptr;
794
795 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
796 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
797
798 PasteDataNapi *obj = nullptr;
799 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
800 if ((status != napi_ok) || (obj == nullptr)) {
801 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetProperty object failed");
802 return nullptr;
803 }
804 PasteDataProperty property = obj->value_->GetProperty();
805 napi_value nProperty = nullptr;
806 napi_create_object(env, &nProperty);
807 if (!SetNapiProperty(env, property, nProperty)) {
808 return nullptr;
809 }
810 return nProperty;
811 }
812
GetRecordAt(napi_env env,napi_callback_info info)813 napi_value PasteDataNapi::GetRecordAt(napi_env env, napi_callback_info info)
814 {
815 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecordAt is called!");
816 uint32_t index = 0;
817 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
818 if (obj == nullptr) {
819 return nullptr;
820 }
821
822 std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
823 napi_value instance = nullptr;
824 PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
825 return instance;
826 }
827
GetRecord(napi_env env,napi_callback_info info)828 napi_value PasteDataNapi::GetRecord(napi_env env, napi_callback_info info)
829 {
830 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "GetRecord is called!");
831 uint32_t index = 0;
832 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
833 if (obj == nullptr
834 || !CheckExpression(env, index < obj->value_->GetRecordCount(),
835 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
836 return nullptr;
837 }
838
839 std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
840 napi_value instance = nullptr;
841 PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
842 return instance;
843 }
844
SetProperty(napi_env env,napi_value in,PasteDataNapi * obj)845 void PasteDataNapi::SetProperty(napi_env env, napi_value in, PasteDataNapi *obj)
846 {
847 napi_value propertyNames = nullptr;
848 NAPI_CALL_RETURN_VOID(env, napi_get_property_names(env, in, &propertyNames));
849 uint32_t propertyNamesNum = 0;
850 NAPI_CALL_RETURN_VOID(env, napi_get_array_length(env, propertyNames, &propertyNamesNum));
851 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "propertyNamesNum = %{public}d", propertyNamesNum);
852
853 for (uint32_t i = 0; i < propertyNamesNum; i++) {
854 napi_value propertyNameNapi = nullptr;
855 NAPI_CALL_RETURN_VOID(env, napi_get_element(env, propertyNames, i, &propertyNameNapi));
856 size_t len = 0;
857 char str[STR_MAX_SIZE] = { 0 };
858 NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, propertyNameNapi, str, STR_MAX_SIZE, &len));
859 std::string propertyName = str;
860 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "propertyName = %{public}s,", propertyName.c_str());
861 napi_value propertyNameValueNapi = nullptr;
862 NAPI_CALL_RETURN_VOID(env, napi_get_named_property(env, in, str, &propertyNameValueNapi));
863 if (propertyName == "shareOption") {
864 int32_t shareOptionValue = 0;
865 NAPI_CALL_RETURN_VOID(env, napi_get_value_int32(env, propertyNameValueNapi, &shareOptionValue));
866 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "shareOptionValue = %{public}d,", shareOptionValue);
867 obj->value_->SetShareOption(static_cast<ShareOption>(shareOptionValue));
868 }
869 if (propertyName == "tag") {
870 char tagValue[STR_MAX_SIZE] = { 0 };
871 size_t tagValueLen = 0;
872 NAPI_CALL_RETURN_VOID(env,
873 napi_get_value_string_utf8(env, propertyNameValueNapi, tagValue, STR_MAX_SIZE, &tagValueLen));
874 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "tagValue = %{public}s,", tagValue);
875 std::string tagValueStr = tagValue;
876 obj->value_->SetTag(tagValueStr);
877 }
878 if (propertyName == "additions") {
879 AAFwk::WantParams additions;
880 bool ret = OHOS::AppExecFwk::UnwrapWantParams(env, propertyNameValueNapi, additions);
881 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "additions ret = %{public}d,", ret);
882 obj->value_->SetAdditions(additions);
883 }
884 }
885 }
886
IsProperty(napi_env env,napi_value in)887 bool PasteDataNapi::IsProperty(napi_env env, napi_value in)
888 {
889 napi_valuetype valueType = napi_undefined;
890 NAPI_CALL_BASE(env, napi_typeof(env, in, &valueType), false);
891 if (valueType != napi_object) {
892 return false;
893 }
894 napi_value propertyNames = nullptr;
895 NAPI_CALL_BASE(env, napi_get_property_names(env, in, &propertyNames), false);
896 uint32_t propertyNamesNum = 0;
897 NAPI_CALL_BASE(env, napi_get_array_length(env, propertyNames, &propertyNamesNum), false);
898 bool hasProperty = false;
899 const char *key[] = { "additions", "mimeTypes", "tag", "timestamp", "localOnly", "shareOption" };
900 const napi_valuetype type[] = { napi_object, napi_object, napi_string, napi_number, napi_boolean, napi_number };
901 napi_value propertyValue = nullptr;
902 for (uint32_t i = 0; i < propertyNamesNum; i++) {
903 NAPI_CALL_BASE(env, napi_has_named_property(env, in, key[i], &hasProperty), false);
904 if (!hasProperty) {
905 return false;
906 }
907 NAPI_CALL_BASE(env, napi_get_named_property(env, in, key[i], &propertyValue), false);
908 if (i == ARGC_TYPE_SET1) {
909 bool isArray = false;
910 NAPI_CALL_BASE(env, napi_is_array(env, propertyValue, &isArray), false);
911 if (!isArray) {
912 return false;
913 }
914 continue;
915 }
916 NAPI_CALL_BASE(env, napi_typeof(env, propertyValue, &valueType), false);
917 if (valueType != type[i]) {
918 return false;
919 }
920 }
921 return true;
922 }
923
SetProperty(napi_env env,napi_callback_info info)924 napi_value PasteDataNapi::SetProperty(napi_env env, napi_callback_info info)
925 {
926 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "SetProperty is called!");
927 size_t argc = ARGC_TYPE_SET1;
928 napi_value argv[ARGC_TYPE_SET1] = { 0 };
929 napi_value thisVar = nullptr;
930
931 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
932 if (!CheckExpression(env, argc > 0, JSErrorCode::INVALID_PARAMETERS, "Parameter error. Wrong number of arguments.")
933 || !CheckExpression(env, IsProperty(env, argv[0]), JSErrorCode::INVALID_PARAMETERS,
934 "Parameter error. The type of property must be PasteDataProperty.")) {
935 return nullptr;
936 }
937
938 PasteDataNapi *obj = nullptr;
939 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
940 if ((status != napi_ok) || (obj == nullptr)) {
941 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
942 return nullptr;
943 }
944 SetProperty(env, argv[0], obj);
945 return nullptr;
946 }
947
PasteDataInit(napi_env env,napi_value exports)948 napi_value PasteDataNapi::PasteDataInit(napi_env env, napi_value exports)
949 {
950 napi_status status = napi_ok;
951 napi_property_descriptor descriptors[] = {
952 DECLARE_NAPI_FUNCTION("addHtmlRecord", AddHtmlRecord),
953 DECLARE_NAPI_FUNCTION("addWantRecord", AddWantRecord),
954 DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
955 DECLARE_NAPI_FUNCTION("addTextRecord", AddTextRecord),
956 DECLARE_NAPI_FUNCTION("addUriRecord", AddUriRecord),
957 DECLARE_NAPI_FUNCTION("addPixelMapRecord", AddPixelMapRecord),
958 DECLARE_NAPI_FUNCTION("getMimeTypes", GetMimeTypes),
959 DECLARE_NAPI_FUNCTION("getPrimaryHtml", GetPrimaryHtml),
960 DECLARE_NAPI_FUNCTION("getPrimaryWant", GetPrimaryWant),
961 DECLARE_NAPI_FUNCTION("getPrimaryMimeType", GetPrimaryMimeType),
962 DECLARE_NAPI_FUNCTION("getPrimaryText", GetPrimaryText),
963 DECLARE_NAPI_FUNCTION("getPrimaryUri", GetPrimaryUri),
964 DECLARE_NAPI_FUNCTION("getPrimaryPixelMap", GetPrimaryPixelMap),
965 DECLARE_NAPI_FUNCTION("getProperty", GetProperty),
966 DECLARE_NAPI_FUNCTION("getRecordAt", GetRecordAt),
967 DECLARE_NAPI_FUNCTION("getRecord", GetRecord),
968 DECLARE_NAPI_FUNCTION("getRecordCount", GetRecordCount),
969 DECLARE_NAPI_FUNCTION("getTag", GetTag),
970 DECLARE_NAPI_FUNCTION("hasMimeType", HasMimeType),
971 DECLARE_NAPI_FUNCTION("hasType", HasType),
972 DECLARE_NAPI_FUNCTION("removeRecordAt", RemoveRecordAt),
973 DECLARE_NAPI_FUNCTION("removeRecord", RemoveRecord),
974 DECLARE_NAPI_FUNCTION("replaceRecordAt", ReplaceRecordAt),
975 DECLARE_NAPI_FUNCTION("replaceRecord", ReplaceRecord),
976 DECLARE_NAPI_FUNCTION("setProperty", SetProperty)
977 };
978
979 napi_value constructor;
980 napi_define_class(env, "PasteData", NAPI_AUTO_LENGTH, New, nullptr,
981 sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &constructor);
982 if (status != napi_ok) {
983 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to define class at Init");
984 return nullptr;
985 }
986
987 status = napi_create_reference(env, constructor, 1, &g_pasteData);
988 if (status != napi_ok) {
989 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "PasteDataNapi Init create reference failed");
990 return nullptr;
991 }
992 napi_set_named_property(env, exports, "PasteData", constructor);
993 return exports;
994 }
995
Destructor(napi_env env,void * nativeObject,void * finalize_hint)996 void PasteDataNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
997 {
998 PasteDataNapi *obj = static_cast<PasteDataNapi *>(nativeObject);
999 delete obj;
1000 }
1001
New(napi_env env,napi_callback_info info)1002 napi_value PasteDataNapi::New(napi_env env, napi_callback_info info)
1003 {
1004 size_t argc = ARGC_TYPE_SET1;
1005 napi_value argv[1] = {0};
1006 napi_value thisVar = nullptr;
1007 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
1008
1009 // get native object
1010 PasteDataNapi *obj = new PasteDataNapi();
1011 obj->env_ = env;
1012 NAPI_CALL(env, napi_wrap(env, thisVar, obj, PasteDataNapi::Destructor,
1013 nullptr, // finalize_hint
1014 &obj->wrapper_));
1015 return thisVar;
1016 }
1017
NewInstance(napi_env env,napi_value & instance)1018 napi_status PasteDataNapi::NewInstance(napi_env env, napi_value &instance)
1019 {
1020 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1021 napi_status status;
1022 napi_value constructor;
1023 status = napi_get_reference_value(env, g_pasteData, &constructor);
1024 if (status != napi_ok) {
1025 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get reference failed");
1026 return status;
1027 }
1028
1029 status = napi_new_instance(env, constructor, 0, nullptr, &instance);
1030 if (status != napi_ok) {
1031 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "new instance failed");
1032 return status;
1033 }
1034 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "new instance ok");
1035 return napi_ok;
1036 }
1037
IsPasteData(napi_env env,napi_value in)1038 bool PasteDataNapi::IsPasteData(napi_env env, napi_value in)
1039 {
1040 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1041 napi_valuetype type = napi_undefined;
1042 NAPI_CALL_BASE(env, napi_typeof(env, in, &type), false);
1043 if (type != napi_object) {
1044 return false;
1045 }
1046 napi_value constructor;
1047 bool isPasteData = false;
1048 NAPI_CALL_BASE(env, napi_get_reference_value(env, g_pasteData, &constructor), false);
1049 NAPI_CALL_BASE(env, napi_instanceof(env, in, constructor, &isPasteData), false);
1050 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isPasteData is [%{public}d]", isPasteData);
1051 return isPasteData;
1052 }
1053 } // namespace MiscServicesNapi
1054 } // namespace OHOS
1055