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
10*2a97ec55SAndrew Rist *
11*2a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*2a97ec55SAndrew Rist *
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.
19*2a97ec55SAndrew Rist *
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 //========================================================================
JScriptValue()31cdf0e10cSrcweir JScriptValue::JScriptValue(): m_bOutParam(0), m_bInOutParam(0)
32cdf0e10cSrcweir {
33cdf0e10cSrcweir }
34cdf0e10cSrcweir
~JScriptValue()35cdf0e10cSrcweir JScriptValue::~JScriptValue()
36cdf0e10cSrcweir {
37cdf0e10cSrcweir }
38cdf0e10cSrcweir
39cdf0e10cSrcweir
40cdf0e10cSrcweir // JScriptValue, IDispatch --------------------------------------------
GetTypeInfoCount(UINT *)41cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetTypeInfoCount(UINT* /*pctinfo*/)
42cdf0e10cSrcweir {
43cdf0e10cSrcweir return E_NOTIMPL;
44cdf0e10cSrcweir }
45cdf0e10cSrcweir
46cdf0e10cSrcweir // JScriptValue, IDispatch --------------------------------------------
GetTypeInfo(UINT,LCID,ITypeInfo **)47cdf0e10cSrcweir STDMETHODIMP JScriptValue::GetTypeInfo( UINT /*iTInfo*/,
48cdf0e10cSrcweir LCID /*lcid*/,
49cdf0e10cSrcweir ITypeInfo** /*ppTInfo*/)
50cdf0e10cSrcweir {
51cdf0e10cSrcweir return E_NOTIMPL;
52cdf0e10cSrcweir }
53cdf0e10cSrcweir
54cdf0e10cSrcweir // JScriptValue, IDispatch --------------------------------------------
GetIDsOfNames(REFIID,LPOLESTR * rgszNames,UINT,LCID,DISPID * rgDispId)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 --------------------------------------------
Invoke(DISPID dispIdMember,REFIID,LCID,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO *,UINT *)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-----------------------
Set(VARIANT type,VARIANT value)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-----------------------
Get(VARIANT * val)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
InitOutParam()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
InitInOutParam(VARIANT type,VARIANT value)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
IsOutParam(VARIANT_BOOL * flag)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
IsInOutParam(VARIANT_BOOL * flag)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
GetValue(BSTR * type,VARIANT * value)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
JScriptOutParam()221cdf0e10cSrcweir JScriptOutParam::JScriptOutParam()
222cdf0e10cSrcweir {
223cdf0e10cSrcweir }
224cdf0e10cSrcweir
~JScriptOutParam()225cdf0e10cSrcweir JScriptOutParam::~JScriptOutParam()
226cdf0e10cSrcweir {
227cdf0e10cSrcweir }
228cdf0e10cSrcweir
229cdf0e10cSrcweir
230cdf0e10cSrcweir // JScriptOutParam, IDispatch --------------------------------------------
GetTypeInfoCount(UINT *)231cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::GetTypeInfoCount(UINT* /*pctinfo*/)
232cdf0e10cSrcweir {
233cdf0e10cSrcweir return E_NOTIMPL;
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
236cdf0e10cSrcweir // JScriptOutParam, IDispatch --------------------------------------------
GetTypeInfo(UINT,LCID,ITypeInfo **)237cdf0e10cSrcweir STDMETHODIMP JScriptOutParam::GetTypeInfo( UINT /*iTInfo*/,
238cdf0e10cSrcweir LCID /*lcid*/,
239cdf0e10cSrcweir ITypeInfo** /*ppTInfo*/)
240cdf0e10cSrcweir {
241cdf0e10cSrcweir return E_NOTIMPL;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir
244cdf0e10cSrcweir // JScriptOutParam, IDispatch --------------------------------------------
GetIDsOfNames(REFIID,LPOLESTR * rgszNames,UINT,LCID,DISPID * rgDispId)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 --------------------------------------------
Invoke(DISPID dispIdMember,REFIID,LCID,WORD wFlags,DISPPARAMS * pDispParams,VARIANT * pVarResult,EXCEPINFO *,UINT *)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