/**************************************************************************
   THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   PARTICULAR PURPOSE.

   Copyright 1998 Microsoft Corporation.  All Rights Reserved.
**************************************************************************/

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

   File:          evntsink.cpp

   Description:   This file contains the implementation of the event sink.

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

/**************************************************************************
   #include statements
**************************************************************************/

#include "main.h"
#include <windows.h>
#include "evntsink.h"

/**************************************************************************
   function prototypes
**************************************************************************/

/**************************************************************************
   global variables and definitions
**************************************************************************/

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

   CEventSink::CEventSink()

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

CEventSink::CEventSink()
{
    m_cRefs     = 1;
}

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

   CEventSink::QueryInterface()

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

STDMETHODIMP CEventSink::QueryInterface(REFIID riid, PVOID *ppvObject)
{
    if (!ppvObject)
        return E_POINTER;

    if (IsEqualIID(riid, IID_IDispatch))
        *ppvObject = (IDispatch *)this;
    else if (IsEqualIID(riid, IID_IUnknown))
        *ppvObject = this;
    else
    {
        *ppvObject = NULL;
        return E_NOINTERFACE;
    }

    AddRef();
    return S_OK;
}

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

   CEventSink::AddRef()

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

ULONG CEventSink::AddRef(void)
{
    return ++m_cRefs;
}

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

   CEventSink::Release()

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

ULONG CEventSink::Release(void)
{
    if (--m_cRefs)
        return m_cRefs;

    delete this;
    return 0;
}

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

   CEventSink::GetIDsOfNames()

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

HRESULT CEventSink::GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgdispid)
{
    *rgdispid = DISPID_UNKNOWN;
    return DISP_E_UNKNOWNNAME;
}

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

   CEventSink::GetTypeInfo()

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

HRESULT CEventSink::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo FAR* FAR* pptinfo)
{
    return E_NOTIMPL;
}

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

   CEventSink::GetTypeInfoCount()

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

HRESULT CEventSink::GetTypeInfoCount(unsigned int FAR * pctinfo)
{
    return E_NOTIMPL;
}

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

   CEventSink::Invoke()

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

void main_setStatusText(LPCWSTR txt)
{
  char dest[512];
  dest[0]=0;
  WideCharToMultiByte(CP_ACP,0,txt,-1,dest,sizeof(dest),NULL,NULL);
  //SetDlgItemText(m_hwnd,IDC_STATUS,dest);
}

void main_beforeNavigate(LPCWSTR txt)
{
  VARIANT *blah=(VARIANT *)txt;
  char dest[512];
  dest[0]=0;
  WideCharToMultiByte(CP_ACP,0,blah->bstrVal,-1,dest,sizeof(dest),NULL,NULL);
  //SetDlgItemText(m_hwnd,IDC_QUICKSEARCH,dest);
}

HRESULT CEventSink::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR *pdispparams, VARIANT FAR *pvarResult, EXCEPINFO FAR * pexecinfo, unsigned int FAR *puArgErr)
{
    switch (dispid)
    {
        // void StatusTextChange([in] BSTR Text);
        case 0x66:
            main_setStatusText(pdispparams->rgvarg[0].bstrVal);
            //m_pApp->eventStatusTextChange(pdispparams->rgvarg[0].bstrVal);
            break;

        // void ProgressChange([in] long Progress, [in] long ProgressMax);
        case 0x6c:
            break;

        // void CommandStateChange([in] long Command, [in] VARIANT_BOOL Enable);
        case 0x69:
            //m_pApp->eventCommandStateChange(pdispparams->rgvarg[1].lVal, pdispparams->rgvarg[0].boolVal);
            break;

        // void DownloadBegin();
        case 0x6a:
            //m_pApp->eventDownloadBegin();
            break;

        // void DownloadComplete();
        case 0x68:
            //m_pApp->eventDownloadComplete();
            break;
            
        // void TitleChange([in] BSTR Text);
        case 0x071:            
            //m_pApp->eventTitleChange(pdispparams->rgvarg[0].bstrVal);
            break;

        // void PropertyChange([in] BSTR szProperty);
        case 0x70:
            //m_pApp->eventPropertyChange(pdispparams->rgvarg[0].bstrVal);
            break;

        // void BeforeNavigate2([in] IDispatch* pDisp, [in] VARIANT* URL, [in] VARIANT* Flags, [in] VARIANT* TargetFrameName, [in] VARIANT* PostData, [in] VARIANT* Headers, [in, out] VARIANT_BOOL* Cancel);
        case 0xfa:
          main_beforeNavigate(pdispparams->rgvarg[5].bstrVal);
            break;

        // void NewWindow2([in, out] IDispatch** ppDisp, [in, out] VARIANT_BOOL* Cancel);
        case 0xfb:
            break;
        
        // void NavigateComplete2([in] IDispatch* pDisp, [in] VARIANT* URL);
        case 0xfc:
            break;

        // void DocumentComplete([in] IDispatch* pDisp, [in] VARIANT* URL);
        case 0x0103:
            break;

        // void OnQuit();
        case 0xfd:
            break;

        // void OnVisible([in] VARIANT_BOOL Visible);
        case 0xfe:
            break;

        // void OnToolBar([in] VARIANT_BOOL ToolBar);
        case 0xff:
            break;

        // void OnMenuBar([in] VARIANT_BOOL MenuBar);
        case 0x0100:
            break;

        // void OnStatusBar([in] VARIANT_BOOL StatusBar);
        case 0x0101:
            break;
            
        // void OnFullScreen([in] VARIANT_BOOL FullScreen);
        case 0x0102:
            break;
            
        // void OnTheaterMode([in] VARIANT_BOOL TheaterMode);
        case 0x0104:
            break;
    }

    return S_OK;
}