oleaut32: Implement ICreateTypeInfo2::SetFuncCustData.
This commit is contained in:
parent
b4025a3ed1
commit
40b59afac8
|
@ -1316,6 +1316,69 @@ static HRESULT ctl2_add_default_value(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* funcrecord_reallochdr
|
||||||
|
*
|
||||||
|
* Ensure FuncRecord data block contains header of required size
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
*
|
||||||
|
* typedata [IO] - reference to pointer to data block
|
||||||
|
* need [I] - required size of block in bytes
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
*
|
||||||
|
* Number of additionally allocated bytes
|
||||||
|
*/
|
||||||
|
static INT funcrecord_reallochdr(INT **typedata, int need)
|
||||||
|
{
|
||||||
|
int tail = (*typedata)[5]*((*typedata)[4]&0x1000?16:12);
|
||||||
|
int hdr = (*typedata)[0] - tail;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (hdr >= need)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
*typedata = HeapReAlloc(GetProcessHeap(), 0, *typedata, need + tail);
|
||||||
|
if (!*typedata)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (tail)
|
||||||
|
memmove((char*)*typedata + need, (const char*)*typedata + hdr, tail);
|
||||||
|
(*typedata)[0] = need + tail;
|
||||||
|
|
||||||
|
/* fill in default values */
|
||||||
|
for(i = (hdr+3)/4; (i+1)*4 <= need; i++)
|
||||||
|
{
|
||||||
|
switch(i)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
(*typedata)[i] = 0;
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
(*typedata)[i] = -1;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
(*typedata)[i] = -1;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
(*typedata)[i] = -1;
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
(*typedata)[i] = -1;
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
(*typedata)[i] = 0;
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
(*typedata)[i] = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return need - hdr;
|
||||||
|
}
|
||||||
|
|
||||||
/*================== ICreateTypeInfo2 Implementation ===================================*/
|
/*================== ICreateTypeInfo2 Implementation ===================================*/
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -2162,14 +2225,11 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncAndParamNames(
|
||||||
namedata = This->typelib->typelib_segment_data[MSFT_SEG_NAME] + offset;
|
namedata = This->typelib->typelib_segment_data[MSFT_SEG_NAME] + offset;
|
||||||
*((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16];
|
*((INT *)namedata) = This->typelib->typelib_typeinfo_offsets[This->typeinfo->typekind >> 16];
|
||||||
|
|
||||||
if(iter->u.data[4]&0x1000)
|
len = iter->u.data[0]/4 - iter->u.data[5]*3;
|
||||||
len = iter->u.data[5];
|
|
||||||
else
|
|
||||||
len = 0;
|
|
||||||
|
|
||||||
for (i = 1; i < cNames; i++) {
|
for (i = 1; i < cNames; i++) {
|
||||||
offset = ctl2_alloc_name(This->typelib, rgszNames[i]);
|
offset = ctl2_alloc_name(This->typelib, rgszNames[i]);
|
||||||
iter->u.data[(i*3) + 4 + len] = offset;
|
iter->u.data[len + ((i-1)*3) + 1] = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -2307,8 +2367,6 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncHelpContext(
|
||||||
{
|
{
|
||||||
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
|
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
|
||||||
CyclicList *func;
|
CyclicList *func;
|
||||||
int *typedata;
|
|
||||||
int size;
|
|
||||||
|
|
||||||
TRACE("(%p,%d,%d)\n", iface, index, dwHelpContext);
|
TRACE("(%p,%d,%d)\n", iface, index, dwHelpContext);
|
||||||
|
|
||||||
|
@ -2322,24 +2380,11 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncHelpContext(
|
||||||
if(index-- == 0)
|
if(index-- == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
typedata = func->u.data;
|
This->typedata->next->u.val += funcrecord_reallochdr(&func->u.data, 7*sizeof(int));
|
||||||
|
if(!func->u.data)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
/* Compute func size without arguments */
|
func->u.data[6] = dwHelpContext;
|
||||||
size = typedata[0] - typedata[5]*(typedata[4]&0x1000?16:12);
|
|
||||||
|
|
||||||
/* Allocate memory for HelpContext if needed */
|
|
||||||
if(size < 7*sizeof(int)) {
|
|
||||||
typedata = HeapReAlloc(GetProcessHeap(), 0, typedata, typedata[0]+sizeof(int));
|
|
||||||
if(!typedata)
|
|
||||||
return E_OUTOFMEMORY;
|
|
||||||
|
|
||||||
memmove(&typedata[7], &typedata[6], typedata[0]-sizeof(int)*6);
|
|
||||||
typedata[0] += sizeof(int);
|
|
||||||
This->typedata->next->u.val += sizeof(int);
|
|
||||||
func->u.data = typedata;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedata[6] = dwHelpContext;
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2741,8 +2786,24 @@ static HRESULT WINAPI ICreateTypeInfo2_fnSetFuncCustData(
|
||||||
REFGUID guid, /* [I] The GUID used as a key to retrieve the custom data. */
|
REFGUID guid, /* [I] The GUID used as a key to retrieve the custom data. */
|
||||||
VARIANT* pVarVal) /* [I] The custom data. */
|
VARIANT* pVarVal) /* [I] The custom data. */
|
||||||
{
|
{
|
||||||
FIXME("(%p,%d,%s,%p), stub!\n", iface, index, debugstr_guid(guid), pVarVal);
|
ICreateTypeInfo2Impl *This = (ICreateTypeInfo2Impl *)iface;
|
||||||
return E_OUTOFMEMORY;
|
CyclicList *iter;
|
||||||
|
UINT i;
|
||||||
|
|
||||||
|
TRACE("(%p,%d,%s,%p)\n", iface, index, debugstr_guid(guid), pVarVal);
|
||||||
|
|
||||||
|
if(index >= This->typeinfo->cElement)
|
||||||
|
return TYPE_E_ELEMENTNOTFOUND;
|
||||||
|
|
||||||
|
for(iter=This->typedata->next->next, i=0; i<index; i++)
|
||||||
|
iter=iter->next;
|
||||||
|
|
||||||
|
This->typedata->next->u.val += funcrecord_reallochdr(&iter->u.data, 13*sizeof(int));
|
||||||
|
if(!iter->u.data)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
|
iter->u.data[4] |= 0x80;
|
||||||
|
return ctl2_set_custdata(This->typelib, guid, pVarVal, &iter->u.data[12]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue