[patch 1/3] user32: put some repeated code for checking and extending of a MENUITEMINFO structure in a separate function.

Rein Klazes wijn at online.nl
Thu Jul 23 00:56:06 CDT 2009


Note: this is the first patch of three to put all updating of menu
item to a single place. Now there are two internal routines that do
essentially the same thing. Of the two SetMenuItemInfo_common duplicates
code depending if the MIIM_TYPE flag is used or the newer (winver >= 5)
menuiteminfo flags. Cleaning this up should make it makes it easier to
fix issues with menu loop prevention and menu locking.
---
 dlls/user32/menu.c |   91 +++++++++++++++++++++++----------------------------
 1 files changed, 41 insertions(+), 50 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index f68393d..07447ad 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -4769,27 +4769,44 @@ static BOOL SetMenuItemInfo_common(MENUITEM * menu,
 }
 
 /**********************************************************************
+ *		MENU_NormalizeMenuItemInfoStruct
+ *
+ * Helper for SetMenuItemInfo and InsertMenuItemInfo:
+ * check, copy and extend the MENUITEMINFO struct from the version that the application
+ * supplied to the version used by wine source. */
+static BOOL MENU_NormalizeMenuItemInfoStruct(  const MENUITEMINFOW *pmii_in,
+         MENUITEMINFOW *pmii_out)
+{
+    /* do we recognized the size? */
+    if( pmii_in->cbSize != sizeof( MENUITEMINFOW) &&
+            pmii_in->cbSize != sizeof( MENUITEMINFOW) - sizeof( pmii_in->hbmpItem)) {
+        SetLastError( ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+    /* copy the fields that we have */
+    memcpy( pmii_out, pmii_in, pmii_in->cbSize);
+    /* if the hbmpItem member is missing then extend */
+    if( pmii_in->cbSize != sizeof( MENUITEMINFOW)) {
+        pmii_out->cbSize = sizeof( MENUITEMINFOW);
+        pmii_out->hbmpItem = NULL;
+    }
+    return TRUE;
+}
+
+/**********************************************************************
  *		SetMenuItemInfoA    (USER32.@)
  */
 BOOL WINAPI SetMenuItemInfoA(HMENU hmenu, UINT item, BOOL bypos,
                                  const MENUITEMINFOA *lpmii)
 {
-    MENUITEMINFOA mii;
+    MENUITEMINFOW mii;
 
     TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
 
-    if( lpmii->cbSize != sizeof( mii) &&
-            lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
-        SetLastError( ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    memcpy( &mii, lpmii, lpmii->cbSize);
-    if( lpmii->cbSize != sizeof( mii)) {
-        mii.cbSize = sizeof( mii);
-        mii.hbmpItem = NULL;
-    }
-    return SetMenuItemInfo_common(MENU_FindItem(&hmenu, &item, bypos? MF_BYPOSITION : 0),
-				    (const MENUITEMINFOW *)&mii, FALSE);
+    if( MENU_NormalizeMenuItemInfoStruct( (MENUITEMINFOW *)lpmii, &mii))
+        return SetMenuItemInfo_common( MENU_FindItem(&hmenu,
+                    &item, bypos? MF_BYPOSITION : 0), &mii, FALSE);
+    return FALSE;
 }
 
 /**********************************************************************
@@ -4802,18 +4819,10 @@ BOOL WINAPI SetMenuItemInfoW(HMENU hmenu, UINT item, BOOL bypos,
 
     TRACE("hmenu %p, item %u, by pos %d, info %p\n", hmenu, item, bypos, lpmii);
 
-    if( lpmii->cbSize != sizeof( mii) &&
-            lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
-        SetLastError( ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    memcpy( &mii, lpmii, lpmii->cbSize);
-    if( lpmii->cbSize != sizeof( mii)) {
-        mii.cbSize = sizeof( mii);
-        mii.hbmpItem = NULL;
-    }
-    return SetMenuItemInfo_common(MENU_FindItem(&hmenu,
-                &item, bypos? MF_BYPOSITION : 0), &mii, TRUE);
+    if( MENU_NormalizeMenuItemInfoStruct( lpmii, &mii))
+        return SetMenuItemInfo_common(MENU_FindItem(&hmenu,
+                    &item, bypos? MF_BYPOSITION : 0), &mii, TRUE);
+    return FALSE;
 }
 
 /**********************************************************************
@@ -4914,23 +4923,14 @@ BOOL WINAPI InsertMenuItemA(HMENU hMenu, UINT uItem, BOOL bypos,
                                 const MENUITEMINFOA *lpmii)
 {
     MENUITEM *item;
-    MENUITEMINFOA mii;
+    MENUITEMINFOW mii;
 
     TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
 
-    if( lpmii->cbSize != sizeof( mii) &&
-            lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
-        SetLastError( ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    memcpy( &mii, lpmii, lpmii->cbSize);
-    if( lpmii->cbSize != sizeof( mii)) {
-        mii.cbSize = sizeof( mii);
-        mii.hbmpItem = NULL;
-    }
-
     item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
-    return SetMenuItemInfo_common(item, (const MENUITEMINFOW *)&mii, FALSE);
+    if( MENU_NormalizeMenuItemInfoStruct( (MENUITEMINFOW *)lpmii, &mii))
+        return SetMenuItemInfo_common(item, &mii, FALSE);
+    return FALSE;
 }
 
 
@@ -4945,19 +4945,10 @@ BOOL WINAPI InsertMenuItemW(HMENU hMenu, UINT uItem, BOOL bypos,
 
     TRACE("hmenu %p, item %04x, by pos %d, info %p\n", hMenu, uItem, bypos, lpmii);
 
-    if( lpmii->cbSize != sizeof( mii) &&
-            lpmii->cbSize != sizeof( mii) - sizeof ( mii.hbmpItem)) {
-        SetLastError( ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    memcpy( &mii, lpmii, lpmii->cbSize);
-    if( lpmii->cbSize != sizeof( mii)) {
-        mii.cbSize = sizeof( mii);
-        mii.hbmpItem = NULL;
-    }
-
     item = MENU_InsertItem(hMenu, uItem, bypos ? MF_BYPOSITION : 0 );
-    return SetMenuItemInfo_common(item, &mii, TRUE);
+    if( MENU_NormalizeMenuItemInfoStruct( lpmii, &mii))
+        return SetMenuItemInfo_common(item, &mii, TRUE);
+    return FALSE;
 }
 
 /**********************************************************************
-- 
1.6.3.3




More information about the wine-patches mailing list