1 /*
2  * Copyright (c) 2022 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 "ohos_adapter/bridge/ark_paste_board_client_adapter_wrapper.h"
17 
18 #include "ohos_adapter/bridge/ark_paste_board_observer_adapter_impl.h"
19 #include "ohos_adapter/bridge/ark_paste_data_record_adapter_wrapper.h"
20 #include "ohos_adapter/ctocpp/ark_paste_data_record_adapter_ctocpp.h"
21 #include "ohos_adapter/ctocpp/ark_paste_record_vector_ctocpp.h"
22 
23 #include "base/bridge/ark_web_bridge_macros.h"
24 
25 namespace OHOS::ArkWeb {
26 
ArkPasteRecordVectorClassToStruct(const NWeb::PasteRecordVector & class_value)27 static ArkPasteRecordVector ArkPasteRecordVectorClassToStruct(const NWeb::PasteRecordVector& class_value)
28 {
29     ArkPasteRecordVector struct_value = { .size = class_value.size(), .ark_web_mem_free_func = ArkWebMemFree };
30     if (struct_value.size > 0) {
31         struct_value.value = (ark_paste_data_record_adapter_t**)ArkWebMemMalloc(
32             sizeof(ark_paste_data_record_adapter_t*) * struct_value.size);
33         if (struct_value.value == nullptr) {
34             struct_value.size = 0;
35             return struct_value;
36         }
37 
38         int count = 0;
39         for (auto it = class_value.begin(); it != class_value.end(); it++) {
40             std::shared_ptr<ArkPasteDataRecordAdapterWrapper> data =
41                 std::static_pointer_cast<ArkPasteDataRecordAdapterWrapper>(*it);
42             struct_value.value[count] = ArkPasteDataRecordAdapterCToCpp::Revert(data->ctocpp_);
43             count++;
44         }
45     }
46     return struct_value;
47 }
48 
ArkPasteBoardClientAdapterWrapper(ArkWebRefPtr<ArkPasteBoardClientAdapter> ref)49 ArkPasteBoardClientAdapterWrapper::ArkPasteBoardClientAdapterWrapper(ArkWebRefPtr<ArkPasteBoardClientAdapter> ref)
50     : ctocpp_(ref)
51 {}
52 
GetPasteData(NWeb::PasteRecordVector & data)53 bool ArkPasteBoardClientAdapterWrapper::GetPasteData(NWeb::PasteRecordVector& data)
54 {
55     if (!ctocpp_) {
56         return false;
57     }
58     ArkPasteRecordVector ark_vector;
59     bool result = ctocpp_->GetPasteData(ark_vector);
60     data = ArkPasteRecordVectorStructToClass(ark_vector);
61     ArkPasteRecordVectorStructRelease(ark_vector);
62     return result;
63 }
64 
SetPasteData(const NWeb::PasteRecordVector & data,NWeb::CopyOptionMode copyOption)65 void ArkPasteBoardClientAdapterWrapper::SetPasteData(
66     const NWeb::PasteRecordVector& data, NWeb::CopyOptionMode copyOption)
67 {
68     if (!ctocpp_) {
69         return;
70     }
71     ArkPasteRecordVector ark_vector = ArkPasteRecordVectorClassToStruct(data);
72     ctocpp_->SetPasteData(ark_vector, (int32_t)copyOption);
73     ArkPasteRecordVectorStructRelease(ark_vector);
74 }
75 
HasPasteData()76 bool ArkPasteBoardClientAdapterWrapper::HasPasteData()
77 {
78     if (!ctocpp_) {
79         return false;
80     }
81     return ctocpp_->HasPasteData();
82 }
83 
Clear()84 void ArkPasteBoardClientAdapterWrapper::Clear()
85 {
86     if (!ctocpp_) {
87         return;
88     }
89     ctocpp_->Clear();
90 }
91 
OpenRemoteUri(const std::string & path)92 int32_t ArkPasteBoardClientAdapterWrapper::OpenRemoteUri(const std::string& path)
93 {
94     if (!ctocpp_) {
95         return -1;
96     }
97     ArkWebString str = ArkWebStringClassToStruct(path);
98     int32_t result = ctocpp_->OpenRemoteUri(str);
99     ArkWebStringStructRelease(str);
100     return result;
101 }
102 
IsLocalPaste()103 bool ArkPasteBoardClientAdapterWrapper::IsLocalPaste()
104 {
105     if (!ctocpp_) {
106         return false;
107     }
108     return ctocpp_->IsLocalPaste();
109 }
110 
GetTokenId()111 uint32_t ArkPasteBoardClientAdapterWrapper::GetTokenId()
112 {
113     if (!ctocpp_) {
114         return 0;
115     }
116     return ctocpp_->GetTokenId();
117 }
118 
AddPasteboardChangedObserver(std::shared_ptr<NWeb::PasteboardObserverAdapter> callback)119 int32_t ArkPasteBoardClientAdapterWrapper::AddPasteboardChangedObserver(
120     std::shared_ptr<NWeb::PasteboardObserverAdapter> callback)
121 {
122     if (!ctocpp_) {
123         return -1;
124     }
125 
126     if (CHECK_SHARED_PTR_IS_NULL(callback)) {
127         return ctocpp_->AddPasteboardChangedObserver(nullptr);
128     }
129 
130     return ctocpp_->AddPasteboardChangedObserver(new ArkPasteBoardObserverAdapterImpl(callback));
131 }
132 
RemovePasteboardChangedObserver(int32_t callbackId)133 void ArkPasteBoardClientAdapterWrapper::RemovePasteboardChangedObserver(int32_t callbackId)
134 {
135     if (!ctocpp_) {
136         return;
137     }
138     ctocpp_->RemovePasteboardChangedObserver(callbackId);
139 }
140 
141 } // namespace OHOS::ArkWeb
142