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