windows-nt/Source/XPSP1/NT/admin/dcpromo/exe/answerfile.cpp
2020-09-26 16:20:57 +08:00

245 lines
4.7 KiB
C++

// Copyright (C) 1997 Microsoft Corporation
//
// answerfile reader object
//
// 12-15-97 sburns
#include "headers.hxx"
#include "AnswerFile.hpp"
AnswerFile::AnswerFile(const String& filename_)
:
filename(filename_)
{
LOG_CTOR(AnswerFile);
ASSERT(!filename.empty());
}
AnswerFile::~AnswerFile()
{
LOG_DTOR(AnswerFile);
}
String
AnswerFile::ReadKey(const String& section, const String& key)
{
LOG_FUNCTION2(
AnswerFile::ReadKey,
String::format(
L"Section=%1 Key=%2",
section.c_str(),
key.c_str()));
ASSERT(!section.empty());
ASSERT(!key.empty());
String result =
Win::GetPrivateProfileString(section, key, String(), filename);
// Don't log the value, as it may be a password.
// LOG(L"value=" + result);
return result.strip(String::BOTH);
}
EncodedString
AnswerFile::EncodedReadKey(const String& section, const String& key)
{
LOG_FUNCTION2(
AnswerFile::EncodedReadKey,
String::format(
L"Section=%1 Key=%2",
section.c_str(),
key.c_str()));
ASSERT(!section.empty());
ASSERT(!key.empty());
EncodedString retval;
unsigned bufSize = 1023;
PWSTR buffer = 0;
do
{
buffer = new WCHAR[bufSize + 1];
::ZeroMemory(buffer, (bufSize + 1) * sizeof(WCHAR));
DWORD result =
::GetPrivateProfileString(
section.c_str(),
key.c_str(),
L"",
buffer,
bufSize,
filename.c_str());
if (!result)
{
break;
}
// values were found. check to see if they were truncated.
if (result == bufSize - 2)
{
// buffer was too small, so the value was truncated. Resize the
// buffer and try again.
// Since the buffer may have contained passwords, scribble it
// out
::ZeroMemory(buffer, sizeof(WCHAR) * (bufSize + 1));
delete[] buffer;
bufSize *= 2;
continue;
}
// don't need to trim whitespace, GetPrivateProfileString does that
// for us.
retval.Encode(buffer);
break;
}
while (true);
// Since the buffer may have contained passwords, scribble it
// out
::ZeroMemory(buffer, sizeof(WCHAR) * (bufSize + 1));
delete[] buffer;
// Don't log the value, as it may be a password.
// LOG(L"value=" + result);
return retval;
}
void
AnswerFile::WriteKey(
const String& section,
const String& key,
const String& value)
{
LOG_FUNCTION2(
AnswerFile::WriteKey,
String::format(
L"Section=%1 Key=%2",
section.c_str(),
key.c_str()));
ASSERT(!section.empty());
ASSERT(!key.empty());
HRESULT hr =
Win::WritePrivateProfileString(section, key, value, filename);
ASSERT(SUCCEEDED(hr));
}
bool
AnswerFile::IsKeyPresent(
const String& section,
const String& key)
{
LOG_FUNCTION2(
AnswerFile::IsKeyPresent,
String::format(
L"Section=%1 Key=%2",
section.c_str(),
key.c_str()));
ASSERT(!section.empty());
ASSERT(!key.empty());
bool present = false;
// our first call is with a large buffer, hoping that it will suffice...
StringList results;
unsigned bufSize = 1023;
PWSTR buffer = 0;
do
{
buffer = new WCHAR[bufSize + 1];
::ZeroMemory(buffer, (bufSize + 1) * sizeof(WCHAR));
DWORD result =
::GetPrivateProfileString(
section.c_str(),
0,
L"default",
buffer,
bufSize,
filename.c_str());
if (!result)
{
break;
}
// values were found. check to see if they were truncated.
if (result == bufSize - 2)
{
// buffer was too small, so the value was truncated. Resize the
// buffer and try again.
// Since the buffer may have contained passwords, scribble it
// out
::ZeroMemory(buffer, (bufSize + 1) * sizeof(WCHAR));
delete[] buffer;
bufSize *= 2;
continue;
}
// copy out the strings results into list elements
PWSTR p = buffer;
while (*p)
{
results.push_back(p);
p += wcslen(p) + 1;
}
break;
}
//lint -e506 ok that this looks like "loop forever"
while (true);
// Since the buffer may have contained passwords, scribble it
// out
::ZeroMemory(buffer, (bufSize + 1) * sizeof(WCHAR));
delete[] buffer;
if (std::find(results.begin(), results.end(), key) != results.end())
{
present = true;
}
LOG(present ? L"true" : L"false");
return present;
}