Mike McCormack : kernel32: Split update_add_resource() into two
functions.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jan 11 05:34:12 CST 2007
Module: wine
Branch: master
Commit: 38e27fa9f82b670fb12ff011083f4faf9901b7d3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=38e27fa9f82b670fb12ff011083f4faf9901b7d3
Author: Mike McCormack <mike at codeweavers.com>
Date: Thu Jan 11 17:43:23 2007 +0900
kernel32: Split update_add_resource() into two functions.
---
dlls/kernel32/resource.c | 62 +++++++++++++++++++++++++++++++---------------
1 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/dlls/kernel32/resource.c b/dlls/kernel32/resource.c
index d8d1afb..54955c5 100644
--- a/dlls/kernel32/resource.c
+++ b/dlls/kernel32/resource.c
@@ -646,7 +646,7 @@ struct resource_data {
LANGID lang;
DWORD codepage;
DWORD cbData;
- BYTE data[1];
+ void *lpData;
};
static int resource_strcmp( LPCWSTR a, LPCWSTR b )
@@ -737,15 +737,13 @@ static void res_free_str( LPWSTR str )
}
static BOOL update_add_resource( QUEUEDUPDATES *updates, LPCWSTR Type, LPCWSTR Name,
- WORD Language, DWORD codepage, LPCVOID lpData, DWORD cbData )
+ struct resource_data *resdata, BOOL overwrite_existing )
{
struct resource_dir_entry *restype, *resname;
- struct resource_data *resdata;
-
- TRACE("%p %s %s %04x %04x %p %d bytes\n", updates, debugstr_w(Type), debugstr_w(Name), Language, codepage, lpData, cbData);
+ struct resource_data *existing;
- if (!lpData || !cbData)
- return FALSE;
+ TRACE("%p %s %s %p %d\n", updates,
+ debugstr_w(Type), debugstr_w(Name), resdata, overwrite_existing );
restype = find_resource_dir_entry( &updates->root, Type );
if (!restype)
@@ -769,24 +767,46 @@ static BOOL update_add_resource( QUEUEDU
* If there's an existing resource entry with matching (Type,Name,Language)
* it needs to be removed before adding the new data.
*/
- resdata = find_resource_data( &resname->children, Language );
- if (resdata)
+ existing = find_resource_data( &resname->children, resdata->lang );
+ if (existing)
{
- list_remove( &resdata->entry );
- HeapFree( GetProcessHeap(), 0, resdata );
+ if (!overwrite_existing)
+ return TRUE;
+ list_remove( &existing->entry );
+ HeapFree( GetProcessHeap(), 0, existing );
}
- resdata = HeapAlloc( GetProcessHeap(), 0, sizeof *resdata + cbData );
- resdata->lang = Language;
- resdata->codepage = codepage;
- resdata->cbData = cbData;
- memcpy( resdata->data, lpData, cbData );
-
add_resource_data_entry( &resname->children, resdata );
return TRUE;
}
+static struct resource_data *allocate_resource_data( WORD Language, DWORD codepage,
+ LPVOID lpData, DWORD cbData, BOOL copy_data )
+{
+ struct resource_data *resdata;
+
+ if (!lpData || !cbData)
+ return NULL;
+
+ resdata = HeapAlloc( GetProcessHeap(), 0, sizeof *resdata + (copy_data ? cbData : 0) );
+ if (resdata)
+ {
+ resdata->lang = Language;
+ resdata->codepage = codepage;
+ resdata->cbData = cbData;
+ if (copy_data)
+ {
+ resdata->lpData = &resdata[1];
+ memcpy( resdata->lpData, lpData, cbData );
+ }
+ else
+ resdata->lpData = lpData;
+ }
+
+ return resdata;
+}
+
static void free_resource_directory( struct list *head, int level )
{
struct list *ptr = NULL;
@@ -1184,7 +1204,7 @@ static BOOL write_resources( QUEUEDUPDAT
si->data_entry_ofs += sizeof (IMAGE_RESOURCE_DATA_ENTRY);
/* write out the resource data */
- memcpy( &base[si->data_ofs], data->data, data->cbData );
+ memcpy( &base[si->data_ofs], data->lpData, data->cbData );
si->data_ofs += data->cbData;
pad_size = (-si->data_ofs)&3;
@@ -1492,8 +1512,10 @@ BOOL WINAPI UpdateResourceW( HANDLE hUpd
updates = GlobalLock(hUpdate);
if (updates)
{
- ret = update_add_resource( updates, lpType, lpName,
- wLanguage, GetACP(), lpData, cbData );
+ struct resource_data *data;
+ data = allocate_resource_data( wLanguage, 0, lpData, cbData, TRUE );
+ if (data)
+ ret = update_add_resource( updates, lpType, lpName, data, TRUE );
GlobalUnlock(hUpdate);
}
return ret;
More information about the wine-cvs
mailing list