1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #ifndef _INPROCSERV_SMARTPOINTER_HXX_ 29*cdf0e10cSrcweir #define _INPROCSERV_SMARTPOINTER_HXX_ 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir // #define OWNDEBUG 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir #ifdef OWNDEBUG 34*cdf0e10cSrcweir #define WRITEDEBUGINFOINTERN( x ) WriteDebugInfo( (DWORD)this, x, sizeof( x ) ) 35*cdf0e10cSrcweir #define WRITEDEBUGINFO( x ) WRITEDEBUGINFOINTERN( x ":" MY_STRING_LINE "\n" ) 36*cdf0e10cSrcweir #define TO_STRING( x ) #x 37*cdf0e10cSrcweir #define MACRO_VALUE_TO_STRING( x ) TO_STRING( x ) 38*cdf0e10cSrcweir #define MY_STRING_LINE MACRO_VALUE_TO_STRING( __LINE__ ) 39*cdf0e10cSrcweir #else 40*cdf0e10cSrcweir #define WRITEDEBUGINFO( x ) void() 41*cdf0e10cSrcweir #define MY_STRING_LINE 42*cdf0e10cSrcweir #endif 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir 45*cdf0e10cSrcweir namespace inprocserv{ 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir void WriteDebugInfo( DWORD pThis, char* pString, DWORD nToWrite ); 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir template< class T > class ComSmart 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir T* m_pInterface; 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir void OwnRelease() 54*cdf0e10cSrcweir { 55*cdf0e10cSrcweir if ( m_pInterface ) 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir T* pInterface = m_pInterface; 58*cdf0e10cSrcweir m_pInterface = NULL; 59*cdf0e10cSrcweir pInterface->Release(); 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir } 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir public: 64*cdf0e10cSrcweir ComSmart() 65*cdf0e10cSrcweir : m_pInterface( NULL ) 66*cdf0e10cSrcweir {} 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir ComSmart( const ComSmart<T>& rObj ) 69*cdf0e10cSrcweir : m_pInterface( rObj.m_pInterface ) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir if ( m_pInterface != NULL ) 72*cdf0e10cSrcweir m_pInterface->AddRef(); 73*cdf0e10cSrcweir } 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir ComSmart( T* pInterface ) 76*cdf0e10cSrcweir : m_pInterface( pInterface ) 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir if ( m_pInterface != NULL ) 79*cdf0e10cSrcweir m_pInterface->AddRef(); 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir ~ComSmart() 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir OwnRelease(); 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir ComSmart& operator=( const ComSmart<T>& rObj ) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir OwnRelease(); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir m_pInterface = rObj.m_pInterface; 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir if ( m_pInterface != NULL ) 94*cdf0e10cSrcweir m_pInterface->AddRef(); 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir return *this; 97*cdf0e10cSrcweir } 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir ComSmart<T>& operator=( T* pInterface ) 100*cdf0e10cSrcweir { 101*cdf0e10cSrcweir OwnRelease(); 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir m_pInterface = pInterface; 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir if ( m_pInterface != NULL ) 106*cdf0e10cSrcweir m_pInterface->AddRef(); 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir return *this; 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir 111*cdf0e10cSrcweir operator T*() const 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir return m_pInterface; 114*cdf0e10cSrcweir } 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir T& operator*() const 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir return *m_pInterface; 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir T** operator&() 122*cdf0e10cSrcweir { 123*cdf0e10cSrcweir OwnRelease(); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir m_pInterface = NULL; 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir return &m_pInterface; 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir T* operator->() const 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir return m_pInterface; 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir BOOL operator==( const ComSmart<T>& rObj ) const 136*cdf0e10cSrcweir { 137*cdf0e10cSrcweir return ( m_pInterface == rObj.m_pInterface ); 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir BOOL operator!=( const ComSmart<T>& rObj ) const 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir return ( m_pInterface != rObj.m_pInterface ); 143*cdf0e10cSrcweir } 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir BOOL operator==( const T* pInterface ) const 146*cdf0e10cSrcweir { 147*cdf0e10cSrcweir return ( m_pInterface == pInterface ); 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir BOOL operator!=( const T* pInterface ) const 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir return ( m_pInterface != pInterface ); 153*cdf0e10cSrcweir } 154*cdf0e10cSrcweir }; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir class CSGuard 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir CRITICAL_SECTION* m_pCriticalSection; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir public: 161*cdf0e10cSrcweir CSGuard( CRITICAL_SECTION* pCS ) 162*cdf0e10cSrcweir : m_pCriticalSection( pCS ) 163*cdf0e10cSrcweir { 164*cdf0e10cSrcweir if ( m_pCriticalSection ) 165*cdf0e10cSrcweir EnterCriticalSection( m_pCriticalSection ); 166*cdf0e10cSrcweir } 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir ~CSGuard() 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir if ( m_pCriticalSection ) 171*cdf0e10cSrcweir LeaveCriticalSection( m_pCriticalSection ); 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir }; 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir class ULONGGuard 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir ULONG* m_pValue; 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir public: 180*cdf0e10cSrcweir ULONGGuard( ULONG* pValue ) 181*cdf0e10cSrcweir : m_pValue( pValue ) 182*cdf0e10cSrcweir { 183*cdf0e10cSrcweir if ( m_pValue ) 184*cdf0e10cSrcweir (*m_pValue)++; 185*cdf0e10cSrcweir } 186*cdf0e10cSrcweir 187*cdf0e10cSrcweir ~ULONGGuard() 188*cdf0e10cSrcweir { 189*cdf0e10cSrcweir if ( m_pValue ) 190*cdf0e10cSrcweir (*m_pValue)--; 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir }; 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir } // namespace inprocserv 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir #endif 197*cdf0e10cSrcweir 198