Detlef Riekenberg : inetcpl: Add a security propsheet.

Alexandre Julliard julliard at winehq.org
Wed Apr 13 10:49:30 CDT 2011


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

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Wed Apr 13 05:33:47 2011 +0200

inetcpl: Add a security propsheet.

---

 dlls/inetcpl.cpl/Makefile.in |    5 +-
 dlls/inetcpl.cpl/cpl_En.rc   |   12 +++
 dlls/inetcpl.cpl/inetcpl.c   |   18 ++++
 dlls/inetcpl.cpl/inetcpl.h   |   25 +++++-
 dlls/inetcpl.cpl/security.c  |  195 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 252 insertions(+), 3 deletions(-)

diff --git a/dlls/inetcpl.cpl/Makefile.in b/dlls/inetcpl.cpl/Makefile.in
index 8046dc7..98a1930 100644
--- a/dlls/inetcpl.cpl/Makefile.in
+++ b/dlls/inetcpl.cpl/Makefile.in
@@ -1,11 +1,12 @@
 MODULE    = inetcpl.cpl
 IMPORTS   = comctl32 shlwapi user32 advapi32
-DELAYIMPORTS = cryptui wininet
+DELAYIMPORTS = cryptui wininet ole32 urlmon
 
 C_SRCS = \
 	content.c \
 	general.c \
-	inetcpl.c
+	inetcpl.c \
+	security.c
 
 RC_SRCS = \
 	cpl_De.rc \
diff --git a/dlls/inetcpl.cpl/cpl_En.rc b/dlls/inetcpl.cpl/cpl_En.rc
index f8459b4..cd7f5f5 100644
--- a/dlls/inetcpl.cpl/cpl_En.rc
+++ b/dlls/inetcpl.cpl/cpl_En.rc
@@ -67,6 +67,18 @@ BEGIN
 
 END
 
+/* "Security" propsheet */
+IDD_SECURITY DIALOG  0, 0, 320, 220
+STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
+FONT 8, "MS Shell Dlg"
+CAPTION "Security"
+BEGIN
+
+    CONTROL     "Listview", IDC_SEC_LISTVIEW, "SysListView32",
+                LVS_ICON | LVS_ALIGNLEFT | LVS_AUTOARRANGE | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_VSCROLL,
+                4, 4, 312, 58
+END
+
 /* "Content" propsheet */
 IDD_CONTENT DIALOG  0, 0, 320, 220
 STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
diff --git a/dlls/inetcpl.cpl/inetcpl.c b/dlls/inetcpl.cpl/inetcpl.c
index 49cd892..019a0af 100644
--- a/dlls/inetcpl.cpl/inetcpl.c
+++ b/dlls/inetcpl.cpl/inetcpl.c
@@ -20,6 +20,8 @@
  */
 
 #define NONAMELESSUNION
+#define COBJMACROS
+#define CONST_VTABLE
 
 #include <stdarg.h>
 #include <windef.h>
@@ -28,6 +30,7 @@
 #include <winuser.h>
 #include <commctrl.h>
 #include <cpl.h>
+#include "ole2.h"
 
 #include "wine/debug.h"
 
