diff --git a/sal/workben/clipboardwben/testcopy/XTDataObject.cxx b/sal/workben/clipboardwben/testcopy/XTDataObject.cxx index b2348ec6bb81..947ffe0f417a 100644 --- a/sal/workben/clipboardwben/testcopy/XTDataObject.cxx +++ b/sal/workben/clipboardwben/testcopy/XTDataObject.cxx @@ -2,9 +2,9 @@ * * $RCSfile: XTDataObject.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: tra $ $Date: 2000-10-19 08:53:23 $ + * last change: $Author: tra $ $Date: 2000-11-13 08:34:09 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -88,8 +88,8 @@ // ctor //------------------------------------------------------------------------ -CXTDataObject::CXTDataObject( ) : - m_nRefCnt( 0 ) +CXTDataObject::CXTDataObject( LONG nRefCntInitVal ) : + m_nRefCnt( nRefCntInitVal ) { } @@ -169,7 +169,7 @@ STDMETHODIMP CXTDataObject::GetData(LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium if ( ( NULL == pFormatetc ) || ( NULL == pmedium ) ) return E_INVALIDARG; - HRESULT hr = S_OK; + HRESULT hr = E_FAIL; if ( CF_TEXT == pFormatetc->cfFormat ) { @@ -191,6 +191,34 @@ STDMETHODIMP CXTDataObject::GetData(LPFORMATETC pFormatetc, LPSTGMEDIUM pmedium pmedium->pUnkForRelease = NULL; } lpStream->Release( ); + hr = S_OK; + } + else + { + pmedium->tymed = TYMED_NULL; + } + } + else if ( CF_UNICODETEXT == pFormatetc->cfFormat ) + { + WCHAR buff[] = L"Hello World, How are you!"; + LPSTREAM lpStream; + + hr = CreateStreamOnHGlobal( NULL, FALSE, &lpStream ); + if ( SUCCEEDED( hr ) ) + { + hr = lpStream->Write( buff, sizeof( buff ) * sizeof( WCHAR ), NULL ); + if ( SUCCEEDED( hr ) ) + { + HGLOBAL hGlob; + + GetHGlobalFromStream( lpStream, &hGlob ); + + pmedium->tymed = TYMED_HGLOBAL; + pmedium->hGlobal = hGlob; + pmedium->pUnkForRelease = NULL; + } + lpStream->Release( ); + hr = S_OK; } else { @@ -311,8 +339,8 @@ CEnumFormatEtc::CEnumFormatEtc( LPUNKNOWN pUnkDataObj ) : m_pUnkDataObj( pUnkDataObj ), m_nCurrentPos( 0 ) { - m_cfFormats[0] = CF_TEXT; - m_cfFormats[1] = CF_UNICODETEXT; + m_cfFormats[0] = CF_UNICODETEXT; + m_cfFormats[1] = CF_TEXT; } //---------------------------------------------------------------------------- diff --git a/sal/workben/clipboardwben/testcopy/XTDataObject.hxx b/sal/workben/clipboardwben/testcopy/XTDataObject.hxx index 9852a885d349..e3776210cd6a 100644 --- a/sal/workben/clipboardwben/testcopy/XTDataObject.hxx +++ b/sal/workben/clipboardwben/testcopy/XTDataObject.hxx @@ -2,9 +2,9 @@ * * $RCSfile: XTDataObject.hxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: tra $ $Date: 2000-10-19 08:53:30 $ + * last change: $Author: tra $ $Date: 2000-11-13 08:34:09 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -96,9 +96,7 @@ class EnumFormatEtc; class CXTDataObject : public IDataObject { public: - CXTDataObject( /*CWinClipboard& theWinClipboard, - const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& theXClipboardOwner, - const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& theXTDataSource*/ ); + CXTDataObject( LONG nRefCntInitVal = 0); ~CXTDataObject( ); //----------------------------------------------------------------- diff --git a/sal/workben/clipboardwben/testcopy/cbcpytest.cxx b/sal/workben/clipboardwben/testcopy/cbcpytest.cxx index 6968874379a1..f5401e803e41 100644 --- a/sal/workben/clipboardwben/testcopy/cbcpytest.cxx +++ b/sal/workben/clipboardwben/testcopy/cbcpytest.cxx @@ -2,6 +2,7 @@ // #define _WIN32_DCOM +#undef _UNICODE #include "stdafx.h" @@ -22,20 +23,29 @@ #define MAX_LOADSTRING 100 #undef USE_MTACB +#define MSG_FLUSHCLIPBOARD WM_USER + 1 + // Globale Variablen: HINSTANCE hInst; // aktuelle Instanz -WCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile -WCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile +TCHAR szTitle[MAX_LOADSTRING]; // Text der Titelzeile +TCHAR szWindowClass[MAX_LOADSTRING]; // Text der Titelzeile ATOM MyRegisterClass( HINSTANCE hInstance ); BOOL InitInstance( HINSTANCE, int ); LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM ); void CopyClipboardData(HWND hwndParent); +void FlushClipboard( ); +void PasteData( HWND hWnd ); +void SetLocale(); + LPSTREAM g_pStm = NULL; char* pTextBuff = NULL; DWORD lData = 0; CXTDataObject* g_xtDo = NULL; +HWND g_hWnd; +HANDLE g_hEvent; +BOOL g_bEnd; //---------------------------------------------------- // a thread function @@ -43,61 +53,12 @@ CXTDataObject* g_xtDo = NULL; unsigned int _stdcall ThreadProc(LPVOID pParam) { - IDataObject* pIDataObj = NULL; - FORMATETC formatETC; - STGMEDIUM stgMedium; - LPVOID pGlobMem; - HWND hwnd; - DWORD sizeGlobBuff; - HRESULT hr; - - hwnd = (HWND)pParam; - - OleInitialize( NULL ); - - hr = OleGetClipboard( &pIDataObj ); - - hr = CoGetInterfaceAndReleaseStream( - g_pStm, - __uuidof(IDataObject), - reinterpret_cast(&pIDataObj)); - - formatETC.cfFormat = CF_TEXT; - formatETC.ptd = NULL; - formatETC.dwAspect = DVASPECT_CONTENT; - formatETC.lindex = -1; - formatETC.tymed = TYMED_HGLOBAL; - - hr = pIDataObj->GetData( &formatETC, &stgMedium ); - pGlobMem = GlobalLock( stgMedium.hGlobal ); - if ( NULL != pGlobMem ) + while( !g_bEnd ) { - if ( NULL != pTextBuff ) - { - free( pTextBuff ); - } - - sizeGlobBuff = GlobalSize( stgMedium.hGlobal ); - pTextBuff = (char*)malloc( sizeGlobBuff + 1 ); - ZeroMemory( pTextBuff, sizeGlobBuff + 1 ); - - memcpy( pTextBuff, pGlobMem, sizeGlobBuff ); - lData = sizeGlobBuff; - - InvalidateRect( hwnd, NULL, TRUE ); - UpdateWindow( hwnd ); + WaitForSingleObject( g_hEvent, INFINITE ); + SendMessage( g_hWnd, MSG_FLUSHCLIPBOARD, WPARAM(0), LPARAM(0) ); } - GlobalUnlock( stgMedium.hGlobal ); - - ReleaseStgMedium( &stgMedium ); - - pIDataObj->Release(); - - //CoUninitialize( ); - - OleUninitialize( ); - return 0; } @@ -115,6 +76,23 @@ int APIENTRY WinMain(HINSTANCE hInstance, HACCEL hAccelTable; HRESULT hr = E_FAIL; + /* + g_hEvent = CreateEvent( 0, + FALSE, + FALSE, + NULL + ); + + g_bEnd = FALSE; + + _beginthreadex( ThreadProc, + 0, + NULL, + 0, + 0, + NULL ); + */ + // it's important to initialize ole // in order to use the clipboard #ifdef USE_MTACB @@ -125,8 +103,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, // Globale Zeichenfolgen initialisieren - LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); - LoadStringW(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING); + LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadString(hInstance, IDC_TESTWIN32, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Initialisierung der Anwendung durchführen: @@ -154,12 +132,14 @@ int APIENTRY WinMain(HINSTANCE hInstance, OleUninitialize( ); #endif + CloseHandle( g_hEvent ); + return msg.wParam; } -// +//---------------------------------------------------------------- // FUNKTION: MyRegisterClass() // // AUFGABE: Registriert die Fensterklasse. @@ -171,10 +151,11 @@ int APIENTRY WinMain(HINSTANCE hInstance, // die zu Windows 95 hinzugefügt wurde. Es ist wichtig diese Funktion aufzurufen, // damit der Anwendung kleine Symbole mit den richtigen Proportionen zugewiesen // werden. -// +//---------------------------------------------------------------- + ATOM MyRegisterClass( HINSTANCE hInstance ) { - WNDCLASSEXW wcex; + WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); @@ -186,14 +167,14 @@ ATOM MyRegisterClass( HINSTANCE hInstance ) wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TESTWIN32); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); - wcex.lpszMenuName = (LPCWSTR)IDC_TESTWIN32; - wcex.lpszClassName = szWindowClass; + wcex.lpszMenuName = (LPCTSTR)IDC_TESTWIN32; + wcex.lpszClassName = _T(szWindowClass); wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); - return RegisterClassExW(&wcex); + return RegisterClassEx(&wcex); } -// +//---------------------------------------------------------------- // FUNKTION: InitInstance(HANDLE, int) // // AUFGABE: Speichert die Instanzzugriffsnummer und erstellt das Hauptfenster @@ -202,28 +183,27 @@ ATOM MyRegisterClass( HINSTANCE hInstance ) // // In dieser Funktion wird die Instanzzugriffsnummer in einer globalen Variable // gespeichert und das Hauptprogrammfenster erstellt und angezeigt. -// +//---------------------------------------------------------------- + BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { - HWND hWnd; - hInst = hInstance; // Instanzzugriffsnummer in unserer globalen Variable speichern - hWnd = CreateWindowExW(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, + g_hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); - if( !hWnd ) + if( !g_hWnd ) { return FALSE; } - ShowWindow( hWnd, nCmdShow ); - UpdateWindow( hWnd ); + ShowWindow( g_hWnd, nCmdShow ); + UpdateWindow( g_hWnd ); return TRUE; } -// +//---------------------------------------------------------------- // FUNKTION: WndProc(HWND, unsigned, WORD, LONG) // // AUFGABE: Verarbeitet Nachrichten für das Hauptfenster. @@ -231,8 +211,8 @@ BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) // WM_COMMAND - Anwendungsmenü verarbeiten // WM_PAINT - Hauptfenster darstellen // WM_DESTROY - Beendigungsnachricht ausgeben und zurückkehren -// -// +//---------------------------------------------------------------- + LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId; @@ -253,10 +233,14 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch( wmId ) { case IDD_COPY: - //PasteClipboardData(hWnd); CopyClipboardData(hWnd); break; - + case IDD_PASTE2: + PasteData(hWnd); + break; + case IDD_LOCALE: + SetLocale(); + break; case IDM_EXIT: DestroyWindow( hWnd ); break; @@ -285,6 +269,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_DESTROY: + g_bEnd = TRUE; + SetEvent( g_hEvent ); + FlushClipboard( ); PostQuitMessage( 0 ); break; @@ -294,63 +281,92 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return 0; } +//---------------------------------------------- +// copy data into the clipboard +//---------------------------------------------- + void CopyClipboardData( HWND hWnd ) { - g_xtDo = new CXTDataObject; + g_xtDo = new CXTDataObject( 1 ); #ifdef USE_MTACB MTASetClipboard( static_cast< IDataObject* >( g_xtDo ) ); - MTAFlushClipboard( ); #else OleSetClipboard( static_cast< IDataObject* >( g_xtDo ) ); - OleFlushClipboard( ); #endif } -void PasteClipboardData2(HWND hwndParent) +//---------------------------------------------- +// flush the content into the clipboard +//---------------------------------------------- + +void FlushClipboard( ) { - IDataObject* pIDataObject; - HRESULT hr; - FORMATETC formatETC; - STGMEDIUM stgMedium; - LPVOID pGlobMem; - HWND hwnd; - DWORD sizeGlobBuff; - - //hr = MTAGetClipboard( &pIDataObject ); - if ( SUCCEEDED( hr ) ) + if ( NULL != g_xtDo ) { - formatETC.cfFormat = CF_TEXT; - formatETC.ptd = NULL; - formatETC.dwAspect = DVASPECT_CONTENT; - formatETC.lindex = -1; - formatETC.tymed = TYMED_HGLOBAL; +#ifdef USE_MTACB + HRESULT hr = MTAIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) ); + if ( S_OK == hr ) + MTAFlushClipboard( ); +#else + HRESULT hr = OleIsCurrentClipboard( static_cast< IDataObject* >( g_xtDo ) ); + if ( S_OK == hr ) + OleFlushClipboard( ); +#endif - hr = pIDataObject->GetData( &formatETC, &stgMedium ); - pGlobMem = GlobalLock( stgMedium.hGlobal ); - if ( NULL != pGlobMem ) - { - if ( NULL != pTextBuff ) - { - free( pTextBuff ); - } - - sizeGlobBuff = GlobalSize( stgMedium.hGlobal ); - pTextBuff = (char*)malloc( sizeGlobBuff + 1 ); - ZeroMemory( pTextBuff, sizeGlobBuff + 1 ); - - memcpy( pTextBuff, pGlobMem, sizeGlobBuff ); - lData = sizeGlobBuff; - - InvalidateRect( hwndParent, NULL, TRUE ); - UpdateWindow( hwndParent ); - } - - GlobalUnlock( stgMedium.hGlobal ); - - ReleaseStgMedium( &stgMedium ); - - pIDataObject->Release(); + static_cast< IDataObject* >( g_xtDo )->Release( ); } } +void PasteData(HWND hWnd) +{ + IDataObject* pDataObj; + + //FlushClipboard( ); + + HRESULT hr = OleGetClipboard( &pDataObj ); + if ( SUCCEEDED( hr ) ) + { + FORMATETC fetc; + STGMEDIUM stgmedium; + + fetc.cfFormat = CF_LOCALE; + fetc.ptd = NULL; + fetc.dwAspect = DVASPECT_CONTENT; + fetc.lindex = -1; + fetc.tymed = TYMED_HGLOBAL; + + hr = pDataObj->GetData( &fetc, &stgmedium ); + if ( SUCCEEDED( hr ) ) + { + LPVOID lpData = GlobalLock( stgmedium.hGlobal ); + + if ( NULL != lpData ) + { + LCID lcid = *( (WORD*)lpData ); + + WORD langID = LANGIDFROMLCID( lcid ); + WORD sublangID = SUBLANGID( langID ); + + TCHAR buff[6]; + int cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTANSICODEPAGE, buff, sizeof( buff ) ); + cbWritten = GetLocaleInfo( lcid, LOCALE_IDEFAULTCODEPAGE, buff, sizeof( buff ) ); + + GlobalUnlock( stgmedium.hGlobal ); + } + else + { + DWORD dwLastError = GetLastError( ); + } + + ReleaseStgMedium( &stgmedium ); + } + } +} + + +void SetLocale() +{ + LCID threadLcid = GetThreadLocale(); +} + diff --git a/sal/workben/clipboardwben/testcopy/cbcpytest.rc b/sal/workben/clipboardwben/testcopy/cbcpytest.rc index 511439da5438..a9db008536ac 100644 --- a/sal/workben/clipboardwben/testcopy/cbcpytest.rc +++ b/sal/workben/clipboardwben/testcopy/cbcpytest.rc @@ -44,6 +44,8 @@ BEGIN POPUP "&Datei" BEGIN MENUITEM "&Copy", IDD_COPY + MENUITEM "Paste", IDD_PASTE2 + MENUITEM "Set Locale", IDD_LOCALE MENUITEM SEPARATOR MENUITEM "&Beenden", IDM_EXIT END diff --git a/sal/workben/clipboardwben/testcopy/resource.h b/sal/workben/clipboardwben/testcopy/resource.h index de3c8450ff7f..5f70db1bb13f 100644 --- a/sal/workben/clipboardwben/testcopy/resource.h +++ b/sal/workben/clipboardwben/testcopy/resource.h @@ -15,6 +15,8 @@ #define IDR_MAINFRAME 128 #define IDD_PASTE 32771 #define IDD_COPY 32771 +#define IDD_PASTE2 32772 +#define IDD_LOCALE 32773 #define IDC_STATIC -1 // Next default values for new objects @@ -22,7 +24,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32772 +#define _APS_NEXT_COMMAND_VALUE 32774 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 110 #endif