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