Alexandre Julliard : shell32: Remove the applet valid flag and improve the error handling.

Alexandre Julliard julliard at winehq.org
Wed Jun 6 15:35:17 CDT 2012


Module: wine
Branch: master
Commit: 2729cc1b3d34387dcb8ae0ce2a7d6d9e9ac81b0b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2729cc1b3d34387dcb8ae0ce2a7d6d9e9ac81b0b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jun  6 11:46:20 2012 +0200

shell32: Remove the applet valid flag and improve the error handling.

---

 dlls/shell32/control.c |   44 +++++++++++++++++++-------------------------
 dlls/shell32/cpanel.h  |    1 -
 2 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/dlls/shell32/control.c b/dlls/shell32/control.c
index cb080d5..d8e4df1 100644
--- a/dlls/shell32/control.c
+++ b/dlls/shell32/control.c
@@ -49,10 +49,9 @@ void Control_UnloadApplet(CPlApplet* applet)
 {
     unsigned	i;
 
-    for (i = 0; i < applet->count; i++) {
-        if (!applet->info[i].valid) continue;
+    for (i = 0; i < applet->count; i++)
         applet->proc(applet->hWnd, CPL_STOP, i, applet->info[i].data);
-    }
+
     if (applet->proc) applet->proc(applet->hWnd, CPL_EXIT, 0L, 0L);
     FreeLibrary(applet->hModule);
     list_remove( &applet->entry );
@@ -70,6 +69,13 @@ CPlApplet*	Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel)
     if (!(applet = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*applet))))
        return applet;
 
+    if (!(applet->cmd = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmd)+1) * sizeof(WCHAR)))) {
+        WARN("Cannot allocate memory for applet path\n");
+        goto theError;
+    }
+
+    lstrcpyW(applet->cmd, cmd);
+
     applet->hWnd = hWnd;
 
     if (!(applet->hModule = LoadLibraryW(cmd))) {
@@ -86,23 +92,16 @@ CPlApplet*	Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel)
     }
     if ((applet->count = applet->proc(hWnd, CPL_GETCOUNT, 0L, 0L)) == 0) {
         WARN("No subprogram in applet\n");
+        applet->proc(applet->hWnd, CPL_EXIT, 0, 0);
 	goto theError;
     }
 
     applet = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, applet,
-			 sizeof(*applet) + (applet->count - 1) * sizeof(NEWCPLINFOW));
-
-    if (!(applet->cmd = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(cmd)+1) * sizeof(WCHAR)))) {
-        WARN("Cannot allocate memory for applet path\n");
-        goto theError;
-    }
-
-    lstrcpyW(applet->cmd, cmd);
+                         FIELD_OFFSET( CPlApplet, info[applet->count] ));
 
     for (i = 0; i < applet->count; i++) {
        ZeroMemory(&newinfo, sizeof(newinfo));
        newinfo.dwSize = sizeof(NEWCPLINFOA);
-       applet->info[i].valid = TRUE;
        applet->info[i].helpfile[0] = 0;
        /* proc is supposed to return a null value upon success for
 	* CPL_INQUIRE and CPL_NEWINQUIRE
@@ -170,7 +169,9 @@ CPlApplet*	Control_LoadApplet(HWND hWnd, LPCWSTR cmd, CPanel* panel)
     return applet;
 
  theError:
-    Control_UnloadApplet(applet);
+    FreeLibrary(applet->hModule);
+    HeapFree(GetProcessHeap(), 0, applet->cmd);
+    HeapFree(GetProcessHeap(), 0, applet);
     return NULL;
 }
 
@@ -277,9 +278,6 @@ static void 	 Control_WndProc_Create(HWND hWnd, const CREATESTRUCTW* cs)
    LIST_FOR_EACH_ENTRY( applet, &panel->applets, CPlApplet, entry )
    {
       for (i = 0; i < applet->count; i++) {
-         if (!applet->info[i].valid)
-            continue;
-
          /* set up a CPlItem for this particular subprogram */
          item = HeapAlloc(GetProcessHeap(), 0, sizeof(CPlItem));
 
@@ -787,12 +785,10 @@ static	void	Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
         /* we've been given a textual parameter (or none at all) */
         if (sp == -1) {
             while ((++sp) != applet->count) {
-                if (applet->info[sp].valid) {
-                    TRACE("sp %d, name %s\n", sp, debugstr_w(applet->info[sp].name));
+                TRACE("sp %d, name %s\n", sp, debugstr_w(applet->info[sp].name));
 
-                    if (StrCmpIW(extraPmts, applet->info[sp].name) == 0)
-                        break;
-                }
+                if (StrCmpIW(extraPmts, applet->info[sp].name) == 0)
+                    break;
             }
         }
 
@@ -801,10 +797,8 @@ static	void	Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
             sp = 0;
         }
 
-        if (applet->info[sp].valid) {
-            if (!applet->proc(applet->hWnd, CPL_STARTWPARMSW, sp, (LPARAM)extraPmts))
-                applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].data);
-        }
+        if (!applet->proc(applet->hWnd, CPL_STARTWPARMSW, sp, (LPARAM)extraPmts))
+            applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].data);
 
         Control_UnloadApplet(applet);
     }
diff --git a/dlls/shell32/cpanel.h b/dlls/shell32/cpanel.h
index 7974d06..285fa8e 100644
--- a/dlls/shell32/cpanel.h
+++ b/dlls/shell32/cpanel.h
@@ -26,7 +26,6 @@
 
 struct applet_info
 {
-    BOOL     valid;
     LONG_PTR data;
     HICON    icon;
     WCHAR    name[256];




More information about the wine-cvs mailing list