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