--- trunk/reactos/include/wine/ocidl.h 2005-11-17 21:35:56 UTC (rev 19312)
+++ trunk/reactos/include/wine/ocidl.h 2005-11-17 21:52:13 UTC (rev 19313)
@@ -5,6 +5,7 @@
DEFINE_GUID(IID_IFont, 0xbef6e002, 0xa874, 0x101a, 0x8b,0xba, 0x00,0xaa,0x00,0x30,0x0c,0xab);
DEFINE_GUID(IID_IFontDisp, 0xbef6e003, 0xa874, 0x101a, 0x8b,0xba, 0x00,0xaa,0x00,0x30,0x0c,0xab);
+DEFINE_GUID(IID_IFontEventsDisp, 0x4ef6100a, 0xaf88, 0x11d0, 0x98,0x46, 0x00,0xc0,0x4f,0xc2,0x99,0x93);
DEFINE_GUID(IID_IPicture, 0x7bf80980, 0xbf32, 0x101a, 0x8b,0xbb, 0x00,0xaa,0x00,0x30,0x0c,0xab);
DEFINE_GUID(IID_IPictureDisp, 0x7bf80981, 0xbf32, 0x101a, 0x8b,0xbb, 0x00,0xaa,0x00,0x30,0x0c,0xab);
DEFINE_GUID(IID_IOleControl, 0xb196b288, 0xbab4, 0x101a, 0xb6,0x9c, 0x00,0xaa,0x00,0x34,0x1d,0x07);
@@ -16,6 +17,7 @@
DEFINE_GUID(IID_IViewObjectEx, 0x3af24292, 0x0c96, 0x11ce, 0xa0,0xcf, 0x00,0xaa,0x00,0x60,0x0a,0xb8);
DEFINE_GUID(IID_IProvideClassInfo, 0xb196b283, 0xbab4, 0x101a, 0xb6,0x9c, 0x00,0xaa,0x00,0x34,0x1d,0x07);
DEFINE_GUID(IID_IProvideClassInfo2, 0xa6bc3ac0, 0xdbaa, 0x11ce, 0x9d,0xe3, 0x00,0xaa,0x00,0x4b,0xb8,0x51);
+DEFINE_GUID(IID_IProvideMultipleClassInfo, 0xa7aba9c1, 0x8983, 0x11cf, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
DEFINE_GUID(IID_IConnectionPoint, 0xb196b286, 0xbab4, 0x101a, 0xb6,0x9c, 0x00,0xaa,0x00,0x34,0x1d,0x07);
DEFINE_GUID(IID_IConnectionPointContainer, 0xb196b284, 0xbab4, 0x101a, 0xb6,0x9c, 0x00,0xaa,0x00,0x34,0x1d,0x07);
DEFINE_GUID(IID_IEnumConnections, 0xb196b287, 0xbab4, 0x101a, 0xb6,0x9c, 0x00,0xaa,0x00,0x34,0x1d,0x07);
--- trunk/reactos/lib/oleaut32/olepicture.c 2005-11-17 21:35:56 UTC (rev 19312)
+++ trunk/reactos/lib/oleaut32/olepicture.c 2005-11-17 21:52:13 UTC (rev 19313)
@@ -1056,6 +1056,7 @@
static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
HRESULT hr = E_FAIL;
BOOL headerisdata = FALSE;
+ BOOL statfailed = FALSE;
ULONG xread, toread;
BYTE *xbuf;
DWORD header[2];
@@ -1065,19 +1066,29 @@
TRACE("(%p,%p)\n",This,pStm);
+ /****************************************************************************************
+ * Part 1: Load the data
+ */
/* Sometimes we have a header, sometimes we don't. Apply some guesses to find
* out whether we do.
*
* UPDATE: the IStream can be mapped to a plain file instead of a stream in a
- * compound file. This may explain most, if not all, of the cases of "no header",
- * and the header validation should take this into account. At least in Visual Basic 6,
- * resource streams, valid headers are
+ * compound file. This may explain most, if not all, of the cases of "no
+ * header", and the header validation should take this into account.
+ * At least in Visual Basic 6, resource streams, valid headers are
* header[0] == "lt\0\0",
* header[1] == length_of_stream.
+ *
+ * Also handle streams where we do not have a working "Stat" method by
+ * reading all data until the end of the stream.
*/
hr=IStream_Stat(pStm,&statstg,STATFLAG_NONAME);
- if (hr)
- FIXME("Stat failed with hres %lx\n",hr);
+ if (hr) {
+ TRACE("stat failed with hres %lx, proceeding to read all data.\n",hr);
+ statfailed = TRUE;
+ /* we will read at least 8 byte ... just right below */
+ statstg.cbSize.QuadPart = 8;
+ }
hr=IStream_Read(pStm,header,8,&xread);
if (hr || xread!=8) {
FIXME("Failure while reading picture header (hr is %lx, nread is %ld).\n",hr,xread);
@@ -1089,42 +1100,77 @@
if (!memcmp(&(header[0]),"lt\0\0", 4) && (header[1] <= statstg.cbSize.QuadPart-8)) {
toread = header[1];
} else {
- if (!memcmp(&(header[0]), "GIF8", 4) || /* GIF header */
- !memcmp(&(header[0]), "BM", 2) || /* BMP header */
- !memcmp(&(header[0]), "\xff\xd8", 2) || /* JPEG header */
- (header[1] > statstg.cbSize.QuadPart) || /* invalid size */
- (header[1]==0)
+ if (!memcmp(&(header[0]), "GIF8", 4) || /* GIF header */
+ !memcmp(&(header[0]), "BM", 2) || /* BMP header */
+ !memcmp(&(header[0]), "\xff\xd8", 2) || /* JPEG header */
+ (header[1] > statstg.cbSize.QuadPart)|| /* invalid size */
+ (header[1]==0)
) {/* Incorrect header, assume none. */
headerisdata = TRUE;
toread = statstg.cbSize.QuadPart-8;
- xread = 8;
+ xread = 8;
} else {
- FIXME("Unknown stream header magic: %08lx\n", header[0]);
+ FIXME("Unknown stream header magic: %08lx\n", header[0]);
toread = header[1];
}
}
- This->datalen = toread+(headerisdata?8:0);
- xbuf = This->data = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, This->datalen);
+ if (statfailed) { /* we don't know the size ... read all we get */
+ int sizeinc = 4096;
+ int origsize = sizeinc;
+ ULONG nread = 42;
- if (headerisdata)
- memcpy (xbuf, &header, 8);
+ TRACE("Reading all data from stream.\n");
+ xbuf = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, origsize);
+ if (headerisdata)
+ memcpy (xbuf, &header, 8);
+ while (1) {
+ while (xread < origsize) {
+ hr = IStream_Read(pStm,xbuf+xread,origsize-xread,&nread);
+ xread+=nread;
+ if (hr || !nread)
+ break;
+ }
+ if (!nread || hr) /* done, or error */
+ break;
+ if (xread == origsize) {
+ origsize += sizeinc;
+ sizeinc = 2*sizeinc; /* exponential increase */
+ xbuf = HeapReAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, xbuf, origsize);
+ }
+ }
+ if (hr)
+ TRACE("hr in no-stat loader case is %08lx\n", hr);
+ TRACE("loaded %ld bytes.\n", xread);
+ This->datalen = xread;
+ This->data = xbuf;
+ } else {
+ This->datalen = toread+(headerisdata?8:0);
+ xbuf = This->data = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, This->datalen);
- while (xread < This->datalen) {
- ULONG nread;
- hr = IStream_Read(pStm,xbuf+xread,This->datalen-xread,&nread);
- xread+=nread;
- if (hr || !nread)
- break;
+ if (headerisdata)
+ memcpy (xbuf, &header, 8);
+
+ while (xread < This->datalen) {
+ ULONG nread;
+ hr = IStream_Read(pStm,xbuf+xread,This->datalen-xread,&nread);
+ xread+=nread;
+ if (hr || !nread)
+ break;
+ }
+ if (xread != This->datalen)
+ FIXME("Could only read %ld of %d bytes out of stream?\n",xread,This->datalen);
}
- if (xread != This->datalen)
- FIXME("Could only read %ld of %d bytes out of stream?\n",xread,This->datalen);
-
- if (This->datalen == 0) { /* Marks the "NONE" picture */
+ if (This->datalen == 0) { /* Marks the "NONE" picture */
This->desc.picType = PICTYPE_NONE;
return S_OK;
}
+
+ /****************************************************************************************
+ * Part 2: Process the loaded data
+ */
+
magic = xbuf[0] + (xbuf[1]<<8);
switch (magic) {
case 0x4947: { /* GIF */
--- trunk/reactos/lib/oleaut32/tmarshal.c 2005-11-17 21:35:56 UTC (rev 19312)
+++ trunk/reactos/lib/oleaut32/tmarshal.c 2005-11-17 21:52:13 UTC (rev 19313)
@@ -45,11 +45,7 @@
#include "typelib.h"
#include "wine/debug.h"
-static const WCHAR riidW[5] = {'r','i','i','d',0};
-static const WCHAR pdispparamsW[] = {'p','d','i','s','p','p','a','r','a','m','s',0};
-static const WCHAR ppvObjectW[] = {'p','p','v','O','b','j','e','c','t',0};
static const WCHAR IDispatchW[] = { 'I','D','i','s','p','a','t','c','h',0};
-static const WCHAR GetIDsOfNamesW[] = { 'G','e','t','I','D','s','O','f','N','a','m','e','s',0};
WINE_DEFAULT_DEBUG_CHANNEL(ole);
WINE_DECLARE_DEBUG_CHANNEL(olerelay);
@@ -60,9 +56,6 @@
LPBYTE base;
int size;
int curoff;
-
- BOOL thisisiid;
- IID iid; /* HACK: for VT_VOID */
} marshal_state;
/* used in the olerelay code to avoid having the L"" stuff added by debugstr_w */
@@ -360,6 +353,7 @@
IID iid;
CRITICAL_SECTION crit;
IUnknown *outerunknown;
+ IDispatch *dispatch;
} TMProxyImpl;
static HRESULT WINAPI
@@ -396,6 +390,7 @@
if (!refCount)
{
+ if (This->dispatch) IDispatch_Release(This->dispatch);
DeleteCriticalSection(&This->crit);
if (This->chanbuf) IRpcChannelBuffer_Release(This->chanbuf);
VirtualFree(This->asmstubs, 0, MEM_RELEASE);
@@ -450,6 +445,8 @@
int
_argsize(DWORD vt) {
switch (vt) {
+ case VT_UI8:
+ return 8/sizeof(DWORD);
case VT_R8:
return sizeof(double)/sizeof(DWORD);
case VT_CY:
@@ -478,6 +475,9 @@
arrsize *= adesc->rgbounds[i].cElements;
return arrsize*_xsize(&adesc->tdescElem);
}
+ case VT_UI8:
+ case VT_I8:
+ return 8;
case VT_UI2:
case VT_I2:
return 2;
@@ -506,6 +506,13 @@
switch (tdesc->vt) {
case VT_EMPTY: /* nothing. empty variant for instance */
return S_OK;
+ case VT_I8:
+ case VT_UI8:
+ hres = S_OK;
+ if (debugout) TRACE_(olerelay)("%lx%lx",arg[0],arg[1]);
+ if (writeit)
+ hres = xbuf_add(buf,(LPBYTE)arg,8);
+ return hres;
case VT_BOOL:
case VT_ERROR:
case VT_UINT:
@@ -726,8 +733,6 @@
if (debugout && (i<(tattr->cVars-1)))
TRACE_(olerelay)(",");
}
- if (buf->thisisiid && (tattr->cbSizeInstance==sizeof(GUID)))
- memcpy(&(buf->iid),arg,sizeof(buf->iid));
if (debugout) TRACE_(olerelay)("}");
break;
}
@@ -773,296 +778,7 @@
}
}
-/* IDL desc:
- * HRESULT GetIDsOfNames(
- * [in] REFIID riid, args[1]
- * [in, size_is(cNames)] LPOLESTR *rgszNames, args[2]
- * [in] UINT cNames, args[3]
- * [in] LCID lcid, args[4]
- * [out, size_is(cNames)] DISPID *rgDispId); args[5]
- *
- * line format:
- * IID iid;
- * DWORD cNames;
- * LPOLESTR rgszNames[cNames];
- * DWORD bytestrlen (incl 0)
- * BYTE data[bytestrlen] (incl 0)
- * LCID
- */
static HRESULT
-serialize_IDispatch_GetIDsOfNames(
- BOOL inputparams,
- BOOL debugout,
- DWORD *args,
- marshal_state *buf)
-{
- HRESULT hres;
- DWORD cNames = args[2];
- LPOLESTR *rgszNames = (LPOLESTR*)args[1];
- int i;
-
- if (inputparams) {
- if (debugout) TRACE_(olerelay)("riid=%s,",debugstr_guid((REFIID)args[0]));
- hres = xbuf_add(buf, (LPBYTE)args[0], sizeof(IID));
- if (hres) {
- FIXME("serialize of IID failed.\n");
- return hres;
- }
- if (debugout) TRACE_(olerelay)("cNames=%ld,",cNames);
- hres = xbuf_add(buf, (LPBYTE)&cNames, sizeof(DWORD));
- if (hres) {
- FIXME("serialize of cNames failed.\n");
- return hres;
- }
- if (debugout) TRACE_(olerelay)("rgszNames=[");
- for (i=0;i<cNames;i++) {
- DWORD len = 2*(lstrlenW(rgszNames[i])+1);
-
- if (debugout) TRACE_(olerelay)("%s,",relaystr(rgszNames[i]));
- hres = xbuf_add(buf, (LPBYTE)&len, sizeof(DWORD));
- if (hres) {
- FIXME("serialize of len failed.\n");
- return hres;
- }
- hres = xbuf_add(buf, (LPBYTE)rgszNames[i], len);
- if (hres) {
- FIXME("serialize of rgszNames[i] failed.\n");
- return hres;
- }
- }
- if (debugout) TRACE_(olerelay)("],lcid=%04lx)",args[3]);
- hres = xbuf_add(buf, (LPBYTE)&args[3], sizeof(DWORD));
- if (hres) {
- FIXME("serialize of lcid failed.\n");
- return hres;
- }
- } else {
- DISPID *rgDispId = (DISPID*)args[4];
-
- hres = xbuf_add(buf, (LPBYTE)rgDispId, sizeof(DISPID) * cNames);
- if (hres) {
- FIXME("serialize of rgDispId failed.\n");
- return hres;
- }
- if (debugout) {
- TRACE_(olerelay)("riid=[in],rgszNames=[in],cNames=[in],rgDispId=[");
- for (i=0;i<cNames;i++)
- TRACE_(olerelay)("%08lx,",rgDispId[i]);
- TRACE_(olerelay)("])");
- }
- HeapFree(GetProcessHeap(),0,(IID*)args[0]);
- rgszNames = (LPOLESTR*)args[1];
- for (i=0;i<cNames;i++) HeapFree(GetProcessHeap(),0,rgszNames[i]);
- HeapFree(GetProcessHeap(),0,rgszNames);
- HeapFree(GetProcessHeap(),0,rgDispId);
- }
- return S_OK;
-}
-
-static HRESULT
-deserialize_IDispatch_GetIDsOfNames(
- BOOL inputparams,
- BOOL debugout,
- DWORD *args,
- marshal_state *buf)
-{
- HRESULT hres;
- DWORD cNames;
- LPOLESTR *rgszNames;
- int i;
-
- if (inputparams) {
- args[0] = (DWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IID));
- if (!args[0]) return E_FAIL;
- hres = xbuf_get(buf, (LPBYTE)args[0], sizeof(IID));
- if (hres) {
- FIXME("deserialize of IID failed.\n");
- return hres;
- }
- if (debugout) TRACE_(olerelay)("riid=%s,",debugstr_guid((REFIID)args[0]));
-
- hres = xbuf_get(buf, (LPBYTE)&cNames, sizeof(DWORD));
- if (hres) {
- FIXME("deserialize of cNames failed.\n");
- return hres;
- }
- args[2] = cNames;
- if (debugout) TRACE_(olerelay)("cNames=%ld,",cNames);
- if (debugout) TRACE_(olerelay)("rgszNames=[");
- rgszNames = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(LPOLESTR) * cNames);
- if (!rgszNames) return E_FAIL;
- args[1] = (DWORD)rgszNames;
- for (i=0;i<cNames;i++) {
- DWORD len;
-
- hres = xbuf_get(buf, (LPBYTE)&len, sizeof(DWORD));
- if (hres) {
- FIXME("serialize of len failed.\n");
- return hres;
- }
- rgszNames[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len);
- if (!rgszNames[i]) {
- FIXME("heapalloc of %ld bytes failed\n", len);
- return E_FAIL;
- }
- hres = xbuf_get(buf, (LPBYTE)rgszNames[i], len);
- if (hres) {
- FIXME("serialize of rgszNames[i] failed.\n");
- return hres;
- }
- if (debugout) TRACE_(olerelay)("%s,",relaystr(rgszNames[i]));
- }
- hres = xbuf_get(buf, (LPBYTE)&args[3], sizeof(DWORD));
- if (hres) {
- FIXME("deserialize of lcid failed.\n");
- return hres;
- }
- if (debugout) TRACE_(olerelay)("],lcid=%04lx,rgDispId=[out])",args[3]);
- args[4] = (DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DISPID) * cNames);
- } else {
- hres = xbuf_get(buf, (LPBYTE)args[4], sizeof(DISPID) * args[2]);
- if (hres) {
- FIXME("serialize of rgDispId failed.\n");
- return hres;
- }
- if (debugout) {
- TRACE_(olerelay)("dispid=[");
- for (i=0;i<args[2];i++)
- TRACE_(olerelay)("%08lx,",((DISPID*)args[4])[i]);
- TRACE_(olerelay)("])");
- }
- }
- return S_OK;
-}
-
-static HRESULT
-serialize_LPVOID_ptr(
- ITypeInfo *tinfo,
- BOOL writeit,
- BOOL debugout,
- BOOL dealloc,
- TYPEDESC *tdesc,
- DWORD *arg,
- marshal_state *buf)
-{
- HRESULT hres;
- DWORD cookie;
-
- if ((tdesc->vt != VT_PTR) ||
- (tdesc->u.lptdesc->vt != VT_PTR) ||
- (tdesc->u.lptdesc->u.lptdesc->vt != VT_VOID)
- ) {
- FIXME("ppvObject not expressed as VT_PTR -> VT_PTR -> VT_VOID?\n");
- return E_FAIL;
- }
- cookie = (*(DWORD*)*arg) ? 0x42424242: 0x0;
- if (writeit) {
- hres = xbuf_add(buf, (LPVOID)&cookie, sizeof(cookie));
- if (hres)
- return hres;
- }
- if (!*(DWORD*)*arg) {
- if (debugout) TRACE_(olerelay)("<lpvoid NULL>");
- return S_OK;
- }
- if (debugout)
- TRACE_(olerelay)("ppv(%p)",*(LPUNKNOWN*)*arg);
- if (writeit) {
- hres = _marshal_interface(buf,&(buf->iid),*(LPUNKNOWN*)*arg);
- if (hres)
- return hres;
- }
- if (dealloc)
- HeapFree(GetProcessHeap(),0,(LPVOID)*arg);
- return S_OK;
-}
-
-static HRESULT
-serialize_DISPPARAM_ptr(
- ITypeInfo *tinfo,
- BOOL writeit,
- BOOL debugout,
- BOOL dealloc,
- TYPEDESC *tdesc,
- DWORD *arg,
- marshal_state *buf)
-{
- DWORD cookie;
- HRESULT hres;
- DISPPARAMS *disp;
- int i;
-
- if ((tdesc->vt != VT_PTR) || (tdesc->u.lptdesc->vt != VT_USERDEFINED)) {
- FIXME("DISPPARAMS not expressed as VT_PTR -> VT_USERDEFINED?\n");
- return E_FAIL;
- }
-
- cookie = *arg ? 0x42424242 : 0x0;
- if (writeit) {
- hres = xbuf_add(buf,(LPBYTE)&cookie,sizeof(cookie));
- if (hres)
- return hres;
- }
- if (!*arg) {
- if (debugout) TRACE_(olerelay)("<DISPPARAMS NULL>");
- return S_OK;
- }
- disp = (DISPPARAMS*)*arg;
- if (writeit) {
- hres = xbuf_add(buf,(LPBYTE)&disp->cArgs,sizeof(disp->cArgs));
- if (hres)
- return hres;
- }
- if (debugout) TRACE_(olerelay)("D{");
- for (i=0;i<disp->cArgs;i++) {
- TYPEDESC vtdesc;
-
- vtdesc.vt = VT_VARIANT;
- serialize_param(
- tinfo,
- writeit,
- debugout,
- dealloc,
- &vtdesc,
- (DWORD*)(disp->rgvarg+i),
- buf
- );
- if (debugout && (i<disp->cArgs-1))
- TRACE_(olerelay)(",");
- }
- if (dealloc)
- HeapFree(GetProcessHeap(),0,disp->rgvarg);
- if (writeit) {
- hres = xbuf_add(buf,(LPBYTE)&disp->cNamedArgs,sizeof(disp->cNamedArgs));
- if (hres)
- return hres;
- }
- if (debugout) TRACE_(olerelay)("}{");
- for (i=0;i<disp->cNamedArgs;i++) {
- TYPEDESC vtdesc;
-
- vtdesc.vt = VT_UINT;
- serialize_param(
- tinfo,
- writeit,
- debugout,
- dealloc,
- &vtdesc,
- (DWORD*)(disp->rgdispidNamedArgs+i),
- buf
- );
- if (debugout && (i<disp->cNamedArgs-1))
- TRACE_(olerelay)(",");
- }
- if (debugout) TRACE_(olerelay)("}");
- if (dealloc) {
- HeapFree(GetProcessHeap(),0,disp->rgdispidNamedArgs);
- HeapFree(GetProcessHeap(),0,disp);
- }
- return S_OK;
-}
-
-static HRESULT
deserialize_param(
ITypeInfo *tinfo,
BOOL readit,
@@ -1107,6 +823,14 @@
return S_OK;
}
}
+ case VT_I8:
+ case VT_UI8:
+ if (readit) {
+ hres = xbuf_get(buf,(LPBYTE)arg,8);
+ if (hres) ERR("Failed to read integer 8 byte\n");
+ }
+ if (debugout) TRACE_(olerelay)("%lx%lx",arg[0],arg[1]);
+ return hres;
case VT_ERROR:
case VT_BOOL:
case VT_I4:
@@ -1331,8 +1055,6 @@
);
if (debugout && (i<tattr->cVars-1)) TRACE_(olerelay)(",");
}
- if (buf->thisisiid && (tattr->cbSizeInstance==sizeof(GUID)))
- memcpy(&(buf->iid),(LPBYTE)*arg,sizeof(buf->iid));
if (debugout) TRACE_(olerelay)("}");
break;
}
@@ -1383,130 +1105,6 @@
}
}
-static HRESULT
-deserialize_LPVOID_ptr(
- ITypeInfo *tinfo,
- BOOL readit,
- BOOL debugout,
- BOOL alloc,
- TYPEDESC *tdesc,
- DWORD *arg,
- marshal_state *buf
-) {
- HRESULT hres;
- DWORD cookie;
-
- if ((tdesc->vt != VT_PTR) ||
- (tdesc->u.lptdesc->vt != VT_PTR) ||
- (tdesc->u.lptdesc->u.lptdesc->vt != VT_VOID)
- ) {
- FIXME("ppvObject not expressed as VT_PTR -> VT_PTR -> VT_VOID?\n");
- return E_FAIL;
- }
- if (alloc)
- *arg=(DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(LPVOID));
- if (readit) {
- hres = xbuf_get(buf, (LPVOID)&cookie, sizeof(cookie));
- if (hres)
- return hres;
- if (cookie != 0x42424242) {
- *(DWORD*)*arg = 0;
- if (debugout) TRACE_(olerelay)("<lpvoid NULL>");
- return S_OK;
- }
- }
- if (readit) {
- hres = _unmarshal_interface(buf,&buf->iid,(LPUNKNOWN*)*arg);
- if (hres) {
- FIXME("_unmarshal_interface of %s , %p failed with %lx\n", debugstr_guid(&buf->iid), (LPUNKNOWN*)*arg, hres);
- return hres;
- }
- }
- if (debugout) TRACE_(olerelay)("ppv(%p)",(LPVOID)*arg);
- return S_OK;
-}
-
-static HRESULT
-deserialize_DISPPARAM_ptr(
- ITypeInfo *tinfo,
- BOOL readit,
- BOOL debugout,
- BOOL alloc,
- TYPEDESC *tdesc,
- DWORD *arg,
- marshal_state *buf)
-{
- DWORD cookie;
- DISPPARAMS *disps;
- HRESULT hres;
- int i;
-
- if ((tdesc->vt != VT_PTR) || (tdesc->u.lptdesc->vt != VT_USERDEFINED)) {
- FIXME("DISPPARAMS not expressed as VT_PTR -> VT_USERDEFINED?\n");
- return E_FAIL;
- }
- if (readit) {
- hres = xbuf_get(buf,(LPBYTE)&cookie,sizeof(cookie));
- if (hres)
- return hres;
- if (cookie == 0) {
- *arg = 0;
- if (debugout) TRACE_(olerelay)("<DISPPARAMS NULL>");
- return S_OK;
- }
- }
- if (alloc)
- *arg = (DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DISPPARAMS));
- disps = (DISPPARAMS*)*arg;
- if (!readit)
- return S_OK;
- hres = xbuf_get(buf, (LPBYTE)&disps->cArgs, sizeof(disps->cArgs));
- if (hres)
- return hres;
- if (alloc)
- disps->rgvarg = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(VARIANT)*disps->cArgs);
- if (debugout) TRACE_(olerelay)("D{");
- for (i=0; i< disps->cArgs; i++) {
- TYPEDESC vdesc;
-
- vdesc.vt = VT_VARIANT;
- hres = deserialize_param(
- tinfo,
- readit,
- debugout,
- alloc,
- &vdesc,
- (DWORD*)(disps->rgvarg+i),
- buf
- );
- }
- if (debugout) TRACE_(olerelay)("}{");
- hres = xbuf_get(buf, (LPBYTE)&disps->cNamedArgs, sizeof(disps->cNamedArgs));
- if (hres)
- return hres;
- if (disps->cNamedArgs) {
- if (alloc)
- disps->rgdispidNamedArgs = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DISPID)*disps->cNamedArgs);
- for (i=0; i< disps->cNamedArgs; i++) {
- TYPEDESC vdesc;
-
- vdesc.vt = VT_UINT;
- hres = deserialize_param(
- tinfo,
- readit,
- debugout,
- alloc,
- &vdesc,
- (DWORD*)(disps->rgdispidNamedArgs+i),
- buf
- );
- if (debugout && i<(disps->cNamedArgs-1)) TRACE_(olerelay)(",");
- }
- }
- if (debugout) TRACE_(olerelay)("}");
- return S_OK;
-}
-
/* Searches function, also in inherited interfaces */
static HRESULT
_get_funcdesc(
@@ -1575,18 +1173,18 @@
BSTR fname,iname;
BSTR names[10];
UINT nrofnames;
- int is_idispatch_getidsofnames = 0;
DWORD remoteresult = 0;
ITypeInfo *tinfo;
+ IRpcChannelBuffer *chanbuf;
EnterCriticalSection(&tpinfo->crit);
hres = _get_funcdesc(tpinfo->tinfo,method,&tinfo,&fdesc,&iname,&fname);
if (hres) {
- ERR("Did not find typeinfo/funcdesc entry for method %d!\n",method);
+ ERR("Did not find typeinfo/funcdesc entry for method %d!\n",method);
ITypeInfo_Release(tinfo);
LeaveCriticalSection(&tpinfo->crit);
- return E_FAIL;
+ return E_FAIL;
}
if (!tpinfo->chanbuf)
@@ -1596,7 +1194,11 @@
LeaveCriticalSection(&tpinfo->crit);
return RPC_E_DISCONNECTED;
}
+ chanbuf = tpinfo->chanbuf;
+ IRpcChannelBuffer_AddRef(chanbuf);
+ LeaveCriticalSection(&tpinfo->crit);
+
if (relaydeb) {
TRACE_(olerelay)("->");
if (iname)
@@ -1607,34 +1209,12 @@
TRACE_(olerelay)("%d",method);
TRACE_(olerelay)("(");
}
- if (iname && fname && !lstrcmpW(iname,IDispatchW) && !lstrcmpW(fname,GetIDsOfNamesW))
- is_idispatch_getidsofnames = 1;
if (iname) SysFreeString(iname);
if (fname) SysFreeString(fname);
memset(&buf,0,sizeof(buf));
- buf.iid = IID_IUnknown;
- /* Special IDispatch::GetIDsOfNames() serializer */
- if (is_idispatch_getidsofnames) {
- hres = serialize_IDispatch_GetIDsOfNames(TRUE,relaydeb,args,&buf);
- if (hres != S_OK) {
- FIXME("serialize of IDispatch::GetIDsOfNames failed!\n");
- ITypeInfo_Release(tinfo);
- LeaveCriticalSection(&tpinfo->crit);
- return hres;
- }
- goto afterserialize;
- }
-
- /* special QueryInterface serialize */
- if (method == 0) {
- xbuf_add(&buf,(LPBYTE)args[0],sizeof(IID));
- if (relaydeb) TRACE_(olerelay)("riid=%s,[out])",debugstr_guid((REFIID)args[0]));
- goto afterserialize;
- }
-
/* normal typelib driven serializing */
/* Need them for hack below */
@@ -1647,62 +1227,27 @@
xargs = args;
for (i=0;i<fdesc->cParams;i++) {
ELEMDESC *elem = fdesc->lprgelemdescParam+i;
- BOOL isserialized = FALSE;
if (relaydeb) {
if (i) TRACE_(olerelay)(",");
if (i+1<nrofnames && names[i+1])
TRACE_(olerelay)("%s=",relaystr(names[i+1]));
}
/* No need to marshal other data than FIN and any VT_PTR. */
- if (!(elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN) && (elem->tdesc.vt != VT_PTR)) {
+ if (!(elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN || !elem->u.paramdesc.wParamFlags) && (elem->tdesc.vt != VT_PTR)) {
xargs+=_argsize(elem->tdesc.vt);
if (relaydeb) TRACE_(olerelay)("[out]");
continue;
}
- if (((i+1)<nrofnames) && !IsBadStringPtrW(names[i+1],1)) {
- /* If the parameter is 'riid', we use it as interface IID
- * for a later ppvObject serialization.
- */
- buf.thisisiid = !lstrcmpW(names[i+1],riidW);
+ hres = serialize_param(
+ tinfo,
+ elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN || !elem->u.paramdesc.wParamFlags,
+ relaydeb,
+ FALSE,
+ &elem->tdesc,
+ xargs,
+ &buf
+ );
- /* DISPPARAMS* needs special serializer */
- if (!lstrcmpW(names[i+1],pdispparamsW)) {
- hres = serialize_DISPPARAM_ptr(
- tinfo,
- elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN,
- relaydeb,
- FALSE,
- &elem->tdesc,
- xargs,
- &buf
- );
- isserialized = TRUE;
- }
- if (!lstrcmpW(names[i+1],ppvObjectW)) {
- hres = serialize_LPVOID_ptr(
- tinfo,
- elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN,
- relaydeb,
- FALSE,
- &elem->tdesc,
- xargs,
- &buf
- );
- if (hres == S_OK)
- isserialized = TRUE;
- }
- }
- if (!isserialized)
- hres = serialize_param(
- tinfo,
- elem->u.paramdesc.wParamFlags & PARAMFLAG_FIN,
- relaydeb,
- FALSE,
- &elem->tdesc,
- xargs,
- &buf
- );
-
if (hres) {
ERR("Failed to serialize param, hres %lx\n",hres);
break;
@@ -1711,23 +1256,20 @@
}
if (relaydeb) TRACE_(olerelay)(")");
-afterserialize:
memset(&msg,0,sizeof(msg));
msg.cbBuffer = buf.curoff;
msg.iMethod = method;
- hres = IRpcChannelBuffer_GetBuffer(tpinfo->chanbuf,&msg,&(tpinfo->iid));
+ hres = IRpcChannelBuffer_GetBuffer(chanbuf,&msg,&(tpinfo->iid));
if (hres) {
ERR("RpcChannelBuffer GetBuffer failed, %lx\n",hres);
- LeaveCriticalSection(&tpinfo->crit);
- return hres;
+ goto exit;
}
memcpy(msg.Buffer,buf.base,buf.curoff);
[truncated at 1000 lines; 1954 more skipped]