@@ -82,10 +85,17 @@ static int CALLBACK propsheet_callback(HWND hwnd, UINT msg, LPARAM lparam)
  */
 static void display_cpl_sheets(HWND parent)
 {
+    INITCOMMONCONTROLSEX icex;
     PROPSHEETPAGEW psp[NUM_PROPERTY_PAGES];
     PROPSHEETHEADERW psh;
     DWORD id = 0;
 
+    OleInitialize(NULL);
+    /* Initialize common controls */
+    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
+    icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_BAR_CLASSES;
+    InitCommonControlsEx(&icex);
+
     ZeroMemory(&psh, sizeof(psh));
     ZeroMemory(psp, sizeof(psp));
 
@@ -98,6 +108,12 @@ static void display_cpl_sheets(HWND parent)
 
     psp[id].dwSize = sizeof (PROPSHEETPAGEW);
     psp[id].hInstance = hcpl;
+    psp[id].u.pszTemplate = MAKEINTRESOURCEW(IDD_SECURITY);
+    psp[id].pfnDlgProc = security_dlgproc;
+    id++;
+
+    psp[id].dwSize = sizeof (PROPSHEETPAGEW);
+    psp[id].hInstance = hcpl;
     psp[id].u.pszTemplate = MAKEINTRESOURCEW(IDD_CONTENT);
     psp[id].pfnDlgProc = content_dlgproc;
     id++;
@@ -115,6 +131,8 @@ static void display_cpl_sheets(HWND parent)
 
     /* display the dialog */
     PropertySheetW(&psh);
+
+    OleUninitialize();
 }
 
 /*********************************************************************
diff --git a/dlls/inetcpl.cpl/inetcpl.h b/dlls/inetcpl.cpl/inetcpl.h
index 45b1ba4..1797b49 100644
--- a/dlls/inetcpl.cpl/inetcpl.h
+++ b/dlls/inetcpl.cpl/inetcpl.h
@@ -24,11 +24,31 @@
 
 #include <windef.h>
 #include <winuser.h>
-
+#include <commctrl.h>
 
 extern HMODULE hcpl;
 INT_PTR CALLBACK content_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
 INT_PTR CALLBACK general_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
+INT_PTR CALLBACK security_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
+
+/* ## Memory allocation functions ## */
+
+static inline void * __WINE_ALLOC_SIZE(1) heap_alloc( size_t len )
+{
+    return HeapAlloc( GetProcessHeap(), 0, len );
+}
+
+static inline void * __WINE_ALLOC_SIZE(1) heap_alloc_zero( size_t len )
+{
+    return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
+}
+
+static inline BOOL heap_free( void *mem )
+{
+    return HeapFree( GetProcessHeap(), 0, mem );
+}
+
+/* ######### */
 
 #define NUM_PROPERTY_PAGES 8
 
@@ -57,6 +77,9 @@ INT_PTR CALLBACK general_dlgproc(HWND, UINT, WPARAM, LPARAM) DECLSPEC_HIDDEN;
 #define IDC_DELETE_FORM_DATA   1014
 #define IDC_DELETE_PASSWORDS   1015
 
+#define IDD_SECURITY        2000
+#define IDC_SEC_LISTVIEW    2001
+
 #define IDD_CONTENT         4000
 #define IDC_CERT            4100
 #define IDC_CERT_PUBLISHER  4101
