• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = 100 * 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 false");
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     if (propertyNamesNum != static_cast<uint32_t>(sizeof(type) / sizeof(type[0]))) {
932         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "propertyNames invalid");
933         return false;
934     }
935     napi_value propertyValue = nullptr;
936     for (uint32_t i = 0; i < propertyNamesNum; i++) {
937         NAPI_CALL_BASE(env, napi_has_named_property(env, in, key[i], &hasProperty), false);
938         if (!hasProperty) {
939             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "hasProperty is false");
940             return false;
941         }
942         NAPI_CALL_BASE(env, napi_get_named_property(env, in, key[i], &propertyValue), false);
943         if (i == ARGC_TYPE_SET1) {
944             bool isArray = false;
945             NAPI_CALL_BASE(env, napi_is_array(env, propertyValue, &isArray), false);
946             if (!isArray) {
947                 PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isArray is false");
948                 return false;
949             }
950             continue;
951         }
952         NAPI_CALL_BASE(env, napi_typeof(env, propertyValue, &valueType), false);
953         if (valueType != type[i]) {
954             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "valueType not equal %{public}d", type[i]);
955             return false;
956         }
957     }
958     return true;
959 }
960 
SetProperty(napi_env env,napi_callback_info info)961 napi_value PasteDataNapi::SetProperty(napi_env env, napi_callback_info info)
962 {
963     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "SetProperty is called!");
964     size_t argc = ARGC_TYPE_SET1;
965     napi_value argv[ARGC_TYPE_SET1] = { 0 };
966     napi_value thisVar = nullptr;
967 
968     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
969     if (!CheckExpression(env, argc > ARGC_TYPE_SET0, JSErrorCode::INVALID_PARAMETERS,
970         "Parameter error. The number of arguments must be greater than zero.") ||
971         !CheckExpression(env, IsProperty(env, argv[0]), JSErrorCode::INVALID_PARAMETERS,
972             "Parameter error. The type of property must be PasteDataProperty.")) {
973         return nullptr;
974     }
975 
976     PasteDataNapi *obj = nullptr;
977     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
978     if ((status != napi_ok) || (obj == nullptr)) {
979         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
980         return nullptr;
981     }
982     SetProperty(env, argv[0], obj);
983     return nullptr;
984 }
985 
PasteDataInit(napi_env env,napi_value exports)986 napi_value PasteDataNapi::PasteDataInit(napi_env env, napi_value exports)
987 {
988     napi_status status = napi_ok;
989     napi_property_descriptor descriptors[] = { DECLARE_NAPI_FUNCTION("addHtmlRecord", AddHtmlRecord),
990         DECLARE_NAPI_FUNCTION("addWantRecord", AddWantRecord), DECLARE_NAPI_FUNCTION("addRecord", AddRecord),
991         DECLARE_NAPI_FUNCTION("addTextRecord", AddTextRecord), DECLARE_NAPI_FUNCTION("addUriRecord", AddUriRecord),
992         DECLARE_NAPI_FUNCTION("addPixelMapRecord", AddPixelMapRecord),
993         DECLARE_NAPI_FUNCTION("getMimeTypes", GetMimeTypes), DECLARE_NAPI_FUNCTION("getPrimaryHtml", GetPrimaryHtml),
994         DECLARE_NAPI_FUNCTION("getPrimaryWant", GetPrimaryWant),
995         DECLARE_NAPI_FUNCTION("getPrimaryMimeType", GetPrimaryMimeType),
996         DECLARE_NAPI_FUNCTION("getPrimaryText", GetPrimaryText), DECLARE_NAPI_FUNCTION("getPrimaryUri", GetPrimaryUri),
997         DECLARE_NAPI_FUNCTION("getPrimaryPixelMap", GetPrimaryPixelMap),
998         DECLARE_NAPI_FUNCTION("getProperty", GetProperty), DECLARE_NAPI_FUNCTION("getRecordAt", GetRecordAt),
999         DECLARE_NAPI_FUNCTION("getRecord", GetRecord), DECLARE_NAPI_FUNCTION("getRecordCount", GetRecordCount),
1000         DECLARE_NAPI_FUNCTION("getTag", GetTag), DECLARE_NAPI_FUNCTION("hasMimeType", HasMimeType),
1001         DECLARE_NAPI_FUNCTION("hasType", HasType), DECLARE_NAPI_FUNCTION("removeRecordAt", RemoveRecordAt),
1002         DECLARE_NAPI_FUNCTION("removeRecord", RemoveRecord), DECLARE_NAPI_FUNCTION("replaceRecordAt", ReplaceRecordAt),
1003         DECLARE_NAPI_FUNCTION("replaceRecord", ReplaceRecord), DECLARE_NAPI_FUNCTION("setProperty", SetProperty),
1004         DECLARE_NAPI_FUNCTION("pasteStart", PasteStart), DECLARE_NAPI_FUNCTION("pasteComplete", PasteComplete) };
1005 
1006     napi_value constructor;
1007     napi_define_class(env, "PasteData", NAPI_AUTO_LENGTH, New, nullptr,
1008         sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &constructor);
1009     if (status != napi_ok) {
1010         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "Failed to define class at Init");
1011         return nullptr;
1012     }
1013 
1014     status = napi_create_reference(env, constructor, 1, &g_pasteData);
1015     if (status != napi_ok) {
1016         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "PasteDataNapi Init create reference failed");
1017         return nullptr;
1018     }
1019     napi_set_named_property(env, exports, "PasteData", constructor);
1020     return exports;
1021 }
1022 
Destructor(napi_env env,void * nativeObject,void * finalize_hint)1023 void PasteDataNapi::Destructor(napi_env env, void *nativeObject, void *finalize_hint)
1024 {
1025     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "Destructor");
1026     PasteDataNapi *obj = static_cast<PasteDataNapi *>(nativeObject);
1027     delete obj;
1028 }
1029 
New(napi_env env,napi_callback_info info)1030 napi_value PasteDataNapi::New(napi_env env, napi_callback_info info)
1031 {
1032     size_t argc = ARGC_TYPE_SET1;
1033     napi_value argv[ARGC_TYPE_SET1] = { 0 };
1034     napi_value thisVar = nullptr;
1035     napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
1036 
1037     // get native object
1038     PasteDataNapi *obj = new PasteDataNapi();
1039     obj->env_ = env;
1040     ASSERT_CALL(env, napi_wrap(env, thisVar, obj, PasteDataNapi::Destructor,
1041                        nullptr, // finalize_hint
1042                        nullptr), obj);
1043     return thisVar;
1044 }
1045 
NewInstance(napi_env env,napi_value & instance)1046 napi_status PasteDataNapi::NewInstance(napi_env env, napi_value &instance)
1047 {
1048     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1049     napi_status status;
1050     napi_value constructor;
1051     status = napi_get_reference_value(env, g_pasteData, &constructor);
1052     if (status != napi_ok) {
1053         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get reference failed");
1054         return status;
1055     }
1056 
1057     status = napi_new_instance(env, constructor, 0, nullptr, &instance);
1058     if (status != napi_ok) {
1059         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "new instance failed");
1060         return status;
1061     }
1062     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "new instance ok");
1063     return napi_ok;
1064 }
1065 
IsPasteData(napi_env env,napi_value in)1066 bool PasteDataNapi::IsPasteData(napi_env env, napi_value in)
1067 {
1068     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "enter");
1069     napi_valuetype type = napi_undefined;
1070     NAPI_CALL_BASE(env, napi_typeof(env, in, &type), false);
1071     if (type != napi_object) {
1072         return false;
1073     }
1074     napi_value constructor;
1075     bool isPasteData = false;
1076     NAPI_CALL_BASE(env, napi_get_reference_value(env, g_pasteData, &constructor), false);
1077     NAPI_CALL_BASE(env, napi_instanceof(env, in, constructor, &isPasteData), false);
1078     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "isPasteData is [%{public}d]", isPasteData);
1079     return isPasteData;
1080 }
1081 
PasteStart(napi_env env,napi_callback_info info)1082 napi_value PasteDataNapi::PasteStart(napi_env env, napi_callback_info info)
1083 {
1084     napi_value thisVar = nullptr;
1085     PasteDataNapi *obj = nullptr;
1086     size_t argc = ARGC_TYPE_SET1;
1087     napi_value argv[ARGC_TYPE_SET1] = { 0 };
1088     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1089     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1090     if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1091         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1092         return nullptr;
1093     }
1094     std::string pasteId = obj->value_->GetPasteId();
1095     PasteboardClient::GetInstance()->PasteStart(pasteId);
1096     return nullptr;
1097 }
1098 
PasteComplete(napi_env env,napi_callback_info info)1099 napi_value PasteDataNapi::PasteComplete(napi_env env, napi_callback_info info)
1100 {
1101     napi_value thisVar = nullptr;
1102     PasteDataNapi *obj = nullptr;
1103     size_t argc = ARGC_TYPE_SET1;
1104     napi_value argv[ARGC_TYPE_SET1] = { 0 };
1105     NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, NULL));
1106     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
1107     if ((status != napi_ok) || (obj == nullptr) || (obj->value_ == nullptr)) {
1108         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_unwrap failed");
1109         return nullptr;
1110     }
1111     std::string deviceId = obj->value_->GetDeviceId();
1112     std::string pasteId = obj->value_->GetPasteId();
1113     PasteboardClient::GetInstance()->PasteComplete(deviceId, pasteId);
1114     return nullptr;
1115 }
1116 } // namespace MiscServicesNapi
1117 } // namespace OHOS
1118