]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/fdrepdlg.cpp
fix memory leak (coverity checker CID 53)
[wxWidgets.git] / src / msw / fdrepdlg.cpp
index 7c533fb4a321284b31e0632f233b070ff9074df8..7c6884739aa5ddf520c92c1acdd114fb8db0986c 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "mswfdrepdlg.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #include "wx/log.h"
 #endif
 
     #include "wx/log.h"
 #endif
 
-#include "wx/msw/private.h"
-
-#if !defined(__WIN32__) || defined(__WXWINCE__)
-    #include <commdlg.h>
-#endif
-
+#include "wx/msw/wrapcdlg.h"
 #include "wx/fdrepdlg.h"
 
 // ----------------------------------------------------------------------------
 #include "wx/fdrepdlg.h"
 
 // ----------------------------------------------------------------------------
 LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
                                        WPARAM wParam, LPARAM lParam);
 
 LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
                                        WPARAM wParam, LPARAM lParam);
 
-UINT CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
-                                          UINT uiMsg,
-                                          WPARAM wParam,
-                                          LPARAM lParam);
+UINT_PTR CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
+                                              UINT uiMsg,
+                                              WPARAM wParam,
+                                              LPARAM lParam);
 
 // ----------------------------------------------------------------------------
 // wxWin macros
 
 // ----------------------------------------------------------------------------
 // wxWin macros
@@ -82,7 +73,7 @@ public:
     FINDREPLACE *GetPtrFindReplace() { return &m_findReplace; }
 
     // set/query the "closed by user" flag
     FINDREPLACE *GetPtrFindReplace() { return &m_findReplace; }
 
     // set/query the "closed by user" flag
-    void SetClosedByUser() { m_wasClosedByUser = TRUE; }
+    void SetClosedByUser() { m_wasClosedByUser = true; }
     bool WasClosedByUser() const { return m_wasClosedByUser; }
 
 private:
     bool WasClosedByUser() const { return m_wasClosedByUser; }
 
 private:
@@ -97,7 +88,7 @@ private:
     // the find replace data used by the dialog
     FINDREPLACE m_findReplace;
 
     // the find replace data used by the dialog
     FINDREPLACE m_findReplace;
 
-    // TRUE if the user closed us, FALSE otherwise
+    // true if the user closed us, false otherwise
     bool m_wasClosedByUser;
 
     // registered Message for Dialog
     bool m_wasClosedByUser;
 
     // registered Message for Dialog
@@ -133,7 +124,7 @@ wxFindReplaceDialogImpl::wxFindReplaceDialogImpl(wxFindReplaceDialog *dialog,
     m_hwndOwner = NULL;
     m_oldParentWndProc = NULL;
 
     m_hwndOwner = NULL;
     m_oldParentWndProc = NULL;
 
-    m_wasClosedByUser = FALSE;
+    m_wasClosedByUser = false;
 
     wxZeroMemory(m_findReplace);
 
 
     wxZeroMemory(m_findReplace);
 
@@ -178,7 +169,7 @@ void wxFindReplaceDialogImpl::InitString(const wxString& str,
 
     *ppStr = new wxChar[len];
     wxStrcpy(*ppStr, str);
 
     *ppStr = new wxChar[len];
     wxStrcpy(*ppStr, str);
-    *pLen = len;
+    *pLen = (WORD)len;
 }
 
 void wxFindReplaceDialogImpl::InitFindWhat(const wxString& str)
 }
 
 void wxFindReplaceDialogImpl::InitFindWhat(const wxString& str)
@@ -199,17 +190,14 @@ void wxFindReplaceDialogImpl::SubclassDialog(HWND hwnd)
 
     // check that we don't subclass the parent twice: this would be a bad idea
     // as then we'd have infinite recursion in wxFindReplaceWindowProc
 
     // check that we don't subclass the parent twice: this would be a bad idea
     // as then we'd have infinite recursion in wxFindReplaceWindowProc
