3199 lines
75 KiB
C++
3199 lines
75 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: C W I N F . C P P
|
||
|
//
|
||
|
// Contents: Definition of class CWInfFile and other related classes
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: kumarp 12 April 97
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
#include "kkcwinf.h"
|
||
|
#include "kkutils.h"
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#define TC_COMMENT_CHAR L';'
|
||
|
const WCHAR c_szCommentPrefix[] = L"; ";
|
||
|
|
||
|
|
||
|
extern const WCHAR c_szYes[];
|
||
|
extern const WCHAR c_szNo[];
|
||
|
|
||
|
void EraseAndDeleteAll(IN WifLinePtrList* ppl)
|
||
|
{
|
||
|
WifLinePtrListIter i=ppl->begin();
|
||
|
while (i != ppl->end())
|
||
|
{
|
||
|
delete *i++;
|
||
|
}
|
||
|
|
||
|
ppl->erase(ppl->begin(), ppl->end());
|
||
|
}
|
||
|
inline void EraseAll(IN WifLinePtrList* ppl)
|
||
|
{
|
||
|
ppl->erase(ppl->begin(), ppl->end());
|
||
|
}
|
||
|
|
||
|
inline WifLinePtrListIter GetIterAtBack(IN const WifLinePtrList* ppl)
|
||
|
{
|
||
|
WifLinePtrListIter pliRet = ppl->end();
|
||
|
pliRet--;
|
||
|
return pliRet;
|
||
|
}
|
||
|
|
||
|
inline WifLinePtrListIter AddAtEndOfPtrList(IN WifLinePtrList& pl, IN PCWInfLine pwifLine)
|
||
|
{
|
||
|
return pl.insert(pl.end(), pwifLine);
|
||
|
}
|
||
|
|
||
|
// ======================================================================
|
||
|
// Class CWInfFile
|
||
|
// ======================================================================
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfFile public functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::CWInfFile
|
||
|
//
|
||
|
// Purpose: constructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// We keep the read-context and write-context separate. This allows us
|
||
|
// to simultaneously read and write from the file
|
||
|
|
||
|
CWInfFile::CWInfFile()
|
||
|
{
|
||
|
m_fp = NULL;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::~CWInfFile
|
||
|
//
|
||
|
// Purpose: destructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
CWInfFile::~CWInfFile()
|
||
|
{
|
||
|
EraseAndDeleteAll(m_plLines);
|
||
|
EraseAll(m_plSections);
|
||
|
|
||
|
CWInfKey::UnInit();
|
||
|
|
||
|
delete m_plLines;
|
||
|
delete m_plSections;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Init
|
||
|
//
|
||
|
// Purpose: initialization of alloc'd member variables
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: davea 17 Feb 2000
|
||
|
//
|
||
|
//
|
||
|
BOOL CWInfFile::Init()
|
||
|
{
|
||
|
m_plLines = new WifLinePtrList(); // lines in this file
|
||
|
m_plSections = new WifLinePtrList(); // lines that represent sections
|
||
|
// this allows us to quickly locate a section
|
||
|
if ((m_plLines != NULL) &&
|
||
|
(m_plSections != NULL))
|
||
|
{
|
||
|
m_ReadContext.posSection = m_plSections->end();
|
||
|
m_ReadContext.posLine = m_plLines->end();
|
||
|
m_WriteContext.posSection = m_plSections->end();
|
||
|
m_WriteContext.posLine = m_plLines->end();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
CWInfKey::Init();
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Open
|
||
|
//
|
||
|
// Purpose: Opens an INF file
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFileName [in] name of the file to open
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This does not keep the physical file handle open. We just open the file
|
||
|
// read the contents and close it. After this, one can freely read from or
|
||
|
// write to the file. This is done to the memory image of the file. To write
|
||
|
// this file back, one must call Close() or SaveAs() member functions
|
||
|
BOOL CWInfFile::Open(IN PCWSTR pszFileName)
|
||
|
{
|
||
|
DefineFunctionName("CWInfFile::Open");
|
||
|
|
||
|
BOOL status = FALSE;
|
||
|
|
||
|
m_strFileName = pszFileName;
|
||
|
FILE *fp = _wfopen(pszFileName, L"r");
|
||
|
if (fp)
|
||
|
{
|
||
|
status = Open(fp);
|
||
|
fclose(fp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TraceTag(ttidError, "%s: could not open file: %S",
|
||
|
__FUNCNAME__, pszFileName);
|
||
|
}
|
||
|
|
||
|
return status;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Open
|
||
|
//
|
||
|
// Purpose: Opens an INF file
|
||
|
//
|
||
|
// Arguments:
|
||
|
// fp [in] FILE* of the file to read from
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This does not physically close the file handle
|
||
|
BOOL CWInfFile::Open(IN FILE *fp)
|
||
|
{
|
||
|
PWSTR pszLineRoot = (PWSTR) MemAlloc ((MAX_INF_STRING_LENGTH + 1) *
|
||
|
sizeof (WCHAR));
|
||
|
|
||
|
if (!pszLineRoot)
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
PWSTR pszNewLinePos;
|
||
|
while (!feof(fp))
|
||
|
{
|
||
|
PWSTR pszLine = pszLineRoot;
|
||
|
|
||
|
*pszLine = 0;
|
||
|
if (fgetws(pszLine, MAX_INF_STRING_LENGTH, fp))
|
||
|
{
|
||
|
// Trim leading spaces
|
||
|
//
|
||
|
while (iswspace(*pszLine))
|
||
|
{
|
||
|
pszLine++;
|
||
|
}
|
||
|
|
||
|
if (pszNewLinePos = wcschr(pszLine, L'\n'))
|
||
|
{
|
||
|
*pszNewLinePos = 0;
|
||
|
}
|
||
|
if (!wcslen(pszLine))
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
ParseLine(pszLine);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MemFree (pszLineRoot);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::ParseLine
|
||
|
//
|
||
|
// Purpose: Parse the given line and update internal structures
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszLine [in] line text to parse
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Parse the line and add a CWInfKey / CWInfSection / CWInfComment
|
||
|
// as appropriate in the current write context
|
||
|
// The logic:
|
||
|
// add CWInfComment if line begins with ';'
|
||
|
// add CWInfKey if line is of the form key=value
|
||
|
// add CWInfSection if line begins with '[' and has ']' at the end
|
||
|
// ignore anything else i.e. dont add anything
|
||
|
|
||
|
void CWInfFile::ParseLine(IN PCWSTR pszLine)
|
||
|
{
|
||
|
tstring strTemp;
|
||
|
PWSTR pszTemp, pszTemp2;
|
||
|
|
||
|
if (!CurrentWriteSection() && (pszLine[0] != L'['))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (pszLine[0] == TC_COMMENT_CHAR)
|
||
|
{
|
||
|
//it is a comment
|
||
|
AddComment(pszLine + 1);
|
||
|
}
|
||
|
else if (pszLine[0] == L'[')
|
||
|
{
|
||
|
//it is a section
|
||
|
pszTemp = wcschr(pszLine, L']');
|
||
|
if (!pszTemp)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
tstring strSectionName(pszLine+1, pszTemp-pszLine-1);
|
||
|
AddSection(strSectionName.c_str());
|
||
|
}
|
||
|
else if ((pszTemp = wcschr(pszLine, L'=')) != NULL)
|
||
|
{
|
||
|
if (pszLine == pszTemp)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//it is a key
|
||
|
pszTemp2 = pszTemp; // pszTemp2 points at '='
|
||
|
pszTemp2--;
|
||
|
while (iswspace(*pszTemp2) && (pszTemp2 != pszLine))
|
||
|
{
|
||
|
pszTemp2--;
|
||
|
}
|
||
|
|
||
|
pszTemp++; // skip '='
|
||
|
while (*pszTemp && iswspace(*pszTemp))
|
||
|
{
|
||
|
pszTemp++;
|
||
|
}
|
||
|
|
||
|
if ((*pszTemp == L'"') && !wcschr(pszTemp, L','))
|
||
|
{
|
||
|
pszTemp++;
|
||
|
DWORD dwLen = wcslen(pszTemp);
|
||
|
if (pszTemp[dwLen-1] == L'"')
|
||
|
{
|
||
|
pszTemp[dwLen-1] = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tstring strKeyName(pszLine, pszTemp2-pszLine+1);
|
||
|
tstring strKeyValue(pszTemp);
|
||
|
AddKey(strKeyName.c_str(), strKeyValue.c_str());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// we cannot interpret the line, just add it
|
||
|
AddRawLine(pszLine);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Create
|
||
|
//
|
||
|
// Purpose: Create a blank INF file in memory
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFileName [in] name of the file to create
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This does not write anything to disk
|
||
|
BOOL CWInfFile::Create(IN PCWSTR pszFileName)
|
||
|
{
|
||
|
m_strFileName = pszFileName;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Create
|
||
|
//
|
||
|
// Purpose: Create a blank INF file in memory
|
||
|
//
|
||
|
// Arguments:
|
||
|
// fp [in] FILE* of the file to create
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This does not write anything to disk
|
||
|
BOOL CWInfFile::Create(IN FILE *fp)
|
||
|
{
|
||
|
m_fp = fp;
|
||
|
|
||
|
return fp != NULL;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Close
|
||
|
//
|
||
|
// Purpose: Close the file, flushing data to disk.
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This just calls CWInfFile::flush() which will actually write the file back
|
||
|
BOOL CWInfFile::Close()
|
||
|
{
|
||
|
return Flush();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::Flush
|
||
|
//
|
||
|
// Purpose: Close the file, flushing data to disk.
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This just calls CWInfFile::flush() which will actually write the file back
|
||
|
BOOL CWInfFile::Flush()
|
||
|
{
|
||
|
WifLinePtrListIter pos;
|
||
|
CWInfLine *line;
|
||
|
tstring line_text;
|
||
|
BOOL fStatus = TRUE;
|
||
|
|
||
|
//if a filename was specified then open it for writing
|
||
|
//
|
||
|
if (!m_strFileName.empty())
|
||
|
{
|
||
|
m_fp = _wfopen(m_strFileName.c_str(), L"w");
|
||
|
}
|
||
|
|
||
|
if (!m_fp)
|
||
|
return FALSE;
|
||
|
|
||
|
// get text of each line and dump it to the file
|
||
|
for( pos = m_plLines->begin(); pos != m_plLines->end(); )
|
||
|
{
|
||
|
line = (CWInfLine *) *pos++;
|
||
|
line->GetText(line_text);
|
||
|
if (line->Type() == INF_SECTION)
|
||
|
fwprintf(m_fp, L"\n");
|
||
|
|
||
|
fwprintf(m_fp, L"%s", line_text.c_str());
|
||
|
fwprintf(m_fp, L"\n");
|
||
|
}
|
||
|
|
||
|
if (!m_strFileName.empty())
|
||
|
{
|
||
|
fStatus = fclose(m_fp) == 0;
|
||
|
m_fp = NULL;
|
||
|
}
|
||
|
|
||
|
return fStatus;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::FlushEx
|
||
|
//
|
||
|
// Purpose: Close the file, flushing data to disk.
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: frankli 4 May 2000
|
||
|
//
|
||
|
// Notes:
|
||
|
// This is used by SysPrep to enclose value of a key with quotes except
|
||
|
// for multi-sz value.
|
||
|
BOOL CWInfFile::FlushEx()
|
||
|
{
|
||
|
WifLinePtrListIter pos;
|
||
|
CWInfLine *line;
|
||
|
tstring line_text;
|
||
|
BOOL fStatus = TRUE;
|
||
|
|
||
|
//if a filename was specified then open it for writing
|
||
|
//
|
||
|
if (!m_strFileName.empty())
|
||
|
{
|
||
|
m_fp = _wfopen(m_strFileName.c_str(), L"w");
|
||
|
}
|
||
|
|
||
|
if (!m_fp)
|
||
|
return FALSE;
|
||
|
|
||
|
// get text of each line and dump it to the file
|
||
|
for( pos = m_plLines->begin(); pos != m_plLines->end(); )
|
||
|
{
|
||
|
line = (CWInfLine *) *pos++;
|
||
|
line->GetTextEx(line_text);
|
||
|
if (line->Type() == INF_SECTION)
|
||
|
fwprintf(m_fp, L"\n");
|
||
|
|
||
|
fwprintf(m_fp, L"%s", line_text.c_str());
|
||
|
fwprintf(m_fp, L"\n");
|
||
|
}
|
||
|
|
||
|
if (!m_strFileName.empty())
|
||
|
{
|
||
|
fStatus = fclose(m_fp) == 0;
|
||
|
m_fp = NULL;
|
||
|
}
|
||
|
|
||
|
return fStatus;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::SaveAs
|
||
|
//
|
||
|
// Purpose: Save current image to the given file
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFileName [in] name of the file to save as
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// This is not same as Close()!, Close() will still write to
|
||
|
// the original file.
|
||
|
BOOL CWInfFile::SaveAs(IN PCWSTR pszFileName)
|
||
|
{
|
||
|
BOOL fStatus;
|
||
|
|
||
|
tstring strTemp = m_strFileName;
|
||
|
m_strFileName = pszFileName;
|
||
|
fStatus = Flush();
|
||
|
m_strFileName = strTemp;
|
||
|
|
||
|
return fStatus;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::SaveAsEx
|
||
|
//
|
||
|
// Purpose: Save current image to the given file
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFileName [in] name of the file to save as
|
||
|
//
|
||
|
// Returns: TRUE if suceeded, FALSE otherwise.
|
||
|
//
|
||
|
// Author: frankli 4 May 2000
|
||
|
//
|
||
|
// Notes:
|
||
|
// This is not same as Close()!, Close() will still write to
|
||
|
// the original file. Save SysPrep prepared data,
|
||
|
// value of a key will be enclosed with quotes except for multi-sz
|
||
|
// value.
|
||
|
BOOL CWInfFile::SaveAsEx(IN PCWSTR pszFileName)
|
||
|
{
|
||
|
BOOL fStatus;
|
||
|
|
||
|
tstring strTemp = m_strFileName;
|
||
|
m_strFileName = pszFileName;
|
||
|
fStatus = FlushEx();
|
||
|
m_strFileName = strTemp;
|
||
|
|
||
|
return fStatus;
|
||
|
}
|
||
|
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
// Functions for reading
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::SetCurrentReadSection
|
||
|
//
|
||
|
// Purpose: Set read-context so that subsequent reads
|
||
|
// will be from this section
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pwisSection [in] Section to set context to
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::SetCurrentReadSection(IN PCWInfSection pwisSection)
|
||
|
{
|
||
|
if ((CurrentReadSection() != pwisSection) && pwisSection)
|
||
|
{
|
||
|
m_ReadContext.posSection = pwisSection->m_posSection;
|
||
|
m_ReadContext.posLine = pwisSection->m_posLine;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::FindSection
|
||
|
//
|
||
|
// Purpose: Find the given section in current file
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszSectionName [in] Section to find
|
||
|
// wsmMode [in] Search mode
|
||
|
// (search from beginning-of-file / current-position)
|
||
|
// Returns: Pointer to section if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets the current read-context to the section found
|
||
|
//
|
||
|
PCWInfSection CWInfFile::FindSection(IN PCWSTR pszSectionName,
|
||
|
IN WInfSearchMode wsmMode)
|
||
|
{
|
||
|
PCWInfSection pwisRet=NULL, pwisTemp;
|
||
|
WifLinePtrListIter pos, old_pos;
|
||
|
if (wsmMode == ISM_FromBeginning)
|
||
|
{
|
||
|
pos = m_plSections->begin();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pos = m_ReadContext.posSection;
|
||
|
if (pos == m_plSections->end())
|
||
|
pos = m_plSections->begin();
|
||
|
}
|
||
|
|
||
|
while (pos != m_plSections->end())
|
||
|
{
|
||
|
old_pos = pos;
|
||
|
pwisTemp = (PCWInfSection) *pos++;
|
||
|
if (!lstrcmpiW(pwisTemp->m_Name.c_str(), pszSectionName))
|
||
|
{
|
||
|
pwisRet = pwisTemp;
|
||
|
SetCurrentReadSection(pwisRet);
|
||
|
/*
|
||
|
// m_ReadContext.posSection = old_pos;
|
||
|
m_ReadContext.posSection = pwisRet->m_posSection;
|
||
|
m_ReadContext.posLine = pwisRet->m_posLine;
|
||
|
*/
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return pwisRet;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::FindKey
|
||
|
//
|
||
|
// Purpose: Find a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// wsmMode [in] Search mode
|
||
|
// (search from beginning-of-section / current-position)
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWInfKey CWInfFile::FindKey(IN PCWSTR pszKeyName, IN WInfSearchMode wsmMode)
|
||
|
{
|
||
|
WifLinePtrListIter pos, old_pos;
|
||
|
PCWInfKey pwikRet=NULL;
|
||
|
PCWInfLine pwilTemp;
|
||
|
|
||
|
PCWInfSection pwisCurrentReadSection = CurrentReadSection();
|
||
|
ReturnNULLIf(!pwisCurrentReadSection);
|
||
|
|
||
|
if (wsmMode == ISM_FromCurrentPosition)
|
||
|
{
|
||
|
pos = m_ReadContext.posLine;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pos = pwisCurrentReadSection->m_posLine;
|
||
|
}
|
||
|
|
||
|
pos++; // start from next line
|
||
|
|
||
|
while(pos != m_plLines->end())
|
||
|
{
|
||
|
old_pos = pos;
|
||
|
pwilTemp = (PCWInfLine) *pos++;
|
||
|
if (pwilTemp->Type() != INF_KEY)
|
||
|
{
|
||
|
if (pwilTemp->Type() == INF_SECTION)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
if (!lstrcmpiW(((PCWInfKey) pwilTemp)->m_Name.c_str(), pszKeyName))
|
||
|
{
|
||
|
pwikRet = (PCWInfKey) pwilTemp;
|
||
|
m_ReadContext.posLine = old_pos;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ReturnNULLIf(!pwikRet);
|
||
|
|
||
|
return pwikRet;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::FirstKey
|
||
|
//
|
||
|
// Purpose: Return the first key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets read-context to this key
|
||
|
//
|
||
|
PCWInfKey CWInfFile::FirstKey()
|
||
|
{
|
||
|
WifLinePtrListIter pos, old_pos;
|
||
|
PCWInfKey pwikRet=NULL;
|
||
|
PCWInfLine pwilTemp;
|
||
|
|
||
|
PCWInfSection pwisCurrentReadSection = CurrentReadSection();
|
||
|
|
||
|
if (!pwisCurrentReadSection)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pos = pwisCurrentReadSection->m_posLine;
|
||
|
|
||
|
pos++; // start from next line
|
||
|
|
||
|
while(pos != m_plLines->end())
|
||
|
{
|
||
|
old_pos = pos;
|
||
|
pwilTemp = (PCWInfLine) *pos++;
|
||
|
if (pwilTemp->Type() != INF_KEY)
|
||
|
{
|
||
|
if (pwilTemp->Type() == INF_SECTION)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
pwikRet = (PCWInfKey) pwilTemp;
|
||
|
m_ReadContext.posLine = old_pos;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return pwikRet;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::NextKey
|
||
|
//
|
||
|
// Purpose: Return the next key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets read-context to this key
|
||
|
//
|
||
|
PCWInfKey CWInfFile::NextKey()
|
||
|
{
|
||
|
WifLinePtrListIter pos, old_pos;
|
||
|
PCWInfKey pwikRet=NULL;
|
||
|
PCWInfLine pwilTemp;
|
||
|
|
||
|
PCWInfSection pwisCurrentReadSection = CurrentReadSection();
|
||
|
|
||
|
if (!pwisCurrentReadSection)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
pos = m_ReadContext.posLine;
|
||
|
|
||
|
pos++; // start from next line
|
||
|
|
||
|
while(pos != m_plLines->end())
|
||
|
{
|
||
|
old_pos = pos;
|
||
|
pwilTemp = (PCWInfLine) *pos++;
|
||
|
if (pwilTemp->Type() != INF_KEY)
|
||
|
{
|
||
|
if (pwilTemp->Type() == INF_SECTION)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
pwikRet = (PCWInfKey) pwilTemp;
|
||
|
m_ReadContext.posLine = old_pos;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return pwikRet;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetStringListValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-list
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pslList [out] List value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringList
|
||
|
// otherwise returns a TStringList with a single element
|
||
|
//
|
||
|
BOOL CWInfFile::GetStringListValue(IN PCWSTR pszKeyName, OUT TStringList &pslList)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetStringListValue(pslList);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetStringArrayValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-Array
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// saStrings [out] Array value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12-November-97
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringArray
|
||
|
// otherwise returns a TStringArray with a single element
|
||
|
//
|
||
|
BOOL CWInfFile::GetStringArrayValue(IN PCWSTR pszKeyName, OUT TStringArray &saStrings)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
|
||
|
if (key)
|
||
|
{
|
||
|
return key->GetStringArrayValue(saStrings);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// strValue [out] string value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfFile::GetStringValue(IN PCWSTR pszKeyName, OUT tstring &strValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetStringValue(strValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an int
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pdwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfFile::GetIntValue(IN PCWSTR pszKeyName, OUT DWORD *pdwValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetIntValue(pdwValue);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a QWORD
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pqwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfFile::GetQwordValue(IN PCWSTR pszKeyName, OUT QWORD *pqwValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetQwordValue(pqwValue);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pfValue [out] BOOL value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// converts:
|
||
|
// "True" / "Yes" / 1 to TRUE
|
||
|
// "False" / "No" / 0 to FALSE
|
||
|
//
|
||
|
BOOL CWInfFile::GetBoolValue(IN PCWSTR pszKeyName, OUT BOOL *pfValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetBoolValue(pfValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pszDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWSTR CWInfFile::GetStringValue(IN PCWSTR pszKeyName, IN PCWSTR pszDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
{
|
||
|
return pszDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetStringValue(pszDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an int
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// dwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
DWORD CWInfFile::GetIntValue(IN PCWSTR pszKeyName, IN DWORD dwDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
{
|
||
|
return dwDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetIntValue(dwDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a QWORD
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// qwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
QWORD CWInfFile::GetQwordValue(IN PCWSTR pszKeyName, IN QWORD qwDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
{
|
||
|
return qwDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetQwordValue(qwDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// fDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfFile::GetBoolValue(IN PCWSTR pszKeyName, IN BOOL fDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
{
|
||
|
return fDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetBoolValue(fDefault);
|
||
|
}
|
||
|
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
// Functions for writing
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddSection
|
||
|
//
|
||
|
// Purpose: Adds the given section to the current file
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszSectionName [in] Section to add
|
||
|
//
|
||
|
// Returns: Pointer to section added, NULL in case of error
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets the current write-context to the section added
|
||
|
//
|
||
|
PCWInfSection CWInfFile::AddSection(IN PCWSTR pszSectionName)
|
||
|
{
|
||
|
WifLinePtrListIter tpos, section_pos, line_pos;
|
||
|
CWInfSection *current_section;
|
||
|
|
||
|
if ((current_section = CurrentWriteSection()) != NULL)
|
||
|
GotoEndOfSection(current_section);
|
||
|
|
||
|
CWInfSection *section = new CWInfSection(pszSectionName, this);
|
||
|
if (m_plSections->empty())
|
||
|
{
|
||
|
m_plSections->push_back(section);
|
||
|
section_pos = GetIterAtBack(m_plSections);
|
||
|
|
||
|
line_pos = m_plLines->end();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
section_pos = m_WriteContext.posSection;
|
||
|
section_pos++;
|
||
|
section_pos = m_plSections->insert(section_pos, section);
|
||
|
}
|
||
|
|
||
|
if (line_pos == m_plLines->end())
|
||
|
{
|
||
|
line_pos = AddAtEndOfPtrList(*m_plLines, section);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
line_pos = m_WriteContext.posLine;
|
||
|
line_pos++;
|
||
|
line_pos = m_plLines->insert(line_pos, section);
|
||
|
// line_pos = AddAtEndOfPtrList(*m_plLines, section);
|
||
|
}
|
||
|
|
||
|
m_WriteContext.posSection = section_pos;
|
||
|
m_WriteContext.posLine = line_pos;
|
||
|
|
||
|
section->m_posLine = line_pos;
|
||
|
section->m_posSection = section_pos;
|
||
|
|
||
|
return section;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddSectionIfNotPresent
|
||
|
//
|
||
|
// Purpose: Adds the given section to the current file if it is not
|
||
|
// present. if present, returns pointer to the section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszSectionName [in] Section to add/find
|
||
|
//
|
||
|
// Returns: Pointer to section added/found, NULL in case of error
|
||
|
//
|
||
|
// Author: kumarp kumarp 11-September-97 (06:09:06 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets the current write-context to the section added
|
||
|
//
|
||
|
PCWInfSection CWInfFile::AddSectionIfNotPresent(IN PCWSTR szSectionName)
|
||
|
{
|
||
|
CWInfSection* pwis;
|
||
|
|
||
|
pwis = FindSection(szSectionName);
|
||
|
if (!pwis)
|
||
|
{
|
||
|
pwis = AddSection(szSectionName);
|
||
|
}
|
||
|
|
||
|
return pwis;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GotoEndOfSection
|
||
|
//
|
||
|
// Purpose: Sets write context to the end of a given section
|
||
|
// (so that more keys can be added to the end)
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pwisSection [in] the given Section
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets the current write-context to the end of pwisSection
|
||
|
//
|
||
|
void CWInfFile::GotoEndOfSection(PCWInfSection pwisSection)
|
||
|
{
|
||
|
// line corresponding to the end of current section is the line
|
||
|
// prior to the next section
|
||
|
WifLinePtrListIter posEndOfSection, posNextSection;
|
||
|
|
||
|
posNextSection = pwisSection->m_posSection;
|
||
|
posNextSection++;
|
||
|
|
||
|
if (posNextSection == m_plSections->end())
|
||
|
{
|
||
|
posEndOfSection = GetIterAtBack(m_plLines);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
PCWInfSection pwisNextSection;
|
||
|
|
||
|
pwisNextSection = (PCWInfSection) *posNextSection;
|
||
|
posEndOfSection = pwisNextSection->m_posLine;
|
||
|
--posEndOfSection;
|
||
|
}
|
||
|
|
||
|
m_WriteContext.posSection = pwisSection->m_posSection;
|
||
|
m_WriteContext.posLine = posEndOfSection;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::GotoEnd
|
||
|
//
|
||
|
// Purpose: Sets write context to the end of the file
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pwisSection [in] the given Section
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::GotoEnd()
|
||
|
{
|
||
|
m_WriteContext.posSection = GetIterAtBack(m_plSections);
|
||
|
m_WriteContext.posLine = GetIterAtBack(m_plLines);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// pszValue [in] value to assign
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddKey(IN PCWSTR pszKeyName, IN PCWSTR pszValue)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetValue(pszValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
//
|
||
|
// Returns: pointer to the key just added, NULL in case of error
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// No value is assigned
|
||
|
//
|
||
|
PCWInfKey CWInfFile::AddKey(IN PCWSTR pszKeyName)
|
||
|
{
|
||
|
CWInfKey *key;
|
||
|
key = new CWInfKey(pszKeyName);
|
||
|
AddLine(key);
|
||
|
return key;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddKey(IN PCWSTR pszKeyName, IN DWORD dwValue)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetValue(dwValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddQwordKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// qwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddQwordKey(IN PCWSTR pszKeyName, IN QWORD qwValue)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetValue(qwValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddHexKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section, stores value in hex.
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddHexKey(IN PCWSTR pszKeyName, IN DWORD dwValue)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetHexValue(dwValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddBoolKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// fValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// TRUE is stored as "Yes"
|
||
|
// FALSE is stored as "No"
|
||
|
//
|
||
|
void CWInfFile::AddBoolKey(IN PCWSTR pszKeyName, IN BOOL Value)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetBoolValue(Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKeyV
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// pszFormat [in] format string (printf style)
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddKeyV(IN PCWSTR pszKeyName, IN PCWSTR Format, IN ...)
|
||
|
{
|
||
|
va_list arglist;
|
||
|
|
||
|
va_start (arglist, Format);
|
||
|
AddKey(pszKeyName)->SetValues(Format, arglist);
|
||
|
va_end(arglist);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// pszFormat [in] format string (printf style)
|
||
|
// arglist [in] argument list
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::AddKey(IN PCWSTR pszKeyName, IN PCWSTR Format, IN va_list arglist)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetValues(Format, arglist);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// slValues [in] values in the form of a string list
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// The string-list is converted to a comma-delimited list before
|
||
|
// the value is assigned to the key
|
||
|
//
|
||
|
void CWInfFile::AddKey(IN PCWSTR pszKeyName, IN const TStringList &slValues)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetValue(slValues);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddComment
|
||
|
//
|
||
|
// Purpose: Adds a comment in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszComment [in] text of the comment
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// A "; " is prefixed to pszComment before it is inserted into the section.
|
||
|
//
|
||
|
void CWInfFile::AddComment(IN PCWSTR pszComment)
|
||
|
{
|
||
|
CWInfComment *Comment;
|
||
|
Comment = new CWInfComment(pszComment);
|
||
|
AddLine(Comment);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddRawLine
|
||
|
//
|
||
|
// Purpose: Adds a raw line in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// szText [in] text to add
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
void CWInfFile::AddRawLine(IN PCWSTR szText)
|
||
|
{
|
||
|
CWInfRaw *pwir;
|
||
|
pwir = new CWInfRaw(szText);
|
||
|
AddLine(pwir);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddRawLines
|
||
|
//
|
||
|
// Purpose: Adds a raw line in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// szText [in] text to add
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
void CWInfFile::AddRawLines(IN PCWSTR* pszLines, IN DWORD cLines)
|
||
|
{
|
||
|
AssertValidReadPtr(pszLines);
|
||
|
AssertSz(cLines, "CWInfFile::AddRawLines: dont add 0 lines");
|
||
|
|
||
|
CWInfRaw *pwir;
|
||
|
for (DWORD i=0; i<cLines; i++)
|
||
|
{
|
||
|
AssertSz(pszLines[i], "CWInfRaw::AddRawLines: One of the lines is bad");
|
||
|
|
||
|
pwir = new CWInfRaw(pszLines[i]);
|
||
|
AddLine(pwir);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfFile protected functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::CurrentWriteSection
|
||
|
//
|
||
|
// Purpose: Get a pointer to the section selected for writing
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: pointer to the section if exists, NULL if file has no sections
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWInfSection CWInfFile::CurrentWriteSection() const
|
||
|
{
|
||
|
WifLinePtrListIter pos = m_WriteContext.posSection;
|
||
|
|
||
|
if (pos == m_plSections->end())
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return (PCWInfSection) *pos;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::CurrentReadSection
|
||
|
//
|
||
|
// Purpose: Get a pointer to the section selected for reading
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: pointer to the section if exists, NULL if file has no sections
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWInfSection CWInfFile::CurrentReadSection() const
|
||
|
{
|
||
|
PCWInfSection pwisCurrent;
|
||
|
|
||
|
WifLinePtrListIter pos = m_ReadContext.posSection;
|
||
|
|
||
|
if (pos == m_plSections->end())
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pwisCurrent = (PCWInfSection) *pos;
|
||
|
return pwisCurrent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CWInfFile::RemoveSection
|
||
|
//
|
||
|
// Purpose: Remove a section and its contents
|
||
|
//
|
||
|
// Arguments:
|
||
|
// szSectionName [in] name of Section to remove
|
||
|
//
|
||
|
// Returns: None
|
||
|
//
|
||
|
// Author: kumarp 09-December-98
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::RemoveSection(IN PCWSTR szSectionName)
|
||
|
{
|
||
|
CWInfSection* pwis;
|
||
|
|
||
|
if (pwis = FindSection(szSectionName))
|
||
|
{
|
||
|
m_plSections->erase(pwis->m_posSection);
|
||
|
WifLinePtrListIter pos = pwis->m_posLine;
|
||
|
WifLinePtrListIter posTemp;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
posTemp = pos;
|
||
|
pos++;
|
||
|
m_plLines->erase(posTemp);
|
||
|
}
|
||
|
while (pos != m_plLines->end() &&
|
||
|
((CWInfLine*) *pos)->Type() != INF_SECTION);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CWInfFile::RemoveSections
|
||
|
//
|
||
|
// Purpose: Remove the specified sections
|
||
|
//
|
||
|
// Arguments:
|
||
|
// slSections [in] list of sections to remove
|
||
|
//
|
||
|
// Returns: None
|
||
|
//
|
||
|
// Author: kumarp 09-December-98
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfFile::RemoveSections(IN TStringList& slSections)
|
||
|
{
|
||
|
PCWSTR szSectionName;
|
||
|
TStringListIter pos;
|
||
|
|
||
|
pos = slSections.begin();
|
||
|
while (pos != slSections.end())
|
||
|
{
|
||
|
szSectionName = (*pos)->c_str();
|
||
|
pos++;
|
||
|
RemoveSection(szSectionName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfFile::AddLine
|
||
|
//
|
||
|
// Purpose: Add a CWInfLine in the current section, adjust write context.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// ilLine [in] pointer to a CWInfLine
|
||
|
//
|
||
|
// Returns: TRUE on success, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfFile::AddLine(IN const PCWInfLine ilLine)
|
||
|
{
|
||
|
CWInfSection *section = CurrentWriteSection();
|
||
|
if (!section)
|
||
|
return FALSE;
|
||
|
|
||
|
WifLinePtrListIter pos;
|
||
|
pos = m_WriteContext.posLine;
|
||
|
pos++;
|
||
|
pos = m_plLines->insert(pos, ilLine);
|
||
|
m_WriteContext.posLine = pos;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// ======================================================================
|
||
|
// Class CWInfSection
|
||
|
// ======================================================================
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfSection public functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetText
|
||
|
//
|
||
|
// Purpose: Get text representation of this section.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// text [in] string that receives the text
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::GetText(OUT tstring &text) const
|
||
|
{
|
||
|
text = L"[" + m_Name + L"]";
|
||
|
}
|
||
|
|
||
|
// used by SysPrep
|
||
|
void CWInfSection::GetTextEx(OUT tstring &text) const
|
||
|
{
|
||
|
text = L"[" + m_Name + L"]";
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::FindKey
|
||
|
//
|
||
|
// Purpose: Find a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// wsmMode [in] Search mode
|
||
|
// (search from beginning-of-section / current-position)
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWInfKey CWInfSection::FindKey(IN PCWSTR pszKeyName,
|
||
|
IN WInfSearchMode wsmMode)
|
||
|
{
|
||
|
m_Parent->SetCurrentReadSection(this);
|
||
|
return m_Parent->FindKey(pszKeyName, wsmMode);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::FirstKey
|
||
|
//
|
||
|
// Purpose: Return the first key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets read-context to this key
|
||
|
//
|
||
|
PCWInfKey CWInfSection::FirstKey()
|
||
|
{
|
||
|
m_Parent->SetCurrentReadSection(this);
|
||
|
return m_Parent->FirstKey();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::NextKey
|
||
|
//
|
||
|
// Purpose: Return the next key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: Pointer to the key if found, NULL otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets read-context to this key
|
||
|
//
|
||
|
PCWInfKey CWInfSection::NextKey()
|
||
|
{
|
||
|
m_Parent->SetCurrentReadSection(this);
|
||
|
return m_Parent->NextKey();
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetStringArrayValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-Array
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// saStrings [out] Array value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12-November-97
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringArray
|
||
|
// otherwise returns a TStringArray with a single element
|
||
|
//
|
||
|
BOOL CWInfSection::GetStringArrayValue(IN PCWSTR pszKeyName, OUT TStringArray &saStrings)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
|
||
|
if (key)
|
||
|
{
|
||
|
return key->GetStringArrayValue(saStrings);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetStringListValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-list
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pslList [out] List value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringList
|
||
|
// otherwise returns a TStringList with a single element
|
||
|
//
|
||
|
BOOL CWInfSection::GetStringListValue(IN PCWSTR pszKeyName, OUT TStringList &pslList)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetStringListValue(pslList);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// strValue [out] string value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfSection::GetStringValue(IN PCWSTR pszKeyName, OUT tstring &strValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetStringValue(strValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an integer
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pdwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfSection::GetIntValue(IN PCWSTR pszKeyName, OUT DWORD *pdwValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetIntValue(pdwValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a QWORD
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pqwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfSection::GetQwordValue(IN PCWSTR pszKeyName, OUT QWORD *pqwValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetQwordValue(pqwValue);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pfValue [out] BOOL value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// converts:
|
||
|
// "True" / "Yes" / 1 to TRUE
|
||
|
// "False" / "No" / 0 to FALSE
|
||
|
//
|
||
|
BOOL CWInfSection::GetBoolValue(IN PCWSTR pszKeyName, OUT BOOL *pfValue)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
return FALSE;
|
||
|
|
||
|
return key->GetBoolValue(pfValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// pszDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWSTR CWInfSection::GetStringValue(IN PCWSTR pszKeyName, IN PCWSTR pszDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
{
|
||
|
return pszDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetStringValue(pszDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an int
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// dwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
DWORD CWInfSection::GetIntValue(IN PCWSTR pszKeyName, IN DWORD dwDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
{
|
||
|
return dwDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetIntValue(dwDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a QWORD
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// qwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
QWORD CWInfSection::GetQwordValue(IN PCWSTR pszKeyName, IN QWORD qwDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName);
|
||
|
if (!key)
|
||
|
{
|
||
|
return qwDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetQwordValue(qwDefault);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to find
|
||
|
// fDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfSection::GetBoolValue(IN PCWSTR pszKeyName, IN BOOL fDefault)
|
||
|
{
|
||
|
CWInfKey* key;
|
||
|
key = FindKey(pszKeyName, ISM_FromBeginning);
|
||
|
if (!key)
|
||
|
{
|
||
|
return fDefault;
|
||
|
}
|
||
|
|
||
|
return key->GetBoolValue(fDefault);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::GotoEnd
|
||
|
//
|
||
|
// Purpose: Sets write context to the end of this section
|
||
|
// (so that more keys can be added to the end)
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// Sets this write-context to the end of pwisSection
|
||
|
//
|
||
|
void CWInfSection::GotoEnd()
|
||
|
{
|
||
|
m_Parent->GotoEndOfSection(this);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
//
|
||
|
// Returns: pointer to the key just added, NULL in case of error
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// No value is assigned
|
||
|
//
|
||
|
PCWInfKey CWInfSection::AddKey(IN PCWSTR pszKeyName)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
return m_Parent->AddKey(pszKeyName);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// pszValue [in] value to assign
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::AddKey(IN PCWSTR pszKeyName, IN PCWSTR pszValue)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddKey(pszKeyName, pszValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::AddKey(IN PCWSTR pszKeyName, IN DWORD Value)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddKey(pszKeyName, Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddQwordKey
|
||
|
//
|
||
|
// Purpose: Adds a key in the current section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// qwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::AddQwordKey(IN PCWSTR pszKeyName, IN QWORD qwValue)
|
||
|
{
|
||
|
AddKey(pszKeyName)->SetQwordValue(qwValue);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddHexKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section, stores value in hex.
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::AddHexKey(IN PCWSTR pszKeyName, IN DWORD Value)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddHexKey(pszKeyName, Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// slValues [in] values in the form of a string list
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// The string-list is converted to a comma-delimited list before
|
||
|
// the value is assigned to the key
|
||
|
//
|
||
|
void CWInfSection::AddKey(IN PCWSTR pszKeyName, IN const TStringList &slValues)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddKey(pszKeyName, slValues);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddBoolKey
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// fValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// TRUE is stored as "Yes"
|
||
|
// FALSE is stored as "No"
|
||
|
//
|
||
|
void CWInfSection::AddBoolKey(IN PCWSTR pszKeyName, IN BOOL Value)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddBoolKey(pszKeyName, Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddKeyV
|
||
|
//
|
||
|
// Purpose: Adds a key in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszKeyName [in] Key to add
|
||
|
// pszFormat [in] format string (printf style)
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfSection::AddKeyV(IN PCWSTR pszKeyName, IN PCWSTR Format, IN ...)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
va_list arglist;
|
||
|
|
||
|
va_start (arglist, Format);
|
||
|
m_Parent->AddKey(pszKeyName, Format, arglist);
|
||
|
va_end(arglist);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddComment
|
||
|
//
|
||
|
// Purpose: Adds a comment in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszComment [in] text of the comment
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// A "; " is prefixed to pszComment before it is inserted into the section.
|
||
|
//
|
||
|
void CWInfSection::AddComment(IN PCWSTR pszComment)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddComment(pszComment);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::AddComment
|
||
|
//
|
||
|
// Purpose: Adds a comment in this section
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// szLine [in] raw line to be inserted
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
void CWInfSection::AddRawLine(IN PCWSTR szLine)
|
||
|
{
|
||
|
GotoEnd();
|
||
|
m_Parent->AddRawLine(szLine);
|
||
|
}
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfSection protected functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::CWInfSection
|
||
|
//
|
||
|
// Purpose: constructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
CWInfSection::CWInfSection(IN PCWSTR SectionName, IN PCWInfFile parent)
|
||
|
: CWInfLine(INF_SECTION)
|
||
|
{
|
||
|
m_Name = SectionName;
|
||
|
m_posLine = 0;
|
||
|
m_Parent = parent;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfSection::~CWInfSection
|
||
|
//
|
||
|
// Purpose: destructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
CWInfSection::~CWInfSection()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
// ======================================================================
|
||
|
// Class CWInfKey
|
||
|
// ======================================================================
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfKey public functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
WCHAR *CWInfKey::m_Buffer;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::CWInfFile
|
||
|
//
|
||
|
// Purpose: constructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
CWInfKey::CWInfKey(IN PCWSTR pszKeyName)
|
||
|
: CWInfLine(INF_KEY)
|
||
|
{
|
||
|
m_Value = c_szEmpty;
|
||
|
m_Name = pszKeyName;
|
||
|
m_fIsAListAndAlreadyProcessed = FALSE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::~CWInfFile
|
||
|
//
|
||
|
// Purpose: destructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
CWInfKey::~CWInfKey()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::Init
|
||
|
//
|
||
|
// Purpose: allocate internal shared buffer
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
void CWInfKey::Init()
|
||
|
{
|
||
|
if (NULL == m_Buffer)
|
||
|
{
|
||
|
m_Buffer = new WCHAR[MAX_INF_STRING_LENGTH];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::UnInit
|
||
|
//
|
||
|
// Purpose: deallocate internal shared buffer
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
void CWInfKey::UnInit()
|
||
|
{
|
||
|
if (NULL != m_Buffer)
|
||
|
{
|
||
|
delete [] m_Buffer;
|
||
|
m_Buffer = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetText
|
||
|
//
|
||
|
// Purpose: Get text representation in the format key=value.
|
||
|
//
|
||
|
// Arguments:
|
||
|
// text [in] string that receives the text
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::GetText(tstring &text) const
|
||
|
{
|
||
|
// Text mode setup does not like certain special characters in the
|
||
|
// value of a key. if the value has one of these characters then
|
||
|
// we need to enclose the entire value in quotes
|
||
|
//
|
||
|
static const WCHAR szSpecialChars[] = L" %=][";
|
||
|
tstring strTemp = m_Value;
|
||
|
tstring strTempName = m_Name;
|
||
|
|
||
|
if (!m_fIsAListAndAlreadyProcessed)
|
||
|
{
|
||
|
if (m_Value.empty() ||
|
||
|
(L'\"' != *(m_Value.c_str()) &&
|
||
|
wcscspn(m_Value.c_str(), szSpecialChars) < m_Value.size()))
|
||
|
{
|
||
|
strTemp = L"\"" + m_Value + L"\"";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (m_Name.empty() ||
|
||
|
(L'\"' != *(m_Name.c_str()) &&
|
||
|
wcscspn(m_Name.c_str(), szSpecialChars) < m_Name.size()))
|
||
|
{
|
||
|
strTempName = L"\"" + m_Name + L"\"";
|
||
|
}
|
||
|
|
||
|
text = strTempName + L"=" + strTemp;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetTextEx
|
||
|
//
|
||
|
// Purpose: Get text representation in the format key=value for multi-sz value
|
||
|
// Otherwiese, get text representation in the format key="value"
|
||
|
//
|
||
|
// Arguments:
|
||
|
// text [in] string that receives the text
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: frankli 4 May 2000
|
||
|
//
|
||
|
// Notes: value will be enclosed in quotes except for multi-sz value
|
||
|
//
|
||
|
void CWInfKey::GetTextEx(tstring &text) const
|
||
|
{
|
||
|
// we need to enclose the entire value in quotes except for multi-sz value.
|
||
|
// For example,
|
||
|
// tcpip adapter specific
|
||
|
// NameServer registry value is of type REG_SZ and it is a string of
|
||
|
// comma-delimited dns server name. We need to enclosed it in quotes,
|
||
|
// otherwise, it will be interpreted as multi-sz value
|
||
|
|
||
|
// Text mode setup does not like certain special characters in the
|
||
|
// value of a key. if the value has one of these characters then
|
||
|
// we need to enclose the entire value in quotes
|
||
|
//
|
||
|
static const WCHAR szSpecialChars[] = L" %=][";
|
||
|
tstring strTemp = m_Value;
|
||
|
tstring strTempName = m_Name;
|
||
|
|
||
|
if (!m_fIsAListAndAlreadyProcessed)
|
||
|
{ // we don't do this for multi-sz value
|
||
|
strTemp = L"\"" + m_Value + L"\"";
|
||
|
}
|
||
|
|
||
|
// leave the processing of the key as in CWInfKey::GetText
|
||
|
if (m_Name.empty() ||
|
||
|
(L'\"' != *(m_Name.c_str()) &&
|
||
|
wcscspn(m_Name.c_str(), szSpecialChars) < m_Name.size()))
|
||
|
{
|
||
|
strTempName = L"\"" + m_Name + L"\"";
|
||
|
}
|
||
|
|
||
|
text = strTempName + L"=" + strTemp;
|
||
|
}
|
||
|
|
||
|
|
||
|
// --------- Read values --------------------------------------------------
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetStringArrayValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-Array
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// saStrings [out] Array value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringArray
|
||
|
// otherwise returns a TStringArray with a single element
|
||
|
//
|
||
|
BOOL CWInfKey::GetStringArrayValue(TStringArray &saStrings) const
|
||
|
{
|
||
|
ConvertCommaDelimitedListToStringArray(m_Value, saStrings);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetStringListValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string-list
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pslList [out] List value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// If the value is a comma-delimited list, converts it to a TStringList
|
||
|
// otherwise returns a TStringList with a single element
|
||
|
//
|
||
|
BOOL CWInfKey::GetStringListValue(TStringList &pslList) const
|
||
|
{
|
||
|
ConvertCommaDelimitedListToStringList(m_Value, pslList);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// strValue [out] string value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfKey::GetStringValue(OUT tstring& strValue) const
|
||
|
{
|
||
|
strValue = m_Value;
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an in
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pdwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfKey::GetIntValue(OUT DWORD *pdwValue) const
|
||
|
{
|
||
|
if ((swscanf(m_Value.c_str(), L"0x%x", pdwValue) == 1) ||
|
||
|
(swscanf(m_Value.c_str(), L"%d", pdwValue) == 1))
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a QWORD
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pqwValue [out] int value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfKey::GetQwordValue(OUT QWORD *pqwValue) const
|
||
|
{
|
||
|
if ((swscanf(m_Value.c_str(), L"0x%I64x", pqwValue) == 1) ||
|
||
|
(swscanf(m_Value.c_str(), L"%I64d", pqwValue) == 1))
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pfValue [out] BOOL value to return
|
||
|
//
|
||
|
// Returns: TRUE if key found and value in correct format, FALSE otherwise
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// converts:
|
||
|
// "True" / "Yes" / 1 to TRUE
|
||
|
// "False" / "No" / 0 to FALSE
|
||
|
//
|
||
|
BOOL CWInfKey::GetBoolValue(OUT BOOL *pfValue) const
|
||
|
{
|
||
|
return IsBoolString(m_Value.c_str(), pfValue);
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//these functions return the default value if value not found
|
||
|
//or if it is in a wrong format
|
||
|
//+---------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetStringValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a string
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
PCWSTR CWInfKey::GetStringValue(IN PCWSTR pszDefault) const
|
||
|
{
|
||
|
if (m_Value.empty())
|
||
|
{
|
||
|
return pszDefault;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return m_Value.c_str();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetIntValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an int
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// dwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
DWORD CWInfKey::GetIntValue(IN DWORD dwDefault) const
|
||
|
{
|
||
|
DWORD dwValue;
|
||
|
if ((swscanf(m_Value.c_str(), L"0x%lx", &dwValue) == 1) ||
|
||
|
(swscanf(m_Value.c_str(), L"%ld", &dwValue) == 1))
|
||
|
{
|
||
|
return dwValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return dwDefault;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetQwordValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as an int
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// qwDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
QWORD CWInfKey::GetQwordValue(IN QWORD qwDefault) const
|
||
|
{
|
||
|
QWORD qwValue;
|
||
|
if ((swscanf(m_Value.c_str(), L"0x%I64x", &qwValue) == 1) ||
|
||
|
(swscanf(m_Value.c_str(), L"%I64x", &qwValue) == 1) ||
|
||
|
(swscanf(m_Value.c_str(), L"%I64d", &qwValue) == 1))
|
||
|
{
|
||
|
return qwValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return qwDefault;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::GetBoolValue
|
||
|
//
|
||
|
// Purpose: Return the value of the given key as a BOOL
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// fDefault [in] default value
|
||
|
//
|
||
|
// Returns: value if key found and value in correct format,
|
||
|
// otherwise returns the default-value
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
BOOL CWInfKey::GetBoolValue(IN BOOL bDefault) const
|
||
|
{
|
||
|
BOOL bValue;
|
||
|
|
||
|
if (IsBoolString(m_Value.c_str(), &bValue))
|
||
|
{
|
||
|
return bValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return bDefault;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// --------- Write values --------------------------------------------------
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetValues
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFormat [in] format string (printf style)
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetValues(IN PCWSTR Format, IN ...)
|
||
|
{
|
||
|
va_list arglist;
|
||
|
va_start (arglist, Format);
|
||
|
SetValues(Format, arglist);
|
||
|
va_end(arglist);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszFormat [in] format string (printf style)
|
||
|
// arglist [in] argument list
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetValues(IN PCWSTR Format, va_list arglist)
|
||
|
{
|
||
|
// we need m_Buffer because tstring does not provide
|
||
|
// tstring::Format( PCWSTR lpszFormat, va_list );
|
||
|
|
||
|
vswprintf(m_Buffer, Format, arglist);
|
||
|
m_Value = m_Buffer;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// pszValue [in] value to assign
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetValue(IN PCWSTR Value)
|
||
|
{
|
||
|
m_Value = Value;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetValue(IN DWORD Value)
|
||
|
{
|
||
|
FormatTString(m_Value, L"%d", Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetQwordValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// qwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetQwordValue(IN QWORD Value)
|
||
|
{
|
||
|
FormatTString(m_Value, L"0x%I64x", Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetHexValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed, stores value in hex.
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// dwValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfKey::SetHexValue(IN DWORD Value)
|
||
|
{
|
||
|
FormatTString(m_Value, L"0x%0lx", Value);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// slValues [in] values in the form of a string list
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// The string-list is converted to a comma-delimited list before
|
||
|
// the value is assigned to the key
|
||
|
//
|
||
|
void CWInfKey::SetValue(IN const TStringList &slValues)
|
||
|
{
|
||
|
tstring strFlatList;
|
||
|
ConvertStringListToCommaList(slValues, strFlatList);
|
||
|
SetValue(strFlatList.c_str());
|
||
|
m_fIsAListAndAlreadyProcessed = TRUE;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfKey::SetBoolValue
|
||
|
//
|
||
|
// Purpose: Sets the value of this key to the value passed
|
||
|
//
|
||
|
//
|
||
|
// Arguments:
|
||
|
// fValue [in] value
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
// TRUE is stored as "Yes"
|
||
|
// FALSE is stored as "No"
|
||
|
//
|
||
|
void CWInfKey::SetBoolValue(IN BOOL Value)
|
||
|
{
|
||
|
m_Value = Value ? c_szYes : c_szNo;
|
||
|
}
|
||
|
|
||
|
// ======================================================================
|
||
|
// Class CWInfComment
|
||
|
// ======================================================================
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfComment public functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfComment::CWInfComment
|
||
|
//
|
||
|
// Purpose: constructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
CWInfComment::CWInfComment(IN PCWSTR pszComment)
|
||
|
: CWInfLine(INF_COMMENT)
|
||
|
{
|
||
|
m_strCommentText = tstring(c_szCommentPrefix) + pszComment;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfComment::~CWInfComment
|
||
|
//
|
||
|
// Purpose: destructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
//
|
||
|
CWInfComment::~CWInfComment()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfComment::GetText
|
||
|
//
|
||
|
// Purpose: Get text representation of this comment
|
||
|
//
|
||
|
// Arguments:
|
||
|
// text [in] string that receives the text
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: kumarp 12 April 97 (05:53:03 pm)
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfComment::GetText(tstring &text) const
|
||
|
{
|
||
|
text = m_strCommentText;
|
||
|
}
|
||
|
|
||
|
// used by SysPrep
|
||
|
void CWInfComment::GetTextEx(tstring &text) const
|
||
|
{
|
||
|
text = m_strCommentText;
|
||
|
}
|
||
|
|
||
|
// ======================================================================
|
||
|
// Class CWInfRaw
|
||
|
// ======================================================================
|
||
|
|
||
|
// ----------------------------------------------------------------------
|
||
|
// CWInfRaw public functions
|
||
|
// ----------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfRaw::CWInfRaw
|
||
|
//
|
||
|
// Purpose: constructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
CWInfRaw::CWInfRaw(IN PCWSTR szText)
|
||
|
: CWInfLine(INF_RAW)
|
||
|
{
|
||
|
m_strText = szText;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfRaw::~CWInfRaw
|
||
|
//
|
||
|
// Purpose: destructor
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
//
|
||
|
CWInfRaw::~CWInfRaw()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CWInfRaw::GetText
|
||
|
//
|
||
|
// Purpose: Get text representation of this raw string
|
||
|
//
|
||
|
// Arguments:
|
||
|
// text [in] string that receives the text
|
||
|
//
|
||
|
// Returns: none
|
||
|
//
|
||
|
// Author: danielwe 11 Jun 1997
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
void CWInfRaw::GetText(tstring &text) const
|
||
|
{
|
||
|
text = m_strText;
|
||
|
}
|
||
|
|
||
|
// used by SysPrep
|
||
|
void CWInfRaw::GetTextEx(tstring &text) const
|
||
|
{
|
||
|
text = m_strText;
|
||
|
}
|
||
|
|