From 943b9c56c0cbbcd5ae4d6cbcc30224922012e07b Mon Sep 17 00:00:00 2001
From: Andy Cedilnik <andy.cedilnik@kitware.com>
Date: Fri, 16 Sep 2005 09:08:40 -0400
Subject: [PATCH] COMP: Win32 fixes

---
 Registry.cxx    | 90 ++++++++++++++++++++++++++++++++++---------------
 Registry.hxx.in |  5 ++-
 2 files changed, 64 insertions(+), 31 deletions(-)

diff --git a/Registry.cxx b/Registry.cxx
index 365859f..3026bd8 100644
--- a/Registry.cxx
+++ b/Registry.cxx
@@ -25,6 +25,10 @@
 #include <ctype.h> // for isspace
 #include <stdio.h>
 
+#ifdef WIN32
+# include <windows.h>
+#endif
+
 #ifdef KWSYS_IOS_USE_ANSI
 # define VTK_IOS_NOCREATE 
 #else
@@ -64,9 +68,16 @@ public:
   void SetTopLevel(const char* tl);
   const char* GetTopLevel() { return m_TopLevel.c_str(); }
 
+  //! Read from local or global scope. On Windows this mean from local machine
+  // or local user. On unix this will read from $HOME/.Projectrc or 
+  // /etc/Project
+  void SetGlobalScope(bool b);
+  bool GetGlobalScope();
+
 protected:
   bool m_Changed;
   kwsys_stl::string m_TopLevel;  
+  bool m_GlobalScope;
 
 #ifdef WIN32
   HKEY HKey;
@@ -91,7 +102,6 @@ Registry::Registry(Registry::RegistryType registryType)
 {
   m_Opened      = false;
   m_Locked      = false;
-  m_GlobalScope = false;
   this->Helper = 0;
   this->Helper = new RegistryHelper(registryType);
 }
@@ -108,6 +118,18 @@ Registry::~Registry()
   delete this->Helper;
 }
 
+//----------------------------------------------------------------------------
+void Registry::SetGlobalScope(bool b)
+{
+  this->Helper->SetGlobalScope(b);
+}
+
+//----------------------------------------------------------------------------
+bool Registry::GetGlobalScope()
+{
+  return this->Helper->GetGlobalScope();
+}
+
 //----------------------------------------------------------------------------
 bool Registry::Open(const char *toplevel,
   const char *subkey, int readonly)
@@ -330,6 +352,7 @@ RegistryHelper::RegistryHelper(Registry::RegistryType registryType)
   m_SubKey  = "";
   m_SubKeySpecified = false;
   m_Empty       = true;
+  m_GlobalScope = false;
   m_RegistryType = registryType;
 }
 
