/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_extensions.hxx"
#include "jscriptclasses.hxx"

//========================================================================
// JScriptValue
//========================================================================
JScriptValue::JScriptValue(): m_bOutParam(0), m_bInOutParam(0)
{
}

JScriptValue::~JScriptValue()
{
}


// JScriptValue, IDispatch --------------------------------------------
STDMETHODIMP JScriptValue::GetTypeInfoCount(UINT* /*pctinfo*/)
{
	return E_NOTIMPL;
}

// JScriptValue, IDispatch --------------------------------------------
STDMETHODIMP JScriptValue::GetTypeInfo( UINT /*iTInfo*/,
										   LCID /*lcid*/,
										   ITypeInfo** /*ppTInfo*/)
{
	return E_NOTIMPL;
}

// JScriptValue, IDispatch --------------------------------------------
STDMETHODIMP JScriptValue::GetIDsOfNames( REFIID /*riid*/,
											 LPOLESTR *rgszNames,
											 UINT /*cNames*/,
											 LCID /*lcid*/,
											 DISPID *rgDispId)
{
	if( !rgDispId)
		return E_POINTER;


	HRESULT ret= S_OK;
	CComBSTR name(*rgszNames);
	name.ToLower();

	if( name == CComBSTR( L"set") )
		*rgDispId= 1;
	else if( name == CComBSTR( L"get") )
		*rgDispId= 2;
	else if( name == CComBSTR( L"initoutparam") )
		*rgDispId= 3;
	else if( name == CComBSTR( L"initinoutparam") )
		*rgDispId= 4;
	else
		ret= DISP_E_UNKNOWNNAME;

	return ret;
}

