1 /*
2 * Copyright (c) 2024 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 "paste_data_impl.h"
17
18 using namespace OHOS::MiscServices;
19
20 namespace OHOS {
21 namespace MiscServicesCj {
22
23 static std::map<std::shared_ptr<PasteDataRecord>, sptr<PasteDataRecordImpl>> g_cjPasteDataRecordMap;
24 std::recursive_mutex g_PasteDataMutex;
25
GetClassType()26 OHOS::FFI::RuntimeType *PasteDataRecordImpl::GetClassType()
27 {
28 static OHOS::FFI::RuntimeType runtimeType =
29 OHOS::FFI::RuntimeType::Create<OHOS::FFI::FFIData>("PasteDataRecordImpl");
30 return &runtimeType;
31 }
32
CreateCjPasteDataRecordObject(std::string mimeType,CJValueType value)33 int64_t CreateCjPasteDataRecordObject(std::string mimeType, CJValueType value)
34 {
35 auto pasteDataRecordImpl = FFI::FFIData::Create<PasteDataRecordImpl>(mimeType, value);
36 if (!pasteDataRecordImpl) {
37 return 0;
38 }
39 std::shared_ptr<MiscServices::PasteDataRecord> realValue = pasteDataRecordImpl->GetRealPasteDataRecord();
40 std::lock_guard<std::recursive_mutex> lock(g_PasteDataMutex);
41 g_cjPasteDataRecordMap.try_emplace(realValue, pasteDataRecordImpl);
42
43 return pasteDataRecordImpl->GetID();
44 }
45
getCjPasteDataRecordImpl(std::shared_ptr<PasteDataRecord> record)46 sptr<PasteDataRecordImpl> getCjPasteDataRecordImpl(std::shared_ptr<PasteDataRecord> record)
47 {
48 if (record == nullptr) {
49 return nullptr;
50 }
51 std::lock_guard<std::recursive_mutex> lock(g_PasteDataMutex);
52 if (g_cjPasteDataRecordMap.find(record) == g_cjPasteDataRecordMap.end()) {
53 return nullptr;
54 }
55 return g_cjPasteDataRecordMap[record];
56 }
57
removeCjPasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> record)58 void removeCjPasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> record)
59 {
60 std::lock_guard<std::recursive_mutex> lock(g_PasteDataMutex);
61 g_cjPasteDataRecordMap.erase(record);
62 }
63
addCjPasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> record,sptr<PasteDataRecordImpl> pasteDataRecordImpl)64 void addCjPasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> record,
65 sptr<PasteDataRecordImpl> pasteDataRecordImpl)
66 {
67 std::lock_guard<std::recursive_mutex> lock(g_PasteDataMutex);
68 g_cjPasteDataRecordMap.try_emplace(record, pasteDataRecordImpl);
69 }
70
PasteDataRecordImpl()71 PasteDataRecordImpl::PasteDataRecordImpl()
72 {
73 value_ = std::make_shared<PasteDataRecord>();
74 }
75
PasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> pasteDataRecord)76 PasteDataRecordImpl::PasteDataRecordImpl(std::shared_ptr<MiscServices::PasteDataRecord> pasteDataRecord)
77 {
78 value_ = pasteDataRecord;
79 }
80
PasteDataRecordImpl(std::string mimeType,CJValueType value)81 PasteDataRecordImpl::PasteDataRecordImpl(std::string mimeType, CJValueType value)
82 {
83 if (mimeType == "text/html") {
84 CreateHtmlDataRecord(mimeType, value);
85 } else if (mimeType == "text/plain") {
86 CreatePlainTextDataRecord(mimeType, value);
87 } else if (mimeType == "text/uri") {
88 CreateUriDataRecord(mimeType, value);
89 } else if (mimeType == "pixelMap") {
90 CreatePixelMapDataRecord(mimeType, value);
91 } else if (mimeType == "text/want") {
92 CreateWantDataRecord(mimeType, value);
93 } else {
94 std::vector<uint8_t> arrayBuf(reinterpret_cast<uint8_t *>(value.arrayBufferData),
95 reinterpret_cast<uint8_t *>(value.arrayBufferData) + value.arrayBufferSize);
96 value_ = PasteboardClient::GetInstance()->CreateKvRecord(mimeType, arrayBuf);
97 }
98 }
99
GetRealPasteDataRecord()100 std::shared_ptr<MiscServices::PasteDataRecord> PasteDataRecordImpl::GetRealPasteDataRecord()
101 {
102 if (value_ == nullptr) {
103 return nullptr;
104 }
105 std::shared_ptr<MiscServices::PasteDataRecord> res = value_;
106 return res;
107 }
108
CreateHtmlDataRecord(std::string mimeType,CJValueType value)109 void PasteDataRecordImpl::CreateHtmlDataRecord(std::string mimeType, CJValueType value)
110 {
111 value_ = PasteboardClient::GetInstance()->CreateHtmlTextRecord(value.stringValue);
112 }
113
CreatePlainTextDataRecord(std::string mimeType,CJValueType value)114 void PasteDataRecordImpl::CreatePlainTextDataRecord(std::string mimeType, CJValueType value)
115 {
116 value_ = PasteboardClient::GetInstance()->CreatePlainTextRecord(value.stringValue);
117 }
118
CreateUriDataRecord(std::string mimeType,CJValueType value)119 void PasteDataRecordImpl::CreateUriDataRecord(std::string mimeType, CJValueType value)
120 {
121 value_ = PasteboardClient::GetInstance()->CreateUriRecord(OHOS::Uri(value.stringValue));
122 }
123
CreatePixelMapDataRecord(std::string mimeType,CJValueType value)124 void PasteDataRecordImpl::CreatePixelMapDataRecord(std::string mimeType, CJValueType value)
125 {
126 value_ = PasteboardClient::GetInstance()->CreatePixelMapRecord(value.pixelMap);
127 }
128
CreateWantDataRecord(std::string mimeType,CJValueType value)129 void PasteDataRecordImpl::CreateWantDataRecord(std::string mimeType, CJValueType value)
130 {
131 }
132
133 }
134 }