/*
 *	OLE2 COM objects
 *
 *	Copyright 1998 Eric Kohl
 */


#include "ole.h"
#include "ole2.h"
#include "winerror.h"
#include "windows.h"
#include "wine/obj_base.h"
#include "wine/obj_storage.h"
#include "wine/obj_moniker.h"
#include "wine/obj_dataobject.h"
#include "oleobj.h"
#include "debug.h"


/**************************************************************************
 *  IOleAdviseHolder Implementation
 */
static HRESULT WINAPI IOleAdviseHolder_QueryInterface(LPOLEADVISEHOLDER,REFIID,LPVOID*);
static ULONG WINAPI   IOleAdviseHolder_AddRef(LPOLEADVISEHOLDER);
static ULONG WINAPI   IOleAdviseHolder_Release(LPOLEADVISEHOLDER);
static HRESULT WINAPI IOleAdviseHolder_Advise(LPOLEADVISEHOLDER, IAdviseSink*, DWORD*);
static HRESULT WINAPI IOleAdviseHolder_Unadvise (LPOLEADVISEHOLDER, DWORD);
static HRESULT WINAPI IOleAdviseHolder_EnumAdvise (LPOLEADVISEHOLDER, IEnumSTATDATA **);
static HRESULT WINAPI IOleAdviseHolder_SendOnRename (LPOLEADVISEHOLDER, IMoniker *);
static HRESULT WINAPI IOleAdviseHolder_SendOnSave (LPOLEADVISEHOLDER this);
static HRESULT WINAPI IOleAdviseHolder_SendOnClose (LPOLEADVISEHOLDER this);


/**************************************************************************
 *  IOleAdviseHolder_VTable
 */
static IOleAdviseHolder_VTable oahvt =
{
    IOleAdviseHolder_QueryInterface,
    IOleAdviseHolder_AddRef,
    IOleAdviseHolder_Release,
    IOleAdviseHolder_Advise,
    IOleAdviseHolder_Unadvise,
    IOleAdviseHolder_EnumAdvise,
    IOleAdviseHolder_SendOnRename,
    IOleAdviseHolder_SendOnSave,
    IOleAdviseHolder_SendOnClose
};

/**************************************************************************
 *  IOleAdviseHolder_Constructor
 */

LPOLEADVISEHOLDER IOleAdviseHolder_Constructor()
{
    LPOLEADVISEHOLDER lpoah;

    lpoah= (LPOLEADVISEHOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IOleAdviseHolder));
    lpoah->ref = 1;
    lpoah->lpvtbl = &oahvt;
    FIXME (ole, "(%p)->()\n", lpoah);

    return lpoah;
}

/**************************************************************************
 *  IOleAdviseHolder_QueryInterface
 */
static HRESULT WINAPI
IOleAdviseHolder_QueryInterface (LPOLEADVISEHOLDER this, REFIID riid, LPVOID *ppvObj)
{
    char xriid[50];
    WINE_StringFromCLSID((LPCLSID)riid,xriid);
    FIXME (ole, "(%p)->(\n\tIID:\t%s)\n", this, xriid);

    *ppvObj = NULL;

    if(IsEqualIID(riid, &IID_IUnknown)) {
	/* IUnknown */
	*ppvObj = this; 
    }
    else if(IsEqualIID(riid, &IID_IOleAdviseHolder)) {
	/* IOleAdviseHolder */
	*ppvObj = (IOleAdviseHolder*) this;
    }

    if(*ppvObj) {
	(*(LPOLEADVISEHOLDER*)ppvObj)->lpvtbl->fnAddRef(this);  	
	FIXME (ole, "-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj);
	return S_OK;
    }

    FIXME (ole, "-- Interface: E_NOINTERFACE\n");
    return E_NOINTERFACE;
}

/******************************************************************************
 * IOleAdviseHolder_AddRef
 */
static ULONG WINAPI
IOleAdviseHolder_AddRef (LPOLEADVISEHOLDER this)
{
    FIXME (ole, "(%p)->(count=%lu)\n", this, this->ref);
    return ++(this->ref);
}

/******************************************************************************
 * IOleAdviseHolder_Release
 */
static ULONG WINAPI
IOleAdviseHolder_Release (LPOLEADVISEHOLDER this)
{
    FIXME (ole, "(%p)->(count=%lu)\n", this, this->ref);
    if (!--(this->ref)) {
	FIXME (ole, "-- destroying IOleAdviseHolder(%p)\n", this);
	HeapFree(GetProcessHeap(),0,this);
	return 0;
    }
    return this->ref;
}

/******************************************************************************
 * IOleAdviseHolder_Advise
 */
static HRESULT WINAPI
IOleAdviseHolder_Advise (LPOLEADVISEHOLDER this,
			 IAdviseSink *pAdvise, DWORD *pdwConnection)
{
    FIXME (ole, "(%p)->(%p %p)\n", this, pAdvise, pdwConnection);

    *pdwConnection = 0;

   return S_OK;
}

/******************************************************************************
 * IOleAdviseHolder_Unadvise
 */
static HRESULT WINAPI
IOleAdviseHolder_Unadvise (LPOLEADVISEHOLDER this, DWORD dwConnection)
{
    FIXME (ole, "(%p)->(%lu)\n", this, dwConnection);

    return S_OK;
}

/******************************************************************************
 * IOleAdviseHolder_EnumAdvise
 */
static HRESULT WINAPI
IOleAdviseHolder_EnumAdvise (LPOLEADVISEHOLDER this, IEnumSTATDATA **ppenumAdvise)
{
    FIXME (ole, "(%p)->(%p)\n", this, ppenumAdvise);

    *ppenumAdvise = NULL;

    return S_OK;
}

/******************************************************************************
 * IOleAdviseHolder_SendOnRename
 */
static HRESULT WINAPI
IOleAdviseHolder_SendOnRename (LPOLEADVISEHOLDER this, IMoniker *pmk)
{
    FIXME (ole, "(%p)->(%p)\n", this, pmk);


    return S_OK;
}

/******************************************************************************
 * IOleAdviseHolder_SendOnSave
 */
static HRESULT WINAPI
IOleAdviseHolder_SendOnSave (LPOLEADVISEHOLDER this)
{
    FIXME (ole, "(%p)\n", this);


    return S_OK;
}

/******************************************************************************
 * IOleAdviseHolder_SendOnClose
 */
static HRESULT WINAPI
IOleAdviseHolder_SendOnClose (LPOLEADVISEHOLDER this)
{
    FIXME (ole, "(%p)\n", this);


    return S_OK;
}

/***********************************************************************
 * API functions
 */

/***********************************************************************
 * CreateOleAdviseHolder [OLE32.59]
 */
HRESULT WINAPI CreateOleAdviseHolder32 (LPOLEADVISEHOLDER *ppOAHolder)
{
    FIXME(ole,"(%p): stub!\n", ppOAHolder);

    *ppOAHolder = IOleAdviseHolder_Constructor ();
    if (*ppOAHolder)
	return S_OK;

    *ppOAHolder = 0;
    return E_OUTOFMEMORY;
}

