/*++

Copyright (C) 1997-1999  Microsoft Corporation

Module Name:

    about.cpp

Abstract:

    This module implemets ISnapinAbout inteface(CDevMgrAbout class).

Author:

    William Hsieh (williamh) created

Revision History:


--*/

#include "devmgr.h"
#include "about.h"

//
// IUnknown interface
//
ULONG
CDevMgrAbout::AddRef()
{
    ::InterlockedIncrement((LONG*)&m_Ref);
    
    return m_Ref;
}

ULONG
CDevMgrAbout::Release()
{
    ::InterlockedDecrement((LONG*)&m_Ref);
    
    if (!m_Ref)
    {
        delete this;
        return 0;
    }
    
    return m_Ref;
}

STDMETHODIMP
CDevMgrAbout::QueryInterface(
    REFIID  riid,
    void**  ppv
    )
{
    if (!ppv)
    {
        return E_INVALIDARG;
    }

    HRESULT hr = S_OK;


    if (IsEqualIID(riid, IID_IUnknown))
    {
        *ppv = (IUnknown*)this;
    }
    
    else if (IsEqualIID(riid, IID_ISnapinAbout))
    {
        *ppv = (ISnapinAbout*)this;
    }
    
    else
    {
        *ppv = NULL;
        hr = E_NOINTERFACE;
    }
    
    if (SUCCEEDED(hr))
    {
        AddRef();
    }

    return hr;
}

// ISnapinAbout interface

STDMETHODIMP
CDevMgrAbout::GetSnapinDescription(
    LPOLESTR *ppDescription
    )
{
    return LoadResourceOleString(IDS_PROGRAM_ABOUT, ppDescription);
}

STDMETHODIMP
CDevMgrAbout::GetProvider(
    LPOLESTR *ppProvider
    )
{
    return LoadResourceOleString(IDS_PROGRAM_PROVIDER, ppProvider);
}

STDMETHODIMP
CDevMgrAbout::GetSnapinVersion(
    LPOLESTR *ppVersion
    )
{
    return LoadResourceOleString(IDS_PROGRAM_VERSION, ppVersion);
}

STDMETHODIMP
CDevMgrAbout::GetSnapinImage(
    HICON* phIcon
    )
{
    if (!phIcon)
    {
        return E_INVALIDARG;
    }

    *phIcon = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_DEVMGR));
    
    if (!*phIcon)
    {
        return E_OUTOFMEMORY;
    }

    return S_OK;
}

STDMETHODIMP
CDevMgrAbout::GetStaticFolderImage(
    HBITMAP* phSmall,
    HBITMAP* phSmallOpen,
    HBITMAP* phLarge,
    COLORREF* pcrMask
    )
{
    if (!phSmall || !phSmallOpen || !phLarge || !pcrMask)
    {
        return E_INVALIDARG;
    }

    *phSmall = ::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM16));
    *phSmallOpen = ::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM16));
    *phLarge =::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM32));
    *pcrMask = RGB(255, 0, 255);
    
    if (NULL == *phSmall || NULL == *phSmallOpen || NULL == *phLarge)
    {
        if (NULL != *phSmall)
        {
            ::DeleteObject(*phSmall);
            *phSmall = NULL;
        }
        
        if (NULL != *phSmallOpen)
        {
            ::DeleteObject(*phSmallOpen);
            *phSmallOpen = NULL;
        }

        if (NULL != *phLarge)
        {
            ::DeleteObject(*phLarge);
            *phLarge = NULL;
        }

        return E_OUTOFMEMORY;
    }
    
    return S_OK;
}

/////////////////////////////////////////////////////////////////////////////
// private routine to allocate ole task memory and load the given resource
// string(indicated by its string id) to the allocated memory.
// INPUT:
//  StringId -- the string resource id
//  LPOLESTR* -- place holder to hold the ole string pointer
// OUTPUT:
//  standard OLE HRESULT
HRESULT
CDevMgrAbout::LoadResourceOleString(
    int StringId,
    LPOLESTR* ppolestr
    )
{
    if (!ppolestr)
    {
        return E_INVALIDARG;
    }

    TCHAR Text[MAX_PATH];
    
    // get the string
    ::LoadString(g_hInstance, StringId, Text, ARRAYLEN(Text));
    
    try
    {
        *ppolestr = AllocOleTaskString(Text);
    }
    catch (CMemoryException* e)
    {
        e->Delete();

        if (*ppolestr)
        {
            FreeOleTaskString(*ppolestr);
            *ppolestr = NULL;
        }
    }

    if (!*ppolestr)
    {
        return E_OUTOFMEMORY;
    }

    return S_OK;
}