/******************************************************************************

Copyright (c) 2000 Microsoft Corporation

Module Name:
    impl.cpp

Abstract:
    This file contains the implementation of the CPCHLaunch class.

Revision History:
    Davide Massarenti   (Dmassare)  04/15/2000
        created

******************************************************************************/

#include "StdAfx.h"

////////////////////////////////////////////////////////////////////////////////

HelpHostProxy::Main::Main()
{
    // CComPtr<IPCHHelpHost>            m_real;
    //
    // CComPtr<Window>                  m_subWindow;
    // CComPtr<Panes>                   m_subPanes;
    //
    // CComQIPtr<IPCHHelpHostEvents>    m_Events;
    // CComQIPtr<IPCHHelpHostNavEvents> m_EventsNav;
}


HelpHostProxy::Main::~Main()
{
    Passivate();
}

HRESULT HelpHostProxy::Main::FinalConstruct()
{
    return Initialize();
}

void HelpHostProxy::Main::FinalRelease()
{
    Passivate();
}

////////////////////

HRESULT HelpHostProxy::Main::Initialize()
{
    __HCP_FUNC_ENTRY( "HelpHostProxy::Main::Initialize" );

    HRESULT hr;


    __MPC_EXIT_IF_METHOD_FAILS(hr, HCAPI::OpenConnection( m_real ));

    __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_subWindow )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_subWindow->Initialize( this ));
    __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &m_subPanes  )); __MPC_EXIT_IF_METHOD_FAILS(hr, m_subPanes ->Initialize( this ));

    hr = S_OK;


    __HCP_FUNC_CLEANUP;

    __HCP_FUNC_EXIT(hr);
}

void HelpHostProxy::Main::Passivate()
{
    if(m_subPanes ) { m_subPanes ->Passivate(); m_subPanes .Release(); }
    if(m_subWindow) { m_subWindow->Passivate(); m_subWindow.Release(); }

    m_Events   .Release();
    m_EventsNav.Release();

    m_real     .Release();
}

////////////////////

