1*565d668cSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*565d668cSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*565d668cSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*565d668cSAndrew Rist * distributed with this work for additional information 6*565d668cSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*565d668cSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*565d668cSAndrew Rist * "License"); you may not use this file except in compliance 9*565d668cSAndrew Rist * with the License. You may obtain a copy of the License at 10*565d668cSAndrew Rist * 11*565d668cSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*565d668cSAndrew Rist * 13*565d668cSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*565d668cSAndrew Rist * software distributed under the License is distributed on an 15*565d668cSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*565d668cSAndrew Rist * KIND, either express or implied. See the License for the 17*565d668cSAndrew Rist * specific language governing permissions and limitations 18*565d668cSAndrew Rist * under the License. 19*565d668cSAndrew Rist * 20*565d668cSAndrew Rist *************************************************************/ 21*565d668cSAndrew Rist 22*565d668cSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef COMPTR_HXX 25cdf0e10cSrcweir #define COMPTR_HXX 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <sal/types.h> 28cdf0e10cSrcweir #include <osl/diagnose.h> 29cdf0e10cSrcweir #include <shobjidl.h> 30cdf0e10cSrcweir 31cdf0e10cSrcweir template< class T_INTERFACE , 32cdf0e10cSrcweir REFIID P_IID = IID_NULL , 33cdf0e10cSrcweir REFCLSID P_CLSID = CLSID_NULL > 34cdf0e10cSrcweir class ComPtr 35cdf0e10cSrcweir { 36cdf0e10cSrcweir public: 37cdf0e10cSrcweir 38cdf0e10cSrcweir //--------------------------------------------------------------------- 39cdf0e10cSrcweir /** initialize com ptr with null. 40cdf0e10cSrcweir */ ComPtr()41cdf0e10cSrcweir ComPtr() 42cdf0e10cSrcweir { 43cdf0e10cSrcweir m_pInterface = NULL; 44cdf0e10cSrcweir } 45cdf0e10cSrcweir 46cdf0e10cSrcweir //--------------------------------------------------------------------- 47cdf0e10cSrcweir /** initialize com ptr with given interface. 48cdf0e10cSrcweir */ ComPtr(T_INTERFACE * pInterface)49cdf0e10cSrcweir ComPtr(T_INTERFACE* pInterface) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir m_pInterface = pInterface; 52cdf0e10cSrcweir if (m_pInterface) 53cdf0e10cSrcweir m_pInterface->AddRef(); 54cdf0e10cSrcweir } 55cdf0e10cSrcweir 56cdf0e10cSrcweir //--------------------------------------------------------------------- 57cdf0e10cSrcweir /** copy ctor. 58cdf0e10cSrcweir */ ComPtr(const ComPtr<T_INTERFACE,P_IID,P_CLSID> & aCopy)59cdf0e10cSrcweir ComPtr(const ComPtr< T_INTERFACE, P_IID, P_CLSID >& aCopy) 60cdf0e10cSrcweir { 61cdf0e10cSrcweir m_pInterface = aCopy.m_pInterface; 62cdf0e10cSrcweir if (m_pInterface) 63cdf0e10cSrcweir m_pInterface->AddRef(); 64cdf0e10cSrcweir } 65cdf0e10cSrcweir 66cdf0e10cSrcweir //--------------------------------------------------------------------- 67cdf0e10cSrcweir /** initialize object by quering external object for the right interface. 68cdf0e10cSrcweir */ ComPtr(IUnknown * pIUnknown)69cdf0e10cSrcweir ComPtr(IUnknown* pIUnknown) 70cdf0e10cSrcweir { 71cdf0e10cSrcweir if (pIUnknown) 72cdf0e10cSrcweir pIUnknown->QueryInterface(P_IID, (void**)&m_pInterface); 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir //--------------------------------------------------------------------- 76cdf0e10cSrcweir /** deinitialize com object right. 77cdf0e10cSrcweir */ ~ComPtr()78cdf0e10cSrcweir ~ComPtr() 79cdf0e10cSrcweir { 80cdf0e10cSrcweir release(); 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir public: 84cdf0e10cSrcweir 85cdf0e10cSrcweir //--------------------------------------------------------------------- create()86cdf0e10cSrcweir HRESULT create() 87cdf0e10cSrcweir { 88cdf0e10cSrcweir return CoCreateInstance(P_CLSID, NULL, CLSCTX_ALL, P_IID, (void**)&m_pInterface); 89cdf0e10cSrcweir } 90cdf0e10cSrcweir 91cdf0e10cSrcweir //--------------------------------------------------------------------- operator T_INTERFACE*() const92cdf0e10cSrcweir operator T_INTERFACE*() const 93cdf0e10cSrcweir { 94cdf0e10cSrcweir return m_pInterface; 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 97cdf0e10cSrcweir //--------------------------------------------------------------------- operator *() const98cdf0e10cSrcweir T_INTERFACE& operator*() const 99cdf0e10cSrcweir { 100cdf0e10cSrcweir return *m_pInterface; 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir //--------------------------------------------------------------------- operator &()104cdf0e10cSrcweir T_INTERFACE** operator&() 105cdf0e10cSrcweir { 106cdf0e10cSrcweir return &m_pInterface; 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir //--------------------------------------------------------------------- operator ->() const110cdf0e10cSrcweir T_INTERFACE* operator->() const 111cdf0e10cSrcweir { 112cdf0e10cSrcweir return m_pInterface; 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir //--------------------------------------------------------------------- operator =(T_INTERFACE * pInterface)116cdf0e10cSrcweir T_INTERFACE* operator=(T_INTERFACE* pInterface) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir if ( equals(pInterface) ) 119cdf0e10cSrcweir return m_pInterface; 120cdf0e10cSrcweir 121cdf0e10cSrcweir m_pInterface->Release(); 122cdf0e10cSrcweir m_pInterface = pInterface; 123cdf0e10cSrcweir if (m_pInterface) 124cdf0e10cSrcweir m_pInterface->AddRef(); 125cdf0e10cSrcweir 126cdf0e10cSrcweir return m_pInterface; 127cdf0e10cSrcweir } 128cdf0e10cSrcweir 129cdf0e10cSrcweir //--------------------------------------------------------------------- operator =(IUnknown * pIUnknown)130cdf0e10cSrcweir T_INTERFACE* operator=(IUnknown* pIUnknown) 131cdf0e10cSrcweir { 132cdf0e10cSrcweir if (pIUnknown) 133cdf0e10cSrcweir pIUnknown->QueryInterface(P_IID, (void**)&m_pInterface); 134cdf0e10cSrcweir return m_pInterface; 135cdf0e10cSrcweir } 136cdf0e10cSrcweir 137cdf0e10cSrcweir //--------------------------------------------------------------------- operator =(const ComPtr<T_INTERFACE,P_IID,P_CLSID> & aCopy)138cdf0e10cSrcweir T_INTERFACE* operator=(const ComPtr< T_INTERFACE, P_IID, P_CLSID >& aCopy) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir m_pInterface = aCopy.m_pInterface; 141cdf0e10cSrcweir if (m_pInterface) 142cdf0e10cSrcweir m_pInterface->AddRef(); 143cdf0e10cSrcweir 144cdf0e10cSrcweir return m_pInterface; 145cdf0e10cSrcweir } 146cdf0e10cSrcweir 147cdf0e10cSrcweir //--------------------------------------------------------------------- get() const148cdf0e10cSrcweir T_INTERFACE* get() const 149cdf0e10cSrcweir { 150cdf0e10cSrcweir return m_pInterface; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir //--------------------------------------------------------------------- attach(T_INTERFACE * pInterface)154cdf0e10cSrcweir void attach(T_INTERFACE* pInterface) 155cdf0e10cSrcweir { 156cdf0e10cSrcweir if (pInterface) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir m_pInterface->Release(); 159cdf0e10cSrcweir m_pInterface = pInterface; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir //--------------------------------------------------------------------- detach()164cdf0e10cSrcweir T_INTERFACE* detach() 165cdf0e10cSrcweir { 166cdf0e10cSrcweir T_INTERFACE* pInterface = m_pInterface; 167cdf0e10cSrcweir m_pInterface = NULL; 168cdf0e10cSrcweir return pInterface; 169cdf0e10cSrcweir } 170cdf0e10cSrcweir 171cdf0e10cSrcweir //--------------------------------------------------------------------- release()172cdf0e10cSrcweir void release() 173cdf0e10cSrcweir { 174cdf0e10cSrcweir if (m_pInterface) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir m_pInterface->Release(); 177cdf0e10cSrcweir m_pInterface = NULL; 178cdf0e10cSrcweir } 179cdf0e10cSrcweir } 180cdf0e10cSrcweir 181cdf0e10cSrcweir //--------------------------------------------------------------------- 182cdf0e10cSrcweir template< class T_QUERYINTERFACE > query(T_QUERYINTERFACE ** pQuery)183cdf0e10cSrcweir HRESULT query(T_QUERYINTERFACE** pQuery) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir return m_pInterface->QueryInterface(__uuidof(T_QUERYINTERFACE), (void**)pQuery); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir 188cdf0e10cSrcweir //--------------------------------------------------------------------- query(REFIID rIID,void ** pQuery)189cdf0e10cSrcweir HRESULT query(REFIID rIID , 190cdf0e10cSrcweir void** pQuery) 191cdf0e10cSrcweir { 192cdf0e10cSrcweir return m_pInterface->QueryInterface(rIID, pQuery); 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir //--------------------------------------------------------------------- unknown(IUnknown ** pQuery)196cdf0e10cSrcweir HRESULT unknown(IUnknown** pQuery) 197cdf0e10cSrcweir { 198cdf0e10cSrcweir return m_pInterface->QueryInterface(IID_IUnknown, (void**)pQuery); 199cdf0e10cSrcweir } 200cdf0e10cSrcweir 201cdf0e10cSrcweir //--------------------------------------------------------------------- equals(IUnknown * pCheck)202cdf0e10cSrcweir ::sal_Bool equals(IUnknown* pCheck) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir if ( 205cdf0e10cSrcweir ( ! m_pInterface ) && 206cdf0e10cSrcweir ( ! pCheck ) 207cdf0e10cSrcweir ) 208cdf0e10cSrcweir return sal_True; 209cdf0e10cSrcweir 210cdf0e10cSrcweir IUnknown* pCurrent = NULL; 211cdf0e10cSrcweir m_pInterface->QueryInterface(IID_IUnknown, (void**)&pCurrent); 212cdf0e10cSrcweir 213cdf0e10cSrcweir ::sal_Bool bEquals = (pCheck == pCurrent); 214cdf0e10cSrcweir pCurrent->Release(); 215cdf0e10cSrcweir 216cdf0e10cSrcweir return bEquals; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir 219cdf0e10cSrcweir //--------------------------------------------------------------------- is()220cdf0e10cSrcweir ::sal_Bool is() 221cdf0e10cSrcweir { 222cdf0e10cSrcweir return (m_pInterface != 0); 223cdf0e10cSrcweir } 224cdf0e10cSrcweir 225cdf0e10cSrcweir private: 226cdf0e10cSrcweir T_INTERFACE* m_pInterface; 227cdf0e10cSrcweir }; 228cdf0e10cSrcweir 229cdf0e10cSrcweir #endif 230