xref: /AOO41X/main/dtrans/source/os2/clipb/Os2Transferable.cxx (revision a7e9c4d8c6d79c93fa5e52a59b4bfc150351874e)
1cdf0e10cSrcweir /*************************************************************************
2cdf0e10cSrcweir  *
3cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4cdf0e10cSrcweir  *
5cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6cdf0e10cSrcweir  *
7cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8cdf0e10cSrcweir  *
9cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10cdf0e10cSrcweir  *
11cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14cdf0e10cSrcweir  *
15cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20cdf0e10cSrcweir  *
21cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25cdf0e10cSrcweir  *
26cdf0e10cSrcweir  ************************************************************************/
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
29cdf0e10cSrcweir #include <stdio.h>
30cdf0e10cSrcweir #endif
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #define INCL_WIN
33cdf0e10cSrcweir #include <svpm.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <string.h>
36cdf0e10cSrcweir #include <com/sun/star/io/IOException.hpp>
37cdf0e10cSrcweir #include "Os2Transferable.hxx"
38cdf0e10cSrcweir 
39cdf0e10cSrcweir using namespace com::sun::star::datatransfer;
40cdf0e10cSrcweir using namespace com::sun::star::lang;
41cdf0e10cSrcweir using namespace com::sun::star::io;
42cdf0e10cSrcweir using namespace com::sun::star::uno;
43cdf0e10cSrcweir using namespace cppu;
44cdf0e10cSrcweir using namespace osl;
45cdf0e10cSrcweir using namespace rtl;
46cdf0e10cSrcweir using namespace os2;
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // =======================================================================
49cdf0e10cSrcweir 
50cdf0e10cSrcweir Os2Transferable::Os2Transferable(
51cdf0e10cSrcweir 	const Reference< XInterface >& xCreator	) :
52cdf0e10cSrcweir 		m_xCreator( xCreator )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir 	debug_printf("Os2Transferable::Os2Transferable %08x\n", this);
55cdf0e10cSrcweir 	hAB = WinQueryAnchorBlock( HWND_DESKTOP );
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 	// query clipboard data to get mimetype
58cdf0e10cSrcweir 	if( UWinOpenClipbrd( hAB ) )
59cdf0e10cSrcweir 	{
60cdf0e10cSrcweir 		ULONG handle = UWinQueryClipbrdData( hAB, UCLIP_CF_UNICODETEXT);
61cdf0e10cSrcweir 		if (handle) {
62cdf0e10cSrcweir 			aFlavor.MimeType = OUString::createFromAscii( "text/plain;charset=utf-16" );
63cdf0e10cSrcweir 			aFlavor.DataType = getCppuType( (OUString*)0 );
64cdf0e10cSrcweir 			//debug_printf("Os2Transferable::Os2Transferable pszText %s\n", pszText);
65cdf0e10cSrcweir 		}
66cdf0e10cSrcweir 		handle = UWinQueryClipbrdData( hAB, UCLIP_CF_BITMAP);
67cdf0e10cSrcweir 		if (handle) {
68cdf0e10cSrcweir 			aFlavor.MimeType = OUString::createFromAscii( "application/x-openoffice-bitmap;windows_formatname=\"Bitmap\"" );
69cdf0e10cSrcweir 			aFlavor.DataType = getCppuType( (OUString*)0 );
70cdf0e10cSrcweir 			//debug_printf("Os2Transferable::Os2Transferable pszText %s\n", pszText);
71cdf0e10cSrcweir 		}
72cdf0e10cSrcweir 		UWinCloseClipbrd( hAB);
73cdf0e10cSrcweir 	}
74cdf0e10cSrcweir 	else
75cdf0e10cSrcweir 	{
76cdf0e10cSrcweir 		debug_printf("Os2Transferable::Os2Transferable failed to open clipboard\n");
77cdf0e10cSrcweir 	}
78cdf0e10cSrcweir 
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir //==================================================================================================
82cdf0e10cSrcweir 
83cdf0e10cSrcweir Os2Transferable::~Os2Transferable()
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	debug_printf("Os2Transferable::~Os2Transferable %08x\n", this);
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir //==================================================================================================
89cdf0e10cSrcweir 
90cdf0e10cSrcweir Any SAL_CALL Os2Transferable::getTransferData( const DataFlavor& rFlavor )
91cdf0e10cSrcweir     throw(UnsupportedFlavorException, IOException, RuntimeException)
92cdf0e10cSrcweir {
93cdf0e10cSrcweir 	debug_printf("Os2Transferable::getTransferData %08x\n", this);
94cdf0e10cSrcweir 	debug_printf("Os2Transferable::getTransferData mimetype: %s\n", CHAR_POINTER(rFlavor.MimeType));
95cdf0e10cSrcweir 	Any aRet;
96cdf0e10cSrcweir 	Sequence< sal_Int8 > aData;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 	// retrieve unicode text
99cdf0e10cSrcweir 	if( rFlavor.MimeType.equalsIgnoreAsciiCase( OUString::createFromAscii( "text/plain;charset=utf-16" ) ) )
100cdf0e10cSrcweir 	{
101cdf0e10cSrcweir 		if( UWinOpenClipbrd( hAB ) )
102cdf0e10cSrcweir 		{
103cdf0e10cSrcweir 			// check if clipboard has text format
104cdf0e10cSrcweir 			sal_Unicode* pszText = (sal_Unicode*) UWinQueryClipbrdData( hAB, UCLIP_CF_UNICODETEXT);
105cdf0e10cSrcweir 			if (pszText) {
106cdf0e10cSrcweir 				// convert to oustring and return it
107cdf0e10cSrcweir 				OUString aString( pszText);
108cdf0e10cSrcweir 				aRet <<= aString;
109cdf0e10cSrcweir 			}
110cdf0e10cSrcweir 			UWinCloseClipbrd( hAB );
111cdf0e10cSrcweir 			if (pszText)
112cdf0e10cSrcweir 				return aRet;
113cdf0e10cSrcweir 		}
114cdf0e10cSrcweir 	}
115cdf0e10cSrcweir 
116*a7e9c4d8SPedro Giffuni 	// retrieve bitmap
117*a7e9c4d8SPedro Giffuni 	if( rFlavor.MimeType.equalsIgnoreAsciiCase( OUString::createFromAscii( "application/x-openoffice-bitmap;windows_formatname=\"Bitmap\"" ) ) )
118*a7e9c4d8SPedro Giffuni 	{
119*a7e9c4d8SPedro Giffuni 		if( UWinOpenClipbrd( hAB ) )
120*a7e9c4d8SPedro Giffuni 		{
121*a7e9c4d8SPedro Giffuni 			// check if clipboard has text format
122*a7e9c4d8SPedro Giffuni 			ULONG handle = UWinQueryClipbrdData( hAB, UCLIP_CF_BITMAP);
123*a7e9c4d8SPedro Giffuni 			if (handle) {
124*a7e9c4d8SPedro Giffuni 				Sequence< sal_Int8 > winDIBStream;
125*a7e9c4d8SPedro Giffuni 				// convert to oustring and return it
126*a7e9c4d8SPedro Giffuni 				if (OS2HandleToOOoBmp( handle, &winDIBStream))
127*a7e9c4d8SPedro Giffuni 					aRet <<= winDIBStream;
128*a7e9c4d8SPedro Giffuni 				else
129*a7e9c4d8SPedro Giffuni 					handle = 0;
130*a7e9c4d8SPedro Giffuni 			}
131*a7e9c4d8SPedro Giffuni 			UWinCloseClipbrd( hAB );
132*a7e9c4d8SPedro Giffuni 			if (handle)
133*a7e9c4d8SPedro Giffuni 				return aRet;
134*a7e9c4d8SPedro Giffuni 		}
135*a7e9c4d8SPedro Giffuni 	}
136*a7e9c4d8SPedro Giffuni 
137cdf0e10cSrcweir 	// clipboard format unsupported, throw exception
138cdf0e10cSrcweir 	throw UnsupportedFlavorException( rFlavor.MimeType, static_cast < XTransferable * > ( this ) );
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir //==================================================================================================
142cdf0e10cSrcweir 
143cdf0e10cSrcweir Sequence< DataFlavor > SAL_CALL Os2Transferable::getTransferDataFlavors()
144cdf0e10cSrcweir     throw(RuntimeException)
145cdf0e10cSrcweir {
146cdf0e10cSrcweir 	debug_printf("Os2Transferable::getTransferDataFlavors %08x\n", this);
147cdf0e10cSrcweir 	Sequence< DataFlavor > aFlavorList(1);
148cdf0e10cSrcweir 	aFlavorList[0] = aFlavor;
149cdf0e10cSrcweir 	debug_printf("Os2Transferable::getTransferDataFlavors mimetype: %s\n", CHAR_POINTER(aFlavor.MimeType));
150cdf0e10cSrcweir 	return aFlavorList;
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
153cdf0e10cSrcweir //==================================================================================================
154cdf0e10cSrcweir 
155cdf0e10cSrcweir sal_Bool SAL_CALL Os2Transferable::isDataFlavorSupported( const DataFlavor& aFlavor )
156cdf0e10cSrcweir     throw(RuntimeException)
157cdf0e10cSrcweir {
158cdf0e10cSrcweir 	debug_printf("Os2Transferable::isDataFlavorSupported %08x\n", this);
159cdf0e10cSrcweir 	debug_printf("Os2Transferable::isDataFlavorSupported %s\n", CHAR_POINTER(aFlavor.MimeType));
160cdf0e10cSrcweir 
161cdf0e10cSrcweir 	if( aFlavor.DataType != getCppuType( (Sequence< sal_Int8 >*)0 ) )
162cdf0e10cSrcweir 	{
163cdf0e10cSrcweir 		if( ! aFlavor.MimeType.equalsIgnoreAsciiCase( OUString::createFromAscii( "text/plain;charset=utf-16" ) ) &&
164cdf0e10cSrcweir 			aFlavor.DataType == getCppuType( (OUString*)0 ) )
165cdf0e10cSrcweir 			return false;
166cdf0e10cSrcweir 	}
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 	Sequence< DataFlavor > aFlavors( getTransferDataFlavors() );
169cdf0e10cSrcweir 	for( int i = 0; i < aFlavors.getLength(); i++ )
170cdf0e10cSrcweir 		if( aFlavor.MimeType.equalsIgnoreAsciiCase( aFlavors.getConstArray()[i].MimeType ) &&
171cdf0e10cSrcweir 			aFlavor.DataType == aFlavors.getConstArray()[i].DataType )
172cdf0e10cSrcweir 			return sal_True;
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 	return sal_False;
175cdf0e10cSrcweir }
176cdf0e10cSrcweir 
177