xref: /AOO41X/main/dtrans/source/win32/workbench/test_wincb.cxx (revision 48123e16153c92857455f9e7a0d17cc19307983f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dtrans.hxx"
26 
27 
28 //_________________________________________________________________________________________________________________________
29 //  interface includes
30 //_________________________________________________________________________________________________________________________
31 
32 
33 #include "..\misc\ImplHelper.hxx"
34 
35 //_________________________________________________________________________________________________________________________
36 //  other includes
37 //_________________________________________________________________________________________________________________________
38 #include <cppuhelper/servicefactory.hxx>
39 #include <com/sun/star/datatransfer/XTransferable.hpp>
40 #include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
41 #include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp>
42 #include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp>
43 #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
44 #include <com/sun/star/lang/XComponent.hpp>
45 #include <cppuhelper/implbase1.hxx>
46 #include <cppuhelper/implbase2.hxx>
47 #include <rtl/ustring.hxx>
48 #include <sal/types.h>
49 #include <osl/diagnose.h>
50 
51 #include <stdio.h>
52 #if defined _MSC_VER
53 #pragma warning(push,1)
54 #endif
55 #include <windows.h>
56 #include <objbase.h>
57 #if defined _MSC_VER
58 #pragma warning(pop)
59 #endif
60 
61 #include <memory>
62 
63 #include <process.h>
64 
65 //-------------------------------------------------------------
66 // my defines
67 //-------------------------------------------------------------
68 
69 #define TEST_CLIPBOARD
70 #define RDB_SYSPATH  "d:\\projects\\src623\\dtrans\\wntmsci7\\bin\\applicat.rdb"
71 #define WINCLIPBOARD_SERVICE_NAME L"com.sun.star.datatransfer.clipboard.SystemClipboard"
72 #define  WRITE_CB
73 #define EVT_MANUAL_RESET     TRUE
74 #define EVT_INIT_NONSIGNALED FALSE
75 #define EVT_NONAME           ""
76 
77 //------------------------------------------------------------
78 //  namesapces
79 //------------------------------------------------------------
80 
81 using namespace ::rtl;
82 using namespace ::std;
83 using namespace ::cppu;
84 using namespace ::com::sun::star::datatransfer;
85 using namespace ::com::sun::star::datatransfer::clipboard;
86 using namespace ::com::sun::star::uno;
87 using namespace ::com::sun::star::io;
88 using namespace ::com::sun::star::lang;
89 
90 //------------------------------------------------------------
91 //  globales
92 //------------------------------------------------------------
93 
94 Reference< XTransferable > rXTransfRead;
95 HANDLE  g_hEvtThreadWakeup;
96 
97 //------------------------------------------------------------
98 //
99 //------------------------------------------------------------
100 
101 class CClipboardListener : public WeakImplHelper1 < XClipboardListener >
102 {
103 public:
104     ~CClipboardListener( );
105 
106     //-------------------------------------------------
107     // XClipboardListener
108     //-------------------------------------------------
109 
110     virtual void SAL_CALL disposing( const EventObject& Source ) throw(RuntimeException);
111     virtual void SAL_CALL changedContents( const ClipboardEvent& event ) throw( RuntimeException );
112 };
113 
~CClipboardListener()114 CClipboardListener::~CClipboardListener( )
115 {
116 }
117 
disposing(const EventObject & Source)118 void SAL_CALL CClipboardListener::disposing( const EventObject& Source ) throw(RuntimeException)
119 {
120 
121 }
122 
changedContents(const ClipboardEvent & event)123 void SAL_CALL CClipboardListener::changedContents( const ClipboardEvent& event ) throw( RuntimeException )
124 {
125     //MessageBox( NULL, TEXT("Clipboard content changed"), TEXT("Info"), MB_OK | MB_ICONINFORMATION );
126 }
127 
128 //------------------------------------------------------------
129 //
130 //------------------------------------------------------------
131 
132 class CTransferable : public WeakImplHelper2< XClipboardOwner, XTransferable >
133 {
134 public:
135     CTransferable( );
136 
137     //-------------------------------------------------
138     // XTransferable
139     //-------------------------------------------------
140 
141     virtual Any SAL_CALL getTransferData( const DataFlavor& aFlavor )
142         throw(UnsupportedFlavorException, IOException, RuntimeException);
143 
144     virtual Sequence< DataFlavor > SAL_CALL getTransferDataFlavors(  ) throw(RuntimeException);
145 
146     virtual sal_Bool SAL_CALL isDataFlavorSupported( const DataFlavor& aFlavor ) throw(RuntimeException);
147 
148     //-------------------------------------------------
149     // XClipboardOwner
150     //-------------------------------------------------
151 
152     virtual void SAL_CALL lostOwnership( const Reference< XClipboard >& xClipboard, const Reference< XTransferable >& xTrans )
153         throw(RuntimeException);
154 
155 private:
156     Sequence< DataFlavor > m_FlavorList;
157     OUString               m_Data;
158 };
159 
160 //----------------------------------------------------------------
161 //  ctor
162 //----------------------------------------------------------------
163 
CTransferable()164 CTransferable::CTransferable( ) :
165     m_FlavorList( 1 ),
166     m_Data( OUString::createFromAscii( "Ich habe mir ein neues Fahrrad gekauft!" ) )
167 {
168     DataFlavor df;
169 
170     //df.MimeType = L"text/plain;charset=utf-16";
171     //df.DataType = getCppuType( ( OUString* )0 );
172 
173     df.MimeType = L"text/plain;charset=Windows1252";
174     df.DataType = getCppuType( (Sequence< sal_Int8 >*)0 );
175 
176     m_FlavorList[0] = df;
177 }
178 
179 //----------------------------------------------------------------
180 //  getTransferData
181 //----------------------------------------------------------------
182 
getTransferData(const DataFlavor & aFlavor)183 Any SAL_CALL CTransferable::getTransferData( const DataFlavor& aFlavor )
184     throw(UnsupportedFlavorException, IOException, RuntimeException)
185 {
186     Any anyData;
187 
188     /*
189     if ( aFlavor.MimeType == m_FlavorList[0].MimeType )
190         anyData = makeAny( m_Data );
191     */
192     if ( aFlavor.MimeType.equalsIgnoreCase( m_FlavorList[0].MimeType ) )
193     {
194         OString text(
195             m_Data.getStr( ),
196             m_Data.getLength( ),
197             RTL_TEXTENCODING_ASCII_US );
198 
199         Sequence< sal_Int8 > textStream( text.getLength( ) + 1 );
200 
201         rtl_copyMemory( textStream.getArray( ), text.getStr( ), textStream.getLength( ) );
202 
203         anyData = makeAny( textStream );
204     }
205     else
206         throw UnsupportedFlavorException( );
207 
208     return anyData;
209 }
210 
211 //----------------------------------------------------------------
212 //  getTransferDataFlavors
213 //----------------------------------------------------------------
214 
getTransferDataFlavors()215 Sequence< DataFlavor > SAL_CALL CTransferable::getTransferDataFlavors(  )
216     throw(RuntimeException)
217 {
218     return m_FlavorList;
219 }
220 
221 //----------------------------------------------------------------
222 //  isDataFlavorSupported
223 //----------------------------------------------------------------
224 
isDataFlavorSupported(const DataFlavor & aFlavor)225 sal_Bool SAL_CALL CTransferable::isDataFlavorSupported( const DataFlavor& aFlavor )
226     throw(RuntimeException)
227 {
228     sal_Int32 nLength = m_FlavorList.getLength( );
229 
230     for ( sal_Int32 i = 0; i < nLength; ++i )
231         if ( m_FlavorList[i].MimeType == aFlavor.MimeType )
232             return sal_True;
233 
234     return sal_False;
235 }
236 
237 //----------------------------------------------------------------
238 //  lostOwnership
239 //----------------------------------------------------------------
240 
lostOwnership(const Reference<XClipboard> & xClipboard,const Reference<XTransferable> & xTrans)241 void SAL_CALL CTransferable::lostOwnership(
242     const Reference< XClipboard >& xClipboard, const Reference< XTransferable >& xTrans )
243     throw(RuntimeException)
244 {
245     //MessageBox( NULL, TEXT("No longer clipboard owner"), TEXT("Info"), MB_OK | MB_ICONINFORMATION );
246 }
247 
248 //----------------------------------------------------------------
249 //  main
250 //----------------------------------------------------------------
251 
main(int nArgc,char * Argv[])252 int SAL_CALL main( int nArgc, char* Argv[] )
253 {
254     // create a multi-threaded apartment; we can test only
255     // with a multithreaded apartment because for a single
256     // threaded apartment we need a message loop to deliver
257     // messages to our XTDataObject
258     //HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
259     HRESULT hr = CoInitialize( NULL );
260 
261     char buff[6];
262 
263     LCID lcid = MAKELCID( MAKELANGID( LANG_GERMAN, SUBLANG_GERMAN ), SORT_DEFAULT );
264 
265     BOOL bValid = IsValidLocale( lcid, LCID_SUPPORTED );
266     GetLocaleInfoA( lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof( buff ) );
267 
268     //-------------------------------------------------
269     // get the global service-manager
270     //-------------------------------------------------
271 
272     OUString rdbName = OUString( RTL_CONSTASCII_USTRINGPARAM( RDB_SYSPATH ) );
273     Reference< XMultiServiceFactory > g_xFactory( createRegistryServiceFactory( rdbName ) );
274 
275     // Print a message if an error occured.
276     if ( !g_xFactory.is( ) )
277     {
278         OSL_ENSURE(sal_False, "Can't create RegistryServiceFactory");
279         return(-1);
280     }
281 
282     //-------------------------------------------------
283     // try to get an Interface to a XFilePicker Service
284     //-------------------------------------------------
285 
286     Reference< XTransferable > rXTransf( static_cast< XTransferable* >( new CTransferable ) );
287 
288     Reference< XClipboard >
289         xClipboard( g_xFactory->createInstance( OUString( WINCLIPBOARD_SERVICE_NAME ) ), UNO_QUERY );
290     if ( !xClipboard.is( ) )
291     {
292         OSL_ENSURE( sal_False, "Error creating Clipboard Service" );
293         return(-1);
294     }
295 
296     Reference< XClipboardNotifier > xClipNotifier( xClipboard, UNO_QUERY );
297     Reference< XClipboardListener > rXClipListener( static_cast< XClipboardListener* >( new CClipboardListener() ) );
298     xClipNotifier->addClipboardListener( rXClipListener );
299 
300     MessageBox( NULL, TEXT("Go"), TEXT("INFO"), MB_OK|MB_ICONINFORMATION);
301 
302     // set new clipboard content
303     xClipboard->setContents( rXTransf, Reference< XClipboardOwner >( rXTransf, UNO_QUERY )  );
304 
305     /*
306     MessageBox( NULL, TEXT("Clear content"), TEXT("INFO"), MB_OK|MB_ICONINFORMATION);
307 
308     Reference< XClipboardOwner > rXClipOwner;
309     Reference< XTransferable >   rXEmptyTransf;
310     xClipboard->setContents( rXEmptyTransf, rXClipOwner );
311     */
312 
313     MessageBox( NULL, TEXT("Stop"), TEXT("INFO"), MB_OK|MB_ICONINFORMATION);
314 
315     // flush the clipboard content
316     Reference< XFlushableClipboard > rXFlushableClip( xClipboard, UNO_QUERY );
317     rXFlushableClip->flushClipboard( );
318     rXFlushableClip = Reference< XFlushableClipboard >( );
319 
320     xClipNotifier->removeClipboardListener( rXClipListener );
321     rXClipListener = Reference< XClipboardListener >( );
322     xClipNotifier  = Reference< XClipboardNotifier >( );
323 
324     //--------------------------------------------------
325     // shutdown the service manager
326     //--------------------------------------------------
327 
328     // Cast factory to XComponent
329     Reference< XComponent > xComponent( g_xFactory, UNO_QUERY );
330 
331     if ( !xComponent.is() )
332         OSL_ENSURE(sal_False, "Error shuting down");
333 
334     // Dispose and clear factory
335     xComponent->dispose();
336     xComponent = Reference< XComponent >( );
337 
338     g_xFactory.clear();
339     g_xFactory = Reference< XMultiServiceFactory >();
340 
341     CoUninitialize( );
342 
343     return 0;
344 }
345