STDMETHODIMP HelpHostProxy::Main::put_FilterName( /*[in] */ BSTR Value )
{
    return m_real ? m_real->put_FilterName( Value ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_FilterName( /*[out, retval]*/ BSTR *pValue )
{
    if(pValue) *pValue = NULL;

    return m_real ? m_real->get_FilterName( pValue ) : E_FAIL;
}


STDMETHODIMP HelpHostProxy::Main::get_Namespace( /*[out, retval]*/ BSTR *pValue )
{
    if(pValue) *pValue = NULL;

    return m_real ? m_real->get_Namespace( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_Session( /*[out, retval]*/ IDispatch* *pValue )
{
    if(pValue) *pValue = NULL;

    return m_real ? m_real->get_Session( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_FilterExpression( /*[out, retval]*/ BSTR *pValue )
{
    if(pValue) *pValue = NULL;

    return m_real ? m_real->get_FilterExpression( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_CurrentUrl( /*[out, retval]*/ BSTR *pValue )
{
    if(pValue) *pValue = NULL;

    return m_real ? m_real->get_CurrentUrl( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_Panes( /*[out, retval]*/ IHelpHostPanes* *pValue )
{
    if(pValue) *pValue = NULL;

    return m_subPanes ? m_subPanes.QueryInterface( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::get_HelpHostWindow( /*[out, retval]*/ IHelpHostWindow* *pValue )
{
    if(pValue) *pValue = NULL;

    return m_subWindow ? m_subWindow.QueryInterface( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::OpenNamespace( /*[in]*/ BSTR newNamespace, /*[in]*/ BSTR filterName )
{
    return m_real ? m_real->OpenNamespace( newNamespace, filterName ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::DisplayTopicFromURL( /*[in]*/ BSTR url, /*[in]*/ VARIANT options )
{
    return m_real ? m_real->DisplayTopicFromURL( url, options ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::DisplayResultsFromQuery( /*[in]*/ BSTR query, /*[in]*/ BSTR navMoniker, /*[in]*/ VARIANT options )
{
    return m_real ? m_real->DisplayResultsFromQuery( query, navMoniker, options ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::ShowPane( /*[in]*/ BSTR paneName, /*[in]*/ BSTR query, /*[in]*/ BSTR navMoniker, /*[in]*/ VARIANT options )
{
    return m_real ? m_real->ShowPane( paneName, query, navMoniker, options ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Main::Terminate()
{
    return m_real ? m_real->Terminate() : E_FAIL;
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

HelpHostProxy::Window::Window()
{
                           // CComPtr<IPCHHelpHostWindow> m_real;
                           //
    m_Main         = NULL; // Main*                       m_Main;
    m_ParentWindow = 0;    // long                        m_ParentWindow;
}

HelpHostProxy::Window::~Window()
{
    Passivate();
}

HRESULT HelpHostProxy::Window::Initialize( /*[in]*/ Main* main )
{
    m_Main = main;

    return S_OK;
}

void HelpHostProxy::Window::Passivate()
{
	m_real.Release();

    m_Main         = NULL;
    m_ParentWindow = 0;
}

////////////////////

STDMETHODIMP HelpHostProxy::Window::put_ParentWindow( /*[in]*/ long hWND )
{
    m_ParentWindow = hWND;

    return m_real ? m_real->put_ParentWindow( hWND ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_ParentWindow( /*[out, retval]*/ long *phWND )
{
    if(phWND == NULL) return E_POINTER;

    *phWND = m_ParentWindow;

    return S_OK;
}


STDMETHODIMP HelpHostProxy::Window::put_UILanguage( /*[in]*/ long LCID )
{
    return m_real ? m_real->put_UILanguage( LCID ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_UILanguage( /*[out, retval]*/ long *pLCID )
{
	if(pLCID) *pLCID = 0;

    return m_real ? m_real->get_UILanguage( pLCID ) : E_FAIL;
}


STDMETHODIMP HelpHostProxy::Window::put_Visible( /*[in]*/ VARIANT_BOOL Value )
{
    return m_real ? m_real->put_Visible( Value ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_Visible( /*[out, retval]*/ VARIANT_BOOL *pValue )
{
    if(pValue) *pValue = VARIANT_FALSE;

    return m_real ? m_real->get_Visible( pValue ) : E_FAIL;
}


STDMETHODIMP HelpHostProxy::Window::get_OriginX( /*[out, retval]*/ long *pValue )
{
    if(pValue) *pValue = 0;

    return m_real ? m_real->get_OriginX( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_OriginY( /*[out, retval]*/ long *pValue )
{
    if(pValue) *pValue = 0;

    return m_real ? m_real->get_OriginY( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_Width( /*[out, retval]*/ long *pValue )
{
    if(pValue) *pValue = 0;

    return m_real ? m_real->get_Width( pValue ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::get_Height( /*[out, retval]*/ long *pValue )
{
    if(pValue) *pValue = 0;

    return m_real ? m_real->get_Height( pValue ) : E_FAIL;
}


STDMETHODIMP HelpHostProxy::Window::MoveWindow( /*[in]*/ long originX, /*[in]*/ long originY, /*[in]*/ long width, /*[in]*/ long height )
{
    return m_real ? m_real->MoveWindow( originX, originY, width, height ) : E_FAIL;
}

STDMETHODIMP HelpHostProxy::Window::WaitForTermination( /*[in]*/ long timeOut )
{
	return E_NOTIMPL;
}

////////////////////////////////////////////////////////////////////////////////

HelpHostProxy::Panes::Panes()
{
    m_Main = NULL; // Main* m_Main;
                     // List  m_Panes;
}

HelpHostProxy::Panes::~Panes()
{
    Passivate();
}

HRESULT HelpHostProxy::Panes::Initialize( /*[in]*/ Main* main )
{
    __HCP_FUNC_ENTRY( "HelpHostProxy::Panes::Initialize" );

    HRESULT hr;
    int     i;


    m_Main = main;

//	  for(i=0; i<ARRAYSIZE(c_Panes); i++)
//	  {
//		  Pane* pVal;
//
//		  __MPC_EXIT_IF_METHOD_FAILS(hr, c_Panes[i].pfn( pVal ) ); m_Panes.push_back( pVal );
//
//		  pVal->m_bstrName = c_Panes[i].szName;
//
//		  __MPC_EXIT_IF_METHOD_FAILS(hr, pVal->Initialize( m_Main ));
//
//		  __MPC_EXIT_IF_METHOD_FAILS(hr, AddItem( pVal ));
//	  }

    hr = S_OK;


	//    __HCP_FUNC_CLEANUP;

    __HCP_FUNC_EXIT(hr);
}

void HelpHostProxy::Panes::Passivate()
{
    MPC::ReleaseAll( m_Panes );
}

HRESULT HelpHostProxy::Panes::GetPane( /*[in]*/ LPCWSTR szName, /*[out]*/ Pane* *pVal )
{
    __HCP_FUNC_ENTRY( "HelpHostProxy::Panes::GetPane" );

    HRESULT hr;
    Iter    it;

    __MPC_PARAMCHECK_BEGIN(hr)
        __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
    __MPC_PARAMCHECK_END();

    for(it=m_Panes.begin(); it!=m_Panes.end(); it++)
    {
        Pane* pane = *it;

        if(!MPC::StrICmp( szName, pane->m_bstrName ))
        {
            *pVal = pane; pane->AddRef();
            break;
        }
    }

    hr = S_OK;


    __HCP_FUNC_CLEANUP;

    __HCP_FUNC_EXIT(hr);
}

////////////////////

STDMETHODIMP HelpHostProxy::Panes::get_Item( /*[in]*/ VARIANT Index, /*[out]*/ VARIANT* pvar )
{
    __HCP_FUNC_ENTRY( "HelpHostProxy::Panes::get_Item" );

    HRESULT hr;

    __MPC_PARAMCHECK_BEGIN(hr)
        __MPC_PARAMCHECK_NOTNULL(pvar);
    __MPC_PARAMCHECK_END();

    if(Index.vt == VT_BSTR)
    {
        CComPtr<Pane> pane;
        CComVariant   v;

        __MPC_EXIT_IF_METHOD_FAILS(hr, GetPane( Index.bstrVal, &pane ));

        v = pane;

        __MPC_EXIT_IF_METHOD_FAILS(hr, v.Detach( pvar ));
    }
    else if(Index.vt == VT_I4)
    {
        __MPC_EXIT_IF_METHOD_FAILS(hr, super::get_Item( Index.iVal, pvar ));
    }
    else
    {
        __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG);
    }

    hr = S_OK;


    __HCP_FUNC_CLEANUP;

    __HCP_FUNC_EXIT(hr);
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

HelpHostProxy::Pane::Pane()
{
    m_Main   = NULL;          // Main*         m_Main;
                                //
                                // CComBSTR      m_bstrName;
                                // CComBSTR      m_bstrMoniker;
    m_fVisible = VARIANT_FALSE; // VARIANT_BOOL  m_fVisible;
}

HelpHostProxy::Pane::~Pane()
{
    Passivate();
}

HRESULT HelpHostProxy::Pane::Initialize( /*[in]*/ Main* main )
{
    m_Main = main;

    return S_OK;
}

void HelpHostProxy::Pane::Passivate()
{
}

////////////////////

STDMETHODIMP HelpHostProxy::Pane::put_Visible( /*[in]*/ VARIANT_BOOL Value )
{
    return S_FALSE;
}

STDMETHODIMP HelpHostProxy::Pane::get_Visible( /*[out, retval]*/ VARIANT_BOOL *pValue )
{
    if(pValue == NULL) return E_POINTER;

    *pValue = m_fVisible;

    return S_OK;
}


STDMETHODIMP HelpHostProxy::Pane::put_NavMoniker( /*[in]*/ BSTR Value )
{
    m_bstrMoniker = Value;

    return S_OK;
}

STDMETHODIMP HelpHostProxy::Pane::get_NavMoniker( /*[out, retval]*/ BSTR *pValue )
{
    return MPC::GetBSTR( m_bstrMoniker, pValue );
}


STDMETHODIMP HelpHostProxy::Pane::get_Name( /*[out, retval]*/ BSTR *pValue )
{
    return MPC::GetBSTR( m_bstrName, pValue );
}

STDMETHODIMP HelpHostProxy::Pane::get_CurrentUrl( /*[out, retval]*/ BSTR *pValue )
{
    return MPC::GetBSTR( NULL, pValue );
}

STDMETHODIMP HelpHostProxy::Pane::get_WebBrowser( /*[out, retval]*/ IDispatch* *pValue )
{
    if(pValue == NULL) return E_POINTER;

    *pValue = NULL;

    return S_OK;
}


STDMETHODIMP HelpHostProxy::Pane::DisplayTopicFromURL( /*[in]*/ BSTR url, /*[in]*/ VARIANT options )
{
    return S_FALSE;
}

STDMETHODIMP HelpHostProxy::Pane::DisplayResultsFromQuery( /*[in]*/ BSTR query, /*[in]*/ VARIANT options )
{
    return S_FALSE;
}

STDMETHODIMP HelpHostProxy::Pane::Sync( /*[in]*/ BSTR url, /*[in]*/ VARIANT options )
{
    return S_FALSE;
}