60 return std::shared_ptr<::OH_PasteboardObserver>(
61 QArkUi::callArkUiOrFailOnNullResult(
62 Q_OHOS_NAMED_FUNC(::OH_PasteboardObserver_Create)),
63 [](
auto *pasteboardDataObserver) {
64 int observerDestroyRes = QArkUi::callArkUi(
65 Q_OHOS_NAMED_FUNC(::OH_PasteboardObserver_Destroy),
66 pasteboardDataObserver);
67 if (observerDestroyRes != ::PASTEBOARD_ErrCode::ERR_OK) {
69 "%s: failed at destroying pasteboard observer.", Q_FUNC_INFO);
75 std::shared_ptr<::OH_Pasteboard> pasteboard,
76 std::shared_ptr<::OH_PasteboardObserver> pasteboardObserver,
77 ::Pasteboard_NotifyType notifyType,
78 std::function<
void()> dataChangedFunc)
80 QArkUi::callArkUiOrFailOnErrorResult(
81 Q_OHOS_NAMED_FUNC(::OH_Pasteboard_Subscribe),
82 pasteboard.get(), notifyType, pasteboardObserver.get());
84 auto sharedDataChangedFunc = QtOhos::moveToSharedPtr(std::move(dataChangedFunc));
86 auto subscriptionHandle = QtOhos::makeDestroyNotifier(
87 [pasteboard, notifyType, pasteboardObserver, sharedDataChangedFunc]() {
88 int unsubscribeRes = QArkUi::callArkUi(
89 Q_OHOS_NAMED_FUNC(::OH_Pasteboard_Unsubscribe),
90 pasteboard.get(), notifyType, pasteboardObserver.get());
91 if (unsubscribeRes != ::PASTEBOARD_ErrCode::ERR_OK) {
93 "%s: failed at unsubscribing from pasteboard %s.", Q_FUNC_INFO,
94 getPasteboardNotifyTypeAsString(notifyType));
98 QArkUi::callArkUiOrFailOnErrorResult(
99 Q_OHOS_NAMED_FUNC(::OH_PasteboardObserver_SetData),
100 pasteboardObserver.get(), sharedDataChangedFunc.get(),
101 [](
void *ctx, ::Pasteboard_NotifyType) {
102 auto *dataChangedFunc =
reinterpret_cast<
std::function<
void()> *>(ctx);
103 (*dataChangedFunc)();
107 return subscriptionHandle;
111 std::shared_ptr<::OH_Pasteboard> pasteboard,
std::function<
void()> dataChangedListener,
112 std::vector<::Pasteboard_NotifyType> monitoredNotifyTypes)
114 std::vector<std::shared_ptr<
void>> subscriptionHandles;
115 auto sharedDataChangedFunc = QtOhos::moveToSharedPtr(std::move(dataChangedListener));
117 for (
auto notifyType : monitoredNotifyTypes) {
118 auto observer = createPasteboardDataObserver();
119 subscriptionHandles.push_back(
120 subscribePasteboardObserver(
121 pasteboard, observer, notifyType,
122 [sharedDataChangedFunc]() {
123 (*sharedDataChangedFunc)();
127 return QtOhos::moveToSharedPtr(std::move(subscriptionHandles));
132 if (!
QArkUi::callArkUi(Q_OHOS_NAMED_FUNC(::OH_Pasteboard_HasData), pasteboard))
136 auto *udmfDataPtr =
QArkUi::callArkUi(
137 Q_OHOS_NAMED_FUNC(::OH_Pasteboard_GetData),
140 if (res != ::PASTEBOARD_ErrCode::ERR_OK || udmfDataPtr ==
nullptr) {
141 qOhosPrintfError(
"%s: error reading pasteboard data: %d / %p", Q_FUNC_INFO, res, udmfDataPtr);
145 return std::make_unique<
QOhosUdmfData>(QOhosUdmfData::takeOwnership(udmfDataPtr));
151 std::function<
void(QOhosOptional<PasteboardDataSource>)> &&pasteboardUpdatesNotifier)
155 m_pasteboard = std::shared_ptr<::OH_Pasteboard>(
156 QArkUi::callArkUiOrFailOnNullResult(
157 Q_OHOS_NAMED_FUNC(::OH_Pasteboard_Create)),
158 [](
auto *pasteboard) {
159 QArkUi::callArkUi(Q_OHOS_NAMED_FUNC(::OH_Pasteboard_Destroy), pasteboard);
161 auto sharedPasteboardUpdatesNotifier = QtOhos::moveToSharedPtr(
162 std::move(pasteboardUpdatesNotifier));
164 auto pasteboardDataChangedJsThreadListener =
std::make_shared<
std::function<
void()>>(
165 [
this, weakPasteboardUpdatesNotifier = QtOhos::makeWeakPtr(sharedPasteboardUpdatesNotifier)]() {
166 auto optPasteboardUdmfData = tryGetUdmfDataFromPasteboard(m_pasteboard.get());
167 auto pasteboardDataSource =
168 optPasteboardUdmfData
170 isQOhosUdmfDataConvertedFromThisProcessMimeData(*optPasteboardUdmfData)
176 "%s: Pasteboard data source: %s",
180 QtOhos::invokeInQtThread(
181 [weakPasteboardUpdatesNotifier, pasteboardDataSource]() {
182 auto sharedPasteboardUpdatesNotifier = weakPasteboardUpdatesNotifier.lock();
183 if (sharedPasteboardUpdatesNotifier)
184 (*sharedPasteboardUpdatesNotifier)(pasteboardDataSource);
188 m_pasteboardDataChangedListenerHandle = QtOhos::makeSharedPtrWithAttachedExtraData(
189 addPasteboardDataChangedListener(
191 [pasteboardDataChangedJsThreadListener]() {
192 auto __dbg = make_QCScopedDebugJS(Q_FUNC_INFO);
193 QtOhos::invokeInJsThread(
194 [pasteboardDataChangedJsThreadListener](
auto &) {
195 (*pasteboardDataChangedJsThreadListener)();
199 ::Pasteboard_NotifyType::NOTIFY_LOCAL_DATA_CHANGE,
200 ::Pasteboard_NotifyType::NOTIFY_REMOTE_DATA_CHANGE,
202 sharedPasteboardUpdatesNotifier);
216 QOhosOptional<PasteboardDataSource> dataSource;
217 QOhosSupplier<std::unique_ptr<QMimeData>> mimeDataFactory;
218 std::tie(dataSource, mimeDataFactory) = QtOhos::evalInJsThreadWithPromise<std::pair<QOhosOptional<PasteboardDataSource>, QOhosSupplier<std::unique_ptr<QMimeData>>>>(
219 [&](QtOhos::JsState &jsState,
auto evalPromise) {
220 static constexpr const char *ohosGetPasteboardDataPermission =
"ohos.permission.READ_PASTEBOARD";
221 auto sharedEvalPromise = QtOhos::moveToSharedPtr(std::move(evalPromise).makeChained(Q_FUNC_INFO));
222 QOhosAppPermissions::checkAppPermissionGrantedWithConsumer(
223 jsState, ohosGetPasteboardDataPermission,
224 [
this, sharedEvalPromise](
auto &,
bool permissionGranted) {
225 if (!permissionGranted) {
227 "%s: %s hasn't been granted by user. Cannot read pasteboard data.", Q_FUNC_INFO,
228 ohosGetPasteboardDataPermission);
229 (*sharedEvalPromise)({{}, std::make_unique<QMimeData>});
233 auto optPasteboardUdmfData = tryGetUdmfDataFromPasteboard(m_pasteboard.get());
234 if (!optPasteboardUdmfData) {
235 (*sharedEvalPromise)({{}, std::make_unique<QMimeData>});
239 (*sharedEvalPromise)(
242 isQOhosUdmfDataConvertedFromThisProcessMimeData(*optPasteboardUdmfData)
243 ? PasteboardDataSource::OurProcess
244 : PasteboardDataSource::OtherProcess),
245 makeLazyFetchingQMimeDataFactoryFromUdmfData(std::move(*optPasteboardUdmfData))
252 .dataSource = dataSource,
253 .lazyFetchingData = mimeDataFactory(),
258 std::shared_ptr<QMimeData> mimeData,
const QOhosOptional<
bool> &shareInAppOnly)
263 auto udmfDataFactory = makeLazyProcessingUdmfDataFactoryFromQMimeData(mimeData, shareInAppOnly);
267 auto udmfData = udmfDataFactory();
269 int res =
QArkUi::callArkUi(
270 Q_OHOS_NAMED_FUNC(::OH_Pasteboard_SetData),
271 m_pasteboard.get(), udmfData.nativePtr());
272 if (res != ::PASTEBOARD_ErrCode::ERR_OK) {
273 qOhosPrintfError(
"%s: cannot set data for pasteboard.", Q_FUNC_INFO);
std::weak_ptr< QOhosClipboardObject > weakThis