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 "pasteboard_napi.h"
22 #include "pastedata_napi.h"
23 #include "pastedata_record_napi.h"
24 using namespace OHOS::MiscServices;
25 using namespace OHOS::Media;
26
27 namespace OHOS {
28 namespace MiscServicesNapi {
29 namespace {
30 constexpr int ARGC_TYPE_SET0 = 0;
31 constexpr int ARGC_TYPE_SET1 = 1;
32 constexpr int ARGC_TYPE_SET2 = 2;
33 const int32_t STR_MAX_SIZE = 256;
34 constexpr int32_t MIMETYPE_MAX_SIZE = 1024;
35 constexpr int32_t MAX_TEXT_LEN = 20 * 1024 * 1024;
36 constexpr size_t STR_TAIL_LENGTH = 1;
37 } // namespace
38 static thread_local napi_ref g_pasteData = nullptr;
39
PasteDataNapi()40 PasteDataNapi::PasteDataNapi() : env_(nullptr)
41 {
42 value_ = std::make_shared<PasteData>();
43 }
44
~PasteDataNapi()45 PasteDataNapi::~PasteDataNapi()
46 {
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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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_HILOGD(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. The number of arguments must be greater than zero.")) ||
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_HILOGD(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. The number of arguments must be greater than zero.")) ||
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_HILOGD(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_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "RemoveRecord is called!");
350 uint32_t index = 0;
351 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
352 if (obj == nullptr || !CheckExpression(env, index < obj->value_->GetRecordCount(),
353 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
354 return nullptr;
355 }
356 obj->value_->RemoveRecordAt(index);
357 return nullptr;
358 }
359
GetPrimaryMimeType(napi_env env,napi_callback_info info)360 napi_value PasteDataNapi::GetPrimaryMimeType(napi_env env, napi_callback_info info)
361 {
362 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryMimeType is called!");
363 size_t argc = 1;
364 napi_value argv[1] = { 0 };
365 napi_value thisVar = nullptr;
366
367 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
368 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
369
370 PasteDataNapi *obj = nullptr;
371 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
372 if ((status != napi_ok) || (obj == nullptr)) {
373 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType object failed");
374 return nullptr;
375 }
376 std::shared_ptr<std::string> mimeType = obj->value_->GetPrimaryMimeType();
377 if (mimeType == nullptr) {
378 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryMimeType failed");
379 return nullptr;
380 }
381 napi_value result = nullptr;
382 napi_create_string_utf8(env, mimeType->c_str(), NAPI_AUTO_LENGTH, &result);
383
384 return result;
385 }
386
GetRecordCount(napi_env env,napi_callback_info info)387 napi_value PasteDataNapi::GetRecordCount(napi_env env, napi_callback_info info)
388 {
389 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecordCount is called!");
390 size_t argc = 1;
391 napi_value argv[1] = { 0 };
392 napi_value thisVar = nullptr;
393
394 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
395 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
396
397 PasteDataNapi *obj = nullptr;
398 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
399 if ((status != napi_ok) || (obj == nullptr)) {
400 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetRecordCount object failed");
401 return nullptr;
402 }
403
404 size_t count = obj->value_->GetRecordCount();
405 napi_value result = nullptr;
406 napi_create_int64(env, count, &result);
407
408 return result;
409 }
410
GetTag(napi_env env,napi_callback_info info)411 napi_value PasteDataNapi::GetTag(napi_env env, napi_callback_info info)
412 {
413 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetTag is called!");
414 size_t argc = 1;
415 napi_value argv[1] = { 0 };
416 napi_value thisVar = nullptr;
417
418 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
419 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
420
421 PasteDataNapi *obj = nullptr;
422 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
423 if ((status != napi_ok) || (obj == nullptr)) {
424 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetTag object failed");
425 return nullptr;
426 }
427 std::string tag = obj->value_->GetTag();
428 napi_value result = nullptr;
429 napi_create_string_utf8(env, tag.c_str(), NAPI_AUTO_LENGTH, &result);
430
431 return result;
432 }
433
GetMimeTypes(napi_env env,napi_callback_info info)434 napi_value PasteDataNapi::GetMimeTypes(napi_env env, napi_callback_info info)
435 {
436 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetMimeTypes is called!");
437 size_t argc = 1;
438 napi_value argv[1] = { 0 };
439 napi_value thisVar = nullptr;
440
441 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
442 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
443
444 PasteDataNapi *obj = nullptr;
445 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
446 if ((status != napi_ok) || (obj == nullptr)) {
447 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetMimeTypes object failed");
448 return nullptr;
449 }
450 std::vector<std::string> mimeTypes = obj->value_->GetMimeTypes();
451 if (mimeTypes.size() == 0) {
452 return nullptr;
453 }
454
455 napi_value nMimeTypes = nullptr;
456 if (napi_create_array(env, &nMimeTypes) != napi_ok) {
457 return nullptr;
458 }
459 size_t index = 0;
460 napi_value value = nullptr;
461 for (auto type : mimeTypes) {
462 napi_create_string_utf8(env, type.c_str(), NAPI_AUTO_LENGTH, &value);
463 napi_set_element(env, nMimeTypes, index, value);
464 index++;
465 }
466 return nMimeTypes;
467 }
468
AddRecord(napi_env env,napi_value * argv,size_t argc,PasteDataNapi * obj)469 void PasteDataNapi::AddRecord(napi_env env, napi_value *argv, size_t argc, PasteDataNapi *obj)
470 {
471 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddRecordV9!");
472 std::string mimeType;
473 if (!CheckArgs(env, argv, argc, mimeType)) {
474 return;
475 }
476 bool isArrayBuffer = false;
477 NAPI_CALL_RETURN_VOID(env, napi_is_arraybuffer(env, argv[1], &isArrayBuffer));
478 if (isArrayBuffer) {
479 void *data = nullptr;
480 size_t dataLen = 0;
481 NAPI_CALL_RETURN_VOID(env, napi_get_arraybuffer_info(env, argv[1], &data, &dataLen));
482 obj->value_->AddKvRecord(mimeType,
483 std::vector<uint8_t>(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen));
484 return;
485 }
486 if (mimeType == MIMETYPE_PIXELMAP) {
487 std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, argv[1]);
488 obj->value_->AddPixelMapRecord(pixelMap);
489 return;
490 } else if (mimeType == MIMETYPE_TEXT_WANT) {
491 OHOS::AAFwk::Want want;
492 AppExecFwk::UnwrapWant(env, argv[1], want);
493 obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
494 return;
495 }
496
497 std::string str;
498 bool ret = GetValue(env, argv[1], str);
499 if (!ret) {
500 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to GetValue!");
501 return;
502 }
503 if (mimeType == MIMETYPE_TEXT_HTML) {
504 obj->value_->AddHtmlRecord(str);
505 } else if (mimeType == MIMETYPE_TEXT_PLAIN) {
506 obj->value_->AddTextRecord(str);
507 } else {
508 obj->value_->AddUriRecord(OHOS::Uri(str));
509 }
510 }
511
SetStringProp(napi_env env,const std::string & propName,napi_value & propValueNapi,PasteDataRecord::Builder & builder)512 bool PasteDataNapi::SetStringProp(
513 napi_env env, const std::string &propName, napi_value &propValueNapi, PasteDataRecord::Builder &builder)
514 {
515 std::string propValue;
516 bool ret = GetValue(env, propValueNapi, propValue);
517 if (!ret) {
518 return false;
519 }
520 if ((propName == "mimeType") && (propValue.size() <= MIMETYPE_MAX_SIZE)) {
521 builder.SetMimeType(propValue);
522 } else if ((propName == "htmlText") && (propValue.size() <= MAX_TEXT_LEN)) {
523 builder.SetHtmlText(std::make_shared<std::string>(propValue));
524 } else if ((propName == "plainText") && (propValue.size() <= MAX_TEXT_LEN)) {
525 builder.SetPlainText(std::make_shared<std::string>(propValue));
526 } else if (propName == "uri") {
527 builder.SetUri(std::make_shared<OHOS::Uri>(Uri(propValue)));
528 } else {
529 return false;
530 }
531 return true;
532 }
533
ParseRecord(napi_env env,napi_value & recordNapi)534 std::shared_ptr<MiscServices::PasteDataRecord> PasteDataNapi::ParseRecord(napi_env env, napi_value &recordNapi)
535 {
536 napi_value propNames = nullptr;
537 NAPI_CALL(env, napi_get_property_names(env, recordNapi, &propNames));
538 uint32_t propNameNums = 0;
539 NAPI_CALL(env, napi_get_array_length(env, propNames, &propNameNums));
540 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propNameNums = %{public}d", propNameNums);
541 PasteDataRecord::Builder builder("");
542 for (uint32_t i = 0; i < propNameNums; i++) {
543 napi_value propNameNapi = nullptr;
544 NAPI_CALL(env, napi_get_element(env, propNames, i, &propNameNapi));
545 size_t len = 0;
546 char str[STR_MAX_SIZE] = { 0 };
547 NAPI_CALL(env, napi_get_value_string_utf8(env, propNameNapi, str, STR_MAX_SIZE - STR_TAIL_LENGTH, &len));
548 napi_value propValueNapi = nullptr;
549 NAPI_CALL(env, napi_get_named_property(env, recordNapi, str, &propValueNapi));
550 std::string propName = str;
551 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_JS_NAPI, "propName = %{public}s,", propName.c_str());
552
553 if (propName == "mimeType" || propName == "htmlText" || propName == "plainText" || propName == "uri") {
554 if (!SetStringProp(env, propName, propValueNapi, builder)) {
555 return nullptr;
556 }
557 } else if (propName == "want") {
558 AAFwk::Want want;
559 if (OHOS::AppExecFwk::UnwrapWant(env, propValueNapi, want) != true) {
560 return nullptr;
561 }
562 builder.SetWant(std::make_shared<AAFwk::Want>(want));
563 } else if (propName == "pixelMap") {
564 std::shared_ptr<PixelMap> pixelMap = PixelMapNapi::GetPixelMap(env, propValueNapi);
565 if (pixelMap == nullptr) {
566 return nullptr;
567 }
568 builder.SetPixelMap(pixelMap);
569 } else if (propName == "data") {
570 std::shared_ptr<MineCustomData> customData = PasteDataRecordNapi::GetNativeKvData(env, propValueNapi);
571 if (customData == nullptr) {
572 return nullptr;
573 }
574 builder.SetCustomData(customData);
575 }
576 }
577 return builder.Build();
578 }
579
AddRecord(napi_env env,napi_value argv,PasteDataNapi * obj)580 void PasteDataNapi::AddRecord(napi_env env, napi_value argv, PasteDataNapi *obj)
581 {
582 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddPasteDataRecord!");
583
584 napi_valuetype valueType = napi_undefined;
585 NAPI_CALL_RETURN_VOID(env, napi_typeof(env, argv, &valueType));
586 NAPI_ASSERT_RETURN_VOID(env, valueType == napi_object, "Wrong argument type. Object expected.");
587
588 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv);
589 if (pasteDataRecord == nullptr) {
590 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
591 return;
592 }
593 obj->value_->AddRecord(*pasteDataRecord);
594 }
595
AddRecord(napi_env env,napi_callback_info info)596 napi_value PasteDataNapi::AddRecord(napi_env env, napi_callback_info info)
597 {
598 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddRecord is called!");
599 size_t argc = ARGC_TYPE_SET2;
600 napi_value argv[ARGC_TYPE_SET2] = { 0 };
601 napi_value thisVar = nullptr;
602 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
603 NAPI_ASSERT(env, argc > 0, "Wrong number of arguments");
604 PasteDataNapi *obj = nullptr;
605 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
606 if ((status != napi_ok) || (obj == nullptr)) {
607 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddRecord object failed");
608 return nullptr;
609 }
610
611 if (argc == ARGC_TYPE_SET1) {
612 AddRecord(env, argv[0], obj);
613 return nullptr;
614 }
615 AddRecord(env, argv, argc, obj);
616 return nullptr;
617 }
618
ReplaceRecordAt(napi_env env,napi_callback_info info)619 napi_value PasteDataNapi::ReplaceRecordAt(napi_env env, napi_callback_info info)
620 {
621 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecordAt is called!");
622 size_t argc = ARGC_TYPE_SET2;
623 napi_value argv[ARGC_TYPE_SET2] = { 0 };
624 napi_value thisVar = nullptr;
625 napi_value result = nullptr;
626 napi_get_boolean(env, false, &result);
627
628 NAPI_CALL_BASE(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL), result);
629 NAPI_ASSERT(env, argc > ARGC_TYPE_SET1, "Wrong number of arguments");
630 napi_valuetype valueType = napi_undefined;
631 NAPI_CALL_BASE(env, napi_typeof(env, argv[0], &valueType), result);
632 NAPI_ASSERT(env, valueType == napi_number, "Wrong argument type. number expected.");
633 NAPI_CALL_BASE(env, napi_typeof(env, argv[1], &valueType), result);
634 NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
635
636 PasteDataNapi *obj = nullptr;
637 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
638 if ((status != napi_ok) || (obj == nullptr)) {
639 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecordAt object failed");
640 return result;
641 }
642
643 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
644 if (pasteDataRecord == nullptr) {
645 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "ParseRecord failed!");
646 return result;
647 }
648
649 int64_t number = 0;
650 napi_get_value_int64(env, argv[0], &number);
651 bool ret = obj->value_->ReplaceRecordAt(number, pasteDataRecord);
652 napi_get_boolean(env, ret, &result);
653
654 return result;
655 }
656
ReplaceRecord(napi_env env,napi_callback_info info)657 napi_value PasteDataNapi::ReplaceRecord(napi_env env, napi_callback_info info)
658 {
659 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "ReplaceRecord is called!");
660 size_t argc = ARGC_TYPE_SET2;
661 napi_value argv[ARGC_TYPE_SET2] = { 0 };
662 napi_value thisVar = nullptr;
663 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
664 if (!CheckExpression(env, argc > ARGC_TYPE_SET1, JSErrorCode::INVALID_PARAMETERS,
665 "Parameter error. The number of arguments must be greater than one.") ||
666 !CheckArgsType(env, argv[0], napi_number, "The type of mimeType must be number.")) {
667 return nullptr;
668 }
669
670 PasteDataNapi *obj = nullptr;
671 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
672 if ((status != napi_ok) || (obj == nullptr)) {
673 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get ReplaceRecord object failed");
674 return nullptr;
675 }
676 uint32_t index = 0;
677 NAPI_CALL(env, napi_get_value_uint32(env, argv[0], &index));
678 if (!CheckExpression(env, index < obj->value_->GetRecordCount(),
679 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
680 return nullptr;
681 }
682
683 if (!CheckArgsType(env, argv[1], napi_object, "The type of record must be PasteDataRecord.")) {
684 return nullptr;
685 }
686 std::shared_ptr<PasteDataRecord> pasteDataRecord = ParseRecord(env, argv[1]);
687 if (!CheckExpression(env, pasteDataRecord != nullptr, JSErrorCode::INVALID_PARAMETERS,
688 "Parameter error. The type of PasteDataRecord cannot be nullptr.")) {
689 return nullptr;
690 }
691 obj->value_->ReplaceRecordAt(index, pasteDataRecord);
692 return nullptr;
693 }
694
AddWantRecord(napi_env env,napi_callback_info info)695 napi_value PasteDataNapi::AddWantRecord(napi_env env, napi_callback_info info)
696 {
697 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "AddWantRecord is called!");
698 size_t argc = 1;
699 napi_value argv[1] = { 0 };
700 napi_value thisVar = nullptr;
701
702 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
703 NAPI_ASSERT(env, argc > ARGC_TYPE_SET0, "Wrong number of arguments");
704
705 napi_valuetype valueType = napi_undefined;
706 NAPI_CALL(env, napi_typeof(env, argv[0], &valueType));
707 NAPI_ASSERT(env, valueType == napi_object, "Wrong argument type. Object expected.");
708 OHOS::AAFwk::Want want;
709 if (!OHOS::AppExecFwk::UnwrapWant(env, argv[0], want)) {
710 return nullptr;
711 }
712
713 PasteDataNapi *obj = nullptr;
714 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
715 if ((status != napi_ok) || (obj == nullptr)) {
716 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get AddWantRecord object failed");
717 return nullptr;
718 }
719
720 obj->value_->AddWantRecord(std::make_shared<OHOS::AAFwk::Want>(want));
721 return nullptr;
722 }
723
GetPrimaryWant(napi_env env,napi_callback_info info)724 napi_value PasteDataNapi::GetPrimaryWant(napi_env env, napi_callback_info info)
725 {
726 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetPrimaryWant is called!");
727 size_t argc = 1;
728 napi_value argv[1] = { 0 };
729 napi_value thisVar = nullptr;
730
731 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
732 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
733
734 PasteDataNapi *obj = nullptr;
735 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
736 if ((status != napi_ok) || (obj == nullptr)) {
737 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetPrimaryWant object failed");
738 return nullptr;
739 }
740
741 std::shared_ptr<OHOS::AAFwk::Want> want = obj->value_->GetPrimaryWant();
742 if (!want) {
743 return nullptr;
744 }
745 return OHOS::AppExecFwk::WrapWant(env, *want);
746 }
747
SetNapiProperty(napi_env env,const PasteDataProperty & property,napi_value & nProperty)748 bool PasteDataNapi::SetNapiProperty(napi_env env, const PasteDataProperty &property, napi_value &nProperty)
749 {
750 napi_value value = nullptr;
751 napi_value arr = nullptr;
752 int count = 0;
753
754 // additions : {[key: string]: object}
755 value = OHOS::AppExecFwk::WrapWantParams(env, property.additions);
756 napi_set_named_property(env, nProperty, "additions", value);
757
758 // mimeTypes: Array<string>
759 napi_create_array(env, &arr);
760 for (auto vec : property.mimeTypes) {
761 napi_create_string_utf8(env, vec.c_str(), NAPI_AUTO_LENGTH, &value);
762 napi_set_element(env, arr, count, value);
763 count++;
764 }
765 napi_set_named_property(env, nProperty, "mimeTypes", arr);
766
767 // tag: string
768 napi_create_string_utf8(env, property.tag.c_str(), NAPI_AUTO_LENGTH, &value);
769 napi_set_named_property(env, nProperty, "tag", value);
770
771 // timestamp: number
772 napi_create_int64(env, property.timestamp, &value);
773 napi_set_named_property(env, nProperty, "timestamp", value);
774
775 // localOnly: boolean
776 napi_get_boolean(env, property.localOnly, &value);
777 napi_set_named_property(env, nProperty, "localOnly", value);
778
779 napi_create_int32(env, static_cast<int32_t>(property.shareOption), &value);
780 napi_set_named_property(env, nProperty, "shareOption", value);
781 return true;
782 }
783
GetProperty(napi_env env,napi_callback_info info)784 napi_value PasteDataNapi::GetProperty(napi_env env, napi_callback_info info)
785 {
786 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetProperty is called!");
787 size_t argc = 1;
788 napi_value argv[1] = { 0 };
789 napi_value thisVar = nullptr;
790
791 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
792 NAPI_ASSERT(env, argc >= ARGC_TYPE_SET0, "Wrong number of arguments");
793
794 PasteDataNapi *obj = nullptr;
795 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
796 if ((status != napi_ok) || (obj == nullptr)) {
797 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Get GetProperty object failed");
798 return nullptr;
799 }
800 PasteDataProperty property = obj->value_->GetProperty();
801 napi_value nProperty = nullptr;
802 napi_create_object(env, &nProperty);
803 if (!SetNapiProperty(env, property, nProperty)) {
804 return nullptr;
805 }
806 return nProperty;
807 }
808
GetRecordAt(napi_env env,napi_callback_info info)809 napi_value PasteDataNapi::GetRecordAt(napi_env env, napi_callback_info info)
810 {
811 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecordAt is called!");
812 uint32_t index = 0;
813 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
814 if (obj == nullptr) {
815 return nullptr;
816 }
817
818 std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
819 napi_value instance = nullptr;
820 PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
821 return instance;
822 }
823
GetRecord(napi_env env,napi_callback_info info)824 napi_value PasteDataNapi::GetRecord(napi_env env, napi_callback_info info)
825 {
826 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "GetRecord is called!");
827 uint32_t index = 0;
828 PasteDataNapi *obj = RemoveAndGetRecordCommon(env, info, index);
829 if (obj == nullptr || !CheckExpression(env, index < obj->value_->GetRecordCount(),
830 JSErrorCode::OUT_OF_RANGE, "index out of range.")) {
831 return nullptr;
832 }
833
834 std::shared_ptr<PasteDataRecord> record = obj->value_->GetRecordAt(index);
835 napi_value instance = nullptr;
836 PasteDataRecordNapi::NewInstanceByRecord(env, instance, record);
837 return instance;
838 }
839
SetProperty(napi_env env,napi_value in,PasteDataNapi * obj)840 void PasteDataNapi::SetProperty(napi_env env, napi_value in, PasteDataNapi *obj)
841 {
842 napi_value propertyNames = nullptr;
843 NAPI_CALL_RETURN_VOID(env, napi_get_property_names(env, in, &propertyNames));
844 uint32_t propertyNamesNum = 0;
845 NAPI_CALL_RETURN_VOID(env, napi_get_array_length(env, propertyNames, &propertyNamesNum));
846 bool localOnlyValue = false;
847 int32_t shareOptionValue = ShareOption::CrossDevice;
848 for (uint32_t i = 0; i < propertyNamesNum; i++) {
849 napi_value propertyNameNapi = nullptr;
850 NAPI_CALL_RETURN_VOID(env, napi_get_element(env, propertyNames, i, &propertyNameNapi));
851 size_t len = 0;
852 char str[STR_MAX_SIZE] = { 0 };
853 NAPI_CALL_RETURN_VOID(env, napi_get_value_string_utf8(env, propertyNameNapi, str, STR_MAX_SIZE, &len));
854 std::string propertyName = str;
855 napi_value propertyNameValueNapi = nullptr;
856 NAPI_CALL_RETURN_VOID(env, napi_get_named_property(env, in, str, &propertyNameValueNapi));
857 if (propertyName == "localOnly") {
858 NAPI_CALL_RETURN_VOID(env, napi_get_value_bool(env, propertyNameValueNapi, &localOnlyValue));
859 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "localOnlyValue = %{public}d", localOnlyValue);
860 }
861 if (propertyName == "shareOption") {
862 NAPI_CALL_RETURN_VOID(env, napi_get_value_int32(env, propertyNameValueNapi, &shareOptionValue));
863 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "shareOptionValue = %{public}d", shareOptionValue);
864 }
865 if (propertyName == "tag") {
866 char tagValue[STR_MAX_SIZE] = { 0 };
867 size_t tagValueLen = 0;
868 NAPI_CALL_RETURN_VOID(env,
869 napi_get_value_string_utf8(env, propertyNameValueNapi, tagValue, STR_MAX_SIZE, &tagValueLen));
870 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "tagValue = %{public}s", tagValue);
871 std::string tagValueStr = tagValue;
872 obj->value_->SetTag(tagValueStr);
873 }
874 if (propertyName == "additions") {
875 AAFwk::WantParams additions;
876 bool ret = OHOS::AppExecFwk::UnwrapWantParams(env, propertyNameValueNapi, additions);
877 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_CLIENT, "additions ret = %{public}d", ret);
878 obj->value_->SetAdditions(additions);
879 }
880 }
881 localOnlyValue = shareOptionValue == ShareOption::CrossDevice ? false : true;
882 PASTEBOARD_HILOGI(PASTEBOARD_MODULE_CLIENT, "localOnly final Value = %{public}d", localOnlyValue);
883 obj->value_->SetLocalOnly(localOnlyValue);
884 obj->value_->SetShareOption(static_cast<ShareOption>(shareOptionValue));
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_HILOGD(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 > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
933 "Parameter error. The number of arguments must be greater than zero.") ||
934 !CheckExpression(env, IsProperty(env, argv[0]), JSErrorCode::INVALID_PARAMETERS,
935 "Parameter error. The type of property must be PasteDataProperty.")) {
936 return nullptr;
937 }
938
939 PasteDataNapi *obj = nullptr;
940 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
941 if ((status != napi_ok) || (obj == nullptr)) {
942 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
943 return nullptr;
944 }
945 SetProperty(env, argv[0], obj);
946 return nullptr;
947 }
948
PasteDataInit(napi_env env,napi_value exports)949 napi_value PasteDataNapi::PasteDataInit(napi_env env, napi_value exports)
950 {
951 napi_status status = napi_ok;
952 napi_property_descriptor descriptors[] = { DECLARE_NAPI_FUNCTION("addHtmlRecord", AddHtmlRecord),
953 DECLARE_NAPI_FUNCTION("addWantRecord", AddWantRecord), DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
954 DECLARE_NAPI_FUNCTION("addTextRecord", AddTextRecord), DECLARE_NAPI_FUNCTION("addUriRecord", AddUriRecord),
955 DECLARE_NAPI_FUNCTION("addPixelMapRecord", AddPixelMapRecord),
956 DECLARE_NAPI_FUNCTION("getMimeTypes", GetMimeTypes), DECLARE_NAPI_FUNCTION("getPrimaryHtml", GetPrimaryHtml),
957 DECLARE_NAPI_FUNCTION("getPrimaryWant", GetPrimaryWant),
958 DECLARE_NAPI_FUNCTION("getPrimaryMimeType", GetPrimaryMimeType),
959 DECLARE_NAPI_FUNCTION("getPrimaryText", GetPrimaryText), DECLARE_NAPI_FUNCTION("getPrimaryUri", GetPrimaryUri),
960 DECLARE_NAPI_FUNCTION("getPrimaryPixelMap", GetPrimaryPixelMap),
961 DECLARE_NAPI_FUNCTION("getProperty", GetProperty), DECLARE_NAPI_FUNCTION("getRecordAt", GetRecordAt),
962 DECLARE_NAPI_FUNCTION("getRecord", GetRecord), DECLARE_NAPI_FUNCTION("getRecordCount", GetRecordCount),
963 DECLARE_NAPI_FUNCTION("getTag", GetTag), DECLARE_NAPI_FUNCTION("hasMimeType", HasMimeType),
964 DECLARE_NAPI_FUNCTION("hasType", HasType), DECLARE_NAPI_FUNCTION("removeRecordAt", RemoveRecordAt),
965 DECLARE_NAPI_FUNCTION("removeRecord", RemoveRecord), DECLARE_NAPI_FUNCTION("replaceRecordAt", ReplaceRecordAt),
966 DECLARE_NAPI_FUNCTION("replaceRecord", ReplaceRecord), DECLARE_NAPI_FUNCTION("setProperty", SetProperty),
967 DECLARE_NAPI_FUNCTION("pasteStart", PasteStart), DECLARE_NAPI_FUNCTION("pasteComplete", PasteComplete)};
968
969 napi_value constructor;
970 napi_define_class(env, "PasteData", NAPI_AUTO_LENGTH, New, nullptr,
971 sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &constructor);
972 if (status != napi_ok) {
973 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to define class at Init");
974 return nullptr;
975 }
976
977 status = napi_create_reference(env, constructor, 1, &g_pasteData);
978 if (status != napi_ok) {
979 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "PasteDataNapi Init create reference failed");
980 return nullptr;
981 }
982 napi_set_named_property(env, exports, "PasteData", constructor);
983 return exports;
984 }
985
Destructor(napi_env env,void * nativeObject,void * finalize_hint)986 void PasteDataNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
987 {
988 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "Destructor");
989 PasteDataNapi *obj = static_cast<PasteDataNapi *>(nativeObject);
990 delete obj;
991 }
992
New(napi_env env,napi_callback_info info)993 napi_value PasteDataNapi::New(napi_env env, napi_callback_info info)
994 {
995 size_t argc = ARGC_TYPE_SET1;
996 napi_value argv[1] = { 0 };
997 napi_value thisVar = nullptr;
998 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
999
1000 // get native object
1001 PasteDataNapi *obj = new PasteDataNapi();
1002 obj->env_ = env;
1003 ASSERT_CALL(env, napi_wrap(env, thisVar, obj, PasteDataNapi::Destructor,
1004 nullptr, // finalize_hint
1005 nullptr), obj);
1006 return thisVar;
1007 }
1008
NewInstance(napi_env env,napi_value & instance)1009 napi_status PasteDataNapi::NewInstance(napi_env env, napi_value &instance)
1010 {
1011 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1012 napi_status status;
1013 napi_value constructor;
1014 status = napi_get_reference_value(env, g_pasteData, &constructor);
1015 if (status != napi_ok) {
1016 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get reference failed");
1017 return status;
1018 }
1019
1020 status = napi_new_instance(env, constructor, 0, nullptr, &instance);
1021 if (status != napi_ok) {
1022 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "new instance failed");
1023 return status;
1024 }
1025 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "new instance ok");
1026 return napi_ok;
1027 }
1028
IsPasteData(napi_env env,napi_value in)1029 bool PasteDataNapi::IsPasteData(napi_env env, napi_value in)
1030 {
1031 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1032 napi_valuetype type = napi_undefined;
1033 NAPI_CALL_BASE(env, napi_typeof(env, in, &type), false);
1034 if (type != napi_object) {
1035 return false;
1036 }
1037 napi_value constructor;
1038 bool isPasteData = false;
1039 NAPI_CALL_BASE(env, napi_get_reference_value(env, g_pasteData, &constructor), false);
1040 NAPI_CALL_BASE(env, napi_instanceof(env, in, constructor, &isPasteData), false);
1041 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isPasteData is [%{public}d]", isPasteData);
1042 return isPasteData;
1043 }
1044
PasteStart(napi_env env,napi_callback_info info)1045 napi_value PasteDataNapi::PasteStart(napi_env env, napi_callback_info info)
1046 {
1047 napi_value thisVar = nullptr;
1048 PasteDataNapi *obj = nullptr;
1049 size_t argc = 1;
1050 napi_value argv[1] = { 0 };
1051 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1052 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1053 if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1054 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1055 return nullptr;
1056 }
1057 std::string pasteId = obj->value_->GetPasteId();
1058 PasteboardClient::GetInstance()->PasteStart(pasteId);
1059 return nullptr;
1060 }
1061
PasteComplete(napi_env env,napi_callback_info info)1062 napi_value PasteDataNapi::PasteComplete(napi_env env, napi_callback_info info)
1063 {
1064 napi_value thisVar = nullptr;
1065 PasteDataNapi *obj = nullptr;
1066 size_t argc = 1;
1067 napi_value argv[1] = { 0 };
1068 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1069 napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1070 if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1071 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1072 return nullptr;
1073 }
1074 std::string deviceId = obj->value_->GetDeviceId();
1075 std::string pasteId = obj->value_->GetPasteId();
1076 PasteboardClient::GetInstance()->PasteComplete(deviceId, pasteId);
1077 return nullptr;
1078 }
1079 } // namespace MiscServicesNapi
1080 } // namespace OHOS
1081