/*======================================================================================//
|  Windows NT Process Control                                                           //
|                                                                                       //
|Copyright (c) 1998  Sequent Computer Systems, Incorporated.  All rights reserved.      //
|                                                                                       //
|File Name:    About.cpp                                                                //
|                                                                                       //
|Description:  Implementation of ISnapinAbout Interface for ProcCon                     //
|                                                                                       //
|Created:      Paul Skoglund 09-1998                                                    //
|                                                                                       //
|Rev History:                                                                           //
|                                                                                       //
|=======================================================================================*/


#include "StdAfx.h"
#include "ProcCon.h"
#include "About.h"


#define MAX_STR_RESOURCE_LEN    (256)
#define MAX_STR_RESOURCE_SIZE  (sizeof(TCHAR) * MAX_STR_RESOURCE_LEN)


CAbout::CAbout() : VersionObj(_Module.GetModuleInstance())
{
  ATLTRACE( _T("CAbout::CAbout()\n") );
}


CAbout::~CAbout()
{
  ATLTRACE( _T("CAbout::~CAbout()\n") );
}

HRESULT CAbout::WrapLoadString(LPOLESTR *ptr, int nID)
{
  *ptr = reinterpret_cast<LPOLESTR> (CoTaskMemAlloc(MAX_STR_RESOURCE_SIZE));
  if (!*ptr)
    return E_FAIL;

  if (LoadString(_Module.GetResourceInstance(), nID, *ptr, MAX_STR_RESOURCE_LEN))
    return S_OK;

  CoTaskMemFree(*ptr);
  *ptr = NULL;
  
  return E_FAIL;
}


/////////////////////////////////////////////////////////////////////////////
//  ISnapinAbout Implementation:
//
STDMETHODIMP CAbout::GetSnapinDescription (LPOLESTR* lpDescription)
{
  ATLTRACE( _T("CAbout::GetSnapinDescription()\n") );
	return WrapLoadString(lpDescription, IDS_DESCRIPTION);
}

STDMETHODIMP CAbout::GetProvider(LPOLESTR* lpName)
{
  ATLTRACE( _T("CAbout::GetProvider()\n") );

  int len = (_tcslen(VersionObj.strGetCompanyName()) + 1 ) * sizeof(TCHAR);

  *lpName = reinterpret_cast<LPOLESTR> (CoTaskMemAlloc(len));
  if (!*lpName)
    return E_FAIL;

  _tcscpy(*lpName, VersionObj.strGetCompanyName());

  return S_OK;
}

STDMETHODIMP CAbout::GetSnapinVersion(LPOLESTR* lpVersion)
{
  ATLTRACE( _T("CAbout::GetSnapinVersion()\n") );

  int len = (_tcslen(VersionObj.GetFileVersion()) + 1 ) * sizeof(TCHAR);

  len += _tcslen(VersionObj.GetFileFlags()) * sizeof(TCHAR);

  *lpVersion = reinterpret_cast<LPOLESTR> (CoTaskMemAlloc(len));
  if (!*lpVersion)
    return E_FAIL;

  _tcscpy(*lpVersion, VersionObj.GetFileVersion());
  _tcscat(*lpVersion, VersionObj.GetFileFlags());

  return S_OK;
}

STDMETHODIMP CAbout::GetSnapinImage(HICON* hAppIcon)
{ 
  ATLTRACE( _T("CAbout::GetSnapinImage()\n") );

  ASSERT(hAppIcon);
  *hAppIcon = LoadIcon(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_PROCCON));
  ASSERT( *hAppIcon );
  return *hAppIcon ? S_OK : E_FAIL;
}

STDMETHODIMP CAbout::GetStaticFolderImage
(
  HBITMAP* hSmallImage, 
  HBITMAP* hSmallImageOpen, 
  HBITMAP* hLargeImage, 
  COLORREF* cLargeMask
)
{
  ATLTRACE( _T("CAbout::GetStaticFolderImage()\n") );

	if (!hSmallImage || !hSmallImageOpen || !hLargeImage || !cLargeMask)
		return S_FALSE;

	*hSmallImage     = (HBITMAP) ::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_NODES_16x16), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
	ASSERT(hSmallImage);

	*hSmallImageOpen = (HBITMAP) ::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_NODES_16x16), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
	ASSERT(hSmallImageOpen);

	*hLargeImage     = (HBITMAP) ::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_NODES_32x32), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR );
	ASSERT(hLargeImage);

	*cLargeMask = RGB(255,0, 255);

  return S_OK;
}