//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// CMPNT.CPP
// --------------------------------
// COMImage object implementation
//
// Some portions of this file adapted from Inside COM, Microsoft Press
//
//

#include <objbase.h>
#include "iface.h"
#include "server.h"
#include "cmpnt.h"

// {{COMASPECT_COMPONENTIMPL
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
///
/// Component COMImage implementation
///
///
///

// static creation method
HRESULT COMImage::CreateInstance(IUnknown* pOuterUnk, void ** ppvObject)
{
	*ppvObject = NULL;

	if(NULL != pOuterUnk)
	{
		return CLASS_E_NOAGGREGATION ;
	}

	COMImage* pObj = new COMImage();
	if(NULL == pObj)
	{
		return E_OUTOFMEMORY;
	}

	*ppvObject = pObj;

	return S_OK;
}

COMImage::COMImage() :
	m_cRef(1)
{
	theServer.IncComponents();
    m_pObj = new CImage();
}

COMImage::~COMImage()
{
	theServer.DecComponents();
}


// IUnknown
HRESULT __stdcall COMImage::QueryInterface(const IID& iid, void** ppv)
{
	*ppv = NULL;

// {{COMASPECT_QUERYINTERFACEHANDLER
    if(iid == IID_IUnknown)
    {
        *ppv = static_cast<IImageInfo*>(this);
    }
    else if (iid == IID_IImageInfo)
    {
        *ppv = static_cast<IImageInfo*>(this);
    }
    else if (iid == IID_IImageProcessing)
    {
        *ppv = static_cast<IImageProcessing*>(this);
    }
    else if (iid == IID_IPersistence)
    {
        *ppv = static_cast<IPersistence*>(this);
    }

// }}COMASPECT_QUERYINTERFACEHANDLER
	else
	{
		*ppv = NULL ;
		return E_NOINTERFACE ;
	}

	// addref the interface
	reinterpret_cast<IUnknown*>(*ppv)->AddRef() ;
	return S_OK ;
}

ULONG __stdcall COMImage::AddRef()
{
	return InterlockedIncrement(&m_cRef);
}

ULONG __stdcall COMImage::Release()
{
	if(InterlockedDecrement(&m_cRef) == 0)
	{
		delete this;
		return 0;
	}

	return m_cRef;
}


//{{COMASPECT_COMPONENTINTERFACEIMPL
HRESULT __stdcall COMImage::GetSize(int *Width, int *Height)
{
    m_pObj->GetSize(Width, Height);
    return S_OK;
}

HRESULT __stdcall COMImage::GetPosition(int *X, int *Y)
{
    m_pObj->GetPosition(X, Y);
    return S_OK;
}

HRESULT __stdcall COMImage::Rotate(int* result_arg, int AngleDegrees)
{
    (*result_arg) = m_pObj->Rotate(AngleDegrees);
    return S_OK;
}

HRESULT __stdcall COMImage::Resize(int* result_arg, int Width, int Height)
{
    (*result_arg) = m_pObj->Resize(Width, Height);
    return S_OK;
}

HRESULT __stdcall COMImage::Load(int* result_arg, char *Filename)
{
    (*result_arg) = m_pObj->Load(Filename);
    return S_OK;
}

HRESULT __stdcall COMImage::Save(int* result_arg, char *Filename)
{
    (*result_arg) = m_pObj->Save(Filename);
    return S_OK;
}


//}}COMASPECT_COMPONENTINTERFACEIMPL



// }}COMASPECT_COMPONENTIMPL


