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