-    if ( !wxCheckWindowWndProc((WXHWND)hwnd, (WXFARPROC)wxFindReplaceWindowProc) )
-    {
-        WNDPROC oldParentWndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_WNDPROC);
-        // save old wnd proc elsewhere to access it from
-        // wxFindReplaceWindowProc
-        m_oldParentWndProc = oldParentWndProc;
-        (void)::SetWindowLong(hwnd, GWL_USERDATA, (LONG)oldParentWndProc);
-
-        // and set the new one
-        (void)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)wxFindReplaceWindowProc);
-    }
+    wxCHECK_RET( wxGetWindowProc(hwnd) != (void *)wxFindReplaceWindowProc,
+                 _T("can't have more than one find dialog currently") );
+
+    // set the new one and save the old as user data to allow access to it
+    // from wxFindReplaceWindowProc
+    m_oldParentWndProc = wxSetWindowProc(hwnd, wxFindReplaceWindowProc);
+
+    wxSetWindowUserData(hwnd, (void *)m_oldParentWndProc);
 }
 
 wxFindReplaceDialogImpl::~wxFindReplaceDialogImpl()
 }
 
 wxFindReplaceDialogImpl::~wxFindReplaceDialogImpl()
@@ -219,7 +207,8 @@ wxFindReplaceDialogImpl::~wxFindReplaceDialogImpl()
 
     if ( m_hwndOwner )
     {
 
     if ( m_hwndOwner )
     {
-        ::SetWindowLong(m_hwndOwner, GWL_WNDPROC, (LONG)m_oldParentWndProc);
+        // undo subclassing
+        wxSetWindowProc(m_hwndOwner, m_oldParentWndProc);
     }
 }
 
     }
 }
 
@@ -249,7 +238,7 @@ LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
         // of UNICOWS.DLL send the correct UNICODE item after button press
         // and a bogus ANSI mode item right after this, so lets ignore
         // the second bogus message
         // of UNICOWS.DLL send the correct UNICODE item after button press
         // and a bogus ANSI mode item right after this, so lets ignore
         // the second bogus message
