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