]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sysopt.cpp
fixing overrelease and out-of-bounds write, fixes #13725
[wxWidgets.git] / src / common / sysopt.cpp
index aa36947d7bb35cdcae11ea3d5cbb78555b7c9d61..4536efb4fbec529e3dbb6e0be9721594c17620f9 100644 (file)
@@ -1,12 +1,12 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        common/sysopt.cpp
+// Name:        src/common/sysopt.cpp
 // Purpose:     wxSystemOptions
 // Author:      Julian Smart
 // Modified by:
 // Created:     2001-07-10
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "sysopt.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
-#ifndef WX_PRECOMP
-    #include "wx/list.h"
-#endif
-
 #if wxUSE_SYSTEM_OPTIONS
 
-#include "wx/string.h"
 #include "wx/sysopt.h"
-#include "wx/module.h"
-#include "wx/arrstr.h"
 
-// ----------------------------------------------------------------------------
-// private classes
-// ----------------------------------------------------------------------------
-
-// the module which is used to clean up wxSystemOptions data (this is a
-// singleton class so it can't be done in the dtor)
-class wxSystemOptionsModule : public wxModule
-{
-    friend class WXDLLIMPEXP_BASE wxSystemOptions;
-public:
-    virtual bool OnInit();
-    virtual void OnExit();
-
-private:
-    DECLARE_DYNAMIC_CLASS(wxSystemOptionsModule)
-
-    static wxArrayString   sm_optionNames;
-    static wxArrayString   sm_optionValues;
-};
-
-// ===========================================================================
-// implementation
-// ===========================================================================
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/list.h"
+    #include "wx/string.h"
+    #include "wx/arrstr.h"
+#endif
 
 // ----------------------------------------------------------------------------
-// wxSystemOptionsModule
+// private globals
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxSystemOptionsModule, wxModule)
-
-wxArrayString wxSystemOptionsModule::sm_optionNames;
-wxArrayString wxSystemOptionsModule::sm_optionValues;
+static wxArrayString gs_optionNames,
+                     gs_optionValues;
 
-bool wxSystemOptionsModule::OnInit()
-{
-    return TRUE;
-}
-
-void wxSystemOptionsModule::OnExit()
-{
-    sm_optionNames.Clear();
-    sm_optionValues.Clear();
-}
-
-// ----------------------------------------------------------------------------
-// wxSystemOptions
-// ----------------------------------------------------------------------------
+// ============================================================================
+// wxSystemOptions implementation
+// ============================================================================
 
 // Option functions (arbitrary name/value mapping)
 void wxSystemOptions::SetOption(const wxString& name, const wxString& value)
 {
-    int idx = wxSystemOptionsModule::sm_optionNames.Index(name, FALSE);
+    int idx = gs_optionNames.Index(name, false);
     if (idx == wxNOT_FOUND)
     {
-        wxSystemOptionsModule::sm_optionNames.Add(name);
-        wxSystemOptionsModule::sm_optionValues.Add(value);
+        gs_optionNames.Add(name);
+        gs_optionValues.Add(value);
     }
     else
     {
-        wxSystemOptionsModule::sm_optionNames[idx] = name;
-        wxSystemOptionsModule::sm_optionValues[idx] = value;
+        gs_optionNames[idx] = name;
+        gs_optionValues[idx] = value;
     }
 }
 
 void wxSystemOptions::SetOption(const wxString& name, int value)
 {
-    wxString valStr;
-    valStr.Printf(wxT("%d"), value);
-    SetOption(name, valStr);
+    SetOption(name, wxString::Format(wxT("%d"), value));
 }
 
 wxString wxSystemOptions::GetOption(const wxString& name)
 {
-    int idx = wxSystemOptionsModule::sm_optionNames.Index(name, FALSE);
-    if (idx == wxNOT_FOUND)
-        return wxEmptyString;
-    else
-        return wxSystemOptionsModule::sm_optionValues[idx];
+    wxString val;
+
+    int idx = gs_optionNames.Index(name, false);
+    if ( idx != wxNOT_FOUND )
+    {
+        val = gs_optionValues[idx];
+    }
+    else // not set explicitly
+    {
+        // look in the environment: first for a variable named "wx_appname_name"
+        // which can be set to affect the behaviour or just this application
+        // and then for "wx_name" which can be set to change the option globally
+        wxString var(name);
+        var.Replace(wxT("."), wxT("_"));  // '.'s not allowed in env var names
+        var.Replace(wxT("-"), wxT("_"));  // and neither are '-'s
+
+        wxString appname;
+        if ( wxTheApp )
+            appname = wxTheApp->GetAppName();
+
+        if ( !appname.empty() )
+            val = wxGetenv(wxT("wx_") + appname + wxT('_') + var);
+
+        if ( val.empty() )
+            val = wxGetenv(wxT("wx_") + var);
+    }
+
+    return val;
 }
 
 int wxSystemOptions::GetOptionInt(const wxString& name)
 {
-    return wxAtoi(GetOption(name));
+    return wxAtoi (GetOption(name));
 }
 
 bool wxSystemOptions::HasOption(const wxString& name)
 {
-    return (wxSystemOptionsModule::sm_optionNames.Index(name, FALSE) != wxNOT_FOUND);
+    return !GetOption(name).empty();
 }
 
-#endif
-    // wxUSE_SYSTEM_OPTIONS
-
+#endif // wxUSE_SYSTEM_OPTIONS