-        if ( s_lastMsgFlags == pFR->Flags )
+        if ( wxUsingUnicowsDll() && s_lastMsgFlags == pFR->Flags )
         {
             s_lastMsgFlags = 0;
             return 0;
         {
             s_lastMsgFlags = 0;
             return 0;
@@ -262,7 +251,7 @@ LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
         // map flags from Windows
         wxEventType evtType;
 
         // map flags from Windows
         wxEventType evtType;
 
-        bool replace = FALSE;
+        bool replace = false;
         if ( pFR->Flags & FR_DIALOGTERM )
         {
             // we have to notify the dialog that it's being closed by user and
         if ( pFR->Flags & FR_DIALOGTERM )
         {
             // we have to notify the dialog that it's being closed by user and
@@ -280,13 +269,13 @@ LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
         {
             evtType = wxEVT_COMMAND_FIND_REPLACE;
 
         {
             evtType = wxEVT_COMMAND_FIND_REPLACE;
 
-            replace = TRUE;
+            replace = true;
         }
         else if ( pFR->Flags & FR_REPLACEALL )
         {
             evtType = wxEVT_COMMAND_FIND_REPLACE_ALL;
 
         }
         else if ( pFR->Flags & FR_REPLACEALL )
         {
             evtType = wxEVT_COMMAND_FIND_REPLACE_ALL;
 
-            replace = TRUE;
+            replace = true;
         }
         else
         {
         }
         else
         {
@@ -327,7 +316,7 @@ LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
         s_lastMsgFlags = 0;
 #endif // wxUSE_UNICODE_MSLU
 
         s_lastMsgFlags = 0;
 #endif // wxUSE_UNICODE_MSLU
 
-    WNDPROC wndProc = (WNDPROC)::GetWindowLong(hwnd, GWL_USERDATA);
+    WNDPROC wndProc = (WNDPROC)wxGetWindowUserData(hwnd);
 
     // sanity check
     wxASSERT_MSG( wndProc != wxFindReplaceWindowProc,
 
     // sanity check
     wxASSERT_MSG( wndProc != wxFindReplaceWindowProc,
@@ -340,10 +329,11 @@ LRESULT APIENTRY wxFindReplaceWindowProc(HWND hwnd, WXUINT nMsg,
 // Find/replace dialog hook proc
 // ----------------------------------------------------------------------------
 
 // Find/replace dialog hook proc
 // ----------------------------------------------------------------------------
 
-UINT CALLBACK wxFindReplaceDialogHookProc(HWND hwnd,
-                                          UINT uiMsg,
-                                          WPARAM WXUNUSED(wParam),
-                                          LPARAM lParam)
+UINT_PTR CALLBACK
+wxFindReplaceDialogHookProc(HWND hwnd,
+                            UINT uiMsg,
+                            WPARAM WXUNUSED(wParam),
+                            LPARAM lParam)
 {
     if ( uiMsg == WM_INITDIALOG )
     {
 {
     if ( uiMsg == WM_INITDIALOG )
     {
@@ -373,7 +363,7 @@ void wxFindReplaceDialog::Init()
     m_FindReplaceData = NULL;
 
     // as we're created in the hidden state, bring the internal flag in sync
     m_FindReplaceData = NULL;
 
     // as we're created in the hidden state, bring the internal flag in sync
-    m_isShown = FALSE;
+    m_isShown = false;
 }
 
 wxFindReplaceDialog::wxFindReplaceDialog(wxWindow *parent,
 }
 
 wxFindReplaceDialog::wxFindReplaceDialog(wxWindow *parent,
@@ -405,7 +395,7 @@ wxFindReplaceDialog::~wxFindReplaceDialog()
     delete m_impl;
 
     // prevent the base class dtor from trying to hide us!
     delete m_impl;
 
     // prevent the base class dtor from trying to hide us!
-    m_isShown = FALSE;
+    m_isShown = false;
 
     // and from destroying our window [again]
     m_hWnd = (WXHWND)NULL;
 
     // and from destroying our window [again]
     m_hWnd = (WXHWND)NULL;
@@ -435,7 +425,7 @@ bool wxFindReplaceDialog::Show(bool show)
     if ( !wxWindowBase::Show(show) )
     {
         // visibility status didn't change
     if ( !wxWindowBase::Show(show) )
     {
         // visibility status didn't change
-        return FALSE;
+        return false;
     }
 
     // do we already have the dialog window?
     }
 
     // do we already have the dialog window?
@@ -444,16 +434,16 @@ bool wxFindReplaceDialog::Show(bool show)
         // yes, just use it
         (void)::ShowWindow(GetHwnd(), show ? SW_SHOW : SW_HIDE);
 
         // yes, just use it
         (void)::ShowWindow(GetHwnd(), show ? SW_SHOW : SW_HIDE);
 
-        return TRUE;
+        return true;
     }
 
     if ( !show )
     {
         // well, it doesn't exist which is as good as being hidden
     }
 
     if ( !show )
     {
         // well, it doesn't exist which is as good as being hidden
-        return TRUE;
+        return true;
     }
 
     }
 
-    wxCHECK_MSG( m_FindReplaceData, FALSE, _T("call Create() first!") );
+    wxCHECK_MSG( m_FindReplaceData, false, _T("call Create() first!") );
 
     wxASSERT_MSG( !m_impl, _T("why don't we have the window then?") );
 
 
     wxASSERT_MSG( !m_impl, _T("why don't we have the window then?") );
 
@@ -483,7 +473,7 @@ bool wxFindReplaceDialog::Show(bool show)
         delete m_impl;
         m_impl = NULL;
 
         delete m_impl;
         m_impl = NULL;
 
-        return FALSE;
+        return false;
     }
 
     // subclass parent window in order to get FINDMSGSTRING message
     }
 
     // subclass parent window in order to get FINDMSGSTRING message
@@ -496,7 +486,7 @@ bool wxFindReplaceDialog::Show(bool show)
 
     m_hWnd = (WXHWND)hwnd;
 
 
     m_hWnd = (WXHWND)hwnd;
 
-    return TRUE;
+    return true;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------