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

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

#include "windows.h"
#include "ole.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_fixme(ole,"OleRegisterServer:%s - stub\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_fixme(ole,"OleRegisterServerDoc:%ld,%s - stub\n", 
		hServer, docname);
    *hRet=++OLE_current_handle;
    return OLE_OK;
}

/***********************************************************************
 *           OleRevokeServerDoc
 */
OLESTATUS WINAPI OleRevokeServerDoc16(LHSERVERDOC hServerDoc)
{
    dprintf_fixme(ole,"OleRevokeServerDoc:%ld  - stub\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_fixme(ole,"OleRevokeServer:%ld - stub\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;
}
