1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_extensions.hxx" 30 #include "unotypewrapper.hxx" 31 #include "rtl/ustring.hxx" 32 33 34 bool createUnoTypeWrapper(BSTR sTypeName, VARIANT * pVar) 35 { 36 bool ret = false; 37 OSL_ASSERT(sTypeName && pVar); 38 CComObject< UnoTypeWrapper>* pObj; 39 VariantClear(pVar); 40 if( SUCCEEDED( CComObject<UnoTypeWrapper>::CreateInstance( &pObj))) 41 { 42 pObj->AddRef(); 43 pVar->vt= VT_DISPATCH; 44 #ifdef __MINGW32__ 45 pVar->pdispVal= CComQIPtr<IDispatch, &__uuidof(IDispatch)>(pObj->GetUnknown()); 46 #else 47 pVar->pdispVal= CComQIPtr<IDispatch>(pObj->GetUnknown()); 48 #endif 49 //now set the value, e.i. the name of the type 50 #ifdef __MINGW32__ 51 CComQIPtr<IUnoTypeWrapper, &__uuidof(IUnoTypeWrapper)> spType(pVar->pdispVal); 52 #else 53 CComQIPtr<IUnoTypeWrapper> spType(pVar->pdispVal); 54 #endif 55 OSL_ASSERT(spType); 56 if (SUCCEEDED(spType->put_Name(sTypeName))) 57 { 58 ret = true; 59 } 60 } 61 return ret; 62 } 63 64 65 bool createUnoTypeWrapper(const rtl::OUString& sTypeName, VARIANT * pVar) 66 { 67 CComBSTR bstr(reinterpret_cast<LPCOLESTR>(sTypeName.getStr())); 68 return createUnoTypeWrapper(bstr, pVar); 69 } 70 71 UnoTypeWrapper::UnoTypeWrapper() 72 { 73 } 74 75 UnoTypeWrapper::~UnoTypeWrapper() 76 { 77 } 78 79 80 // UnoTypeWrapper, IDispatch -------------------------------------------- 81 STDMETHODIMP UnoTypeWrapper::GetTypeInfoCount(UINT* /*pctinfo*/) 82 { 83 return E_NOTIMPL; 84 } 85 86 // UnoTypeWrapper, IDispatch -------------------------------------------- 87 STDMETHODIMP UnoTypeWrapper::GetTypeInfo( UINT /*iTInfo*/, 88 LCID /*lcid*/, 89 ITypeInfo** /*ppTInfo*/) 90 { 91 return E_NOTIMPL; 92 } 93 94 // UnoTypeWrapper, IDispatch -------------------------------------------- 95 STDMETHODIMP UnoTypeWrapper::GetIDsOfNames( REFIID /*riid*/, 96 LPOLESTR *rgszNames, 97 UINT /*cNames*/, 98 LCID /*lcid*/, 99 DISPID *rgDispId) 100 { 101 if( !rgDispId) 102 return E_POINTER; 103 104 HRESULT ret= S_OK; 105 CComBSTR name(*rgszNames); 106 name.ToLower(); 107 108 if( name == CComBSTR( L"name") ) 109 *rgDispId= DISPID_VALUE; 110 else 111 ret= DISP_E_UNKNOWNNAME; 112 113 return ret; 114 } 115 116 // UnoTypeWrapper, IDispatch -------------------------------------------- 117 STDMETHODIMP UnoTypeWrapper::Invoke( DISPID dispIdMember, 118 REFIID /*riid*/, 119 LCID /*lcid*/, 120 WORD wFlags, 121 DISPPARAMS *pDispParams, 122 VARIANT *pVarResult, 123 EXCEPINFO* /*pExcepInfo*/, 124 UINT* /*puArgErr*/) 125 { 126 if (pDispParams == NULL) 127 return DISP_E_EXCEPTION; 128 129 if( pDispParams->cNamedArgs) 130 return DISP_E_NONAMEDARGS; 131 132 133 HRESULT ret= S_OK; 134 switch( dispIdMember) 135 { 136 case DISPID_VALUE: // DISPID_VALUE 137 if (wFlags & DISPATCH_PROPERTYGET) 138 { 139 if (pVarResult == NULL) 140 { 141 ret = E_POINTER; 142 break; 143 } 144 get_Name( & pVarResult->bstrVal); 145 pVarResult->vt = VT_BSTR; 146 } 147 break; 148 default: 149 ret= DISP_E_MEMBERNOTFOUND; 150 break; 151 } 152 153 return ret; 154 } 155 156 // IUnoTypeWrapper----------------------- 157 STDMETHODIMP UnoTypeWrapper::put_Name(BSTR val) 158 { 159 Lock(); 160 HRESULT hr = S_OK; 161 m_sName = val; 162 Unlock(); 163 return hr; 164 } 165 166 // (UnoTypeWrapper----------------------- 167 STDMETHODIMP UnoTypeWrapper::get_Name(BSTR *pVal) 168 { 169 Lock(); 170 HRESULT hr = S_OK; 171 if( !pVal) 172 return E_POINTER; 173 *pVal = m_sName.Copy(); 174 Unlock(); 175 return hr; 176 } 177 178 179 180