/*
 *	OLE2 library
 *
 *	Copyright 1995	Martin von Loewis
 */

#include "windows.h"
#include "winerror.h"
#include "ole2.h"
#include "process.h"
#include "debug.h"

/***********************************************************************
 *           OleBuildVersion     [OLE.1]
 */
DWORD WINAPI OleBuildVersion()
{
    TRACE(ole,"(void)\n");
    return (rmm<<16)+rup;
}

/***********************************************************************
 *           OleInitialize       (OLE2.2) (OLE32.108)
 */
HRESULT WINAPI OleInitialize(LPVOID reserved)
{
    FIXME(ole,"OleInitialize - stub\n");
    return S_OK;
}

/***********************************************************************
 * CoGetCurrentProcess [OLE2.2][OLE32.108]
 *
 * NOTES
 *   Is DWORD really the correct return type for this function?
 */
DWORD WINAPI CoGetCurrentProcess() {
	return (DWORD)PROCESS_Current();
}

/***********************************************************************
 *           OleUnitialize       (OLE2.3) (OLE32.131)
 */
void WINAPI OleUninitialize(void)
{
    FIXME(ole,"stub\n");
}

/***********************************************************************
 *           OleFlushClipboard   [OLE2.76]
 */
HRESULT WINAPI OleFlushClipboard()
{
    return S_OK;
}

/***********************************************************************
 *           CoRegisterMessageFilter   [OLE32.38]
 */
HRESULT WINAPI CoRegisterMessageFilter32(
    LPMESSAGEFILTER lpMessageFilter,	/* Pointer to interface */
    LPMESSAGEFILTER *lplpMessageFilter	/* Indirect pointer to prior instance if non-NULL */
) {
    FIXME(ole,"stub\n");
    if (lplpMessageFilter) {
	*lplpMessageFilter = NULL;
    }
    return S_OK;
}

/***********************************************************************
 *           OleInitializeWOW (OLE32.27)
 */
HRESULT WINAPI OleInitializeWOW(DWORD x) {
        FIXME(ole,"(0x%08lx),stub!\n",x);
        return 0;
}

/***********************************************************************
 *           GetRunningObjectTable (OLE2.30)
 */
HRESULT WINAPI GetRunningObjectTable16(DWORD reserved, LPVOID *pprot) {
	FIXME(ole,"(%ld,%p),stub!\n",reserved,pprot);
	return E_FAIL;
}

/***********************************************************************
 *           RegisterDragDrop (OLE2.35)
 */
HRESULT WINAPI RegisterDragDrop16(
	HWND16 hwnd,
	LPDROPTARGET pDropTarget
) {
	FIXME(ole,"(0x%04x,%p),stub!\n",hwnd,pDropTarget);
	return S_OK;
}

