vcl/Library_vcl.mk | 1 vcl/ios/clipboard.cxx | 257 -------------------------------------------------- vcl/ios/clipboard.hxx | 122 ----------------------- 3 files changed, 380 deletions(-)
New commits: commit 1bd9ac53f0d042c82de77abccde292a2bd179bbd Author: Skyler Grey <skyler.g...@collabora.com> AuthorDate: Tue Nov 12 13:21:08 2024 +0000 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Mon Jan 27 16:57:01 2025 +0100 chore(iOS): Cleanup old iOS pasteboard code Since as we're switching to handling the clipboard the same in iOS as everywhere else, this old pasteboard code is no longer needed Change-Id: I49671a0bdbd1e1699253c9e710366c1a860ca38d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180785 Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index ef2e92721dc1..b9fa3e21c996 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -764,7 +764,6 @@ $(eval $(call gb_Library_add_objcxxobjects,vcl,\ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/ios/iosinst \ vcl/ios/dummies \ - vcl/ios/clipboard \ vcl/ios/salios \ vcl/ios/iOSTransferable \ vcl/ios/DataFlavorMapping \ diff --git a/vcl/ios/clipboard.cxx b/vcl/ios/clipboard.cxx deleted file mode 100644 index 109f744e87c8..000000000000 --- a/vcl/ios/clipboard.cxx +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include "ios/iosinst.hxx" -#include "quartz/utils.h" - -#include "clipboard.hxx" - -#include "DataFlavorMapping.hxx" -#include "iOSTransferable.hxx" -#include <com/sun/star/datatransfer/MimeContentTypeFactory.hpp> -#include <com/sun/star/lang/IllegalArgumentException.hpp> -#include <comphelper/processfactory.hxx> -#include <cppuhelper/supportsservice.hxx> - -@implementation PasteboardChangedEventListener - -- (PasteboardChangedEventListener*)initWithiOSClipboard:(iOSClipboard*)pcb -{ - self = [super init]; - - if (self) - { - // Just to be safe, set clipboard to a nullptr to ignore any - // synchronous callbacks that might occur when adding the observer - piOSClipboard = nullptr; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(pasteboardChanged:) - name:UIPasteboardChangedNotification - object:[UIPasteboard generalPasteboard]]; - - // According to following, no UIPasteboardChangedNotification - // notifications are received when an app is not active. So, post the - // notification so that the LibreOffice vcl/ios code can handle any - // clipboard changes: - // https://stackoverflow.com/questions/4240087/receiving-uipasteboard-generalpasteboard-notification-while-in-the-background - // Note: UIApplicationDidBecomeActiveNotification is never sent when - // running in Mac Catalyst so listen for UISceneDidActivateNotification - // instead. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(pasteboardChanged:) - name:UISceneDidActivateNotification - object:nil]; - - piOSClipboard = pcb; - } - - return self; -} - -- (void)pasteboardChanged:(NSNotification*)aNotification -{ - if (piOSClipboard) - piOSClipboard->contentsChanged(); -} - -- (void)disposing -{ - piOSClipboard = nullptr; - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -@end - -iOSClipboard::iOSClipboard() - : WeakComponentImplHelper<XSystemClipboard, XServiceInfo>(m_aMutex) -{ - auto xContext = comphelper::getProcessComponentContext(); - - mrXMimeCntFactory = css::datatransfer::MimeContentTypeFactory::create(xContext); - - mpDataFlavorMapper.reset(new DataFlavorMapper()); - - mnPasteboardChangeCount = 0; - mpPasteboardChangedEventListener = - [[PasteboardChangedEventListener alloc] initWithiOSClipboard:this]; -} - -iOSClipboard::~iOSClipboard() -{ - [mpPasteboardChangedEventListener disposing]; - [mpPasteboardChangedEventListener release]; -} - -css::uno::Reference<css::datatransfer::XTransferable> SAL_CALL iOSClipboard::getContents() -{ - osl::MutexGuard aGuard(m_aMutex); - - return css::uno::Reference<css::datatransfer::XTransferable>( - new iOSTransferable(mrXMimeCntFactory, mpDataFlavorMapper)); -} - -void SAL_CALL iOSClipboard::setContents( - const css::uno::Reference<css::datatransfer::XTransferable>& xTransferable, - const css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner>& /*xClipboardOwner*/) -{ - NSArray* types = xTransferable.is() ? mpDataFlavorMapper->flavorSequenceToTypesArray( - xTransferable->getTransferDataFlavors()) - : [NSArray array]; - - osl::ClearableMutexGuard aGuard(m_aMutex); - - NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithCapacity:1]; - NSArray* array = @[ dict ]; - - for (sal_uInt32 i = 0; i < [types count]; ++i) - { - DataProviderPtr_t dp = mpDataFlavorMapper->getDataProvider(types[i], xTransferable); - - if (dp.get() != nullptr) - { - NSData* pBoardData = (NSData*)dp->getSystemData(); - dict[types[i]] = pBoardData; - } - } - SAL_INFO("vcl.ios.clipboard", "Setting pasteboard items: " << NSDictionaryKeysToOUString(dict)); - [[UIPasteboard generalPasteboard] setItems:array options:@{}]; - - // We don't keep a copy of the clipboard contents around in-process, so fire the lost clipboard - // ownership event right away. - // fireLostClipboardOwnershipEvent(xClipboardOwner, xTransferable); - - // fireClipboardChangedEvent(xTransferable); -} - -OUString SAL_CALL iOSClipboard::getName() { return OUString(); } - -sal_Int8 SAL_CALL iOSClipboard::getRenderingCapabilities() { return 0; } - -void SAL_CALL iOSClipboard::addClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) -{ - osl::MutexGuard aGuard(m_aMutex); - - if (!listener.is()) - throw css::lang::IllegalArgumentException( - "empty reference", static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), 1); - - mClipboardListeners.push_back(listener); -} - -void SAL_CALL iOSClipboard::removeClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) -{ - osl::MutexGuard aGuard(m_aMutex); - - if (!listener.is()) - throw css::lang::IllegalArgumentException( - "empty reference", static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), 1); - - mClipboardListeners.remove(listener); -} - -void iOSClipboard::fireClipboardChangedEvent( - css::uno::Reference<css::datatransfer::XTransferable> xNewContents) -{ - osl::ClearableMutexGuard aGuard(m_aMutex); - - std::list<css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>> listeners( - mClipboardListeners); - css::datatransfer::clipboard::ClipboardEvent aEvent; - - if (!listeners.empty()) - { - aEvent = css::datatransfer::clipboard::ClipboardEvent(getXWeak(), xNewContents); - } - - aGuard.clear(); - - while (!listeners.empty()) - { - if (listeners.front().is()) - { - try - { - listeners.front()->changedContents(aEvent); - } - catch (const css::uno::RuntimeException&) - { - } - } - listeners.pop_front(); - } -} - -void iOSClipboard::fireLostClipboardOwnershipEvent( - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> const& oldOwner, - css::uno::Reference<css::datatransfer::XTransferable> const& oldContent) -{ - assert(oldOwner.is()); - - try - { - oldOwner->lostOwnership(static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), - oldContent); - } - catch (const css::uno::RuntimeException&) - { - } -} - -OUString SAL_CALL iOSClipboard::getImplementationName() -{ - return OUString("com.sun.star.datatransfer.clipboard.iOSClipboard"); -} - -sal_Bool SAL_CALL iOSClipboard::supportsService(const OUString& ServiceName) -{ - return cppu::supportsService(this, ServiceName); -} - -css::uno::Sequence<OUString> SAL_CALL iOSClipboard::getSupportedServiceNames() -{ - return { OUString("com.sun.star.datatransfer.clipboard.SystemClipboard") }; -} - -void iOSClipboard::contentsChanged() -{ - NSInteger nPasteboardChangeCount = [[UIPasteboard generalPasteboard] changeCount]; - if (mnPasteboardChangeCount != nPasteboardChangeCount) - { - // cool#5839 fire a clipboard changed event in the iOS app - // A clipboard changed event needs to be fired whenever the - // native general pasteboard changes. Otherwise, if the clipboard - // is empty when a document is opened, the Paste and Paste Special - // menu items and toolbar buttons will be disabled and will never - // be enabled even after something has been copied to the general - // pasteboard. - mnPasteboardChangeCount = nPasteboardChangeCount; - fireClipboardChangedEvent(getContents()); - } -} - -css::uno::Reference<css::uno::XInterface> -IosSalInstance::CreateClipboard(const css::uno::Sequence<css::uno::Any>&) -{ - return getXWeak(new iOSClipboard()); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/ios/clipboard.hxx b/vcl/ios/clipboard.hxx deleted file mode 100644 index e1133f0ba0bf..000000000000 --- a/vcl/ios/clipboard.hxx +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#pragma once - -#include "DataFlavorMapping.hxx" -#include <rtl/ustring.hxx> -#include <sal/types.h> -#include <cppuhelper/compbase.hxx> -#include <com/sun/star/datatransfer/XTransferable.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp> -#include <com/sun/star/datatransfer/clipboard/XSystemClipboard.hpp> -#include <com/sun/star/datatransfer/XMimeContentTypeFactory.hpp> -#include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <cppuhelper/basemutex.hxx> -#include <com/sun/star/lang/XMultiComponentFactory.hpp> - -#include <list> - -#include <premac.h> -#import <UIKit/UIKit.h> -#include <postmac.h> - -class iOSClipboard; - -@interface PasteboardChangedEventListener : NSObject -{ - iOSClipboard* piOSClipboard; -} -- (PasteboardChangedEventListener*)initWithiOSClipboard:(iOSClipboard*)pcb; -- (void)pasteboardChanged:(NSNotification*)aNotification; -- (void)disposing; -@end - -class iOSClipboard - : public ::cppu::BaseMutex, - public ::cppu::WeakComponentImplHelper<css::datatransfer::clipboard::XSystemClipboard, - css::lang::XServiceInfo> -{ -public: - iOSClipboard(); - - virtual ~iOSClipboard() override; - iOSClipboard(const iOSClipboard&) = delete; - iOSClipboard& operator=(const iOSClipboard&) = delete; - - // XClipboard - - css::uno::Reference<css::datatransfer::XTransferable> SAL_CALL getContents() override; - - void SAL_CALL setContents( - const css::uno::Reference<css::datatransfer::XTransferable>& xTransferable, - const css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner>& xClipboardOwner) - override; - - OUString SAL_CALL getName() override; - - // XClipboardEx - - sal_Int8 SAL_CALL getRenderingCapabilities() override; - - // XClipboardNotifier - - void SAL_CALL addClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) - override; - - void SAL_CALL removeClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) - override; - - // XServiceInfo - - OUString SAL_CALL getImplementationName() override; - - sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; - - css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; - - void contentsChanged(); - -private: - /* Notify the current clipboard owner that he is no longer the clipboard owner. */ - void fireLostClipboardOwnershipEvent( - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> const& oldOwner, - css::uno::Reference<css::datatransfer::XTransferable> const& oldContent); - - /* Notify all registered XClipboardListener that the clipboard content has changed. */ - void - fireClipboardChangedEvent(css::uno::Reference<css::datatransfer::XTransferable> xNewContents); - -private: - css::uno::Reference<css::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; - std::list<css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>> - mClipboardListeners; - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> mXClipboardOwner; - std::shared_ptr<DataFlavorMapper> mpDataFlavorMapper; - NSInteger mnPasteboardChangeCount; - PasteboardChangedEventListener* mpPasteboardChangedEventListener; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */