148123e16SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
348123e16SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
448123e16SAndrew Rist * or more contributor license agreements. See the NOTICE file
548123e16SAndrew Rist * distributed with this work for additional information
648123e16SAndrew Rist * regarding copyright ownership. The ASF licenses this file
748123e16SAndrew Rist * to you under the Apache License, Version 2.0 (the
848123e16SAndrew Rist * "License"); you may not use this file except in compliance
948123e16SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
1148123e16SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
1348123e16SAndrew Rist * Unless required by applicable law or agreed to in writing,
1448123e16SAndrew Rist * software distributed under the License is distributed on an
1548123e16SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1648123e16SAndrew Rist * KIND, either express or implied. See the License for the
1748123e16SAndrew Rist * specific language governing permissions and limitations
1848123e16SAndrew Rist * under the License.
19cdf0e10cSrcweir *
2048123e16SAndrew Rist *************************************************************/
2148123e16SAndrew Rist
2248123e16SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dtrans.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir //------------------------------------------------------------------------
28cdf0e10cSrcweir // includes
29cdf0e10cSrcweir //------------------------------------------------------------------------
30cdf0e10cSrcweir #include <osl/diagnose.h>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #ifndef _TXDATAOBJECT_HXX_
33cdf0e10cSrcweir #include "XTDataObject.hxx"
34cdf0e10cSrcweir #endif
35cdf0e10cSrcweir #include <com/sun/star/datatransfer/DataFlavor.hpp>
36cdf0e10cSrcweir #include "..\misc\ImplHelper.hxx"
37cdf0e10cSrcweir #include "DTransHelper.hxx"
38cdf0e10cSrcweir #include "TxtCnvtHlp.hxx"
39cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
40cdf0e10cSrcweir #include "FmtFilter.hxx"
41cdf0e10cSrcweir
42cdf0e10cSrcweir #if defined _MSC_VER
43cdf0e10cSrcweir #pragma warning(push,1)
44cdf0e10cSrcweir #pragma warning(disable:4917)
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #include <windows.h>
47cdf0e10cSrcweir #include <shlobj.h>
48cdf0e10cSrcweir #if defined _MSC_VER
49cdf0e10cSrcweir #pragma warning(pop)
50cdf0e10cSrcweir #endif
51cdf0e10cSrcweir
52cdf0e10cSrcweir #ifdef __MINGW32__
53cdf0e10cSrcweir #define __uuidof(I) IID_##I
54cdf0e10cSrcweir #endif
55cdf0e10cSrcweir
56cdf0e10cSrcweir //------------------------------------------------------------------------
57cdf0e10cSrcweir // namespace directives
58cdf0e10cSrcweir //------------------------------------------------------------------------
59cdf0e10cSrcweir
60cdf0e10cSrcweir using namespace com::sun::star::datatransfer;
61cdf0e10cSrcweir using namespace com::sun::star::datatransfer::clipboard;
62cdf0e10cSrcweir using namespace com::sun::star::uno;
63cdf0e10cSrcweir using namespace com::sun::star::lang;
64cdf0e10cSrcweir using namespace rtl;
65cdf0e10cSrcweir
66cdf0e10cSrcweir //------------------------------------------------------------------------
67cdf0e10cSrcweir // a helper class that will be thrown by the function validateFormatEtc
68cdf0e10cSrcweir //------------------------------------------------------------------------
69cdf0e10cSrcweir
70cdf0e10cSrcweir class CInvalidFormatEtcException
71cdf0e10cSrcweir {
72cdf0e10cSrcweir public:
73cdf0e10cSrcweir HRESULT m_hr;
CInvalidFormatEtcException(HRESULT hr)74cdf0e10cSrcweir CInvalidFormatEtcException( HRESULT hr ) : m_hr( hr ) {};
75cdf0e10cSrcweir };
76cdf0e10cSrcweir
77cdf0e10cSrcweir //------------------------------------------------------------------------
78cdf0e10cSrcweir // ctor
79cdf0e10cSrcweir //------------------------------------------------------------------------
80cdf0e10cSrcweir
CXTDataObject(const Reference<XMultiServiceFactory> & aServiceManager,const Reference<XTransferable> & aXTransferable)81cdf0e10cSrcweir CXTDataObject::CXTDataObject( const Reference< XMultiServiceFactory >& aServiceManager,
82cdf0e10cSrcweir const Reference< XTransferable >& aXTransferable ) :
83cdf0e10cSrcweir m_nRefCnt( 0 ),
84cdf0e10cSrcweir m_SrvMgr( aServiceManager ),
85cdf0e10cSrcweir m_XTransferable( aXTransferable ),
86cdf0e10cSrcweir m_DataFormatTranslator( aServiceManager ),
87cdf0e10cSrcweir m_bFormatEtcContainerInitialized( sal_False ),
88cdf0e10cSrcweir m_FormatRegistrar( m_SrvMgr, m_DataFormatTranslator )
89cdf0e10cSrcweir {
90cdf0e10cSrcweir }
91cdf0e10cSrcweir
92cdf0e10cSrcweir //------------------------------------------------------------------------
93cdf0e10cSrcweir // IUnknown->QueryInterface
94cdf0e10cSrcweir //------------------------------------------------------------------------
95cdf0e10cSrcweir
QueryInterface(REFIID iid,LPVOID * ppvObject)96cdf0e10cSrcweir STDMETHODIMP CXTDataObject::QueryInterface( REFIID iid, LPVOID* ppvObject )
97cdf0e10cSrcweir {
98cdf0e10cSrcweir if ( NULL == ppvObject )
99cdf0e10cSrcweir return E_INVALIDARG;
100cdf0e10cSrcweir
101cdf0e10cSrcweir HRESULT hr = E_NOINTERFACE;
102cdf0e10cSrcweir
103cdf0e10cSrcweir *ppvObject = NULL;
104cdf0e10cSrcweir if ( ( __uuidof( IUnknown ) == iid ) ||
105cdf0e10cSrcweir ( __uuidof( IDataObject ) == iid ) )
106cdf0e10cSrcweir {
107cdf0e10cSrcweir *ppvObject = static_cast< IUnknown* >( this );
108cdf0e10cSrcweir ( (LPUNKNOWN)*ppvObject )->AddRef( );
109cdf0e10cSrcweir hr = S_OK;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
112cdf0e10cSrcweir return hr;
113cdf0e10cSrcweir }
114cdf0e10cSrcweir
115cdf0e10cSrcweir //------------------------------------------------------------------------
116cdf0e10cSrcweir // IUnknown->AddRef
117cdf0e10cSrcweir //------------------------------------------------------------------------
118cdf0e10cSrcweir
STDMETHODIMP_(ULONG)119cdf0e10cSrcweir STDMETHODIMP_(ULONG) CXTDataObject::AddRef( )
120cdf0e10cSrcweir {
121cdf0e10cSrcweir return static_cast< ULONG >( InterlockedIncrement( &m_nRefCnt ) );
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
124cdf0e10cSrcweir //------------------------------------------------------------------------
125cdf0e10cSrcweir // IUnknown->Release
126cdf0e10cSrcweir //------------------------------------------------------------------------
127cdf0e10cSrcweir
STDMETHODIMP_(ULONG)128cdf0e10cSrcweir STDMETHODIMP_(ULONG) CXTDataObject::Release( )
129cdf0e10cSrcweir {
130cdf0e10cSrcweir ULONG nRefCnt =
131cdf0e10cSrcweir static_cast< ULONG >( InterlockedDecrement( &m_nRefCnt ) );
132cdf0e10cSrcweir
133cdf0e10cSrcweir if ( 0 == nRefCnt )
134cdf0e10cSrcweir delete this;
135cdf0e10cSrcweir
136cdf0e10cSrcweir return nRefCnt;
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
139cdf0e10cSrcweir //------------------------------------------------------------------------
140cdf0e10cSrcweir //
141cdf0e10cSrcweir //------------------------------------------------------------------------
142cdf0e10cSrcweir
GetData(LPFORMATETC pFormatetc,LPSTGMEDIUM pmedium)143cdf0e10cSrcweir STDMETHODIMP CXTDataObject::GetData( LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir if ( !(pFormatetc && pmedium) )
146cdf0e10cSrcweir return E_INVALIDARG;
147cdf0e10cSrcweir
148cdf0e10cSrcweir try
149cdf0e10cSrcweir {
150cdf0e10cSrcweir // prepare data transfer
151cdf0e10cSrcweir invalidateStgMedium( *pmedium );
152cdf0e10cSrcweir validateFormatEtc( pFormatetc );
153cdf0e10cSrcweir
154cdf0e10cSrcweir // handle locale request, because locale is a artificial format for us
155cdf0e10cSrcweir if ( CF_LOCALE == pFormatetc->cfFormat )
156cdf0e10cSrcweir renderLocaleAndSetupStgMedium( *pFormatetc, *pmedium );
157cdf0e10cSrcweir else if ( CF_UNICODETEXT == pFormatetc->cfFormat )
158cdf0e10cSrcweir renderUnicodeAndSetupStgMedium( *pFormatetc, *pmedium );
159cdf0e10cSrcweir else
160cdf0e10cSrcweir renderAnyDataAndSetupStgMedium( *pFormatetc, *pmedium );
161cdf0e10cSrcweir }
162cdf0e10cSrcweir catch(UnsupportedFlavorException&)
163cdf0e10cSrcweir {
164cdf0e10cSrcweir HRESULT hr = DV_E_FORMATETC;
165cdf0e10cSrcweir
166cdf0e10cSrcweir if ( m_FormatRegistrar.isSynthesizeableFormat( *pFormatetc ) )
167cdf0e10cSrcweir hr = renderSynthesizedFormatAndSetupStgMedium( *pFormatetc, *pmedium );
168cdf0e10cSrcweir
169cdf0e10cSrcweir return hr;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir catch( CInvalidFormatEtcException& ex )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir return ex.m_hr;
174cdf0e10cSrcweir }
175cdf0e10cSrcweir catch( CStgTransferHelper::CStgTransferException& ex )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir return translateStgExceptionCode( ex.m_hr );
178cdf0e10cSrcweir }
179cdf0e10cSrcweir catch(...)
180cdf0e10cSrcweir {
181cdf0e10cSrcweir return E_UNEXPECTED;
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
184cdf0e10cSrcweir return S_OK;
185cdf0e10cSrcweir }
186cdf0e10cSrcweir
187cdf0e10cSrcweir //------------------------------------------------------------------------
188cdf0e10cSrcweir //
189cdf0e10cSrcweir //------------------------------------------------------------------------
190cdf0e10cSrcweir
191cdf0e10cSrcweir // inline
renderDataAndSetupStgMedium(const sal_Int8 * lpStorage,const FORMATETC & fetc,sal_uInt32 nInitStgSize,sal_uInt32 nBytesToTransfer,STGMEDIUM & stgmedium)192cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderDataAndSetupStgMedium(
193cdf0e10cSrcweir const sal_Int8* lpStorage, const FORMATETC& fetc, sal_uInt32 nInitStgSize,
194cdf0e10cSrcweir sal_uInt32 nBytesToTransfer, STGMEDIUM& stgmedium )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir OSL_PRECOND( !nInitStgSize || nInitStgSize && (nInitStgSize >= nBytesToTransfer),
197cdf0e10cSrcweir "Memory size less than number of bytes to transfer" );
198cdf0e10cSrcweir
199cdf0e10cSrcweir CStgTransferHelper stgTransfHelper( AUTO_INIT );
200cdf0e10cSrcweir
201cdf0e10cSrcweir // setup storage size
202cdf0e10cSrcweir if ( nInitStgSize > 0 )
203cdf0e10cSrcweir stgTransfHelper.init( nInitStgSize, GHND );
204cdf0e10cSrcweir
205cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
206cdf0e10cSrcweir sal_uInt32 nBytesWritten = 0;
207cdf0e10cSrcweir stgTransfHelper.write( lpStorage, nBytesToTransfer, &nBytesWritten );
208cdf0e10cSrcweir OSL_ASSERT( nBytesWritten == nBytesToTransfer );
209cdf0e10cSrcweir #else
210cdf0e10cSrcweir stgTransfHelper.write( lpStorage, nBytesToTransfer );
211cdf0e10cSrcweir #endif
212cdf0e10cSrcweir
213cdf0e10cSrcweir setupStgMedium( fetc, stgTransfHelper, stgmedium );
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
216cdf0e10cSrcweir //------------------------------------------------------------------------
217cdf0e10cSrcweir //
218cdf0e10cSrcweir //------------------------------------------------------------------------
219cdf0e10cSrcweir
220cdf0e10cSrcweir //inline
renderLocaleAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)221cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderLocaleAndSetupStgMedium(
222cdf0e10cSrcweir FORMATETC& fetc, STGMEDIUM& stgmedium )
223cdf0e10cSrcweir {
224cdf0e10cSrcweir if ( m_FormatRegistrar.hasSynthesizedLocale( ) )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir LCID lcid = m_FormatRegistrar.getSynthesizedLocale( );
227cdf0e10cSrcweir renderDataAndSetupStgMedium(
228cdf0e10cSrcweir reinterpret_cast< sal_Int8* >( &lcid ),
229cdf0e10cSrcweir fetc,
230cdf0e10cSrcweir 0,
231cdf0e10cSrcweir sizeof( LCID ),
232cdf0e10cSrcweir stgmedium );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir else
235cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_FORMATETC );
236cdf0e10cSrcweir }
237cdf0e10cSrcweir
238cdf0e10cSrcweir //------------------------------------------------------------------------
239cdf0e10cSrcweir //
240cdf0e10cSrcweir //------------------------------------------------------------------------
241cdf0e10cSrcweir
242cdf0e10cSrcweir //inline
renderUnicodeAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)243cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderUnicodeAndSetupStgMedium(
244cdf0e10cSrcweir FORMATETC& fetc, STGMEDIUM& stgmedium )
245cdf0e10cSrcweir {
246cdf0e10cSrcweir DataFlavor aFlavor = formatEtcToDataFlavor( fetc );
247cdf0e10cSrcweir
248cdf0e10cSrcweir Any aAny = m_XTransferable->getTransferData( aFlavor );
249cdf0e10cSrcweir
250cdf0e10cSrcweir // unfortunately not all transferables fulfill the
251cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
252cdf0e10cSrcweir // so we must check the any
253cdf0e10cSrcweir if ( !aAny.hasValue( ) )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir OSL_ENSURE( sal_False, "XTransferable should throw an exception if ask for an unsupported flavor" );
256cdf0e10cSrcweir throw UnsupportedFlavorException( );
257cdf0e10cSrcweir }
258cdf0e10cSrcweir
259cdf0e10cSrcweir OUString aText;
260cdf0e10cSrcweir aAny >>= aText;
261cdf0e10cSrcweir
262cdf0e10cSrcweir sal_uInt32 nBytesToTransfer = aText.getLength( ) * sizeof( sal_Unicode );
263cdf0e10cSrcweir
264cdf0e10cSrcweir // to be sure there is an ending 0
265cdf0e10cSrcweir sal_uInt32 nRequiredMemSize = nBytesToTransfer + sizeof( sal_Unicode );
266cdf0e10cSrcweir
267cdf0e10cSrcweir renderDataAndSetupStgMedium(
268cdf0e10cSrcweir reinterpret_cast< const sal_Int8* >( aText.getStr( ) ),
269cdf0e10cSrcweir fetc,
270cdf0e10cSrcweir nRequiredMemSize,
271cdf0e10cSrcweir nBytesToTransfer,
272cdf0e10cSrcweir stgmedium );
273cdf0e10cSrcweir }
274cdf0e10cSrcweir
275cdf0e10cSrcweir //------------------------------------------------------------------------
276cdf0e10cSrcweir //
277cdf0e10cSrcweir //------------------------------------------------------------------------
278cdf0e10cSrcweir
279cdf0e10cSrcweir //inline
renderAnyDataAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)280cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderAnyDataAndSetupStgMedium(
281cdf0e10cSrcweir FORMATETC& fetc, STGMEDIUM& stgmedium )
282cdf0e10cSrcweir {
283cdf0e10cSrcweir DataFlavor aFlavor = formatEtcToDataFlavor( fetc );
284cdf0e10cSrcweir
285cdf0e10cSrcweir Any aAny = m_XTransferable->getTransferData( aFlavor );
286cdf0e10cSrcweir
287cdf0e10cSrcweir // unfortunately not all transferables fulfill the
288cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
289cdf0e10cSrcweir // so we must check the any
290cdf0e10cSrcweir if ( !aAny.hasValue( ) )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir OSL_ENSURE( sal_False, "XTransferable should throw an exception if ask for an unsupported flavor" );
293cdf0e10cSrcweir throw UnsupportedFlavorException( );
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
296cdf0e10cSrcweir // unfortunately not all transferables fulfill the
297cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
298cdf0e10cSrcweir // so we must check the any
299cdf0e10cSrcweir if ( !aAny.hasValue( ) )
300cdf0e10cSrcweir throw UnsupportedFlavorException( );
301cdf0e10cSrcweir
302cdf0e10cSrcweir Sequence< sal_Int8 > clipDataStream;
303cdf0e10cSrcweir aAny >>= clipDataStream;
304cdf0e10cSrcweir
305cdf0e10cSrcweir sal_uInt32 nRequiredMemSize = 0;
306cdf0e10cSrcweir if ( m_DataFormatTranslator.isOemOrAnsiTextFormat( fetc.cfFormat ) )
307cdf0e10cSrcweir nRequiredMemSize = sizeof( sal_Int8 ) * clipDataStream.getLength( ) + 1;
308cdf0e10cSrcweir
309cdf0e10cSrcweir // prepare data for transmision
310*a206ee71SArmin Le Grand // #124085# DIBV5 should not happen for now, but keep as hint here
31145fd3b9aSArmin Le Grand if ( CF_DIBV5 == fetc.cfFormat || CF_DIB == fetc.cfFormat )
31245fd3b9aSArmin Le Grand {
31345fd3b9aSArmin Le Grand #ifdef DBG_UTIL
31445fd3b9aSArmin Le Grand if(CF_DIBV5 == fetc.cfFormat)
31545fd3b9aSArmin Le Grand {
31645fd3b9aSArmin Le Grand OSL_ENSURE(clipDataStream.getLength( ) > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPV5HEADER)), "Wrong size on CF_DIBV5 data (!)");
31745fd3b9aSArmin Le Grand }
31845fd3b9aSArmin Le Grand else // CF_DIB == fetc.cfFormat
31945fd3b9aSArmin Le Grand {
32045fd3b9aSArmin Le Grand OSL_ENSURE(clipDataStream.getLength( ) > (sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)), "Wrong size on CF_DIB data (!)");
32145fd3b9aSArmin Le Grand }
32245fd3b9aSArmin Le Grand #endif
32345fd3b9aSArmin Le Grand
32445fd3b9aSArmin Le Grand // remove BITMAPFILEHEADER
325cdf0e10cSrcweir clipDataStream = OOBmpToWinDIB( clipDataStream );
32645fd3b9aSArmin Le Grand }
327cdf0e10cSrcweir
328cdf0e10cSrcweir if ( CF_METAFILEPICT == fetc.cfFormat )
329cdf0e10cSrcweir {
330cdf0e10cSrcweir stgmedium.tymed = TYMED_MFPICT;
331cdf0e10cSrcweir stgmedium.hMetaFilePict = OOMFPictToWinMFPict( clipDataStream );
332cdf0e10cSrcweir stgmedium.pUnkForRelease = NULL;
333cdf0e10cSrcweir }
334cdf0e10cSrcweir else if( CF_ENHMETAFILE == fetc.cfFormat )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir stgmedium.tymed = TYMED_ENHMF;
337cdf0e10cSrcweir stgmedium.hMetaFilePict = OOMFPictToWinENHMFPict( clipDataStream );
338cdf0e10cSrcweir stgmedium.pUnkForRelease = NULL;
339cdf0e10cSrcweir }
340cdf0e10cSrcweir else
341cdf0e10cSrcweir renderDataAndSetupStgMedium(
342cdf0e10cSrcweir clipDataStream.getArray( ),
343cdf0e10cSrcweir fetc,
344cdf0e10cSrcweir nRequiredMemSize,
345cdf0e10cSrcweir clipDataStream.getLength( ),
346cdf0e10cSrcweir stgmedium );
347cdf0e10cSrcweir }
348cdf0e10cSrcweir
349cdf0e10cSrcweir //------------------------------------------------------------------------
350cdf0e10cSrcweir //
351cdf0e10cSrcweir //------------------------------------------------------------------------
352cdf0e10cSrcweir
renderSynthesizedFormatAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)353cdf0e10cSrcweir HRESULT SAL_CALL CXTDataObject::renderSynthesizedFormatAndSetupStgMedium( FORMATETC& fetc, STGMEDIUM& stgmedium )
354cdf0e10cSrcweir {
355cdf0e10cSrcweir HRESULT hr = S_OK;
356cdf0e10cSrcweir
357cdf0e10cSrcweir try
358cdf0e10cSrcweir {
359cdf0e10cSrcweir if ( CF_UNICODETEXT == fetc.cfFormat )
360cdf0e10cSrcweir // the transferable seems to have only text
361cdf0e10cSrcweir renderSynthesizedUnicodeAndSetupStgMedium( fetc, stgmedium );
362cdf0e10cSrcweir else if ( m_DataFormatTranslator.isOemOrAnsiTextFormat( fetc.cfFormat ) )
363cdf0e10cSrcweir // the transferable seems to have only unicode text
364cdf0e10cSrcweir renderSynthesizedTextAndSetupStgMedium( fetc, stgmedium );
365cdf0e10cSrcweir else
366cdf0e10cSrcweir // the transferable seems to have only text/html
367cdf0e10cSrcweir renderSynthesizedHtmlAndSetupStgMedium( fetc, stgmedium );
368cdf0e10cSrcweir }
369cdf0e10cSrcweir catch(UnsupportedFlavorException&)
370cdf0e10cSrcweir {
371cdf0e10cSrcweir hr = DV_E_FORMATETC;
372cdf0e10cSrcweir }
373cdf0e10cSrcweir catch( CInvalidFormatEtcException& )
374cdf0e10cSrcweir {
375cdf0e10cSrcweir OSL_ENSURE( sal_False, "Unexpected exception" );
376cdf0e10cSrcweir }
377cdf0e10cSrcweir catch( CStgTransferHelper::CStgTransferException& ex )
378cdf0e10cSrcweir {
379cdf0e10cSrcweir return translateStgExceptionCode( ex.m_hr );
380cdf0e10cSrcweir }
381cdf0e10cSrcweir catch(...)
382cdf0e10cSrcweir {
383cdf0e10cSrcweir hr = E_UNEXPECTED;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir
386cdf0e10cSrcweir return hr;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir
389cdf0e10cSrcweir //------------------------------------------------------------------------
390cdf0e10cSrcweir // the transferable must have only text, so we will synthesize unicode text
391cdf0e10cSrcweir //------------------------------------------------------------------------
392cdf0e10cSrcweir
renderSynthesizedUnicodeAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)393cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderSynthesizedUnicodeAndSetupStgMedium( FORMATETC& fetc, STGMEDIUM& stgmedium )
394cdf0e10cSrcweir {
395cdf0e10cSrcweir OSL_ASSERT( CF_UNICODETEXT == fetc.cfFormat );
396cdf0e10cSrcweir
397cdf0e10cSrcweir Any aAny = m_XTransferable->getTransferData( m_FormatRegistrar.getRegisteredTextFlavor( ) );
398cdf0e10cSrcweir
399cdf0e10cSrcweir // unfortunately not all transferables fulfill the
400cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
401cdf0e10cSrcweir // so we must check the any
402cdf0e10cSrcweir if ( !aAny.hasValue( ) )
403cdf0e10cSrcweir {
404cdf0e10cSrcweir OSL_ENSURE( sal_False, "XTransferable should throw an exception if ask for an unsupported flavor" );
405cdf0e10cSrcweir throw UnsupportedFlavorException( );
406cdf0e10cSrcweir }
407cdf0e10cSrcweir
408cdf0e10cSrcweir Sequence< sal_Int8 > aText;
409cdf0e10cSrcweir aAny >>= aText;
410cdf0e10cSrcweir
411cdf0e10cSrcweir CStgTransferHelper stgTransfHelper;
412cdf0e10cSrcweir
413cdf0e10cSrcweir MultiByteToWideCharEx(
414cdf0e10cSrcweir m_FormatRegistrar.getRegisteredTextCodePage( ),
415cdf0e10cSrcweir reinterpret_cast< char* >( aText.getArray( ) ),
416cdf0e10cSrcweir aText.getLength( ),
417cdf0e10cSrcweir stgTransfHelper );
418cdf0e10cSrcweir
419cdf0e10cSrcweir setupStgMedium( fetc, stgTransfHelper, stgmedium );
420cdf0e10cSrcweir }
421cdf0e10cSrcweir
422cdf0e10cSrcweir //------------------------------------------------------------------------
423cdf0e10cSrcweir // the transferable must have only unicode text so we will sythesize text
424cdf0e10cSrcweir //------------------------------------------------------------------------
425cdf0e10cSrcweir
renderSynthesizedTextAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)426cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderSynthesizedTextAndSetupStgMedium( FORMATETC& fetc, STGMEDIUM& stgmedium )
427cdf0e10cSrcweir {
428cdf0e10cSrcweir OSL_ASSERT( m_DataFormatTranslator.isOemOrAnsiTextFormat( fetc.cfFormat ) );
429cdf0e10cSrcweir
430cdf0e10cSrcweir DataFlavor aFlavor = formatEtcToDataFlavor(
431cdf0e10cSrcweir m_DataFormatTranslator.getFormatEtcForClipformat( CF_UNICODETEXT ) );
432cdf0e10cSrcweir
433cdf0e10cSrcweir Any aAny = m_XTransferable->getTransferData( aFlavor );
434cdf0e10cSrcweir
435cdf0e10cSrcweir // unfortunately not all transferables fulfill the
436cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
437cdf0e10cSrcweir // so we must check the any
438cdf0e10cSrcweir if ( !aAny.hasValue( ) )
439cdf0e10cSrcweir {
440cdf0e10cSrcweir OSL_ENSURE( sal_False, "XTransferable should throw an exception if ask for an unsupported flavor" );
441cdf0e10cSrcweir throw UnsupportedFlavorException( );
442cdf0e10cSrcweir }
443cdf0e10cSrcweir
444cdf0e10cSrcweir OUString aUnicodeText;
445cdf0e10cSrcweir aAny >>= aUnicodeText;
446cdf0e10cSrcweir
447cdf0e10cSrcweir CStgTransferHelper stgTransfHelper;
448cdf0e10cSrcweir
449cdf0e10cSrcweir WideCharToMultiByteEx(
450cdf0e10cSrcweir GetACP( ),
451cdf0e10cSrcweir reinterpret_cast<LPCWSTR>( aUnicodeText.getStr( ) ),
452cdf0e10cSrcweir aUnicodeText.getLength( ),
453cdf0e10cSrcweir stgTransfHelper );
454cdf0e10cSrcweir
455cdf0e10cSrcweir setupStgMedium( fetc, stgTransfHelper, stgmedium );
456cdf0e10cSrcweir }
457cdf0e10cSrcweir
458cdf0e10cSrcweir //------------------------------------------------------------------------
459cdf0e10cSrcweir //
460cdf0e10cSrcweir //------------------------------------------------------------------------
461cdf0e10cSrcweir
renderSynthesizedHtmlAndSetupStgMedium(FORMATETC & fetc,STGMEDIUM & stgmedium)462cdf0e10cSrcweir void SAL_CALL CXTDataObject::renderSynthesizedHtmlAndSetupStgMedium( FORMATETC& fetc, STGMEDIUM& stgmedium )
463cdf0e10cSrcweir {
464cdf0e10cSrcweir OSL_ASSERT( m_DataFormatTranslator.isHTMLFormat( fetc.cfFormat ) );
465cdf0e10cSrcweir
466cdf0e10cSrcweir DataFlavor aFlavor;
467cdf0e10cSrcweir
468cdf0e10cSrcweir // creating a DataFlavor on the fly
469cdf0e10cSrcweir aFlavor.MimeType = OUString::createFromAscii( "text/html" );
470cdf0e10cSrcweir aFlavor.DataType = getCppuType( (Sequence< sal_Int8 >*)0 );
471cdf0e10cSrcweir
472cdf0e10cSrcweir Any aAny = m_XTransferable->getTransferData( aFlavor );
473cdf0e10cSrcweir
474cdf0e10cSrcweir // unfortunately not all transferables fulfill the
475cdf0e10cSrcweir // spec. an do throw an UnsupportedFlavorException
476cdf0e10cSrcweir // so we must check the any
477cdf0e10cSrcweir if ( !aAny.hasValue( ) )
478cdf0e10cSrcweir {
479cdf0e10cSrcweir OSL_ENSURE( sal_False, "XTransferable should throw an exception if ask for an unsupported flavor" );
480cdf0e10cSrcweir throw UnsupportedFlavorException( );
481cdf0e10cSrcweir }
482cdf0e10cSrcweir
483cdf0e10cSrcweir Sequence< sal_Int8 > aTextHtmlSequence;
484cdf0e10cSrcweir aAny >>= aTextHtmlSequence;
485cdf0e10cSrcweir
486cdf0e10cSrcweir Sequence< sal_Int8 > aHTMLFormatSequence = TextHtmlToHTMLFormat( aTextHtmlSequence );
487cdf0e10cSrcweir
488cdf0e10cSrcweir sal_uInt32 nBytesToTransfer = aHTMLFormatSequence.getLength( );
489cdf0e10cSrcweir
490cdf0e10cSrcweir renderDataAndSetupStgMedium(
491cdf0e10cSrcweir reinterpret_cast< const sal_Int8* >( aHTMLFormatSequence.getArray( ) ),
492cdf0e10cSrcweir fetc,
493cdf0e10cSrcweir 0,
494cdf0e10cSrcweir nBytesToTransfer,
495cdf0e10cSrcweir stgmedium );
496cdf0e10cSrcweir }
497cdf0e10cSrcweir
498cdf0e10cSrcweir //------------------------------------------------------------------------
499cdf0e10cSrcweir // IDataObject->EnumFormatEtc
500cdf0e10cSrcweir //------------------------------------------------------------------------
501cdf0e10cSrcweir
EnumFormatEtc(DWORD dwDirection,IEnumFORMATETC ** ppenumFormatetc)502cdf0e10cSrcweir STDMETHODIMP CXTDataObject::EnumFormatEtc(
503cdf0e10cSrcweir DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc )
504cdf0e10cSrcweir {
505cdf0e10cSrcweir if ( NULL == ppenumFormatetc )
506cdf0e10cSrcweir return E_INVALIDARG;
507cdf0e10cSrcweir
508cdf0e10cSrcweir if ( DATADIR_SET == dwDirection )
509cdf0e10cSrcweir return E_NOTIMPL;
510cdf0e10cSrcweir
511cdf0e10cSrcweir *ppenumFormatetc = NULL;
512cdf0e10cSrcweir
513cdf0e10cSrcweir InitializeFormatEtcContainer( );
514cdf0e10cSrcweir
515cdf0e10cSrcweir HRESULT hr;
516cdf0e10cSrcweir if ( DATADIR_GET == dwDirection )
517cdf0e10cSrcweir {
518cdf0e10cSrcweir *ppenumFormatetc = new CEnumFormatEtc( this, m_FormatEtcContainer );
519cdf0e10cSrcweir if ( NULL != *ppenumFormatetc )
520cdf0e10cSrcweir static_cast< LPUNKNOWN >( *ppenumFormatetc )->AddRef( );
521cdf0e10cSrcweir
522cdf0e10cSrcweir hr = ( NULL != *ppenumFormatetc ) ? S_OK : E_OUTOFMEMORY;
523cdf0e10cSrcweir }
524cdf0e10cSrcweir else
525cdf0e10cSrcweir hr = E_INVALIDARG;
526cdf0e10cSrcweir
527cdf0e10cSrcweir return hr;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir
530cdf0e10cSrcweir //------------------------------------------------------------------------
531cdf0e10cSrcweir // IDataObject->QueryGetData
532cdf0e10cSrcweir //------------------------------------------------------------------------
533cdf0e10cSrcweir
QueryGetData(LPFORMATETC pFormatetc)534cdf0e10cSrcweir STDMETHODIMP CXTDataObject::QueryGetData( LPFORMATETC pFormatetc )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir if ( (NULL == pFormatetc) || IsBadReadPtr( pFormatetc, sizeof( FORMATETC ) ) )
537cdf0e10cSrcweir return E_INVALIDARG;
538cdf0e10cSrcweir
539cdf0e10cSrcweir InitializeFormatEtcContainer( );
540cdf0e10cSrcweir
541cdf0e10cSrcweir return m_FormatEtcContainer.hasFormatEtc( *pFormatetc ) ? S_OK : S_FALSE;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir
544cdf0e10cSrcweir //------------------------------------------------------------------------
545cdf0e10cSrcweir // IDataObject->GetDataHere
546cdf0e10cSrcweir //------------------------------------------------------------------------
547cdf0e10cSrcweir
GetDataHere(LPFORMATETC,LPSTGMEDIUM)548cdf0e10cSrcweir STDMETHODIMP CXTDataObject::GetDataHere( LPFORMATETC, LPSTGMEDIUM )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir return E_NOTIMPL;
551cdf0e10cSrcweir }
552cdf0e10cSrcweir
553cdf0e10cSrcweir //------------------------------------------------------------------------
554cdf0e10cSrcweir // IDataObject->GetCanonicalFormatEtc
555cdf0e10cSrcweir //------------------------------------------------------------------------
556cdf0e10cSrcweir
GetCanonicalFormatEtc(LPFORMATETC,LPFORMATETC)557cdf0e10cSrcweir STDMETHODIMP CXTDataObject::GetCanonicalFormatEtc( LPFORMATETC, LPFORMATETC )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir return E_NOTIMPL;
560cdf0e10cSrcweir }
561cdf0e10cSrcweir
562cdf0e10cSrcweir //------------------------------------------------------------------------
563cdf0e10cSrcweir // IDataObject->SetData
564cdf0e10cSrcweir //------------------------------------------------------------------------
565cdf0e10cSrcweir
SetData(LPFORMATETC,LPSTGMEDIUM,BOOL)566cdf0e10cSrcweir STDMETHODIMP CXTDataObject::SetData( LPFORMATETC, LPSTGMEDIUM, BOOL )
567cdf0e10cSrcweir {
568cdf0e10cSrcweir return E_NOTIMPL;
569cdf0e10cSrcweir }
570cdf0e10cSrcweir
571cdf0e10cSrcweir //------------------------------------------------------------------------
572cdf0e10cSrcweir // IDataObject->DAdvise
573cdf0e10cSrcweir //------------------------------------------------------------------------
574cdf0e10cSrcweir
DAdvise(LPFORMATETC,DWORD,LPADVISESINK,DWORD *)575cdf0e10cSrcweir STDMETHODIMP CXTDataObject::DAdvise( LPFORMATETC, DWORD, LPADVISESINK, DWORD * )
576cdf0e10cSrcweir {
577cdf0e10cSrcweir return E_NOTIMPL;
578cdf0e10cSrcweir }
579cdf0e10cSrcweir
580cdf0e10cSrcweir //------------------------------------------------------------------------
581cdf0e10cSrcweir // IDataObject->DUnadvise
582cdf0e10cSrcweir //------------------------------------------------------------------------
583cdf0e10cSrcweir
DUnadvise(DWORD)584cdf0e10cSrcweir STDMETHODIMP CXTDataObject::DUnadvise( DWORD )
585cdf0e10cSrcweir {
586cdf0e10cSrcweir return E_NOTIMPL;
587cdf0e10cSrcweir }
588cdf0e10cSrcweir
589cdf0e10cSrcweir //------------------------------------------------------------------------
590cdf0e10cSrcweir // IDataObject->EnumDAdvise
591cdf0e10cSrcweir //------------------------------------------------------------------------
592cdf0e10cSrcweir
EnumDAdvise(LPENUMSTATDATA *)593cdf0e10cSrcweir STDMETHODIMP CXTDataObject::EnumDAdvise( LPENUMSTATDATA * )
594cdf0e10cSrcweir {
595cdf0e10cSrcweir return E_NOTIMPL;
596cdf0e10cSrcweir }
597cdf0e10cSrcweir
598cdf0e10cSrcweir //------------------------------------------------------------------------
599cdf0e10cSrcweir // for our convenience
600cdf0e10cSrcweir //------------------------------------------------------------------------
601cdf0e10cSrcweir
operator IDataObject*()602cdf0e10cSrcweir CXTDataObject::operator IDataObject*( )
603cdf0e10cSrcweir {
604cdf0e10cSrcweir return static_cast< IDataObject* >( this );
605cdf0e10cSrcweir }
606cdf0e10cSrcweir
607cdf0e10cSrcweir //------------------------------------------------------------------------
608cdf0e10cSrcweir //
609cdf0e10cSrcweir //------------------------------------------------------------------------
610cdf0e10cSrcweir
611cdf0e10cSrcweir inline
formatEtcToDataFlavor(const FORMATETC & aFormatEtc) const612cdf0e10cSrcweir DataFlavor SAL_CALL CXTDataObject::formatEtcToDataFlavor( const FORMATETC& aFormatEtc ) const
613cdf0e10cSrcweir {
614cdf0e10cSrcweir DataFlavor aFlavor;
615cdf0e10cSrcweir
616cdf0e10cSrcweir if ( m_FormatRegistrar.hasSynthesizedLocale( ) )
617cdf0e10cSrcweir aFlavor =
618cdf0e10cSrcweir m_DataFormatTranslator.getDataFlavorFromFormatEtc( aFormatEtc, m_FormatRegistrar.getSynthesizedLocale( ) );
619cdf0e10cSrcweir else
620cdf0e10cSrcweir aFlavor = m_DataFormatTranslator.getDataFlavorFromFormatEtc( aFormatEtc );
621cdf0e10cSrcweir
622cdf0e10cSrcweir if ( !aFlavor.MimeType.getLength( ) )
623cdf0e10cSrcweir throw UnsupportedFlavorException( );
624cdf0e10cSrcweir
625cdf0e10cSrcweir return aFlavor;
626cdf0e10cSrcweir }
627cdf0e10cSrcweir
628cdf0e10cSrcweir //------------------------------------------------------------------------
629cdf0e10cSrcweir //
630cdf0e10cSrcweir //------------------------------------------------------------------------
631cdf0e10cSrcweir
632cdf0e10cSrcweir inline
validateFormatEtc(LPFORMATETC lpFormatEtc) const633cdf0e10cSrcweir void CXTDataObject::validateFormatEtc( LPFORMATETC lpFormatEtc ) const
634cdf0e10cSrcweir {
635cdf0e10cSrcweir OSL_ASSERT( lpFormatEtc );
636cdf0e10cSrcweir
637cdf0e10cSrcweir if ( lpFormatEtc->lindex != -1 )
638cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_LINDEX );
639cdf0e10cSrcweir
640cdf0e10cSrcweir if ( !(lpFormatEtc->dwAspect & DVASPECT_CONTENT) &&
641cdf0e10cSrcweir !(lpFormatEtc->dwAspect & DVASPECT_SHORTNAME) )
642cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_DVASPECT );
643cdf0e10cSrcweir
644cdf0e10cSrcweir if ( !(lpFormatEtc->tymed & TYMED_HGLOBAL) &&
645cdf0e10cSrcweir !(lpFormatEtc->tymed & TYMED_ISTREAM) &&
646cdf0e10cSrcweir !(lpFormatEtc->tymed & TYMED_MFPICT) &&
647cdf0e10cSrcweir !(lpFormatEtc->tymed & TYMED_ENHMF) )
648cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_TYMED );
649cdf0e10cSrcweir
650cdf0e10cSrcweir if ( lpFormatEtc->cfFormat == CF_METAFILEPICT &&
651cdf0e10cSrcweir !(lpFormatEtc->tymed & TYMED_MFPICT) )
652cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_TYMED );
653cdf0e10cSrcweir
654cdf0e10cSrcweir if ( lpFormatEtc->cfFormat == CF_ENHMETAFILE &&
655cdf0e10cSrcweir !(lpFormatEtc->tymed & TYMED_ENHMF) )
656cdf0e10cSrcweir throw CInvalidFormatEtcException( DV_E_TYMED );
657cdf0e10cSrcweir }
658cdf0e10cSrcweir
659cdf0e10cSrcweir //------------------------------------------------------------------------
660cdf0e10cSrcweir //
661cdf0e10cSrcweir //------------------------------------------------------------------------
662cdf0e10cSrcweir
663cdf0e10cSrcweir //inline
setupStgMedium(const FORMATETC & fetc,CStgTransferHelper & stgTransHlp,STGMEDIUM & stgmedium)664cdf0e10cSrcweir void SAL_CALL CXTDataObject::setupStgMedium( const FORMATETC& fetc,
665cdf0e10cSrcweir CStgTransferHelper& stgTransHlp,
666cdf0e10cSrcweir STGMEDIUM& stgmedium )
667cdf0e10cSrcweir {
668cdf0e10cSrcweir stgmedium.pUnkForRelease = NULL;
669cdf0e10cSrcweir
670cdf0e10cSrcweir if ( fetc.cfFormat == CF_METAFILEPICT )
671cdf0e10cSrcweir {
672cdf0e10cSrcweir stgmedium.tymed = TYMED_MFPICT;
673cdf0e10cSrcweir stgmedium.hMetaFilePict = static_cast< HMETAFILEPICT >( stgTransHlp.getHGlobal( ) );
674cdf0e10cSrcweir }
675cdf0e10cSrcweir else if ( fetc.cfFormat == CF_ENHMETAFILE )
676cdf0e10cSrcweir {
677cdf0e10cSrcweir stgmedium.tymed = TYMED_ENHMF;
678cdf0e10cSrcweir stgmedium.hEnhMetaFile = static_cast< HENHMETAFILE >( stgTransHlp.getHGlobal( ) );
679cdf0e10cSrcweir }
680cdf0e10cSrcweir else if ( fetc.tymed & TYMED_HGLOBAL )
681cdf0e10cSrcweir {
682cdf0e10cSrcweir stgmedium.tymed = TYMED_HGLOBAL;
683cdf0e10cSrcweir stgmedium.hGlobal = stgTransHlp.getHGlobal( );
684cdf0e10cSrcweir }
685cdf0e10cSrcweir else if ( fetc.tymed & TYMED_ISTREAM )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir stgmedium.tymed = TYMED_ISTREAM;
688cdf0e10cSrcweir stgTransHlp.getIStream( &stgmedium.pstm );
689cdf0e10cSrcweir }
690cdf0e10cSrcweir else
691cdf0e10cSrcweir OSL_ASSERT( sal_False );
692cdf0e10cSrcweir }
693cdf0e10cSrcweir
694cdf0e10cSrcweir //------------------------------------------------------------------------
695cdf0e10cSrcweir //
696cdf0e10cSrcweir //------------------------------------------------------------------------
697cdf0e10cSrcweir
698cdf0e10cSrcweir inline
invalidateStgMedium(STGMEDIUM & stgmedium) const699cdf0e10cSrcweir void SAL_CALL CXTDataObject::invalidateStgMedium( STGMEDIUM& stgmedium ) const
700cdf0e10cSrcweir {
701cdf0e10cSrcweir stgmedium.tymed = TYMED_NULL;
702cdf0e10cSrcweir }
703cdf0e10cSrcweir
704cdf0e10cSrcweir //------------------------------------------------------------------------
705cdf0e10cSrcweir //
706cdf0e10cSrcweir //------------------------------------------------------------------------
707cdf0e10cSrcweir
708cdf0e10cSrcweir inline
translateStgExceptionCode(HRESULT hr) const709cdf0e10cSrcweir HRESULT SAL_CALL CXTDataObject::translateStgExceptionCode( HRESULT hr ) const
710cdf0e10cSrcweir {
711cdf0e10cSrcweir HRESULT hrTransl;
712cdf0e10cSrcweir
713cdf0e10cSrcweir switch( hr )
714cdf0e10cSrcweir {
715cdf0e10cSrcweir case STG_E_MEDIUMFULL:
716cdf0e10cSrcweir hrTransl = hr;
717cdf0e10cSrcweir break;
718cdf0e10cSrcweir
719cdf0e10cSrcweir default:
720cdf0e10cSrcweir hrTransl = E_UNEXPECTED;
721cdf0e10cSrcweir break;
722cdf0e10cSrcweir }
723cdf0e10cSrcweir
724cdf0e10cSrcweir return hrTransl;
725cdf0e10cSrcweir }
726cdf0e10cSrcweir
727cdf0e10cSrcweir //------------------------------------------------------------------------
728cdf0e10cSrcweir //
729cdf0e10cSrcweir //------------------------------------------------------------------------
730cdf0e10cSrcweir
InitializeFormatEtcContainer()731cdf0e10cSrcweir inline void SAL_CALL CXTDataObject::InitializeFormatEtcContainer( )
732cdf0e10cSrcweir {
733cdf0e10cSrcweir if ( !m_bFormatEtcContainerInitialized )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir m_FormatRegistrar.RegisterFormats( m_XTransferable, m_FormatEtcContainer );
736cdf0e10cSrcweir m_bFormatEtcContainerInitialized = sal_True;
737cdf0e10cSrcweir }
738cdf0e10cSrcweir }
739cdf0e10cSrcweir
740cdf0e10cSrcweir //============================================================================
741cdf0e10cSrcweir // CEnumFormatEtc
742cdf0e10cSrcweir //============================================================================
743cdf0e10cSrcweir
744cdf0e10cSrcweir //----------------------------------------------------------------------------
745cdf0e10cSrcweir // ctor
746cdf0e10cSrcweir //----------------------------------------------------------------------------
747cdf0e10cSrcweir
CEnumFormatEtc(LPUNKNOWN lpUnkOuter,const CFormatEtcContainer & aFormatEtcContainer)748cdf0e10cSrcweir CEnumFormatEtc::CEnumFormatEtc( LPUNKNOWN lpUnkOuter, const CFormatEtcContainer& aFormatEtcContainer ) :
749cdf0e10cSrcweir m_nRefCnt( 0 ),
750cdf0e10cSrcweir m_lpUnkOuter( lpUnkOuter ),
751cdf0e10cSrcweir m_FormatEtcContainer( aFormatEtcContainer )
752cdf0e10cSrcweir {
753cdf0e10cSrcweir Reset( );
754cdf0e10cSrcweir }
755cdf0e10cSrcweir
756cdf0e10cSrcweir //----------------------------------------------------------------------------
757cdf0e10cSrcweir // IUnknown->QueryInterface
758cdf0e10cSrcweir //----------------------------------------------------------------------------
759cdf0e10cSrcweir
QueryInterface(REFIID iid,LPVOID * ppvObject)760cdf0e10cSrcweir STDMETHODIMP CEnumFormatEtc::QueryInterface( REFIID iid, LPVOID* ppvObject )
761cdf0e10cSrcweir {
762cdf0e10cSrcweir if ( NULL == ppvObject )
763cdf0e10cSrcweir return E_INVALIDARG;
764cdf0e10cSrcweir
765cdf0e10cSrcweir HRESULT hr = E_NOINTERFACE;
766cdf0e10cSrcweir
767cdf0e10cSrcweir *ppvObject = NULL;
768cdf0e10cSrcweir
769cdf0e10cSrcweir if ( ( __uuidof( IUnknown ) == iid ) ||
770cdf0e10cSrcweir ( __uuidof( IEnumFORMATETC ) == iid ) )
771cdf0e10cSrcweir {
772cdf0e10cSrcweir *ppvObject = static_cast< IUnknown* >( this );
773cdf0e10cSrcweir static_cast< LPUNKNOWN >( *ppvObject )->AddRef( );
774cdf0e10cSrcweir hr = S_OK;
775cdf0e10cSrcweir }
776cdf0e10cSrcweir
777cdf0e10cSrcweir return hr;
778cdf0e10cSrcweir }
779cdf0e10cSrcweir
780cdf0e10cSrcweir //----------------------------------------------------------------------------
781cdf0e10cSrcweir // IUnknown->AddRef
782cdf0e10cSrcweir //----------------------------------------------------------------------------
783cdf0e10cSrcweir
STDMETHODIMP_(ULONG)784cdf0e10cSrcweir STDMETHODIMP_(ULONG) CEnumFormatEtc::AddRef( )
785cdf0e10cSrcweir {
786cdf0e10cSrcweir // keep the dataobject alive
787cdf0e10cSrcweir m_lpUnkOuter->AddRef( );
788cdf0e10cSrcweir return InterlockedIncrement( &m_nRefCnt );
789cdf0e10cSrcweir }
790cdf0e10cSrcweir
791cdf0e10cSrcweir //----------------------------------------------------------------------------
792cdf0e10cSrcweir // IUnknown->Release
793cdf0e10cSrcweir //----------------------------------------------------------------------------
794cdf0e10cSrcweir
STDMETHODIMP_(ULONG)795cdf0e10cSrcweir STDMETHODIMP_(ULONG) CEnumFormatEtc::Release( )
796cdf0e10cSrcweir {
797cdf0e10cSrcweir // release the outer dataobject
798cdf0e10cSrcweir m_lpUnkOuter->Release( );
799cdf0e10cSrcweir
800cdf0e10cSrcweir ULONG nRefCnt = InterlockedDecrement( &m_nRefCnt );
801cdf0e10cSrcweir if ( 0 == nRefCnt )
802cdf0e10cSrcweir delete this;
803cdf0e10cSrcweir
804cdf0e10cSrcweir return nRefCnt;
805cdf0e10cSrcweir }
806cdf0e10cSrcweir
807cdf0e10cSrcweir //----------------------------------------------------------------------------
808cdf0e10cSrcweir // IEnumFORMATETC->Next
809cdf0e10cSrcweir //----------------------------------------------------------------------------
810cdf0e10cSrcweir
Next(ULONG nRequested,LPFORMATETC lpDest,ULONG * lpFetched)811cdf0e10cSrcweir STDMETHODIMP CEnumFormatEtc::Next( ULONG nRequested, LPFORMATETC lpDest, ULONG* lpFetched )
812cdf0e10cSrcweir {
813cdf0e10cSrcweir if ( ( nRequested < 1 ) ||
814cdf0e10cSrcweir (( nRequested > 1 ) && ( NULL == lpFetched )) ||
815cdf0e10cSrcweir IsBadWritePtr( lpDest, sizeof( FORMATETC ) * nRequested ) )
816cdf0e10cSrcweir return E_INVALIDARG;
817cdf0e10cSrcweir
818cdf0e10cSrcweir sal_uInt32 nFetched = m_FormatEtcContainer.nextFormatEtc( lpDest, nRequested );
819cdf0e10cSrcweir
820cdf0e10cSrcweir if ( NULL != lpFetched )
821cdf0e10cSrcweir *lpFetched = nFetched;
822cdf0e10cSrcweir
823cdf0e10cSrcweir return (nFetched == nRequested) ? S_OK : S_FALSE;
824cdf0e10cSrcweir }
825cdf0e10cSrcweir
826cdf0e10cSrcweir //----------------------------------------------------------------------------
827cdf0e10cSrcweir // IEnumFORMATETC->Skip
828cdf0e10cSrcweir //----------------------------------------------------------------------------
829cdf0e10cSrcweir
Skip(ULONG celt)830cdf0e10cSrcweir STDMETHODIMP CEnumFormatEtc::Skip( ULONG celt )
831cdf0e10cSrcweir {
832cdf0e10cSrcweir return m_FormatEtcContainer.skipFormatEtc( celt ) ? S_OK : S_FALSE;
833cdf0e10cSrcweir }
834cdf0e10cSrcweir
835cdf0e10cSrcweir //----------------------------------------------------------------------------
836cdf0e10cSrcweir // IEnumFORMATETC->Reset
837cdf0e10cSrcweir //----------------------------------------------------------------------------
838cdf0e10cSrcweir
Reset()839cdf0e10cSrcweir STDMETHODIMP CEnumFormatEtc::Reset( )
840cdf0e10cSrcweir {
841cdf0e10cSrcweir m_FormatEtcContainer.beginEnumFormatEtc( );
842cdf0e10cSrcweir return S_OK;
843cdf0e10cSrcweir }
844cdf0e10cSrcweir
845cdf0e10cSrcweir //----------------------------------------------------------------------------
846cdf0e10cSrcweir // IEnumFORMATETC->Clone
847cdf0e10cSrcweir //----------------------------------------------------------------------------
848cdf0e10cSrcweir
Clone(IEnumFORMATETC ** ppenum)849cdf0e10cSrcweir STDMETHODIMP CEnumFormatEtc::Clone( IEnumFORMATETC** ppenum )
850cdf0e10cSrcweir {
851cdf0e10cSrcweir if ( NULL == ppenum )
852cdf0e10cSrcweir return E_INVALIDARG;
853cdf0e10cSrcweir
854cdf0e10cSrcweir *ppenum = new CEnumFormatEtc( m_lpUnkOuter, m_FormatEtcContainer );
855cdf0e10cSrcweir if ( NULL != ppenum )
856cdf0e10cSrcweir static_cast< LPUNKNOWN >( *ppenum )->AddRef( );
857cdf0e10cSrcweir
858cdf0e10cSrcweir return ( NULL != *ppenum ) ? S_OK : E_OUTOFMEMORY;
859cdf0e10cSrcweir }
860