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 }