summaryrefslogtreecommitdiff
path: root/dtrans/source/win32
diff options
context:
space:
mode:
authorTino Rachui <tra@openoffice.org>2001-03-16 15:33:30 +0000
committerTino Rachui <tra@openoffice.org>2001-03-16 15:33:30 +0000
commit52dbacf7cd5f28ac400b6a60693a522d371d7609 (patch)
tree036bf3eab71b2df4aec1e306b7449000f5c141ce /dtrans/source/win32
parent1434b5f4363053a8747a401d0f50b7c25c31b7ba (diff)
*** empty log message ***
Diffstat (limited to 'dtrans/source/win32')
-rw-r--r--dtrans/source/win32/clipb/WinClipbImpl.cxx143
-rw-r--r--dtrans/source/win32/clipb/WinClipbImpl.hxx39
-rw-r--r--dtrans/source/win32/clipb/WinClipboard.cxx17
-rw-r--r--dtrans/source/win32/clipb/WinClipboard.hxx5
-rw-r--r--dtrans/source/win32/dtobj/DataFmtTransl.cxx15
-rw-r--r--dtrans/source/win32/dtobj/FetcList.cxx6
-rw-r--r--dtrans/source/win32/dtobj/XNotifyingDataObject.cxx382
-rw-r--r--dtrans/source/win32/dtobj/XNotifyingDataObject.hxx135
-rw-r--r--dtrans/source/win32/dtobj/XTDataObject.cxx25
-rw-r--r--dtrans/source/win32/dtobj/XTDataObject.hxx11
-rw-r--r--dtrans/source/win32/dtobj/makefile.mk7
11 files changed, 601 insertions, 184 deletions
diff --git a/dtrans/source/win32/clipb/WinClipbImpl.cxx b/dtrans/source/win32/clipb/WinClipbImpl.cxx
index 64bcbb018db3..4afc5e8f424e 100644
--- a/dtrans/source/win32/clipb/WinClipbImpl.cxx
+++ b/dtrans/source/win32/clipb/WinClipbImpl.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: WinClipbImpl.cxx,v $
*
- * $Revision: 1.8 $
+ * $Revision: 1.9 $
*
- * last change: $Author: tra $ $Date: 2001-03-16 08:59:04 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:32:44 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -87,6 +87,10 @@
#include <com/sun/star/datatransfer/clipboard/RenderingCapabilities.hpp>
#endif
+#ifndef _XNOTIFYINGDATAOBJECT_HXX_
+#include "..\dtobj\XNotifyingDataObject.hxx"
+#endif
+
#include <windows.h>
#include <ole2.h>
#include <objidl.h>
@@ -119,15 +123,13 @@ CWinClipbImpl* CWinClipbImpl::s_pCWinClipbImpl = NULL;
CWinClipbImpl::CWinClipbImpl( const OUString& aClipboardName, CWinClipboard* theWinClipboard ) :
m_itsName( aClipboardName ),
m_pWinClipboard( theWinClipboard ),
- m_bInDispose( sal_False ),
- m_bSelfTriggered( sal_False )
+ m_pCurrentClipContent( NULL )
{
OSL_ASSERT( NULL != m_pWinClipboard );
// necessary to reassociate from
// the static callback function
s_pCWinClipbImpl = this;
-
registerClipboardViewer( );
}
@@ -137,6 +139,7 @@ CWinClipbImpl::CWinClipbImpl( const OUString& aClipboardName, CWinClipboard* the
CWinClipbImpl::~CWinClipbImpl( )
{
+ s_pCWinClipbImpl = NULL;
unregisterClipboardViewer( );
}
@@ -146,12 +149,10 @@ CWinClipbImpl::~CWinClipbImpl( )
Reference< XTransferable > SAL_CALL CWinClipbImpl::getContents( ) throw( RuntimeException )
{
- MutexGuard aGuard( m_aMutex );
-
Reference< XTransferable > rClipContent;
- if ( m_rCurrentClipbContent.is( ) )
- rClipContent = m_rCurrentClipbContent;
+ if ( NULL != m_pCurrentClipContent )
+ rClipContent = m_pCurrentClipContent->m_XTransferable;
else
{
// get the current dataobject from clipboard
@@ -175,37 +176,24 @@ Reference< XTransferable > SAL_CALL CWinClipbImpl::getContents( ) throw( Runtime
// setContent
//------------------------------------------------------------------------
-void SAL_CALL CWinClipbImpl::setContents( const Reference< XTransferable >& xTransferable,
- const Reference< XClipboardOwner >& xClipboardOwner,
- ClearableMutexGuard& aGuard )
- throw( RuntimeException )
+void SAL_CALL CWinClipbImpl::setContents(
+ const Reference< XTransferable >& xTransferable,
+ const Reference< XClipboardOwner >& xClipboardOwner )
+ throw( RuntimeException )
{
CDTransObjFactory objFactory;
-
- m_rOldClipbContent = m_rCurrentClipbContent;
- m_rOldClipbOwner = m_rCurrentClipbOwner;
-
- m_rCurrentClipbContent = xTransferable;
- m_rCurrentClipbOwner = xClipboardOwner;
-
- IDataObjectPtr pIDataObj;
+ IDataObjectPtr pIDataObj;
if ( xTransferable.is( ) )
- pIDataObj = objFactory.createDataObjFromTransferable(
- m_pWinClipboard->m_SrvMgr , m_rCurrentClipbContent );
- else
- // we don't even need to save a potential clip-owner
- m_rCurrentClipbOwner = Reference< XClipboardOwner >( );
-
- // used to differentiate in ClipboardContentChanged handler
- m_bSelfTriggered = sal_True;
+ {
+ m_pCurrentClipContent = new CXNotifyingDataObject(
+ objFactory.createDataObjFromTransferable( m_pWinClipboard->m_SrvMgr , xTransferable ),
+ xTransferable,
+ xClipboardOwner,
+ this );
- // block other threads via a condition
- // release the mutex before calling into
- // windows, because another thread can't
- // do it
- m_pWinClipboard->m_aCondition.reset( );
- aGuard.clear( );
+ pIDataObj = IDataObjectPtr( m_pCurrentClipContent );
+ }
m_MtaOleClipboard.setClipboard( pIDataObj );
}
@@ -234,7 +222,7 @@ sal_Int8 SAL_CALL CWinClipbImpl::getRenderingCapabilities( ) throw( RuntimeExce
void SAL_CALL CWinClipbImpl::flushClipboard( ) throw( RuntimeException )
{
- if ( m_rCurrentClipbContent.is( ) )
+ if ( NULL != m_pCurrentClipContent )
m_MtaOleClipboard.flushClipboard( );
}
@@ -262,10 +250,7 @@ void SAL_CALL CWinClipbImpl::unregisterClipboardViewer( )
void SAL_CALL CWinClipbImpl::dispose() throw( RuntimeException )
{
- OSL_ENSURE( !m_rOldClipbContent.is( ) &&
- !m_rOldClipbOwner.is( ) &&
- !m_rCurrentClipbContent.is( ) &&
- !m_rCurrentClipbOwner.is( ),
+ OSL_ENSURE( (NULL != m_pCurrentClipContent),
"Clipboard was not flushed before shutdown!" );
}
@@ -275,73 +260,25 @@ void SAL_CALL CWinClipbImpl::dispose() throw( RuntimeException )
void WINAPI CWinClipbImpl::onClipboardContentChanged( void )
{
- try
- {
- ClearableMutexGuard aGuard( s_pCWinClipbImpl->m_aMutex );
-
- Reference< XTransferable > xClipbContent;
- Reference< XClipboardOwner > xClipbOwner;
-
- if ( s_pCWinClipbImpl->m_rOldClipbContent.is( ) )
- {
- xClipbContent = s_pCWinClipbImpl->m_rOldClipbContent;
- xClipbOwner = s_pCWinClipbImpl->m_rOldClipbOwner;
-
- s_pCWinClipbImpl->m_rOldClipbOwner = Reference< XClipboardOwner >( );
- s_pCWinClipbImpl->m_rOldClipbContent = Reference< XTransferable >( );
-
- // release the condition because of expected callbacks
- // to the clipboard service (remeber: the mutex is already
- // released)
- s_pCWinClipbImpl->m_pWinClipboard->m_aCondition.set( );
-
- // notify the old ClipboardOwner
- if ( xClipbOwner.is( ) )
- xClipbOwner->lostOwnership(
- s_pCWinClipbImpl->m_pWinClipboard, xClipbContent );
- }
- else if ( !s_pCWinClipbImpl->m_bSelfTriggered &&
- s_pCWinClipbImpl->m_rCurrentClipbContent.is( ) )
- {
- // save the state variables locally
- xClipbContent = s_pCWinClipbImpl->m_rCurrentClipbContent;
- xClipbOwner = s_pCWinClipbImpl->m_rCurrentClipbOwner;
-
- s_pCWinClipbImpl->m_rCurrentClipbOwner = Reference< XClipboardOwner >( );
- s_pCWinClipbImpl->m_rCurrentClipbContent = Reference< XTransferable >( );
-
- // release the condition because of expected callbacks
- // to the clipboard service (remeber: the mutex is already
- // released)
- s_pCWinClipbImpl->m_pWinClipboard->m_aCondition.set( );
-
- // notify the old ClipboardOwner
- if ( xClipbOwner.is( ) )
- xClipbOwner->lostOwnership( s_pCWinClipbImpl->m_pWinClipboard, xClipbContent );
- }
- }
- catch( RuntimeException& )
- {
- OSL_ENSURE( sal_False, "RuntimeException caught" );
- }
- catch(...)
- {
- OSL_ENSURE( sal_False, "Unknown exception caught" );
- }
-
- s_pCWinClipbImpl->m_pWinClipboard->m_aCondition.set( );
- s_pCWinClipbImpl->m_bSelfTriggered = sal_False;
-
// reassocition to instance through static member
- s_pCWinClipbImpl->m_pWinClipboard->notifyAllClipboardListener( );
+ if ( NULL != s_pCWinClipbImpl )
+ s_pCWinClipbImpl->m_pWinClipboard->notifyAllClipboardListener( );
}
//------------------------------------------------------------------------
-// returns wether we are in dispose or not, is important for the
-// XTDataObject so that we ignore the "Link" format during FlushClipboard
+//
//------------------------------------------------------------------------
-sal_Bool SAL_CALL CWinClipbImpl::isInDispose( ) const
+void SAL_CALL CWinClipbImpl::onReleaseDataObject( CXNotifyingDataObject* theCaller )
{
- return m_bInDispose;
-}
+ OSL_ASSERT( NULL != theCaller );
+
+ if ( theCaller )
+ theCaller->lostOwnership( );
+
+ // if the current caller is the one we currently
+ // hold, then set it to NULL because an external
+ // source must be the clipboardowner now
+ if ( m_pCurrentClipContent == theCaller )
+ m_pCurrentClipContent = NULL;
+} \ No newline at end of file
diff --git a/dtrans/source/win32/clipb/WinClipbImpl.hxx b/dtrans/source/win32/clipb/WinClipbImpl.hxx
index 0a47183145e1..a4f55329dab5 100644
--- a/dtrans/source/win32/clipb/WinClipbImpl.hxx
+++ b/dtrans/source/win32/clipb/WinClipbImpl.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: WinClipbImpl.hxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: tra $ $Date: 2001-03-14 14:43:14 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:32:44 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -95,6 +95,7 @@
#include <comdef.h>
class CWinClipboard;
+class CXNotifyingDataObject;
//---------------------------------------------------
// impl class to avoid deadlocks between XTDataObject
@@ -112,10 +113,10 @@ protected:
::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL getContents( )
throw( ::com::sun::star::uno::RuntimeException );
- void SAL_CALL setContents( const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTransferable,
- const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner,
- osl::ClearableMutexGuard& aGuard )
- throw( ::com::sun::star::uno::RuntimeException );
+ void SAL_CALL setContents(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTransferable,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
+ throw( ::com::sun::star::uno::RuntimeException );
::rtl::OUString SAL_CALL getName( ) throw( ::com::sun::star::uno::RuntimeException );
@@ -146,25 +147,23 @@ protected:
static void WINAPI onClipboardContentChanged( void );
- sal_Bool SAL_CALL isInDispose( ) const;
-
- ::rtl::OUString m_itsName;
- CMtaOleClipboard m_MtaOleClipboard;
- static CWinClipbImpl* s_pCWinClipbImpl;
- CWinClipboard* m_pWinClipboard;
- sal_Bool m_bInDispose;
- com::sun::star::uno::Reference< com::sun::star::datatransfer::XTransferable > m_rCurrentClipbContent;
- com::sun::star::uno::Reference< com::sun::star::datatransfer::XTransferable > m_rOldClipbContent;
- com::sun::star::uno::Reference< com::sun::star::datatransfer::clipboard::XClipboardOwner > m_rCurrentClipbOwner;
- com::sun::star::uno::Reference< com::sun::star::datatransfer::clipboard::XClipboardOwner > m_rOldClipbOwner;
- sal_Bool m_bSelfTriggered;
- osl::Mutex m_aMutex;
+private:
+ void SAL_CALL onReleaseDataObject( CXNotifyingDataObject* theCaller );
- friend class CWinClipboard;
+private:
+ ::rtl::OUString m_itsName;
+ CMtaOleClipboard m_MtaOleClipboard;
+ CWinClipboard* m_pWinClipboard;
+ CXNotifyingDataObject* m_pCurrentClipContent;
+ osl::Mutex m_aMutex;
+ static CWinClipbImpl* s_pCWinClipbImpl;
private:
CWinClipbImpl( const CWinClipbImpl& );
CWinClipbImpl& operator=( const CWinClipbImpl& );
+
+ friend class CWinClipboard;
+ friend class CXNotifyingDataObject;
};
#endif \ No newline at end of file
diff --git a/dtrans/source/win32/clipb/WinClipboard.cxx b/dtrans/source/win32/clipb/WinClipboard.cxx
index 294ab20bfd4d..a497ec4e4b07 100644
--- a/dtrans/source/win32/clipb/WinClipboard.cxx
+++ b/dtrans/source/win32/clipb/WinClipboard.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: WinClipboard.cxx,v $
*
- * $Revision: 1.7 $
+ * $Revision: 1.8 $
*
- * last change: $Author: tra $ $Date: 2001-03-16 08:59:04 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:32:44 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -121,7 +121,6 @@ CWinClipboard::CWinClipboard( const Reference< XMultiServiceFactory >& rServiceM
WeakComponentImplHelper4< XClipboardEx, XFlushableClipboard, XClipboardNotifier, XServiceInfo >( m_aCbListenerMutex ),
m_SrvMgr( rServiceManager )
{
- m_aCondition.set( );
m_pImpl.reset( new CWinClipbImpl( aClipboardName, this ) );
}
@@ -142,8 +141,6 @@ Reference< XTransferable > SAL_CALL CWinClipboard::getContents( ) throw( Runtime
{
OSL_ASSERT( m_pImpl.get( ) );
- m_aCondition.wait( );
-
MutexGuard aGuard( m_aMutex );
OSL_ENSURE( !rBHelper.bDisposed, "Object is already disposed" );
@@ -164,14 +161,12 @@ void SAL_CALL CWinClipboard::setContents( const Reference< XTransferable >& xTra
{
OSL_ASSERT( m_pImpl.get( ) );
- m_aCondition.wait( );
-
ClearableMutexGuard aGuard( m_aMutex );
OSL_ENSURE( !rBHelper.bDisposed, "Object is already disposed" );
if ( NULL != m_pImpl.get( ) )
- m_pImpl->setContents( xTransferable, xClipboardOwner, aGuard );
+ m_pImpl->setContents( xTransferable, xClipboardOwner );
}
//------------------------------------------------------------------------
@@ -196,8 +191,6 @@ void SAL_CALL CWinClipboard::flushClipboard( ) throw( RuntimeException )
{
OSL_ASSERT( m_pImpl.get( ) );
- m_aCondition.wait( );
-
MutexGuard aGuard( m_aMutex );
OSL_ENSURE( !rBHelper.bDisposed, "Object is already disposed" );
@@ -230,8 +223,6 @@ sal_Int8 SAL_CALL CWinClipboard::getRenderingCapabilities( ) throw( RuntimeExce
void SAL_CALL CWinClipboard::addClipboardListener( const Reference< XClipboardListener >& listener )
throw( RuntimeException )
{
- m_aCondition.wait( );
-
MutexGuard aGuard( m_aMutex );
rBHelper.aLC.addInterface( getCppuType( &listener ), listener );
}
@@ -243,8 +234,6 @@ void SAL_CALL CWinClipboard::addClipboardListener( const Reference< XClipboardLi
void SAL_CALL CWinClipboard::removeClipboardListener( const Reference< XClipboardListener >& listener )
throw( RuntimeException )
{
- m_aCondition.wait( );
-
MutexGuard aGuard( m_aMutex );
rBHelper.aLC.removeInterface( getCppuType( &listener ), listener );
}
diff --git a/dtrans/source/win32/clipb/WinClipboard.hxx b/dtrans/source/win32/clipb/WinClipboard.hxx
index a34cf618c72c..429c37d08758 100644
--- a/dtrans/source/win32/clipb/WinClipboard.hxx
+++ b/dtrans/source/win32/clipb/WinClipboard.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: WinClipboard.hxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: tra $ $Date: 2001-03-07 11:23:10 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:32:44 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -136,7 +136,6 @@ class CWinClipboardDummy
protected:
osl::Mutex m_aMutex;
osl::Mutex m_aCbListenerMutex;
- osl::Condition m_aCondition;
};
class CWinClipboard :
diff --git a/dtrans/source/win32/dtobj/DataFmtTransl.cxx b/dtrans/source/win32/dtobj/DataFmtTransl.cxx
index 570347b7a8e0..25b7d7191bf3 100644
--- a/dtrans/source/win32/dtobj/DataFmtTransl.cxx
+++ b/dtrans/source/win32/dtobj/DataFmtTransl.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: DataFmtTransl.cxx,v $
*
- * $Revision: 1.8 $
+ * $Revision: 1.9 $
*
- * last change: $Author: tra $ $Date: 2001-03-16 09:00:32 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:04 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -305,12 +305,13 @@ LCID SAL_CALL CDataFormatTranslator::getCurrentLocaleFromClipboard(
try
{
aAny = refXTransferable->getTransferData( aFlavor );
- OSL_ASSERT( aAny.hasValue( ) && (aAny.getValueType( ) == CPPUTYPE_SEQSALINT8) );
-
- Sequence< sal_Int8 > byteStream;
- aAny >>= byteStream;
+ if ( aAny.hasValue( ) && (aAny.getValueType( ) == CPPUTYPE_SEQSALINT8) );
+ {
+ Sequence< sal_Int8 > byteStream;
+ aAny >>= byteStream;
- lcid = *reinterpret_cast< LCID* >( byteStream.getArray( ) );
+ lcid = *reinterpret_cast< LCID* >( byteStream.getArray( ) );
+ }
}
catch( UnsupportedFlavorException& )
{
diff --git a/dtrans/source/win32/dtobj/FetcList.cxx b/dtrans/source/win32/dtobj/FetcList.cxx
index fa144791fd6f..e5b1895364b3 100644
--- a/dtrans/source/win32/dtobj/FetcList.cxx
+++ b/dtrans/source/win32/dtobj/FetcList.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: FetcList.cxx,v $
*
- * $Revision: 1.7 $
+ * $Revision: 1.8 $
*
- * last change: $Author: tra $ $Date: 2001-03-16 09:00:32 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:24 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -494,7 +494,7 @@ sal_Bool CFormatRegistrar::isEqualCurrentSystemCodePage( sal_uInt32 aCodePage )
void SAL_CALL CFormatRegistrar::FindLocaleForTextCodePage( )
{
EnumSystemLocalesA( CFormatRegistrar::EnumLocalesProc, LCID_SUPPORTED );
- WaitForSingleObject( CFormatRegistrar::m_hEvtEnumLocaleReady, INFINITE );
+ WaitForSingleObject( CFormatRegistrar::m_hEvtEnumLocaleReady, 60000 );
}
//------------------------------------------------------------------------
diff --git a/dtrans/source/win32/dtobj/XNotifyingDataObject.cxx b/dtrans/source/win32/dtobj/XNotifyingDataObject.cxx
new file mode 100644
index 000000000000..512865dbf890
--- /dev/null
+++ b/dtrans/source/win32/dtobj/XNotifyingDataObject.cxx
@@ -0,0 +1,382 @@
+/*************************************************************************
+ *
+ * $RCSfile: XNotifyingDataObject.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:54 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#ifndef _OSL_DIAGNOSE_H_
+#include <osl/diagnose.h>
+#endif
+
+/*
+#ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARDEX_HPP_
+#include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
+#endif
+*/
+
+#ifndef _XNOTIFYINGDATAOBJECT_HXX_
+#include "XNotifyingDataObject.hxx"
+#endif
+
+#ifndef _WINCLIPBIMPL_HXX_
+#include "..\clipb\WinClipbImpl.hxx"
+#endif
+
+#ifndef _WINCLIPBOARD_HXX_
+#include "..\clipb\WinClipboard.hxx"
+#endif
+
+#ifndef _DTOBJFACTORY_HXX_
+#include "..\..\inc\DtObjFactory.hxx"
+#endif
+
+//------------------------------------------------------------------------
+// namespace directives
+//------------------------------------------------------------------------
+
+using namespace com::sun::star::datatransfer;
+using namespace com::sun::star::datatransfer::clipboard;
+using com::sun::star::uno::RuntimeException;
+using com::sun::star::uno::Reference;
+
+//------------------------------------------------------------------------
+// ctor
+//------------------------------------------------------------------------
+
+CXNotifyingDataObject::CXNotifyingDataObject(
+ const IDataObjectPtr& aIDataObject,
+ const Reference< XTransferable >& aXTransferable,
+ const Reference< XClipboardOwner >& aXClipOwner,
+ CWinClipbImpl* theWinClipImpl ) :
+ m_nRefCnt( 0 ),
+ m_aIDataObject( aIDataObject ),
+ m_XTransferable( aXTransferable ),
+ m_XClipboardOwner( aXClipOwner ),
+ m_pWinClipImpl( theWinClipImpl )
+{
+}
+
+//------------------------------------------------------------------------
+// IUnknown->QueryInterface
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::QueryInterface( REFIID iid, LPVOID* ppvObject )
+{
+ if ( NULL == ppvObject )
+ return E_INVALIDARG;
+
+ HRESULT hr = E_NOINTERFACE;
+
+ *ppvObject = NULL;
+ if ( ( __uuidof( IUnknown ) == iid ) ||
+ ( __uuidof( IDataObject ) == iid ) )
+ {
+ *ppvObject = static_cast< IUnknown* >( this );
+ ( (LPUNKNOWN)*ppvObject )->AddRef( );
+ hr = S_OK;
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IUnknown->AddRef
+//------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CXNotifyingDataObject::AddRef( )
+{
+ return static_cast< ULONG >( InterlockedIncrement( &m_nRefCnt ) );
+}
+
+//------------------------------------------------------------------------
+// IUnknown->Release
+//------------------------------------------------------------------------
+
+STDMETHODIMP_(ULONG) CXNotifyingDataObject::Release( )
+{
+ ULONG nRefCnt =
+ static_cast< ULONG >( InterlockedDecrement( &m_nRefCnt ) );
+
+ if ( 0 == nRefCnt )
+ {
+ if ( m_pWinClipImpl )
+ m_pWinClipImpl->onReleaseDataObject( this );
+
+ delete this;
+ }
+
+ return nRefCnt;
+}
+
+//------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::GetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->GetData( pFormatetc, pmedium );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->EnumFormatEtc
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::EnumFormatEtc(
+ DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->EnumFormatEtc(
+ dwDirection, ppenumFormatetc );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->QueryGetData
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::QueryGetData( LPFORMATETC pFormatetc )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->QueryGetData( pFormatetc );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->GetDataHere
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::GetDataHere( LPFORMATETC lpFetc, LPSTGMEDIUM lpStgMedium )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->GetDataHere( lpFetc, lpStgMedium );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->GetCanonicalFormatEtc
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::GetCanonicalFormatEtc( LPFORMATETC lpFetc, LPFORMATETC lpCanonicalFetc )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->GetCanonicalFormatEtc( lpFetc, lpCanonicalFetc );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->SetData
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::SetData( LPFORMATETC lpFetc, LPSTGMEDIUM lpStgMedium, BOOL bRelease )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->SetData( lpFetc, lpStgMedium, bRelease );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->DAdvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::DAdvise(
+ LPFORMATETC lpFetc, DWORD advf, LPADVISESINK lpAdvSink, DWORD* pdwConnection )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->DAdvise( lpFetc, advf, lpAdvSink, pdwConnection );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->DUnadvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::DUnadvise( DWORD dwConnection )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->DUnadvise( dwConnection );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// IDataObject->EnumDAdvise
+//------------------------------------------------------------------------
+
+STDMETHODIMP CXNotifyingDataObject::EnumDAdvise( LPENUMSTATDATA * ppenumAdvise )
+{
+ HRESULT hr;
+
+ try
+ {
+ hr = m_aIDataObject->EnumDAdvise( ppenumAdvise );
+ }
+ catch( _com_error& ex )
+ {
+ hr = ex.Error( );
+ }
+
+ return hr;
+}
+
+//------------------------------------------------------------------------
+// for our convenience
+//------------------------------------------------------------------------
+
+CXNotifyingDataObject::operator IDataObject*( )
+{
+ return static_cast< IDataObject* >( this );
+}
+
+//------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------
+
+void SAL_CALL CXNotifyingDataObject::lostOwnership( )
+{
+ try
+ {
+ if ( m_XClipboardOwner.is( ) )
+ m_XClipboardOwner->lostOwnership(
+ static_cast< XClipboardEx* >( m_pWinClipImpl->m_pWinClipboard ), m_XTransferable );
+ }
+ catch( RuntimeException& )
+ {
+ OSL_ENSURE( sal_False, "RuntimeException caught" );
+ }
+ catch(...)
+ {
+ OSL_ENSURE( sal_False, "Unknown exception caught" );
+ }
+}
diff --git a/dtrans/source/win32/dtobj/XNotifyingDataObject.hxx b/dtrans/source/win32/dtobj/XNotifyingDataObject.hxx
new file mode 100644
index 000000000000..7bd857dcb2db
--- /dev/null
+++ b/dtrans/source/win32/dtobj/XNotifyingDataObject.hxx
@@ -0,0 +1,135 @@
+/*************************************************************************
+ *
+ * $RCSfile: XNotifyingDataObject.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:48 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+
+#ifndef _XNOTIFYINGDATAOBJECT_HXX_
+#define _XNOTIFYINGDATAOBJECT_HXX_
+
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#ifndef _COM_SUN_STAR_DATATRANSFER_XTRANSFERABLE_HPP_
+#include <com/sun/star/datatransfer/XTransferable.hpp>
+#endif
+
+#ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARDOWNER_HPP_
+#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
+#endif
+
+#include <objidl.h>
+#include <windows.h>
+#include <comdef.h>
+
+/*--------------------------------------------------------------------------
+ To implement the lostOwnership mechanism cleanly we need this wrapper
+ object
+----------------------------------------------------------------------------*/
+
+// forward
+class CWinClipbImpl;
+
+class CXNotifyingDataObject : public IDataObject
+{
+public:
+ CXNotifyingDataObject(
+ const IDataObjectPtr& aIDataObject,
+ const com::sun::star::uno::Reference< com::sun::star::datatransfer::XTransferable >& aXTransferable,
+ const com::sun::star::uno::Reference< com::sun::star::datatransfer::clipboard::XClipboardOwner >& aXClipOwner,
+ CWinClipbImpl* theWinClipImpl );
+
+ //-----------------------------------------------------------------
+ // ole interface implementation
+ //-----------------------------------------------------------------
+
+ //IUnknown interface methods
+ STDMETHODIMP QueryInterface(REFIID iid, LPVOID* ppvObject);
+ STDMETHODIMP_( ULONG ) AddRef( );
+ STDMETHODIMP_( ULONG ) Release( );
+
+ // IDataObject interface methods
+ STDMETHODIMP GetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium );
+ STDMETHODIMP GetDataHere( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium );
+ STDMETHODIMP QueryGetData( LPFORMATETC pFormatetc );
+ STDMETHODIMP GetCanonicalFormatEtc( LPFORMATETC pFormatectIn, LPFORMATETC pFormatetcOut );
+ STDMETHODIMP SetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium, BOOL fRelease );
+ STDMETHODIMP EnumFormatEtc( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc );
+ STDMETHODIMP DAdvise( LPFORMATETC pFormatetc, DWORD advf, LPADVISESINK pAdvSink, DWORD* pdwConnection );
+ STDMETHODIMP DUnadvise( DWORD dwConnection );
+ STDMETHODIMP EnumDAdvise( LPENUMSTATDATA* ppenumAdvise );
+
+ operator IDataObject*( );
+
+private:
+ void SAL_CALL lostOwnership( );
+
+private:
+ sal_Int32 m_nRefCnt;
+ IDataObjectPtr m_aIDataObject;
+ const com::sun::star::uno::Reference< com::sun::star::datatransfer::XTransferable > m_XTransferable;
+ const com::sun::star::uno::Reference< com::sun::star::datatransfer::clipboard::XClipboardOwner > m_XClipboardOwner;
+ CWinClipbImpl* m_pWinClipImpl;
+
+ friend class CWinClipbImpl;
+};
+
+#endif \ No newline at end of file
diff --git a/dtrans/source/win32/dtobj/XTDataObject.cxx b/dtrans/source/win32/dtobj/XTDataObject.cxx
index f5d2696a5e84..c762ff5920b8 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.cxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: XTDataObject.cxx,v $
*
- * $Revision: 1.11 $
+ * $Revision: 1.12 $
*
- * last change: $Author: ka $ $Date: 2001-03-16 12:57:31 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:24 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -67,7 +67,7 @@
#include <osl/diagnose.h>
#endif
-#ifndef _TWRAPPERDATAOBJECT_HXX_
+#ifndef _TXDATAOBJECT_HXX_
#include "XTDataObject.hxx"
#endif
@@ -510,25 +510,6 @@ CXTDataObject::operator IDataObject*( )
}
//------------------------------------------------------------------------
-// aks for the total size of all available and renderable clipboard
-// formats
-//------------------------------------------------------------------------
-
-sal_Int64 SAL_CALL CXTDataObject::QueryDataSize( )
-{
- return 0;
-}
-
-//------------------------------------------------------------------------
-// in preparation of clipboard flushing transfer all data from remote
-// to here
-//------------------------------------------------------------------------
-
-void SAL_CALL CXTDataObject::GetAllDataFromSource( )
-{
-}
-
-//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
diff --git a/dtrans/source/win32/dtobj/XTDataObject.hxx b/dtrans/source/win32/dtobj/XTDataObject.hxx
index 78161a249199..ef572f495080 100644
--- a/dtrans/source/win32/dtobj/XTDataObject.hxx
+++ b/dtrans/source/win32/dtobj/XTDataObject.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: XTDataObject.hxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: tra $ $Date: 2001-03-05 12:26:17 $
+ * last change: $Author: tra $ $Date: 2001-03-16 16:31:24 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -138,13 +138,6 @@ public:
operator IDataObject*( );
- sal_Int64 SAL_CALL QueryDataSize( );
-
- // retrieve the data from the source
- // necessary so that we have all data
- // when we flush the clipboard
- void SAL_CALL GetAllDataFromSource( );
-
private:
void validateFormatEtc( LPFORMATETC lpFormatEtc ) const;
com::sun::star::datatransfer::DataFlavor SAL_CALL formatEtcToDataFlavor( const FORMATETC& aFormatEtc ) const;
diff --git a/dtrans/source/win32/dtobj/makefile.mk b/dtrans/source/win32/dtobj/makefile.mk
index a3646f0ae1d1..4a1c22e39b93 100644
--- a/dtrans/source/win32/dtobj/makefile.mk
+++ b/dtrans/source/win32/dtobj/makefile.mk
@@ -2,9 +2,9 @@
#
# $RCSfile: makefile.mk,v $
#
-# $Revision: 1.6 $
+# $Revision: 1.7 $
#
-# last change: $Author: tra $ $Date: 2001-03-14 14:45:41 $
+# last change: $Author: tra $ $Date: 2001-03-16 16:31:24 $
#
# The Contents of this file are made available subject to the terms of
# either of the following licenses
@@ -86,7 +86,8 @@ SLOFILES=$(SLO)$/DtObjFactory.obj\
$(SLO)$/DataFmtTransl.obj\
$(SLO)$/FmtFilter.obj\
$(SLO)$/FetcList.obj\
- $(SLO)$/Fetc.obj
+ $(SLO)$/Fetc.obj\
+ $(SLO)$/XNotifyingDataObject.obj
LIB1TARGET=$(SLB)$/$(TARGET).lib
LIB1OBJFILES=$(SLOFILES)