]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/regconf.cpp
somehow log target wasn't being created automatically anymore. Restored.
[wxWidgets.git] / src / msw / regconf.cpp
index 9b6bdf0962b40cf2884ab983c19f9eef32637585..6e6d1da8d3220d06ffc1aa7443f3eb8fc4fcc829 100644 (file)
@@ -35,6 +35,7 @@
   #include  <wx/string.h>
 #endif //WX_PRECOMP
 
+#include <wx/app.h>
 #include <wx/log.h>
 #include <wx/config.h>
 #include <wx/msw/registry.h>
@@ -69,20 +70,75 @@ bool TryGetValue(const wxRegKey& key, const wxString& str, long *plVal)
 // ----------------------------------------------------------------------------
 // ctor/dtor
 // ----------------------------------------------------------------------------
-wxRegConfig::wxRegConfig(const wxString& strRoot)
-           : m_keyLocalRoot(wxRegKey::HKCU, SOFTWARE_KEY + strRoot),
-             m_keyLocal(m_keyLocalRoot, ""),
-             m_keyGlobalRoot(wxRegKey::HKLM, SOFTWARE_KEY + strRoot),
-             m_keyGlobal(m_keyGlobalRoot, "")
+
+// create the config object which stores its data under HKCU\vendor\app and, if
+// style & wxCONFIG_USE_GLOBAL_FILE, under HKLM\vendor\app
+wxRegConfig::wxRegConfig(const wxString& appName, const wxString& vendorName,
+                         const wxString& strLocal, const wxString& strGlobal,
+                         long style)
+           : wxConfigBase(appName, vendorName, strLocal, strGlobal, style)
 {
+  wxString strRoot;
+
+  bool bDoUseGlobal = (style & wxCONFIG_USE_GLOBAL_FILE) != 0;
+
+  // the convention is to put the programs keys under <vendor>\<appname>
+  // (but it can be overriden by specifying the pathes explicitly in strLocal
+  // and/or strGlobal)
+  if ( strLocal.IsEmpty() || (strGlobal.IsEmpty() && bDoUseGlobal) )
+  {
+    if ( vendorName.IsEmpty() )
+    {
+      if ( wxTheApp )
+        strRoot = wxTheApp->GetVendorName();
+    }
+    else
+    {
+      strRoot = vendorName;
+    }
+
+    // no '\\' needed if no vendor name
+    if ( !strRoot.IsEmpty() )
+    {
+      strRoot += '\\';
+    }
+
+    if ( appName.IsEmpty() )
+    {
+      wxCHECK_RET( wxTheApp, "No application name in wxRegConfig ctor!" );
+      strRoot << wxTheApp->GetAppName();
+    }
+    else
+    {
+      strRoot << appName;
+    }
+  }
+  //else: we don't need to do all the complicated stuff above
+
+  wxString str = strLocal.IsEmpty() ? strRoot : strLocal;
+  m_keyLocalRoot.SetName(wxRegKey::HKCU, SOFTWARE_KEY + str);
+  m_keyLocal.SetName(m_keyLocalRoot, "");
+
+  if ( bDoUseGlobal )
+  {
+    str = strGlobal.IsEmpty() ? strRoot : strGlobal;
+    m_keyGlobalRoot.SetName(wxRegKey::HKLM, SOFTWARE_KEY + str);
+    m_keyGlobal.SetName(m_keyGlobalRoot, "");
+  }
+
   // Create() will Open() if key already exists
   m_keyLocalRoot.Create();
 
   // as it's the same key, Open() shouldn't fail (i.e. no need for Create())
   m_keyLocal.Open();
 
-  wxLogNull nolog;
-  m_keyGlobalRoot.Open();
+  // OTOH, this key may perfectly not exist, so suppress error messages the call
+  // to Open() might generate
+  if ( bDoUseGlobal )
+  {
+    wxLogNull nolog;
+    m_keyGlobalRoot.Open();
+  }
 }
 
 wxRegConfig::~wxRegConfig()
@@ -252,11 +308,9 @@ bool wxRegConfig::HasEntry(const wxString& strName) const
 // reading/writing
 // ----------------------------------------------------------------------------
 
