//*********************************************************************
//*                  Microsoft Windows                               **
//*            Copyright(c) Microsoft Corp., 1999                    **
//*********************************************************************
//
//  SIGNUP.CPP - Header for the implementation of CSignup
//
//  HISTORY:
//
//  1/27/99 a-jaswed Created.
//

#include "signup.h"
#include "appdefs.h"
#include "dispids.h"
#include "msobmain.h"
#include "resource.h"

DISPATCHLIST SignupExternalInterface[] =
{
    {L"get_Locale",   DISPID_SIGNUP_GET_LOCALE   },
    {L"get_IDLocale",   DISPID_SIGNUP_GET_IDLOCALE   },
    {L"get_Text1",   DISPID_SIGNUP_GET_TEXT1   },
    {L"get_Text2",   DISPID_SIGNUP_GET_TEXT2   },
    {L"get_OEMName",   DISPID_SIGNUP_GET_OEMNAME   },
};

/////////////////////////////////////////////////////////////
// CSignup::CSignup
CSignup::CSignup(HINSTANCE hInstance)
{

    // Init member vars
    m_cRef = 0;
    m_hInstance = hInstance;
}

/////////////////////////////////////////////////////////////
// CSignup::~CSignup
CSignup::~CSignup()
{
    assert(m_cRef == 0);
}


////////////////////////////////////////////////
////////////////////////////////////////////////
//// GET / SET :: SignupLocale
////

HRESULT CSignup::get_Locale(LPVARIANT pvResult)
{
    return GetINIKeyBSTR(m_hInstance, INI_SETTINGS_FILENAME, IDS_SECTION_SIGNUP,
                            IDS_KEY_LOCALE, pvResult);
}

HRESULT CSignup::get_IDLocale(LPVARIANT pvResult)
{
    return GetINIKeyBSTR(m_hInstance, INI_SETTINGS_FILENAME, IDS_SECTION_SIGNUP,
                                IDS_KEY_IDLOCALE, pvResult);
}

HRESULT CSignup::get_Text1(LPVARIANT pvResult)
{
    return GetINIKeyBSTR(m_hInstance, INI_SETTINGS_FILENAME, IDS_SECTION_SIGNUP,
                                IDS_KEY_TEXT1, pvResult);
}

HRESULT CSignup::get_Text2(LPVARIANT pvResult)
{
    return GetINIKeyBSTR(m_hInstance, INI_SETTINGS_FILENAME, IDS_SECTION_SIGNUP,
                            IDS_KEY_TEXT2, pvResult);
}

HRESULT CSignup::get_OEMName(LPVARIANT pvResult)
{
    return GetINIKeyBSTR(m_hInstance, INI_SETTINGS_FILENAME, IDS_SECTION_BRANDING,
                            IDS_KEY_OEMNAME, pvResult);
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////// IUnknown implementation
///////
///////

/////////////////////////////////////////////////////////////
// CSignup::QueryInterface
STDMETHODIMP CSignup::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
    // must set out pointer parameters to NULL
    *ppvObj = NULL;

    if ( riid == IID_IUnknown)
    {
        AddRef();
        *ppvObj = (IUnknown*)this;
        return ResultFromScode(S_OK);
    }

    if (riid == IID_IDispatch)
    {
        AddRef();
        *ppvObj = (IDispatch*)this;
        return ResultFromScode(S_OK);
    }

    // Not a supported interface
    return ResultFromScode(E_NOINTERFACE);
}

/////////////////////////////////////////////////////////////
// CSignup::AddRef
STDMETHODIMP_(ULONG) CSignup::AddRef()
{
    return ++m_cRef;
}

/////////////////////////////////////////////////////////////
// CSignup::Release
STDMETHODIMP_(ULONG) CSignup::Release()
{
    return --m_cRef;
}

/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
/////// IDispatch implementation
///////
///////

/////////////////////////////////////////////////////////////
// CSignup::GetTypeInfo
STDMETHODIMP CSignup::GetTypeInfo(UINT, LCID, ITypeInfo**)
{
    return E_NOTIMPL;
}

/////////////////////////////////////////////////////////////
// CSignup::GetTypeInfoCount
STDMETHODIMP CSignup::GetTypeInfoCount(UINT* pcInfo)
{
    return E_NOTIMPL;
}


/////////////////////////////////////////////////////////////
// CSignup::GetIDsOfNames
STDMETHODIMP CSignup::GetIDsOfNames(REFIID    riid,
                                       OLECHAR** rgszNames,
                                       UINT      cNames,
                                       LCID      lcid,
                                       DISPID*   rgDispId)
{

    HRESULT hr  = DISP_E_UNKNOWNNAME;
    rgDispId[0] = DISPID_UNKNOWN;

    for (int iX = 0; iX < sizeof(SignupExternalInterface)/sizeof(DISPATCHLIST); iX ++)
    {
        if(lstrcmp(SignupExternalInterface[iX].szName, rgszNames[0]) == 0)
        {
            rgDispId[0] = SignupExternalInterface[iX].dwDispID;
            hr = NOERROR;
            break;
        }
    }

    // Set the disid's for the parameters
    if (cNames > 1)
    {
        // Set a DISPID for function parameters
        for (UINT i = 1; i < cNames ; i++)
            rgDispId[i] = DISPID_UNKNOWN;
    }

    return hr;
}

/////////////////////////////////////////////////////////////
// CSignup::Invoke
HRESULT CSignup::Invoke
(
    DISPID      dispidMember,
    REFIID      riid,
    LCID        lcid,
    WORD        wFlags,
    DISPPARAMS* pdispparams,
    VARIANT*    pvarResult,
    EXCEPINFO*  pexcepinfo,
    UINT*       puArgErr
)
{
    HRESULT hr = S_OK;

    switch(dispidMember)
    {
        case DISPID_SIGNUP_GET_LOCALE:
        {

            TRACE(L"DISPID_SIGNUP_GET_LOCALE\n");

            if (NULL != pvarResult)
                get_Locale(pvarResult);
            break;
        }

        case DISPID_SIGNUP_GET_IDLOCALE:
        {

            TRACE(L"DISPID_SIGNUP_GET_IDLOCALE\n");

            if (NULL != pvarResult)
                get_IDLocale(pvarResult);
            break;
        }

        case DISPID_SIGNUP_GET_TEXT1:
        {

            TRACE(L"DISPID_SIGNUP_GET_TEXT1\n");

            if (NULL != pvarResult)
                get_Text1(pvarResult);
            break;
        }

        case DISPID_SIGNUP_GET_TEXT2:
        {

            TRACE(L"DISPID_SIGNUP_GET_TEXT2\n");

            if (NULL != pvarResult)
                get_Text2(pvarResult);
            break;
        }

        case DISPID_SIGNUP_GET_OEMNAME:
        {

            TRACE(L"DISPID_SIGNUP_GET_OEMNAME\n");

            if (NULL != pvarResult)
                get_OEMName(pvarResult);
            break;
        }

        default:
        {
            hr = DISP_E_MEMBERNOTFOUND;
            break;
        }
    }
    return hr;
}