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

/*	At the moment, these are only empty stubs.
 */

#include "windows.h"
#include "ole.h"
#include "stddebug.h"
#include "debug.h"

LONG	OLE_current_handle;

/***********************************************************************
 *           OleRegisterServer
 */
OLESTATUS WINAPI OleRegisterServer16( LPCSTR name, LPOLESERVER serverStruct,
                                      LHSERVER *hRet, HINSTANCE16 hServer,
                                      OLE_SERVER_USE use )
{
    dprintf_ole(stdnimp,"OleRegisterServer:%s\n",name);
    *hRet=++OLE_current_handle;
    /* return OLE_ERROR_MEMORY, OLE_ERROR_PROTECT_ONLY if you want it fail*/
    return OLE_OK;
}

/***********************************************************************
 *           OleBlockServer
 */
OLESTATUS WINAPI OleBlockServer16(LHSERVER hServer)
{
    fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
    return OLE_OK;
}

/***********************************************************************
 *           OleBlockServer
 */
OLESTATUS WINAPI OleBlockServer32(LHSERVER hServer)
{
    fprintf(stdnimp,"OleBlockServer:%ld\n",hServer);
    return OLE_OK;
}

/***********************************************************************
 *           OleUnblockServer
 */
OLESTATUS WINAPI OleUnblockServer16(LHSERVER hServer, BOOL16 *block)
{
    fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
    /* no more blocked messages :) */
    *block=FALSE;
    return OLE_OK;
}

/***********************************************************************
 *           OleUnblockServer
 */
OLESTATUS WINAPI OleUnblockServer32(LHSERVER hServer, BOOL32 *block)
{
    fprintf(stdnimp,"OleUnblockServer:%ld\n",hServer);
    /* no more blocked messages :) */
    *block=FALSE;
    return OLE_OK;
}

/***********************************************************************
 *           OleRegisterServerDoc
 */
OLESTATUS WINAPI OleRegisterServerDoc16( LHSERVER hServer, LPCSTR docname,
                                         LPOLESERVERDOC document,
                                         LHSERVERDOC *hRet)
{
    dprintf_ole(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
    *hRet=++OLE_current_handle;
    return OLE_OK;
}

/***********************************************************************
 *           OleRevokeServerDoc
 */
OLESTATUS WINAPI OleRevokeServerDoc16(LHSERVERDOC hServerDoc)
{
    dprintf_ole(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
    return OLE_OK;
}

/***********************************************************************
 *           OleRevokeServerDoc
 */
OLESTATUS WINAPI OleRevokeServerDoc32(LHSERVERDOC hServerDoc)
{
    fprintf(stdnimp,"OleRevokeServerDoc:%ld\n",hServerDoc);
    return OLE_OK;
}

/***********************************************************************
 *           OleRevokeServer
 */
OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer)
{
    dprintf_ole(stdnimp,"OleRevokeServer:%ld\n",hServer);
    return OLE_OK;
}

OLESTATUS WINAPI OleRegisterServer32(LPCSTR svrname,LPOLESERVER olesvr,LHSERVER* hRet,HINSTANCE32 hinst,OLE_SERVER_USE osu) {
	fprintf(stderr,"OleRegisterServer(%s,%p,%p,%08x,%d),stub!\n",
		svrname,olesvr,hRet,hinst,osu
	);
    	*hRet=++OLE_current_handle;
	return OLE_OK;
}

OLESTATUS WINAPI OleRegisterServerDoc32( LHSERVER hServer, LPCSTR docname,
                                         LPOLESERVERDOC document,
                                         LHSERVERDOC *hRet)
{
    fprintf(stdnimp,"OleRegisterServerDoc:%ld,%s\n", hServer, docname);
    *hRet=++OLE_current_handle;
    return OLE_OK;
}

/***********************************************************************
 *           OleRenameServerDoc32
 *
 */
OLESTATUS WINAPI OleRenameServerDoc32(LHSERVERDOC hDoc, LPCSTR newName)
{
    fprintf(stderr,"OleRenameServerDoc: %ld %s; stub.\n",hDoc, newName);
    return OLE_OK;
}