@@ -344,7 +367,7 @@ bool RegistryHelper::Open(const char *toplevel, const char *subkey,
   int readonly)
 {  
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     HKEY scope = HKEY_CURRENT_USER;
     if ( this->GetGlobalScope() )
@@ -352,32 +375,31 @@ bool RegistryHelper::Open(const char *toplevel, const char *subkey,
       scope = HKEY_LOCAL_MACHINE;
       }
     int res = 0;
-    ostrstream str;
+    kwsys_ios::ostringstream str;
     DWORD dwDummy;
-    str << "Software\\Kitware\\" << toplevel << "\\" << subkey << ends;
-    if ( readonly == vtkKWRegistryUtilities::READONLY )
+    str << "Software\\Kitware\\" << toplevel << "\\" << subkey;
+    if ( readonly == Registry::READONLY )
       {
-      res = ( RegOpenKeyEx(scope, str.str(), 
+      res = ( RegOpenKeyEx(scope, str.str().c_str(), 
           0, KEY_READ, &this->HKey) == ERROR_SUCCESS );
       }
     else
       {
-      res = ( RegCreateKeyEx(scope, str.str(),
+      res = ( RegCreateKeyEx(scope, str.str().c_str(),
           0, "", REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE, 
           NULL, &this->HKey, &dwDummy) == ERROR_SUCCESS );    
       }
-    str.rdbuf()->freeze(0);
-    return res;
+    return (res != 0);
     }
 #endif
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
     {
-    int res = 0;
+    bool res = false;
     int cc;
     kwsys_ios::ostringstream str;
     if ( !getenv("HOME") )
       {
-      return 0;
+      return false; 
       }
     str << getenv("HOME") << "/." << toplevel << "rc";
     if ( readonly == Registry::READWRITE )
@@ -385,7 +407,7 @@ bool RegistryHelper::Open(const char *toplevel, const char *subkey,
       kwsys_ios::ofstream ofs( str.str().c_str(), kwsys_ios::ios::out|kwsys_ios::ios::app );
       if ( ofs.fail() )
         {
-        return 0;
+        return false;
         }
       ofs.close();
       }
@@ -393,15 +415,15 @@ bool RegistryHelper::Open(const char *toplevel, const char *subkey,
     kwsys_ios::ifstream *ifs = new kwsys_ios::ifstream(str.str().c_str(), kwsys_ios::ios::in VTK_IOS_NOCREATE);
     if ( !ifs )
       {
-      return 0;
+      return false;
       }
     if ( ifs->fail())
       {
       delete ifs;
-      return 0;
+      return false;
       }
 
-    res = 1;
+    res = true;
     char buffer[BUFFER_SIZE];
     while( !ifs->fail() )
       {
@@ -448,11 +470,11 @@ bool RegistryHelper::Open(const char *toplevel, const char *subkey,
 bool RegistryHelper::Close()
 {
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     int res;
     res = ( RegCloseKey(this->HKey) == ERROR_SUCCESS );    
-    return res;
+    return (res != 0);
     }
 #else
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
@@ -520,15 +542,15 @@ bool RegistryHelper::ReadValue(const char *skey, char *value)
 
 {
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     int res = 1;
     DWORD dwType, dwSize;  
     dwType = REG_SZ;
     dwSize = BUFFER_SIZE;
-    res = ( RegQueryValueEx(this->HKey, key, NULL, &dwType, 
+    res = ( RegQueryValueEx(this->HKey, skey, NULL, &dwType, 
         (BYTE *)value, &dwSize) == ERROR_SUCCESS );
-    return res;
+    return (res != 0);
     }
 #else
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
@@ -557,11 +579,11 @@ bool RegistryHelper::ReadValue(const char *skey, char *value)
 bool RegistryHelper::DeleteKey(const char* key)
 {
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     int res = 1;
     res = ( RegDeleteKey( this->HKey, key ) == ERROR_SUCCESS );
-    return res;
+    return (res != 0);
     }
 #else
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
@@ -578,11 +600,11 @@ bool RegistryHelper::DeleteKey(const char* key)
 bool RegistryHelper::DeleteValue(const char *skey)
 {
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     int res = 1;
-    res = ( RegDeleteValue( this->HKey, key ) == ERROR_SUCCESS );
-    return res;
+    res = ( RegDeleteValue( this->HKey, skey ) == ERROR_SUCCESS );
+    return (res != 0);
     }
 #else
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
@@ -604,14 +626,14 @@ bool RegistryHelper::DeleteValue(const char *skey)
 bool RegistryHelper::SetValue(const char *skey, const char *value)
 {
 #ifdef WIN32
-  if ( m_RegistryType == Registry::RegistryType::WIN32)
+  if ( m_RegistryType == Registry::WIN32_REGISTRY)
     {
     int res = 1;
     DWORD len = (DWORD)(value ? strlen(value) : 0);
-    res = ( RegSetValueEx(this->HKey, key, 0, REG_SZ, 
+    res = ( RegSetValueEx(this->HKey, skey, 0, REG_SZ, 
         (CONST BYTE *)(const char *)value, 
         len+1) == ERROR_SUCCESS );
-    return res;
+    return (res != 0);
     }
 #else
   if ( m_RegistryType == Registry::UNIX_REGISTRY )
@@ -688,4 +710,16 @@ char *RegistryHelper::Strip(char *str)
   return nstr;
 }
 
+//----------------------------------------------------------------------------
+void RegistryHelper::SetGlobalScope(bool b)
+{
+  m_GlobalScope = b;
+}
+
+//----------------------------------------------------------------------------
+bool RegistryHelper::GetGlobalScope()
+{
+  return m_GlobalScope;
+}
+
 } // namespace KWSYS_NAMESPACE
diff --git a/Registry.hxx.in b/Registry.hxx.in
index abdf4db..a7dd98a 100644
--- a/Registry.hxx.in
+++ b/Registry.hxx.in
@@ -75,8 +75,8 @@ public:
   // /etc/Project
   void GlobalScopeOn() { this->SetGlobalScope(1); }
   void GlobalScopeOff() { this->SetGlobalScope(0); }
-  void SetGlobalScope(bool b) { m_GlobalScope = b; }
-  bool GetGlobalScope() { return m_GlobalScope; }
+  void SetGlobalScope(bool b);
+  bool GetGlobalScope();
   
   // Set or get the toplevel registry key.
   void SetTopLevel(const char* tl);
@@ -102,7 +102,6 @@ private:
   bool m_Opened;
    
   bool m_Locked;
-  bool m_GlobalScope;
 }; // End Class: Registry
 
 } // namespace @KWSYS_NAMESPACE@
-- 
GitLab