1*2a97ec55SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*2a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*2a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*2a97ec55SAndrew Rist * distributed with this work for additional information 6*2a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*2a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*2a97ec55SAndrew Rist * "License"); you may not use this file except in compliance 9*2a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*2a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*2a97ec55SAndrew Rist * software distributed under the License is distributed on an 15*2a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*2a97ec55SAndrew Rist * KIND, either express or implied. See the License for the 17*2a97ec55SAndrew Rist * specific language governing permissions and limitations 18*2a97ec55SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*2a97ec55SAndrew Rist *************************************************************/ 21*2a97ec55SAndrew Rist 22*2a97ec55SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_extensions.hxx" 26cdf0e10cSrcweir #include "jscriptclasses.hxx" 27cdf0e10cSrcweir 28cdf0e10cSrcweir //======================================================================== 29cdf0e10cSrcweir // JScriptValue 30cdf0e10cSrcweir //======================================================================== 31cdf0e10cSrcweir JScriptValue::JScriptValue(): m_bOutParam(0), m_bInOutParam(0) 32cdf0e10cSrcweir { 33cdf0e10cSrcweir } 34cdf0e10cSrcweir 35cdf0e10cSrcweir JScriptValue::~JScriptValue() 36cdf0e10cSrcweir { 37cdf0e10cSrcweir } 38cdf0e10cSrcweir 39cdf0e10cSrcweir 40cdf0e10cSrcweir // JScriptValue, IDispatch -------------------------------------------- 41cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetTypeInfoCount(UINT* /*pctinfo*/) 42cdf0e10cSrcweir { 43cdf0e10cSrcweir return E_NOTIMPL; 44cdf0e10cSrcweir } 45cdf0e10cSrcweir 46cdf0e10cSrcweir // JScriptValue, IDispatch -------------------------------------------- 47cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetTypeInfo( UINT /*iTInfo*/, 48cdf0e10cSrcweir LCID /*lcid*/, 49cdf0e10cSrcweir ITypeInfo** /*ppTInfo*/) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir return E_NOTIMPL; 52cdf0e10cSrcweir } 53cdf0e10cSrcweir 54cdf0e10cSrcweir // JScriptValue, IDispatch -------------------------------------------- 55cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetIDsOfNames( REFIID /*riid*/, 56cdf0e10cSrcweir LPOLESTR *rgszNames, 57cdf0e10cSrcweir UINT /*cNames*/, 58cdf0e10cSrcweir LCID /*lcid*/, 59cdf0e10cSrcweir DISPID *rgDispId) 60cdf0e10cSrcweir { 61cdf0e10cSrcweir if( !rgDispId) 62cdf0e10cSrcweir return E_POINTER; 63cdf0e10cSrcweir 64cdf0e10cSrcweir 65cdf0e10cSrcweir HRESULT ret= S_OK; 66cdf0e10cSrcweir CComBSTR name(*rgszNames); 67cdf0e10cSrcweir name.ToLower(); 68cdf0e10cSrcweir 69cdf0e10cSrcweir if( name == CComBSTR( L"set") ) 70cdf0e10cSrcweir *rgDispId= 1; 71cdf0e10cSrcweir else if( name == CComBSTR( L"get") ) 72cdf0e10cSrcweir *rgDispId= 2; 73cdf0e10cSrcweir else if( name == CComBSTR( L"initoutparam") ) 74cdf0e10cSrcweir *rgDispId= 3; 75cdf0e10cSrcweir else if( name == CComBSTR( L"initinoutparam") ) 76cdf0e10cSrcweir *rgDispId= 4; 77cdf0e10cSrcweir else 78cdf0e10cSrcweir ret= DISP_E_UNKNOWNNAME; 79cdf0e10cSrcweir 80cdf0e10cSrcweir return ret; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir 83cdf0e10cSrcweir // JScriptValue, IDispatch -------------------------------------------- 84cdf0e10cSrcweir STDMETHODIMP JScriptValue::Invoke( DISPID dispIdMember, 85cdf0e10cSrcweir REFIID /*riid*/, 86cdf0e10cSrcweir LCID /*lcid*/, 87cdf0e10cSrcweir WORD wFlags, 88cdf0e10cSrcweir DISPPARAMS *pDispParams, 89cdf0e10cSrcweir VARIANT *pVarResult, 90cdf0e10cSrcweir EXCEPINFO* /*pExcepInfo*/, 91cdf0e10cSrcweir UINT* /*puArgErr*/) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir if( pDispParams->cNamedArgs) 94cdf0e10cSrcweir return DISP_E_NONAMEDARGS; 95cdf0e10cSrcweir 96cdf0e10cSrcweir 97cdf0e10cSrcweir HRESULT ret= S_OK; 98cdf0e10cSrcweir switch( dispIdMember) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir case 0: // DISPID_VALUE 101cdf0e10cSrcweir if( wFlags & DISPATCH_PROPERTYGET && pVarResult) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir if( FAILED( VariantCopy( pVarResult, &m_varValue))) 104cdf0e10cSrcweir ret= E_FAIL; 105cdf0e10cSrcweir } 106cdf0e10cSrcweir else 107cdf0e10cSrcweir ret= E_POINTER; 108cdf0e10cSrcweir break; 109cdf0e10cSrcweir case 1: 110cdf0e10cSrcweir if( wFlags & DISPATCH_METHOD) 111cdf0e10cSrcweir ret= Set( pDispParams->rgvarg[1], pDispParams->rgvarg[0]); 112cdf0e10cSrcweir if( FAILED( ret)) 113cdf0e10cSrcweir ret= DISP_E_EXCEPTION; 114cdf0e10cSrcweir break; 115cdf0e10cSrcweir case 2: 116cdf0e10cSrcweir if( wFlags & DISPATCH_METHOD) 117cdf0e10cSrcweir ret= Get( pVarResult); 118cdf0e10cSrcweir if( FAILED( ret)) 119cdf0e10cSrcweir ret= DISP_E_EXCEPTION; 120cdf0e10cSrcweir break; 121cdf0e10cSrcweir case 3: 122cdf0e10cSrcweir if( wFlags & DISPATCH_METHOD) 123cdf0e10cSrcweir ret= InitOutParam(); 124cdf0e10cSrcweir if( FAILED( ret)) 125cdf0e10cSrcweir ret= DISP_E_EXCEPTION; 126cdf0e10cSrcweir break; 127cdf0e10cSrcweir case 4: 128cdf0e10cSrcweir if( wFlags & DISPATCH_METHOD) 129cdf0e10cSrcweir ret= InitInOutParam( pDispParams->rgvarg[1], pDispParams->rgvarg[0]); 130cdf0e10cSrcweir if( FAILED( ret)) 131cdf0e10cSrcweir ret= DISP_E_EXCEPTION; 132cdf0e10cSrcweir break; 133cdf0e10cSrcweir default: 134cdf0e10cSrcweir ret= DISP_E_MEMBERNOTFOUND; 135cdf0e10cSrcweir break; 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir return ret; 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir // JScriptValue, IScriptOutParam----------------------- 142cdf0e10cSrcweir STDMETHODIMP JScriptValue::Set( VARIANT type, VARIANT value) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir Lock(); 145cdf0e10cSrcweir HRESULT hr= S_OK; 146cdf0e10cSrcweir m_varValue.Clear(); 147cdf0e10cSrcweir hr= VariantCopyInd( &m_varValue, &value); 148cdf0e10cSrcweir VARIANT var; 149cdf0e10cSrcweir VariantInit( &var); 150cdf0e10cSrcweir if( SUCCEEDED( hr= VariantChangeType( &var, &type, 0, VT_BSTR))) 151cdf0e10cSrcweir m_bstrType= var.bstrVal; 152cdf0e10cSrcweir Unlock(); 153cdf0e10cSrcweir return hr; 154cdf0e10cSrcweir } 155cdf0e10cSrcweir // JScriptValue, IScriptOutParam----------------------- 156cdf0e10cSrcweir STDMETHODIMP JScriptValue::Get( VARIANT *val) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir Lock(); 159cdf0e10cSrcweir if( !val) 160cdf0e10cSrcweir return E_POINTER; 161cdf0e10cSrcweir HRESULT hr= VariantCopy( val, &m_varValue); 162cdf0e10cSrcweir Unlock(); 163cdf0e10cSrcweir return hr; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir STDMETHODIMP JScriptValue::InitOutParam() 167cdf0e10cSrcweir { 168cdf0e10cSrcweir Lock(); 169cdf0e10cSrcweir m_varValue.Clear(); 170cdf0e10cSrcweir m_bOutParam= true; 171cdf0e10cSrcweir m_bInOutParam= false; 172cdf0e10cSrcweir Unlock(); 173cdf0e10cSrcweir return S_OK; 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir STDMETHODIMP JScriptValue::InitInOutParam( VARIANT type, VARIANT value) 177cdf0e10cSrcweir { 178cdf0e10cSrcweir Lock(); 179cdf0e10cSrcweir m_bInOutParam= true; 180cdf0e10cSrcweir m_bOutParam= false; 181cdf0e10cSrcweir Unlock(); 182cdf0e10cSrcweir return Set( type, value); 183cdf0e10cSrcweir } 184cdf0e10cSrcweir 185cdf0e10cSrcweir STDMETHODIMP JScriptValue::IsOutParam( VARIANT_BOOL * flag) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir Lock(); 188cdf0e10cSrcweir if( !flag) 189cdf0e10cSrcweir return E_POINTER; 190cdf0e10cSrcweir *flag= m_bOutParam ? VARIANT_TRUE : VARIANT_FALSE; 191cdf0e10cSrcweir Unlock(); 192cdf0e10cSrcweir return S_OK; 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir STDMETHODIMP JScriptValue::IsInOutParam( VARIANT_BOOL * flag) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir Lock(); 198cdf0e10cSrcweir if( !flag) 199cdf0e10cSrcweir return E_POINTER; 200cdf0e10cSrcweir *flag= m_bInOutParam ? VARIANT_TRUE : VARIANT_FALSE; 201cdf0e10cSrcweir Unlock(); 202cdf0e10cSrcweir return S_OK; 203cdf0e10cSrcweir } 204cdf0e10cSrcweir 205cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetValue( BSTR* type, VARIANT *value) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir Lock(); 208cdf0e10cSrcweir if( !type || !value) 209cdf0e10cSrcweir return E_POINTER; 210cdf0e10cSrcweir HRESULT hr; 211cdf0e10cSrcweir if( SUCCEEDED( hr= m_bstrType.CopyTo( type))) 212cdf0e10cSrcweir hr= VariantCopy( value, &m_varValue); 213cdf0e10cSrcweir Unlock(); 214cdf0e10cSrcweir return hr; 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir //########################################################################################## 218cdf0e10cSrcweir // JScriptOutValue 219cdf0e10cSrcweir //########################################################################################## 220cdf0e10cSrcweir 221cdf0e10cSrcweir JScriptOutParam::JScriptOutParam() 222cdf0e10cSrcweir { 223cdf0e10cSrcweir } 224cdf0e10cSrcweir 225cdf0e10cSrcweir JScriptOutParam::~JScriptOutParam() 226cdf0e10cSrcweir { 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir 230cdf0e10cSrcweir // JScriptOutParam, IDispatch -------------------------------------------- 231cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::GetTypeInfoCount(UINT* /*pctinfo*/) 232cdf0e10cSrcweir { 233cdf0e10cSrcweir return E_NOTIMPL; 234cdf0e10cSrcweir } 235cdf0e10cSrcweir 236cdf0e10cSrcweir // JScriptOutParam, IDispatch -------------------------------------------- 237cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::GetTypeInfo( UINT /*iTInfo*/, 238cdf0e10cSrcweir LCID /*lcid*/, 239cdf0e10cSrcweir ITypeInfo** /*ppTInfo*/) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir return E_NOTIMPL; 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir // JScriptOutParam, IDispatch -------------------------------------------- 245cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::GetIDsOfNames( REFIID /*riid*/, 246cdf0e10cSrcweir LPOLESTR *rgszNames, 247cdf0e10cSrcweir UINT /*cNames*/, 248cdf0e10cSrcweir LCID /*lcid*/, 249cdf0e10cSrcweir DISPID *rgDispId) 250cdf0e10cSrcweir { 251cdf0e10cSrcweir if( !rgDispId) 252cdf0e10cSrcweir return E_POINTER; 253cdf0e10cSrcweir 254cdf0e10cSrcweir 255cdf0e10cSrcweir HRESULT ret= S_OK; 256cdf0e10cSrcweir CComBSTR name(*rgszNames); 257cdf0e10cSrcweir name.ToLower(); 258cdf0e10cSrcweir 259cdf0e10cSrcweir if( name == CComBSTR( L"0") ) 260cdf0e10cSrcweir *rgDispId= 1; 261cdf0e10cSrcweir else 262cdf0e10cSrcweir ret= DISP_E_UNKNOWNNAME; 263cdf0e10cSrcweir 264cdf0e10cSrcweir return ret; 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir // JScriptOutParam, IDispatch -------------------------------------------- 268cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::Invoke( DISPID dispIdMember, 269cdf0e10cSrcweir REFIID /*riid*/, 270cdf0e10cSrcweir LCID /*lcid*/, 271cdf0e10cSrcweir WORD wFlags, 272cdf0e10cSrcweir DISPPARAMS *pDispParams, 273cdf0e10cSrcweir VARIANT *pVarResult, 274cdf0e10cSrcweir EXCEPINFO* /*pExcepInfo*/, 275cdf0e10cSrcweir UINT* /*puArgErr*/) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir HRESULT ret= S_OK; 278cdf0e10cSrcweir switch( dispIdMember) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir case 0: // DISPID_VALUE 281cdf0e10cSrcweir if( wFlags & DISPATCH_PROPERTYGET && pVarResult) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir if( FAILED( VariantCopy( pVarResult, &m_varValue))) 284cdf0e10cSrcweir ret= E_FAIL; 285cdf0e10cSrcweir } 286cdf0e10cSrcweir else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir m_varValue.Clear(); 289cdf0e10cSrcweir if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0]))) 290cdf0e10cSrcweir ret= E_FAIL; 291cdf0e10cSrcweir } 292cdf0e10cSrcweir else 293cdf0e10cSrcweir ret= E_POINTER; 294cdf0e10cSrcweir break; 295cdf0e10cSrcweir case 1: // 296cdf0e10cSrcweir if( wFlags & DISPATCH_PROPERTYGET && pVarResult) 297cdf0e10cSrcweir { 298cdf0e10cSrcweir if( FAILED( VariantCopy( pVarResult, &m_varValue))) 299cdf0e10cSrcweir ret= E_FAIL; 300cdf0e10cSrcweir } 301cdf0e10cSrcweir else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF) 302cdf0e10cSrcweir { 303cdf0e10cSrcweir m_varValue.Clear(); 304cdf0e10cSrcweir if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0]))) 305cdf0e10cSrcweir ret= E_FAIL; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir else 308cdf0e10cSrcweir ret= E_POINTER; 309cdf0e10cSrcweir break; 310cdf0e10cSrcweir 311cdf0e10cSrcweir default: 312cdf0e10cSrcweir ret= DISP_E_MEMBERNOTFOUND; 313cdf0e10cSrcweir break; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir return ret; 317cdf0e10cSrcweir } 318