summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/PropertiesI.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2009-07-29 21:50:06 +0200
committerJose <jose@zeroc.com>2009-07-29 21:50:06 +0200
commitdb9adf0e14f01d0aa8eb288a172995847c006f57 (patch)
tree9690b02e0f0c85377c0feedb18b3a203d73928fb /cpp/src/Ice/PropertiesI.cpp
parentbug 4003 - update bindist READMEs for bzip2 (diff)
downloadice-db9adf0e14f01d0aa8eb288a172995847c006f57.tar.bz2
ice-db9adf0e14f01d0aa8eb288a172995847c006f57.tar.xz
ice-db9adf0e14f01d0aa8eb288a172995847c006f57.zip
Changes for bug 3962 and 4714
Diffstat (limited to 'cpp/src/Ice/PropertiesI.cpp')
-rw-r--r--cpp/src/Ice/PropertiesI.cpp126
1 files changed, 109 insertions, 17 deletions
diff --git a/cpp/src/Ice/PropertiesI.cpp b/cpp/src/Ice/PropertiesI.cpp
index 0939ee3eada..56f33473162 100644
--- a/cpp/src/Ice/PropertiesI.cpp
+++ b/cpp/src/Ice/PropertiesI.cpp
@@ -299,40 +299,115 @@ Ice::PropertiesI::load(const std::string& file)
}
HKEY iceKey;
- if(RegOpenKey(key, file.substr(5).c_str(), &iceKey) != ERROR_SUCCESS)
+ if(RegOpenKeyExW(key, IceUtil::stringToWstring(file.substr(5)).c_str(), 0, KEY_QUERY_VALUE, &iceKey) != ERROR_SUCCESS)
{
InitializationException ex(__FILE__, __LINE__);
ex.reason = "Could not open Windows registry key `" + file + "'";
throw ex;
}
+ DWORD maxValueNameLen;
+ DWORD maxValueLen;
DWORD numValues;
- if(RegQueryInfoKey(iceKey, NULL, NULL, NULL, NULL, NULL, NULL, &numValues, NULL, NULL, NULL, NULL) ==
- ERROR_SUCCESS)
+ try
{
- if(numValues > 0)
+ if(RegQueryInfoKey(iceKey, NULL, NULL, NULL, NULL, NULL, NULL, &numValues, &maxValueNameLen, &maxValueLen,
+ NULL, NULL) == ERROR_SUCCESS && numValues > 0)
{
+ auto_ptr<wchar_t> keyBuf(new wchar_t[maxValueNameLen + 1]);
+ auto_ptr<wchar_t> valueBuf(new wchar_t[maxValueLen + 1]);
for(DWORD i = 0; i < numValues; ++i)
{
- char keyBuf[256];
- DWORD keyBufSize = sizeof(keyBuf);
- if(RegEnumValue(iceKey, i, keyBuf, &keyBufSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ DWORD keyBufSize = (maxValueNameLen + 1) * sizeof(wchar_t);
+ DWORD valueBufSize = (maxValueLen + 1) * sizeof(wchar_t) ;
+ unsigned int err = RegEnumValueW(iceKey, i, keyBuf.get(), &keyBufSize, NULL, NULL, NULL, NULL);
+ if(err != ERROR_SUCCESS)
{
- char valueBuf[256];
- DWORD valueBufSize = sizeof(valueBuf);
- DWORD keyType;
- if(RegQueryValueEx(iceKey, keyBuf, 0, &keyType, (BYTE*)valueBuf, &valueBufSize) ==
- ERROR_SUCCESS)
+ getProcessLogger()->warning("Could not read Windows registry property name, key path: \"" +
+ file + "\"");
+ continue;
+ }
+ keyBuf.get()[keyBufSize] = L'\0';
+
+ DWORD keyType;
+ err = RegQueryValueExW(iceKey, keyBuf.get(), 0, &keyType, (BYTE*)valueBuf.get(), &valueBufSize);
+ if(err != ERROR_SUCCESS)
+ {
+ getProcessLogger()->warning("Could not read Windows registry property value, property name: `" +
+ IceUtil::wstringToString(wstring(keyBuf.get())) + "' key path: `" +
+ file + "'");
+ continue;
+ }
+ valueBuf.get()[valueBufSize] = L'\0';
+
+ switch(keyType)
+ {
+ case REG_SZ:
{
- if(keyType == REG_SZ)
+ string name = IceUtil::wstringToString(wstring(keyBuf.get()));
+ string value = IceUtil::wstringToString(wstring(valueBuf.get()));
+ if(_converter)
{
- setProperty(keyBuf, valueBuf);
+ string tmp;
+ _converter->fromUTF8(reinterpret_cast<const Byte*>(name.data()),
+ reinterpret_cast<const Byte*>(name.data() + name.size()), tmp);
+ name.swap(tmp);
+
+ _converter->fromUTF8(reinterpret_cast<const Byte*>(value.data()),
+ reinterpret_cast<const Byte*>(value.data() + value.size()), tmp);
+ value.swap(tmp);
}
+ setProperty(name, value);
+ break;
+ }
+ case REG_EXPAND_SZ:
+ {
+ unsigned int sz = ExpandEnvironmentStringsW(valueBuf.get(), 0, 0);
+ auto_ptr<wchar_t> expandValue;
+ if(sz > 0)
+ {
+ valueBufSize = sz;
+ expandValue = auto_ptr<wchar_t>(new wchar_t[sz + 1]);
+ sz = ExpandEnvironmentStringsW(valueBuf.get(), expandValue.get(), sz);
+ }
+
+ if(sz == 0 || sz > valueBufSize || expandValue.get() == 0)
+ {
+ getProcessLogger()->warning("Could not expand variables in property value: `" +
+ IceUtil::wstringToString(wstring(valueBuf.get())) +
+ "' key path: `" + file + "'");
+ continue;
+ }
+
+ string name = IceUtil::wstringToString(wstring(keyBuf.get()));
+ string value = IceUtil::wstringToString(wstring(expandValue.get()));
+ if(_converter)
+ {
+ string tmp;
+ _converter->fromUTF8(reinterpret_cast<const Byte*>(name.data()),
+ reinterpret_cast<const Byte*>(name.data() + name.size()), tmp);
+ name.swap(tmp);
+
+ _converter->fromUTF8(reinterpret_cast<const Byte*>(value.data()),
+ reinterpret_cast<const Byte*>(value.data() + value.size()), tmp);
+ value.swap(tmp);
+ }
+ setProperty(name, value);
+ break;
+ }
+ default:
+ {
+ break;
}
}
}
}
}
+ catch(...)
+ {
+ RegCloseKey(iceKey);
+ throw;
+ }
RegCloseKey(iceKey);
}
else
@@ -652,11 +727,28 @@ Ice::PropertiesI::loadConfig()
if(value.empty() || value == "1")
{
- const char* s = getenv("ICE_CONFIG");
- if(s && *s != '\0')
+ #ifdef _WIN32
+ DWORD ret = GetEnvironmentVariableW(L"ICE_CONFIG", 0, 0);
+ if(ret > 0)
{
- value = s;
+ auto_ptr<wchar_t> v(new wchar_t[ret]);
+ ret = GetEnvironmentVariableW(L"ICE_CONFIG", v.get(), ret);
+ value = (ret > 0 && ret < sizeof(v.get()) / sizeof(wchar_t)) ? IceUtil::wstringToString(v.get()) : string("");
+ if(_converter)
+ {
+ string tmp;
+ _converter->fromUTF8(reinterpret_cast<const Byte*>(value.data()),
+ reinterpret_cast<const Byte*>(value.data() + value.size()), tmp);
+ value.swap(tmp);
+ }
}
+#else
+ const char* s = getenv("ICE_CONFIG");
+ if(s && *s != '\0')
+ {
+ value = s;
+ }
+#endif
}
if(!value.empty())