// 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; }