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 #ifndef FOUNDATION_ACE_ACE_ENGINE_ADAPTER_OHOS_CAPABILITY_CLIPBOARD_CLIPBOARD_IMPL_H
17 #define FOUNDATION_ACE_ACE_ENGINE_ADAPTER_OHOS_CAPABILITY_CLIPBOARD_CLIPBOARD_IMPL_H
18 
19 #ifdef SYSTEM_CLIPBOARD_SUPPORTED
20 #include "pasteboard_client.h"
21 #endif
22 
23 #include "core/common/clipboard/clipboard_interface.h"
24 #include "core/common/clipboard/paste_data.h"
25 
26 namespace OHOS::Ace {
27 class PasteDataImpl;
28 class ClipboardImpl : public Clipboard {
29 public:
ClipboardImpl(const RefPtr<TaskExecutor> & taskExecutor)30     explicit ClipboardImpl(const RefPtr<TaskExecutor>& taskExecutor) : Clipboard(taskExecutor) {}
31     ~ClipboardImpl() override = default;
32 
33     // Implement Clipboard
34     void SetData(
35         const std::string& data, CopyOptions copyOption = CopyOptions::InApp, bool isDragData = false) override;
36     void GetData(const std::function<void(const std::string&)>& callback, bool syncMode = false) override;
37     void SetPixelMapData(const RefPtr<PixelMap>& pixmap, CopyOptions copyOption = CopyOptions::InApp) override;
38     void GetPixelMapData(const std::function<void(const RefPtr<PixelMap>&)>& callback, bool syncMode = false) override;
39     void AddPixelMapRecord(const RefPtr<PasteDataMix>& pasteData, const RefPtr<PixelMap>& pixmap) override;
40     void AddImageRecord(const RefPtr<PasteDataMix>& pasteData, const std::string& uri) override;
41     void AddTextRecord(const RefPtr<PasteDataMix>& pasteData, const std::string& selectedStr) override;
42     void AddSpanStringRecord(const RefPtr<PasteDataMix>& pasteData, std::vector<uint8_t>& data) override;
43     void AddMultiTypeRecord(
44         const RefPtr<PasteDataMix>& pasteData, const RefPtr<MultiTypeRecordMix>& multiTypeRecord) override;
45     void SetData(const RefPtr<PasteDataMix>& pasteData, CopyOptions copyOption) override;
46     void GetData(const std::function<void(const std::string&, bool isLastRecord)>& textCallback,
47         const std::function<void(const RefPtr<PixelMap>&, bool isLastRecord)>& pixelMapCallback,
48         const std::function<void(const std::string&, bool isLastRecord)>& urlCallback, bool syncMode = false) override;
49     RefPtr<PasteDataMix> CreatePasteDataMix() override;
50     void HasData(const std::function<void(bool hasData)>& callback) override;
51     void HasDataType(
52         const std::function<void(bool hasData)>& callback, const std::vector<std::string>& mimeTypes) override;
53     void Clear() override;
54     void GetSpanStringData(
55         const std::function<void(std::vector<std::vector<uint8_t>>&, const std::string&, bool&)>& callback,
56         bool syncMode = false) override;
57 
58 #ifdef SYSTEM_CLIPBOARD_SUPPORTED
59 private:
60     void GetDataSync(const std::function<void(const std::string&)>& callback);
61     void GetDataAsync(const std::function<void(const std::string&)>& callback);
62     void GetDataSync(const std::function<void(const std::string&, bool isLastRecord)>& textCallback,
63         const std::function<void(const RefPtr<PixelMap>&, bool isLastRecord)>& pixelMapCallback,
64         const std::function<void(const std::string&, bool isLastRecord)>& urlCallback);
65     void GetDataAsync(const std::function<void(const std::string&, bool isLastRecord)>& textCallback,
66         const std::function<void(const RefPtr<PixelMap>&, bool isLastRecord)>& pixelMapCallback,
67         const std::function<void(const std::string&, bool isLastRecord)>& urlCallback);
68     bool ProcessPasteDataRecord(const std::shared_ptr<MiscServices::PasteDataRecord>& pasteDataRecord,
69         std::string& resText);
70     void GetPixelMapDataSync(const std::function<void(const RefPtr<PixelMap>&)>& callback);
71     void GetPixelMapDataAsync(const std::function<void(const RefPtr<PixelMap>&)>& callback);
72     void GetSpanStringDataHelper(
73         const std::function<void(std::vector<std::vector<uint8_t>>&, const std::string&, bool&)>& callback,
74         bool syncMode = false);
75     void ProcessSpanStringData(std::vector<std::vector<uint8_t>>& arrays,
76         const OHOS::MiscServices::PasteData& pasteData, std::string& text, bool& isMultiTypeRecord);
77     const std::string GetMimeType(
78         std::map<std::string, std::shared_ptr<OHOS::MiscServices::EntryValue>> multiTypeDataMap);
79 #endif
80 };
81 
82 class ClipboardProxyImpl final : public ClipboardInterface {
83 public:
84     ClipboardProxyImpl() = default;
85     ~ClipboardProxyImpl() = default;
86 
87     // Implement ClipboardInterface
GetClipboard(const RefPtr<TaskExecutor> & taskExecutor)88     RefPtr<Clipboard> GetClipboard(const RefPtr<TaskExecutor>& taskExecutor) const override
89     {
90         return AceType::MakeRefPtr<ClipboardImpl>(taskExecutor);
91     }
92 };
93 
94 class PasteDataImpl : public PasteDataMix {
95     DECLARE_ACE_TYPE(PasteDataImpl, PasteDataMix);
96 
97 public:
98     PasteDataImpl() = default;
99     ~PasteDataImpl() = default;
100 
101 #ifdef SYSTEM_CLIPBOARD_SUPPORTED
102     std::shared_ptr<OHOS::MiscServices::PasteData> GetPasteDataData();
103     void SetUnifiedData(std::shared_ptr<OHOS::MiscServices::PasteData> pasteData);
104 
105 private:
106     std::shared_ptr<OHOS::MiscServices::PasteData> pasteData_;
107 #endif
108 };
109 
110 class MultiTypeRecordImpl : public MultiTypeRecordMix {
111     DECLARE_ACE_TYPE(MultiTypeRecordImpl, MultiTypeRecordMix);
112 
113 public:
114     MultiTypeRecordImpl() = default;
115     ~MultiTypeRecordImpl() = default;
116 
117     void SetPlainText(const std::string plainText);
118     void SetUri(const std::string uri);
119     void SetPixelMap(RefPtr<PixelMap> pixelMap);
120     const RefPtr<PixelMap> GetPixelMap();
121     const std::string GetPlainText();
122     const std::string GetUri();
123     std::vector<uint8_t>& GetSpanStringBuffer();
124 
125 private:
126     RefPtr<PixelMap> pixelMap_;
127     std::string plainText_;
128     std::string uri_;
129     std::vector<uint8_t> spanStringBuffer_;
130 };
131 } // namespace OHOS::Ace
132 
133 #endif // FOUNDATION_ACE_ACE_ENGINE_ADAPTER_OHOS_CAPABILITY_CLIPBOARD_CLIPBOARD_IMPL_H