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 114 CClipboardListener::~CClipboardListener( ) 115 { 116 } 117 118 void SAL_CALL CClipboardListener::disposing( const EventObject& Source ) throw(RuntimeException) 119 { 120 121 } 122 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 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 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 215 Sequence< DataFlavor > SAL_CALL CTransferable::getTransferDataFlavors( ) 216 throw(RuntimeException) 217 { 218 return m_FlavorList; 219 } 220 221 //---------------------------------------------------------------- 222 // isDataFlavorSupported 223 //---------------------------------------------------------------- 224 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 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 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