diff --git a/dlls/inetcpl.cpl/security.c b/dlls/inetcpl.cpl/security.c
new file mode 100644
index 0000000..e853dd0
--- /dev/null
+++ b/dlls/inetcpl.cpl/security.c
@@ -0,0 +1,195 @@
+/*
+ * Internet control panel applet: security propsheet
+ *
+ * Copyright 2011 Detlef Riekenberg
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ */
+
+#define COBJMACROS
+#define CONST_VTABLE
+#define NONAMELESSUNION
+
+#include <stdarg.h>
+#include <windef.h>
+#include <winbase.h>
+#include <winuser.h>
+#include <prsht.h>
+#include "commctrl.h"
+
+#include "ole2.h"
+#include "urlmon.h"
+#include "initguid.h"
+#include "winreg.h"
+#include "shlwapi.h"
+
+#include "inetcpl.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(inetcpl);
+
+typedef struct secdlg_data_s {
+    HWND hsec;  /* security propsheet */
+    HWND hlv;   /* listview */
+    IInternetSecurityManager *sec_mgr;
+    IInternetZoneManager *zone_mgr;
+    DWORD zone_enumerator;
+    DWORD num_zones;
+} secdlg_data;
+
+/*********************************************************************
+ * security_cleanup_zones [internal]
+ *
+ */
+static void security_cleanup_zones(secdlg_data *sd)
+{
+    if (sd->zone_enumerator) {
+        IInternetZoneManager_DestroyZoneEnumerator(sd->zone_mgr, sd->zone_enumerator);
+    }
+
+    if (sd->zone_mgr) {
+        IInternetZoneManager_Release(sd->zone_mgr);
+    }
+
+    if (sd->sec_mgr) {
+        IInternetSecurityManager_Release(sd->sec_mgr);
+    }
+}
+
+/*********************************************************************
+ * security_enum_zones [internal]
+ *
+ */
+static HRESULT security_enum_zones(secdlg_data * sd)
+{
+    HRESULT hr;
+
+    hr = CoInternetCreateSecurityManager(NULL, &sd->sec_mgr, 0);
+    if (SUCCEEDED(hr)) {
+        hr = CoInternetCreateZoneManager(NULL, &sd->zone_mgr, 0);
+        if (SUCCEEDED(hr)) {
+            hr = IInternetZoneManager_CreateZoneEnumerator(sd->zone_mgr, &sd->zone_enumerator, &sd->num_zones, 0);
+        }
+    }
+    return hr;
+}
+
+/*********************************************************************
+ * security_on_destroy [internal]
+ *
+ * handle WM_NCDESTROY
+ *
+ */
+static INT_PTR security_on_destroy(secdlg_data * sd)
+{
+    TRACE("(%p)\n", sd);
+
+    security_cleanup_zones(sd);
+    SetWindowLongPtrW(sd->hsec, DWLP_USER, 0);
+    heap_free(sd);
+    return TRUE;
+}
+
+/*********************************************************************
+ * security_on_initdialog [internal]
+ *
+ * handle WM_INITDIALOG
+ *
+ */
+static INT_PTR security_on_initdialog(HWND hsec)
+{
+    secdlg_data *sd;
+    HRESULT hr;
+
+    sd = heap_alloc_zero(sizeof(secdlg_data));
+    SetWindowLongPtrW(hsec, DWLP_USER, (LONG_PTR) sd);
+    if (!sd) {
+        return FALSE;
+    }
+
+    sd->hsec = hsec;
+    sd->hlv = GetDlgItem(hsec, IDC_SEC_LISTVIEW);
+
+    hr = security_enum_zones(sd);
+    if (FAILED(hr)) {
+        ERR("got 0x%x\n", hr);
+        security_on_destroy(sd);
+        return FALSE;
+    }
+
+    TRACE("found %d zones\n", sd->num_zones);
+    return TRUE;
+}
+
+/*********************************************************************
+ * security_on_notify [internal]
+ *
+ * handle WM_NOTIFY
+ *
+ */
+static INT_PTR security_on_notify(WPARAM wparam, LPARAM lparam)
+{
+    NMLISTVIEW *nm;
+
+    nm = (NMLISTVIEW *) lparam;
+    switch (nm->hdr.code)
+    {
+        case PSN_APPLY:
+            TRACE("PSN_APPLY (0x%lx, 0x%lx) from %p with code: %d\n", wparam, lparam,
+                    nm->hdr.hwndFrom, nm->hdr.code);
+            break;
+
+        default:
+            TRACE("WM_NOTIFY (0x%lx, 0x%lx) from %p with code: %d\n", wparam, lparam,
+                    nm->hdr.hwndFrom, nm->hdr.code);
+
+    }
+    return FALSE;
+}
+
+/*********************************************************************
+ * security_dlgproc [internal]
+ *
+ */
+INT_PTR CALLBACK security_dlgproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+    secdlg_data *sd;
+
+    if (msg == WM_INITDIALOG) {
+        return security_on_initdialog(hwnd);
+    }
+
+    sd = (secdlg_data *)GetWindowLongPtrW(hwnd, DWLP_USER);
+    if (sd) {
+        switch (msg)
+        {
+            case WM_NOTIFY:
+                return security_on_notify(wparam, lparam);
+
+            case WM_NCDESTROY:
+                return security_on_destroy(sd);
+
+            default:
+                /* do not flood the log */
+                if ((msg == WM_SETCURSOR) || (msg == WM_NCHITTEST) ||
+                    (msg == WM_MOUSEMOVE) || (msg == WM_MOUSEACTIVATE) || (msg == WM_PARENTNOTIFY))
+                    return FALSE;
+
+                TRACE("(%p, 0x%08x/%03d, 0x%08lx, 0x%08lx)\n", hwnd, msg, msg, wparam, lparam);
+        }
+    }
+    return FALSE;
+}




More information about the wine-cvs mailing list