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

#include "windows.h"
#include "ole.h"
#include "ole2.h"
#include "interfaces.h"
#include "heap.h"
#include "ldt.h"
#include "debug.h"

/* This implementation of the BSTR API is 16-bit only. It
   represents BSTR as a 16:16 far pointer, and the strings
   as ISO-8859 */

typedef DWORD	BSTR;

static BSTR BSTR_AllocBytes(int n)
{
    void *ptr = SEGPTR_ALLOC(n);
    return SEGPTR_GET(ptr);
}

static void BSTR_Free(BSTR in)
{
    SEGPTR_FREE( PTR_SEG_TO_LIN(in) );
}

static void* BSTR_GetAddr(BSTR in)
{
    return in ? PTR_SEG_TO_LIN(in) : 0;
}

/***********************************************************************
 *           SysAllocString         [OLE2DISP.2]
 */
BSTR WINAPI SysAllocString(char *in)
{
	BSTR out=BSTR_AllocBytes(strlen(in)+1);
	if(!out)return 0;
	strcpy(BSTR_GetAddr(out),in);
	return out;
}

/***********************************************************************
 *           SysReAllocString       [OLE2DISP.3]
 */
int WINAPI SysReAllocString(BSTR *old,char *in)
{
	BSTR new=SysAllocString(in);
	BSTR_Free(*old);
	*old=new;
	return 1;
}

/***********************************************************************
 *           SysAllocStringLen      [OLE2DISP.4]
 */
BSTR WINAPI SysAllocStringLen(char *in, int len)
{
	BSTR out=BSTR_AllocBytes(len+1);
	if(!out)return 0;
	strcpy(BSTR_GetAddr(out),in);
	return out;
}

/***********************************************************************
 *           SysReAllocStringLen    [OLE2DISP.5]
 */
int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len)
{
	BSTR new=SysAllocStringLen(in,len);
	BSTR_Free(*old);
	*old=new;
	return 1;
}

/***********************************************************************
 *           SysFreeString          [OLE2DISP.6]
 */
void WINAPI SysFreeString(BSTR in)
{
	BSTR_Free(in);
}

/***********************************************************************
 *           SysStringLen           [OLE2DISP.7]
 */
int WINAPI SysStringLen(BSTR str)
{
	return strlen(BSTR_GetAddr(str));
}

OLESTATUS WINAPI CreateDispTypeInfo(INTERFACEDATA * pidata,LCID lcid,LPVOID/*ITypeInfo*/ * * pptinfo) {
	fprintf(stderr,"CreateDispTypeInfo(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
	return 0;
}

OLESTATUS WINAPI RegisterActiveObject(
	IUnknown * punk,REFCLSID rclsid,DWORD dwFlags, DWORD * pdwRegister
) {
	char	buf[80];
	WINE_StringFromCLSID(rclsid,buf);
	fprintf(stderr,"RegisterActiveObject(%p,%s,0x%08lx,%p),stub\n",punk,buf,dwFlags,pdwRegister);
	return 0;
}
