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