License: LGPL Changelog: - Implemented PropSysAllocString, PropSysFreeString, FreePropVariantArray; - Partially implemented PropVariantClear, PropVariantCopy - Changed IErrorInfo to rely on PropSys(Free|Alloc)String instead of a private copy of Sys(Free|Alloc)String Alberto Index: Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/ole32/Makefile.in,v retrieving revision 1.24 diff -u -r1.24 Makefile.in --- Makefile.in 22 Nov 2002 04:43:02 -0000 1.24 +++ Makefile.in 26 Nov 2002 14:25:50 -0000 @@ -33,6 +33,7 @@ ole2stubs.c \ ole2impl.c \ ole2nls.c \ + ole2prop.c \ ole32_main.c \ oleobj.c \ oleproxy.c \ Index: errorinfo.c =================================================================== RCS file: /home/wine/wine/dlls/ole32/errorinfo.c,v retrieving revision 1.12 diff -u -r1.12 errorinfo.c --- errorinfo.c 31 May 2002 23:25:50 -0000 1.12 +++ errorinfo.c 26 Nov 2002 14:25:50 -0000 @@ -29,6 +29,7 @@ #include "winbase.h" #include "oleauto.h" #include "winerror.h" +#include "ole2prop.h" #include "wine/obj_base.h" #include "wine/obj_oleaut.h" @@ -40,92 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -/* this code is from SysAllocStringLen (ole2disp.c in oleaut32) */ -static BSTR WINAPI ERRORINFO_SysAllocString(const OLECHAR* in) -{ - DWORD bufferSize; - DWORD* newBuffer; - WCHAR* stringBuffer; - DWORD len; - - if (in == NULL) - return NULL; - /* - * Find the lenth of the buffer passed-in in bytes. - */ - len = strlenW(in); - bufferSize = len * sizeof (WCHAR); - - /* - * Allocate a new buffer to hold the string. - * dont't forget to keep an empty spot at the beginning of the - * buffer for the character count and an extra character at the - * end for the '\0'. - */ - newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), - 0, - bufferSize + sizeof(WCHAR) + sizeof(DWORD)); - - /* - * If the memory allocation failed, return a null pointer. - */ - if (newBuffer==0) - return 0; - - /* - * Copy the length of the string in the placeholder. - */ - *newBuffer = bufferSize; - - /* - * Skip the byte count. - */ - newBuffer++; - - /* - * 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 (in != 0) - memcpy(newBuffer, in, bufferSize); - else - memset(newBuffer, 0, bufferSize); - - /* - * Make sure that there is a nul character at the end of the - * string. - */ - stringBuffer = (WCHAR*)newBuffer; - stringBuffer[len] = 0; - - return (LPWSTR)stringBuffer; -} - -/* this code is from SysFreeString (ole2disp.c in oleaut32)*/ -static VOID WINAPI ERRORINFO_SysFreeString(BSTR in) -{ - DWORD* bufferPointer; - - /* NULL is a valid parameter */ - if(!in) return; - - /* - * We have to be careful when we free a BSTR pointer, it points to - * the beginning of the string but it skips the byte count contained - * before the string. - */ - bufferPointer = (DWORD*)in; - - bufferPointer--; - - /* - * Free the memory from it's "real" origin. - */ - HeapFree(GetProcessHeap(), 0, bufferPointer); -} - - typedef struct ErrorInfoImpl { ICOM_VTABLE(IErrorInfo) *lpvtei; @@ -256,7 +171,7 @@ TRACE("(%p)->(pBstrSource=%p)\n",This,pBstrSource); if (pBstrSource == NULL) return E_INVALIDARG; - *pBstrSource = ERRORINFO_SysAllocString(This->bstrSource); + *pBstrSource = PropSysAllocString(This->bstrSource); return S_OK; } @@ -269,7 +184,7 @@ TRACE("(%p)->(pBstrDescription=%p)\n",This,pBstrDescription); if (pBstrDescription == NULL) return E_INVALIDARG; - *pBstrDescription = ERRORINFO_SysAllocString(This->bstrDescription); + *pBstrDescription = PropSysAllocString(This->bstrDescription); return S_OK; } @@ -283,7 +198,7 @@ TRACE("(%p)->(pBstrHelpFile=%p)\n",This, pBstrHelpFile); if (pBstrHelpFile == NULL) return E_INVALIDARG; - *pBstrHelpFile = ERRORINFO_SysAllocString(This->bstrHelpFile); + *pBstrHelpFile = PropSysAllocString(This->bstrHelpFile); return S_OK; } @@ -360,8 +275,8 @@ _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); TRACE("(%p)\n",This); if (This->bstrSource != NULL) - ERRORINFO_SysFreeString(This->bstrSource); - This->bstrSource = ERRORINFO_SysAllocString(szSource); + PropSysFreeString(This->bstrSource); + This->bstrSource = PropSysAllocString(szSource); return S_OK; } @@ -373,8 +288,8 @@ _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); TRACE("(%p)\n",This); if (This->bstrDescription != NULL) - ERRORINFO_SysFreeString(This->bstrDescription); - This->bstrDescription = ERRORINFO_SysAllocString(szDescription); + PropSysFreeString(This->bstrDescription); + This->bstrDescription = PropSysAllocString(szDescription); return S_OK; } @@ -386,8 +301,8 @@ _ICOM_THIS_From_ICreateErrorInfo(ErrorInfoImpl, iface); TRACE("(%p)\n",This); if (This->bstrHelpFile != NULL) - ERRORINFO_SysFreeString(This->bstrHelpFile); - This->bstrHelpFile = ERRORINFO_SysAllocString(szHelpFile); + PropSysFreeString(This->bstrHelpFile); + This->bstrHelpFile = PropSysAllocString(szHelpFile); return S_OK; } Index: ole2stubs.c =================================================================== RCS file: /home/wine/wine/dlls/ole32/ole2stubs.c,v retrieving revision 1.25 diff -u -r1.25 ole2stubs.c --- ole2stubs.c 22 Nov 2002 04:43:02 -0000 1.25 +++ ole2stubs.c 26 Nov 2002 14:25:50 -0000 @@ -221,40 +221,6 @@ } /*********************************************************************** - * PropVariantClear [OLE32.166] - */ -HRESULT WINAPI PropVariantClear(void *pvar) /* [in/out] FIXME: PROPVARIANT * */ -{ - FIXME("(%p): stub:\n", pvar); - - *(LPWORD)pvar = 0; - /* sets at least the vt field to VT_EMPTY */ - return E_NOTIMPL; -} - -/*********************************************************************** - * PropVariantCopy [OLE32.246] - */ -HRESULT WINAPI PropVariantCopy(void *pvarDest, /* [out] FIXME: PROPVARIANT * */ - const void *pvarSrc) /* [in] FIXME: const PROPVARIANT * */ -{ - FIXME("(%p, %p): stub:\n", pvarDest, pvarSrc); - - return E_NOTIMPL; -} - -/*********************************************************************** - * FreePropVariantArray [OLE32.195] - */ -HRESULT WINAPI FreePropVariantArray(ULONG cVariants, /* [in] */ - void *rgvars) /* [in/out] FIXME: PROPVARIANT * */ -{ - FIXME("(%lu, %p): stub:\n", cVariants, rgvars); - - return E_NOTIMPL; -} - -/*********************************************************************** * CoIsOle1Class [OLE32.29] */ BOOL WINAPI CoIsOle1Class(REFCLSID clsid) Index: ole32.spec =================================================================== RCS file: /home/wine/wine/dlls/ole32/ole32.spec,v retrieving revision 1.41 diff -u -r1.41 ole32.spec --- ole32.spec 4 Nov 2002 23:53:44 -0000 1.41 +++ ole32.spec 26 Nov 2002 14:25:50 -0000 @@ -241,8 +241,8 @@ 241 stub OleCreateLinkEx 242 stub OleCreateLinkFromDataEx 243 stub OleCreateLinkToFileEx -244 stub PropSysAllocString -245 stub PropSysFreeString +244 stdcall PropSysAllocString(wstr) PropSysAllocString +245 stdcall PropSysFreeString(ptr) PropSysFreeString 246 stdcall PropVariantCopy(ptr ptr) PropVariantCopy 247 stub SNB_UserFree 248 stub SNB_UserMarshal --- /dev/null 1970-01-01 01:00:00.000000000 +0100 +++ dlls/ole32/ole2prop.h 2002-11-25 21:02:48.000000000 +0100 @@ -0,0 +1,25 @@ +/* + * Copyright 2002 Alberto Massari + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#if !defined( __WINE_OLE2PROP_H_ ) +#define __WINE_OLE2PROP_H_ + +BSTR WINAPI PropSysAllocString(const OLECHAR* in); +VOID WINAPI PropSysFreeString(BSTR in); + +#endif /* __WINE_OLE2PROP_H_ */ --- /dev/null 1970-01-01 01:00:00.000000000 +0100 +++ dlls/ole32/ole2prop.c 2002-11-26 14:04:56.000000000 +0100 @@ -0,0 +1,226 @@ +/* + * Copyright 2002 Alberto Massari + * + * Copyright (C) 1999 Corel Corporation + * Move these functions to dlls/ole32/ole2impl.c when you implement them. + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "wine/debug.h" +#include "wine/unicode.h" +#include "wine/obj_oleaut.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +/*********************************************************************** + * PropSysAllocString [OLE32.@] + */ +BSTR WINAPI PropSysAllocString(const OLECHAR* in) +{ + DWORD bufferSize; + DWORD* newBuffer; + WCHAR* stringBuffer; + DWORD len; + + if (in == NULL) + return NULL; + /* + * Find the lenth of the buffer passed-in in bytes. + */ + len = strlenW(in); + bufferSize = len * sizeof (WCHAR); + + /* + * Allocate a new buffer to hold the string. + * dont't forget to keep an empty spot at the beginning of the + * buffer for the character count and an extra character at the + * end for the '\0'. + */ + newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), + 0, + bufferSize + sizeof(WCHAR) + sizeof(DWORD)); + + /* + * If the memory allocation failed, return a null pointer. + */ + if (newBuffer==0) + return 0; + + /* + * Copy the length of the string in the placeholder. + */ + *newBuffer = bufferSize; + + /* + * Skip the byte count. + */ + newBuffer++; + + /* + * 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 (in != 0) + memcpy(newBuffer, in, bufferSize); + else + memset(newBuffer, 0, bufferSize); + + /* + * Make sure that there is a nul character at the end of the + * string. + */ + stringBuffer = (WCHAR*)newBuffer; + stringBuffer[len] = 0; + + return (LPWSTR)stringBuffer; +} + +/*********************************************************************** + * PropSysFreeString [OLE32.@] + */ +VOID WINAPI PropSysFreeString(BSTR in) +{ + DWORD* bufferPointer; + + /* NULL is a valid parameter */ + if(!in) return; + + /* + * We have to be careful when we free a BSTR pointer, it points to + * the beginning of the string but it skips the byte count contained + * before the string. + */ + bufferPointer = (DWORD*)in; + + bufferPointer--; + + /* + * Free the memory from it's "real" origin. + */ + HeapFree(GetProcessHeap(), 0, bufferPointer); +} + +/*********************************************************************** + * PropVariantClear [OLE32.166] + */ +HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar) +{ + if(pvar==NULL) + return S_OK; + switch(pvar->vt) + { + case VT_EMPTY: + case VT_NULL: + case VT_I1: + case VT_UI1: + case VT_I2: + case VT_UI2: + case VT_I4: + case VT_UI4: + case VT_INT: + case VT_UINT: + case VT_I8: + case VT_UI8: + case VT_R4: + case VT_R8: + case VT_CY: + case VT_DATE: + case VT_BOOL: + case VT_ERROR: + case VT_FILETIME: + case VT_DECIMAL: + break; + case VT_BSTR: + PropSysFreeString(pvar->u.bstrVal); + break; + case VT_LPSTR: + FIXME("(VT_LPSTR %s): stub:\n", pvar->u.pszVal); + break; + case VT_LPWSTR: + FIXME("(VT_LPWSTR %s): stub:\n", debugstr_w(pvar->u.pwszVal)); + break; + case VT_CLSID: + FIXME("(VT_CLSID): stub:\n"); + break; + case VT_CF: + FIXME("(VT_CF): stub:\n"); + break; + case VT_BLOB: + case VT_BLOB_OBJECT: + FIXME("(VT_BLOB/VT_BLOB_OBJECT): stub:\n"); + break; + case VT_STREAM: + case VT_STREAMED_OBJECT: + IUnknown_Release(pvar->u.pStream); + break; + case VT_STORAGE: + case VT_STORED_OBJECT: + IUnknown_Release(pvar->u.pStorage); + break; + default: + return STG_E_INVALIDPARAMETER; + } + + memset(pvar,0,sizeof(PROPVARIANT)); + return S_OK; +} + +/*********************************************************************** + * PropVariantCopy [OLE32.246] + */ +HRESULT WINAPI PropVariantCopy(PROPVARIANT *pvarDest, + const PROPVARIANT *pvarSrc) +{ + pvarDest->vt=pvarSrc->vt; + switch(pvarSrc->vt) + { + case VT_EMPTY: break; + case VT_I4: pvarDest->u.lVal=pvarSrc->u.lVal; break; + case VT_UI4: pvarDest->u.ulVal=pvarSrc->u.ulVal; break; + case VT_LPWSTR: + pvarDest->u.pwszVal=CoTaskMemAlloc((strlenW(pvarSrc->u.pwszVal)+1)*sizeof(WCHAR)); + strcpyW(pvarDest->u.pwszVal,pvarSrc->u.pwszVal); + break; + case VT_FILETIME: memcpy(&pvarDest->u.filetime,&pvarSrc->u.filetime,8); break; + default: + FIXME("(%p, %p): vt=%d stub:\n", pvarDest, pvarSrc,pvarSrc->vt); + return E_NOTIMPL; + } + + return S_OK; +} + +/*********************************************************************** + * FreePropVariantArray [OLE32.195] + */ +HRESULT WINAPI FreePropVariantArray(ULONG cVariants, + PROPVARIANT *rgvars) +{ + ULONG i; + if(rgvars==NULL) + return S_OK; + + for(i=0;i<cVariants;i++) + PropVariantClear(&rgvars[i]); + + return S_OK; +} +