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 25 #ifndef _DTRANSHELPER_HXX_ 26 #define _DTRANSHELPER_HXX_ 27 28 //------------------------------------------------------------------------ 29 // includes 30 //------------------------------------------------------------------------ 31 32 #if defined _MSC_VER 33 #pragma warning(push,1) 34 #endif 35 #include <windows.h> 36 #if defined _MSC_VER 37 #pragma warning(pop) 38 #endif 39 #include "..\misc\WinClip.hxx" 40 41 //------------------------------------------------------------------------ 42 // defines 43 //------------------------------------------------------------------------ 44 45 #define AUTO_INIT TRUE 46 #define NO_AUTO_INIT FALSE 47 #define MEM_DESTROY_ON_RELEASE TRUE 48 #define NO_MEM_DESTROY_ON_RELEASE FALSE 49 50 //------------------------------------------------------------------------ 51 // deklarations 52 //------------------------------------------------------------------------ 53 54 55 //------------------------------------------------------------------------- 56 // a helper class to manage a global memory area, the clients can write 57 // into the global memory area and extract the handle to the global mem 58 // note: not thread-safe 59 //------------------------------------------------------------------------- 60 61 class CStgTransferHelper 62 { 63 public: 64 // will be thrown in case of failures 65 class CStgTransferException 66 { 67 public: 68 HRESULT m_hr; CStgTransferException(HRESULT hr)69 CStgTransferException( HRESULT hr ) : m_hr( hr ) {}; 70 }; 71 72 public: 73 CStgTransferHelper( 74 sal_Bool bAutoInit = sal_False, 75 HGLOBAL hGlob = NULL, 76 sal_Bool bDelStgOnRelease = sal_False ); 77 78 ~CStgTransferHelper( ); 79 80 void SAL_CALL write( const void* lpData, ULONG cb, ULONG* cbWritten = NULL ); 81 void SAL_CALL read( LPVOID pv, ULONG cb, ULONG* pcbRead = NULL ); 82 83 HGLOBAL SAL_CALL getHGlobal( ) const; 84 void SAL_CALL getIStream( LPSTREAM* ppStream ); 85 86 void SAL_CALL init( 87 SIZE_T newSize, 88 sal_uInt32 uiFlags = GHND, 89 sal_Bool bDelStgOnRelease = sal_False ); 90 91 void SAL_CALL init( 92 HGLOBAL hGlob, 93 sal_Bool bDelStgOnRelease = sal_False ); 94 95 // returns the size of the managed memory 96 sal_uInt32 SAL_CALL memSize( CLIPFORMAT cf = CF_INVALID ) const; 97 98 // free the global memory and necessary 99 // release the internal stream pointer 100 void SAL_CALL cleanup( ); 101 102 private: 103 LPSTREAM m_lpStream; 104 sal_Bool m_bDelStgOnRelease; 105 106 private: 107 CStgTransferHelper( const CStgTransferHelper& ); 108 CStgTransferHelper& operator=( const CStgTransferHelper& ); 109 }; 110 111 //------------------------------------------------------------------------- 112 // something like an auto-pointer - allows access to the memory belonging 113 // to a HGLOBAL and automatically unlocks a global memory at destruction 114 // time 115 //------------------------------------------------------------------------- 116 117 class CRawHGlobalPtr 118 { 119 public: 120 121 //--------------------------------------------- 122 // ctor 123 //--------------------------------------------- 124 CRawHGlobalPtr(HGLOBAL hGlob)125 CRawHGlobalPtr( HGLOBAL hGlob ) : 126 m_hGlob( hGlob ), 127 m_bIsLocked( FALSE ), 128 m_pGlobMem( NULL ) 129 { 130 } 131 132 133 //--------------------------------------------- 134 // ctor 135 //--------------------------------------------- 136 CRawHGlobalPtr(const CStgTransferHelper & theHGlobalHelper)137 CRawHGlobalPtr( const CStgTransferHelper& theHGlobalHelper ) : 138 m_hGlob( theHGlobalHelper.getHGlobal( ) ), 139 m_bIsLocked( FALSE ), 140 m_pGlobMem( NULL ) 141 { 142 } 143 144 //--------------------------------------------- 145 // dtor 146 //--------------------------------------------- 147 ~CRawHGlobalPtr()148 ~CRawHGlobalPtr( ) 149 { 150 if ( m_bIsLocked ) 151 GlobalUnlock( m_hGlob ); 152 } 153 154 //--------------------------------------------- 155 // lock the global memory (initializes a 156 // pointer to this memory) 157 //--------------------------------------------- 158 Lock()159 BOOL Lock( ) 160 { 161 if ( !m_bIsLocked && ( NULL != m_hGlob ) ) 162 { 163 m_pGlobMem = GlobalLock( m_hGlob ); 164 m_bIsLocked = ( NULL != m_pGlobMem ); 165 } 166 167 return m_bIsLocked; 168 } 169 170 //--------------------------------------------- 171 // unlock the global memory (invalidates the 172 // pointer to this memory) 173 //--------------------------------------------- 174 Unlock()175 BOOL Unlock( ) 176 { 177 GlobalUnlock( m_hGlob ); 178 m_bIsLocked = FALSE; 179 m_pGlobMem = NULL; 180 181 return ( NO_ERROR == GetLastError( ) ); 182 } 183 184 //--------------------------------------------- 185 // locks the global memory and returns a 186 // pointer to this memory 187 //--------------------------------------------- 188 GetMemPtr()189 LPVOID GetMemPtr( ) 190 { 191 Lock( ); 192 return m_pGlobMem; 193 } 194 195 //--------------------------------------------- 196 // size of mem we point to 197 //--------------------------------------------- 198 MemSize() const199 int MemSize( ) const 200 { 201 return GlobalSize( m_hGlob ); 202 } 203 204 private: 205 HGLOBAL m_hGlob; 206 BOOL m_bIsLocked; 207 LPVOID m_pGlobMem; 208 }; 209 210 #endif 211