| /* | 
 |  *	OLE2DISP library | 
 |  * | 
 |  *	Copyright 1995	Martin von Loewis | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  */ | 
 |  | 
 | #include "config.h" | 
 |  | 
 | #include <stdarg.h> | 
 | #include <string.h> | 
 |  | 
 | #include "wine/windef16.h" | 
 | #include "windef.h" | 
 | #include "winbase.h" | 
 | #include "wingdi.h" | 
 | #include "winuser.h" | 
 | #include "ole2.h" | 
 | #include "oleauto.h" | 
 | #include "winerror.h" | 
 |  | 
 | #include "ole2disp.h" | 
 |  | 
 | #include "wine/debug.h" | 
 |  | 
 | WINE_DEFAULT_DEBUG_CHANNEL(ole); | 
 |  | 
 | /* 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 */ | 
 |  | 
 | /****************************************************************************** | 
 |  *		BSTR_AllocBytes	[Internal] | 
 |  */ | 
 | static BSTR16 BSTR_AllocBytes(int n) | 
 | { | 
 |     void *ptr = HeapAlloc( GetProcessHeap(), 0, n ); | 
 |     return (BSTR16)MapLS(ptr); | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * BSTR_Free [INTERNAL] | 
 |  */ | 
 | static void BSTR_Free(BSTR16 in) | 
 | { | 
 |     void *ptr = MapSL( (SEGPTR)in ); | 
 |     UnMapLS( (SEGPTR)in ); | 
 |     HeapFree( GetProcessHeap(), 0, ptr ); | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * BSTR_GetAddr [INTERNAL] | 
 |  */ | 
 | static void* BSTR_GetAddr(BSTR16 in) | 
 | { | 
 |     return in ? MapSL((SEGPTR)in) : 0; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysAllocString	[OLE2DISP.2] | 
 |  * | 
 |  * Create a BSTR16 from an OLESTR16 (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  oleStr [I] Source to create BSTR16 from | 
 |  * | 
 |  * RETURNS | 
 |  *  Success: A BSTR16 allocated with SysAllocStringLen16(). | 
 |  *  Failure: NULL, if oleStr is NULL. | 
 |  */ | 
 | BSTR16 WINAPI SysAllocString16(LPCOLESTR16 oleStr) | 
 | { | 
 | 	BSTR16 out; | 
 |  | 
 | 	if (!oleStr) return 0; | 
 |  | 
 | 	out = BSTR_AllocBytes(strlen(oleStr)+1); | 
 | 	if (!out) return 0; | 
 | 	strcpy(BSTR_GetAddr(out),oleStr); | 
 | 	return out; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysReallocString	[OLE2DISP.3] | 
 |  * | 
 |  * Change the length of a previously created BSTR16 (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  pbstr  [I] BSTR16 to change the length of | 
 |  *  oleStr [I] New source for pbstr | 
 |  * | 
 |  * RETURNS | 
 |  *  Success: 1 | 
 |  *  Failure: 0. | 
 |  * | 
 |  * NOTES | 
 |  *  SysAllocStringStringLen16(). | 
 |  */ | 
 | INT16 WINAPI SysReAllocString16(LPBSTR16 pbstr,LPCOLESTR16 oleStr) | 
 | { | 
 | 	BSTR16 new=SysAllocString16(oleStr); | 
 | 	BSTR_Free(*pbstr); | 
 | 	*pbstr=new; | 
 | 	return 1; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysAllocStringLen	[OLE2DISP.4] | 
 |  * | 
 |  * Create a BSTR16 from an OLESTR16 of a given character length (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  oleStr [I] Source to create BSTR16 from | 
 |  *  len    [I] Length of oleStr in wide characters | 
 |  * | 
 |  * RETURNS | 
 |  *  Success: A newly allocated BSTR16 from SysAllocStringByteLen16() | 
 |  *  Failure: NULL, if len is >= 0x80000000, or memory allocation fails. | 
 |  * | 
 |  * NOTES | 
 |  *  See SysAllocStringByteLen16(). | 
 |  */ | 
 | BSTR16 WINAPI SysAllocStringLen16(const char *oleStr, int len) | 
 | { | 
 | 	BSTR16 out=BSTR_AllocBytes(len+1); | 
 |  | 
 | 	if (!out) | 
 | 		return 0; | 
 |  | 
 |     /* | 
 |      * Copy the information in the buffer. | 
 |      * Since it is valid to pass a NULL pointer here, we'll initialize the | 
 |      * buffer to nul if it is the case. | 
 |      */ | 
 |     if (oleStr != 0) | 
 | 	strcpy(BSTR_GetAddr(out),oleStr); | 
 |     else | 
 |       memset(BSTR_GetAddr(out), 0, len+1); | 
 |  | 
 | 	return out; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysReAllocStringLen	[OLE2DISP.5] | 
 |  * | 
 |  * Change the length of a previously created BSTR16 (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  pbstr  [I] BSTR16 to change the length of | 
 |  *  oleStr [I] New source for pbstr | 
 |  *  len    [I] Length of oleStr in characters | 
 |  * | 
 |  * RETURNS | 
 |  *  Success: 1. The size of pbstr is updated. | 
 |  *  Failure: 0, if len >= 0x8000 or memory allocation fails. | 
 |  * | 
 |  * NOTES | 
 |  *  See SysAllocStringByteLen16(). | 
 |  *  *pbstr may be changed by this function. | 
 |  */ | 
 | int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len) | 
 | { | 
 | 	/* FIXME: Check input length */ | 
 | 	BSTR16 new=SysAllocStringLen16(in,len); | 
 | 	BSTR_Free(*old); | 
 | 	*old=new; | 
 | 	return 1; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysFreeString	[OLE2DISP.6] | 
 |  * | 
 |  * Free a BSTR16 (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  str [I] String to free. | 
 |  * | 
 |  * RETURNS | 
 |  *  Nothing. | 
 |  */ | 
 | void WINAPI SysFreeString16(BSTR16 str) | 
 | { | 
 | 	BSTR_Free(str); | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  *		SysStringLen	[OLE2DISP.7] | 
 |  * | 
 |  * Get the allocated length of a BSTR16 in characters (16 Bit). | 
 |  * | 
 |  * PARAMS | 
 |  *  str [I] BSTR16 to find the length of | 
 |  * | 
 |  * RETURNS | 
 |  *  The allocated length of str, or 0 if str is NULL. | 
 |  */ | 
 | int WINAPI SysStringLen16(BSTR16 str) | 
 | { | 
 | 	return strlen(BSTR_GetAddr(str)); | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * CreateDispTypeInfo [OLE2DISP.31] | 
 |  */ | 
 | HRESULT WINAPI CreateDispTypeInfo16( | 
 | 	INTERFACEDATA *pidata, | 
 | 	LCID lcid, | 
 | 	ITypeInfo **pptinfo) | 
 | { | 
 | 	FIXME("(%p,%d,%p),stub\n",pidata,lcid,pptinfo); | 
 | 	return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * CreateStdDispatch [OLE2DISP.32] | 
 |  */ | 
 | HRESULT WINAPI CreateStdDispatch16( | 
 |         IUnknown* punkOuter, | 
 |         void* pvThis, | 
 | 	ITypeInfo* ptinfo, | 
 | 	IUnknown** ppunkStdDisp) | 
 | { | 
 | 	FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, | 
 |                ppunkStdDisp); | 
 | 	return 0; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * RegisterActiveObject [OLE2DISP.35] | 
 |  */ | 
 | HRESULT WINAPI RegisterActiveObject16( | 
 | 	IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister | 
 | ) { | 
 | 	FIXME("(%p,%s,0x%08x,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister); | 
 | 	return E_NOTIMPL; | 
 | } |