Module: wine Branch: master Commit: a8dbeb1e60098d78c6875e7dcb023d5c97c27d60 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8dbeb1e60098d78c6875e7dcb...
Author: Andrew Eikum aeikum@codeweavers.com Date: Wed Aug 18 12:21:22 2010 -0500
oleaut32: Overwrite previous CustData segment.
This eliminates the diff between Wine's and Windows XP's generated TLB files.
---
dlls/oleaut32/typelib2.c | 36 ++++++++++++++++++++++++++++++++---- 1 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c index b2c086b..cc8c7a2 100644 --- a/dlls/oleaut32/typelib2.c +++ b/dlls/oleaut32/typelib2.c @@ -921,6 +921,26 @@ static HRESULT ctl2_encode_variant( } }
+static int ctl2_find_custdata( + ICreateTypeLib2Impl *This, + REFGUID guid, + int offset) +{ + while (offset != -1) { + MSFT_CDGuid *cdentry = + (MSFT_CDGuid *)&This->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][offset]; + MSFT_GuidEntry *guidentry = + (MSFT_GuidEntry *)&This->typelib_segment_data[MSFT_SEG_GUID][cdentry->GuidOffset]; + + if (IsEqualGUID(guidentry, guid)) + return offset; + + offset = cdentry->next; + } + + return -1; +} + /**************************************************************************** * ctl2_set_custdata * @@ -943,6 +963,7 @@ static HRESULT ctl2_set_custdata( int guidoffset; int custoffset; int *custdata; + BOOL new_segment = FALSE;
switch(V_VT(pVarVal)) { @@ -971,14 +992,21 @@ static HRESULT ctl2_set_custdata( if (status) return status;
- custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0); - if (custoffset == -1) return E_OUTOFMEMORY; + custoffset = ctl2_find_custdata(This, guid, *offset); + if (custoffset == -1) { + custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0); + if (custoffset == -1) + return E_OUTOFMEMORY; + new_segment = TRUE; + }
custdata = (int *)&This->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][custoffset]; custdata[0] = guidoffset; custdata[1] = dataoffset; - custdata[2] = *offset; - *offset = custoffset; + if (new_segment) { + custdata[2] = *offset; + *offset = custoffset; + }
return S_OK; }