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