-bool wxRegConfig::Read(wxString *pStr,
-                       const char *szKey,
-                       const char *szDefault) const
+bool wxRegConfig::Read(const wxString& key, wxString *pStr) const
 {
-  PathChanger path(this, szKey);
+  wxConfigPathChanger path(this, key);
 
   bool bQueryGlobal = TRUE;
 
@@ -268,7 +322,7 @@ bool wxRegConfig::Read(wxString *pStr,
         wxLogWarning("User value for immutable key '%s' ignored.",
                    path.Name().c_str());
       }
-
+     *pStr = wxConfigBase::ExpandEnvVars(*pStr);
       return TRUE;
     }
     else {
@@ -281,10 +335,49 @@ bool wxRegConfig::Read(wxString *pStr,
   if ( TryGetValue(m_keyLocal, path.Name(), *pStr) ||
        (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), *pStr)) ) {
     // nothing to do
+
+    // TODO: do we return TRUE? Not in original implementation,
+    // but I don't see why not. -- JACS
+    *pStr = wxConfigBase::ExpandEnvVars(*pStr);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+bool wxRegConfig::Read(const wxString& key, wxString *pStr,
+                       const wxString& szDefault) const
+{
+  wxConfigPathChanger path(this, key);
+
+  bool bQueryGlobal = TRUE;
+
+  // if immutable key exists in global key we must check that it's not
+  // overriden by the local key with the same name
+  if ( IsImmutable(path.Name()) ) {
+    if ( TryGetValue(m_keyGlobal, path.Name(), *pStr) ) {
+      if ( m_keyLocal.HasValue(path.Name()) ) {
+        wxLogWarning("User value for immutable key '%s' ignored.",
+                   path.Name().c_str());
+      }
+
+      return TRUE;
+    }
+    else {
+      // don't waste time - it's not there anyhow
+      bQueryGlobal = FALSE;
+    }
+  }
+
+  // first try local key
+  if ( TryGetValue(m_keyLocal, path.Name(), *pStr) ||
+       (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), *pStr)) ) {
+    *pStr = wxConfigBase::ExpandEnvVars(*pStr);
+    return TRUE;
   }
   else {
     if ( IsRecordingDefaults() ) {
-      ((wxRegConfig*)this)->Write(szKey, szDefault);
+      ((wxRegConfig*)this)->Write(key, szDefault);
     }
 
     // default value
@@ -296,9 +389,9 @@ bool wxRegConfig::Read(wxString *pStr,
   return FALSE;
 }
 
-bool wxRegConfig::Read(long *plResult, const char *szKey, long lDefault) const
+bool wxRegConfig::Read(const wxString& key, long *plResult) const
 {
-  PathChanger path(this, szKey);
+  wxConfigPathChanger path(this, key);
 
   bool bQueryGlobal = TRUE;
 
@@ -324,15 +417,12 @@ bool wxRegConfig::Read(long *plResult, const char *szKey, long lDefault) const
        (bQueryGlobal && TryGetValue(m_keyGlobal, path.Name(), plResult)) ) {
     return TRUE;
   }
-
-  // default
-  *plResult = lDefault;
   return FALSE;
 }
 
-bool wxRegConfig::Write(const char *szKey, const char *szValue)
+bool wxRegConfig::Write(const wxString& key, const wxString& szValue)
 {
-  PathChanger path(this, szKey);
+  wxConfigPathChanger path(this, key);
 
   if ( IsImmutable(path.Name()) ) {
     wxLogError("Can't change immutable entry '%s'.", path.Name().c_str());
@@ -342,9 +432,9 @@ bool wxRegConfig::Write(const char *szKey, const char *szValue)
   return m_keyLocal.SetValue(path.Name(), szValue);
 }
 
-bool wxRegConfig::Write(const char *szKey, long lValue)
+bool wxRegConfig::Write(const wxString& key, long lValue)
 {
-  PathChanger path(this, szKey);
+  wxConfigPathChanger path(this, key);
 
   if ( IsImmutable(path.Name()) ) {
     wxLogError("Can't change immutable entry '%s'.", path.Name().c_str());
@@ -357,9 +447,9 @@ bool wxRegConfig::Write(const char *szKey, long lValue)
 // ----------------------------------------------------------------------------
 // deleting
 // ----------------------------------------------------------------------------
-bool wxRegConfig::DeleteEntry(const char *szValue, bool bGroupIfEmptyAlso)
+bool wxRegConfig::DeleteEntry(const wxString& value, bool bGroupIfEmptyAlso)
 {
-  PathChanger path(this, szValue);
+  wxConfigPathChanger path(this, value);
 
   if ( !m_keyLocal.DeleteValue(path.Name()) )
     return FALSE;
@@ -373,9 +463,9 @@ bool wxRegConfig::DeleteEntry(const char *szValue, bool bGroupIfEmptyAlso)
   return TRUE;
 }
 
-bool wxRegConfig::DeleteGroup(const char *szKey)
+bool wxRegConfig::DeleteGroup(const wxString& key)
 {
-  PathChanger path(this, szKey);
+  wxConfigPathChanger path(this, key);
 
   return m_keyLocal.DeleteKey(path.Name());
 }