//+--------------------------------------------------------------------------- // // 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 #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; iend()) { 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; }