// JScriptValue, IDispatch --------------------------------------------
STDMETHODIMP JScriptValue::Invoke( DISPID dispIdMember,
						 REFIID /*riid*/,
						 LCID /*lcid*/,
						 WORD wFlags,
						 DISPPARAMS *pDispParams,
						 VARIANT *pVarResult,
						 EXCEPINFO* /*pExcepInfo*/,
						 UINT* /*puArgErr*/)
{
	if( pDispParams->cNamedArgs)
		return DISP_E_NONAMEDARGS;


	HRESULT ret= S_OK;
	switch( dispIdMember)
	{
	case 0: // DISPID_VALUE
		if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
		{
			if( FAILED( VariantCopy( pVarResult, &m_varValue)))
				ret= E_FAIL;
		}
		else
			ret= E_POINTER;
		break;
	case 1:
		if( wFlags & DISPATCH_METHOD)
			ret= Set( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
		if( FAILED( ret))
			ret= DISP_E_EXCEPTION;
		break;
	case 2:
		if( wFlags & DISPATCH_METHOD)
			ret= Get( pVarResult);
		if( FAILED( ret))
			ret= DISP_E_EXCEPTION;
		break;
	case 3:
		if( wFlags & DISPATCH_METHOD)
			ret= InitOutParam();
		if( FAILED( ret))
			ret= DISP_E_EXCEPTION;
		break;
	case 4:
		if( wFlags & DISPATCH_METHOD)
			ret= InitInOutParam( pDispParams->rgvarg[1], pDispParams->rgvarg[0]);
		if( FAILED( ret))
			ret= DISP_E_EXCEPTION;
		break;
	default:
		ret= DISP_E_MEMBERNOTFOUND;
		break;
	}

	return ret;
}

// JScriptValue, IScriptOutParam-----------------------
STDMETHODIMP JScriptValue::Set( VARIANT type, VARIANT value)
{
	Lock();
	HRESULT hr= S_OK;
	m_varValue.Clear();
	hr= VariantCopyInd( &m_varValue, &value);
	VARIANT var;
	VariantInit( &var);
	if( SUCCEEDED( hr= VariantChangeType( &var, &type, 0, VT_BSTR)))
		m_bstrType= var.bstrVal;
	Unlock();
	return hr;
}
// JScriptValue, IScriptOutParam-----------------------
STDMETHODIMP JScriptValue::Get( VARIANT *val)
{
	Lock();
	if( !val)
		return E_POINTER;
	HRESULT hr= VariantCopy( val, &m_varValue);
	Unlock();
	return hr;
}

STDMETHODIMP JScriptValue::InitOutParam()
{
	Lock();
	m_varValue.Clear();
	m_bOutParam= true;
	m_bInOutParam= false;
	Unlock();
	return S_OK;
}

STDMETHODIMP JScriptValue::InitInOutParam( VARIANT type, VARIANT value)
{
	Lock();
	m_bInOutParam= true;
	m_bOutParam= false;
	Unlock();
	return Set( type, value);
}

STDMETHODIMP JScriptValue::IsOutParam( VARIANT_BOOL * flag)
{
	Lock();
	if( !flag)
		return E_POINTER;
	*flag= m_bOutParam ? VARIANT_TRUE : VARIANT_FALSE;
	Unlock();
	return S_OK;
}

STDMETHODIMP JScriptValue::IsInOutParam( VARIANT_BOOL * flag)
{
	Lock();
	if( !flag)
		return E_POINTER;
	*flag= m_bInOutParam ? VARIANT_TRUE : VARIANT_FALSE;
	Unlock();
	return S_OK;
}

STDMETHODIMP JScriptValue::GetValue( BSTR* type, VARIANT *value)
{
	Lock();
	if( !type || !value)
		return E_POINTER;
	HRESULT hr;
	if( SUCCEEDED(	hr= m_bstrType.CopyTo( type)))
		hr= VariantCopy( value, &m_varValue);
	Unlock();
	return hr;
}

//##########################################################################################
// JScriptOutValue
//##########################################################################################

JScriptOutParam::JScriptOutParam()
{
}

JScriptOutParam::~JScriptOutParam()
{
}


// JScriptOutParam, IDispatch --------------------------------------------
STDMETHODIMP JScriptOutParam::GetTypeInfoCount(UINT* /*pctinfo*/)
{
	return E_NOTIMPL;
}

// JScriptOutParam, IDispatch --------------------------------------------
STDMETHODIMP JScriptOutParam::GetTypeInfo( UINT /*iTInfo*/,
										   LCID /*lcid*/,
										   ITypeInfo** /*ppTInfo*/)
{
	return E_NOTIMPL;
}

// JScriptOutParam, IDispatch --------------------------------------------
STDMETHODIMP JScriptOutParam::GetIDsOfNames( REFIID /*riid*/,
											 LPOLESTR *rgszNames,
											 UINT /*cNames*/,
											 LCID /*lcid*/,
											 DISPID *rgDispId)
{
	if( !rgDispId)
		return E_POINTER;


	HRESULT ret= S_OK;
	CComBSTR name(*rgszNames);
	name.ToLower();

	if( name == CComBSTR( L"0") )
		*rgDispId= 1;
	else
		ret= DISP_E_UNKNOWNNAME;

	return ret;
}

// JScriptOutParam, IDispatch --------------------------------------------
STDMETHODIMP JScriptOutParam::Invoke( DISPID dispIdMember,
						 REFIID /*riid*/,
						 LCID /*lcid*/,
						 WORD wFlags,
						 DISPPARAMS *pDispParams,
						 VARIANT *pVarResult,
						 EXCEPINFO* /*pExcepInfo*/,
						 UINT* /*puArgErr*/)
{
	HRESULT ret= S_OK;
	switch( dispIdMember)
	{
	case 0: // DISPID_VALUE
		if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
		{
			if( FAILED( VariantCopy( pVarResult, &m_varValue)))
				ret= E_FAIL;
		}
		else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
		{
			m_varValue.Clear();
			if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
				ret= E_FAIL;
		}
		else
			ret= E_POINTER;
		break;
	case 1: //
		if( wFlags & DISPATCH_PROPERTYGET && pVarResult)
		{
			if( FAILED( VariantCopy( pVarResult, &m_varValue)))
				ret= E_FAIL;
		}
		else if( wFlags & DISPATCH_PROPERTYPUT || wFlags & DISPATCH_PROPERTYPUTREF)
		{
			m_varValue.Clear();
			if( FAILED( VariantCopyInd( &m_varValue, &pDispParams->rgvarg[0])))
				ret= E_FAIL;
		}
		else
			ret= E_POINTER;
		break;

	default:
		ret= DISP_E_MEMBERNOTFOUND;
		break;
	}

	return ret;
}
