Module: wine Branch: master Commit: 2729cc1b3d34387dcb8ae0ce2a7d6d9e9ac81b0b URL: http://source.winehq.org/git/wine.git/?a=commit;h=2729cc1b3d34387dcb8ae0ce2a...
Author: Alexandre Julliard julliard@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];