|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: C W I N F . H
//
// Contents: Declaration of class CWInfFile and other related classes
//
// Notes:
//
// Author: kumarp 04/12/97 17:17:27
//
//----------------------------------------------------------------------------
#pragma once
#include "kkstl.h"
//----------------------------------------------------------------------------
// forward declarations and useful typedefs
//----------------------------------------------------------------------------
typedef unsigned __int64 QWORD;
class CWInfContext; typedef CWInfContext &RCWInfContext;
class CWInfFile; typedef CWInfFile *PCWInfFile, &RCWInfFile;
class CWInfSection; typedef CWInfSection *PCWInfSection, &RCWInfSection;
class CWInfKey; typedef CWInfKey *PCWInfKey, &RCWInfKey;
class CWInfLine; typedef CWInfLine *PCWInfLine, &RCWInfLine;
// access mode for CWInfFile
enum WInfAccessMode { IAM_Read, IAM_Write };
// search mode for CWInfFile
enum WInfSearchMode { ISM_FromCurrentPosition, ISM_FromBeginning };
typedef list<PCWInfLine> WifLinePtrList; typedef WifLinePtrList::iterator WifLinePtrListIter;
// ----------------------------------------------------------------------
// Class CWInfContext
//
// Inheritance:
// none
//
// Purpose:
// Stores context within a CWInfFile during reading or writing
//
// Hungarian: wix
// ----------------------------------------------------------------------
class CWInfContext { friend class CWInfFile;
public: CWInfContext() { posSection = 0; posLine = 0; }
private: WifLinePtrListIter posSection; WifLinePtrListIter posLine; };
// ----------------------------------------------------------------------
// Class CWInfContext
//
// Inheritance:
// none
//
// Purpose:
// Allows simultaneous reading from and writing to an INF/INI style file
//
// Hungarian: wif
// ----------------------------------------------------------------------
class CWInfFile { public: CWInfFile(); ~CWInfFile();
BOOL Init(); virtual BOOL Create(IN PCWSTR pszFileName); virtual BOOL Create(IN FILE *fp); virtual BOOL Open(IN PCWSTR pszFileName); virtual BOOL Open(IN FILE *fp); virtual BOOL Close(); virtual BOOL SaveAs(IN PCWSTR pszFileName); virtual BOOL SaveAsEx(IN PCWSTR pszFileName); // used by SysPrep
virtual BOOL Flush(); virtual BOOL FlushEx(); // used by SysPrep
virtual PCWSTR FileName() const { return m_strFileName.c_str(); }
virtual const CWInfContext CurrentReadContext() const { return m_ReadContext; } virtual void SetReadContext(IN RCWInfContext cwic) { m_ReadContext = cwic; }
virtual const CWInfContext CurrentWriteContext() const { return m_WriteContext; } virtual void SetWriteContext(IN RCWInfContext cwic) { m_WriteContext = cwic; }
//Functions for reading
virtual PCWInfSection FindSection(IN PCWSTR pszSectionName, IN WInfSearchMode wsmMode=ISM_FromBeginning); virtual void SetCurrentReadSection(IN PCWInfSection pwisSection); virtual PCWInfSection CurrentReadSection() const;
virtual PCWInfKey FindKey(IN PCWSTR pszKeyName, IN WInfSearchMode wsmMode=ISM_FromCurrentPosition); virtual PCWInfKey FirstKey(); virtual PCWInfKey NextKey();
//these functions return the FALSE if value not found
//or if it is in a wrong format
virtual BOOL GetStringArrayValue(IN PCWSTR pszKeyName, OUT TStringArray &saStrings); virtual BOOL GetStringListValue(IN PCWSTR pszKeyName, OUT TStringList &slList); virtual BOOL GetStringValue(IN PCWSTR pszKeyName, OUT tstring &strValue); virtual BOOL GetIntValue(IN PCWSTR pszKeyName, OUT DWORD *pdwValue); virtual BOOL GetQwordValue(IN PCWSTR pszKeyName, OUT QWORD *pqwValue); virtual BOOL GetBoolValue(IN PCWSTR pszKeyName, OUT BOOL *pfValue);
//these functions return the default value if value not found
//or if it is in a wrong format
virtual PCWSTR GetStringValue(IN PCWSTR pszKeyName, IN PCWSTR pszDefault); virtual DWORD GetIntValue(IN PCWSTR pszKeyName, IN DWORD dwDefault); virtual QWORD GetQwordValue(IN PCWSTR pszKeyName, IN QWORD qwDefault); virtual BOOL GetBoolValue(IN PCWSTR pszKeyName, IN BOOL fDefault);
//Functions for writing
virtual void GotoEnd();
virtual PCWInfSection AddSectionIfNotPresent(IN PCWSTR pszSectionName); virtual PCWInfSection AddSection(IN PCWSTR pszSectionName); virtual void GotoEndOfSection(PCWInfSection section); virtual PCWInfSection CurrentWriteSection() const; void RemoveSection(IN PCWSTR szSectionName); void RemoveSections(IN TStringList& slSections);
virtual PCWInfKey AddKey(IN PCWSTR pszKeyName); virtual void AddKey(IN PCWSTR pszKeyName, IN PCWSTR Value); virtual void AddKey(IN PCWSTR pszKeyName, IN DWORD Value); virtual void AddQwordKey(IN PCWSTR pszKeyName, IN QWORD qwValue); virtual void AddHexKey(IN PCWSTR pszKeyName, IN DWORD Value); virtual void AddBoolKey(IN PCWSTR pszKeyName, IN BOOL Value); virtual void AddKeyV(IN PCWSTR pszKeyName, IN PCWSTR Format, IN ...); virtual void AddKey(IN PCWSTR pszKeyName, IN PCWSTR Format, IN va_list arglist); virtual void AddKey(IN PCWSTR pszKeyName, IN const TStringList &slValues);
virtual void AddComment(IN PCWSTR pszComment); virtual void AddRawLine(IN PCWSTR szText); virtual void AddRawLines(IN PCWSTR* pszLines, IN DWORD cLines);
protected: WifLinePtrList *m_plSections, *m_plLines; CWInfContext m_WriteContext, m_ReadContext;
BOOL AddLine(IN const PCWInfLine ilLine); virtual void ParseLine(IN PCWSTR pszLine);
private: tstring m_strFileName; FILE* m_fp; };
// ----------------------------------------------------------------------
// Type of a line in a CWInfFile
//
// Hungarian: ilt
// ----------------------------------------------------------------------
enum InfLineTypeEnum { INF_UNKNOWN, INF_SECTION, INF_KEY, INF_COMMENT, INF_BLANK, INF_RAW }; typedef enum InfLineTypeEnum InfLineType;
// ----------------------------------------------------------------------
// Class CWInfLine
//
// Inheritance:
// none
//
// Purpose:
// Represents a line in a CWInfFile
//
// Hungarian: wil
// ----------------------------------------------------------------------
class CWInfLine { public: CWInfLine(InfLineType type) { m_Type = type; }
virtual void GetText(tstring &text) const = 0; virtual void GetTextEx(tstring &text) const = 0; // used by SysPrep
InfLineType Type() const { return m_Type; }
virtual ~CWInfLine(){};
protected: InfLineType m_Type; };
// ----------------------------------------------------------------------
// Class CWInfSection
//
// Inheritance:
// CWInfLine
//
// Purpose:
// Represents a section in a CWInfFile
//
// Hungarian: wis
// ----------------------------------------------------------------------
class CWInfSection : public CWInfLine { friend class CWInfFile;
public: virtual void GetText(tstring &text) const; virtual void GetTextEx(tstring &text) const; // used by SysPrep
virtual PCWSTR Name() const { return m_Name.c_str(); }
//Functions for reading
virtual PCWInfKey FindKey(IN PCWSTR pszKeyName, IN WInfSearchMode wsmMode=ISM_FromCurrentPosition); virtual PCWInfKey FirstKey(); virtual PCWInfKey NextKey();
//these functions return the FALSE if value not found
//or if it is in a wrong format
virtual BOOL GetStringArrayValue(IN PCWSTR pszKeyName, OUT TStringArray &saStrings); virtual BOOL GetStringListValue(IN PCWSTR pszKeyName, OUT TStringList &slList); virtual BOOL GetStringValue(IN PCWSTR pszKeyName, OUT tstring &strValue); virtual BOOL GetIntValue(IN PCWSTR pszKeyName, OUT DWORD *pdwValue); virtual BOOL GetQwordValue(IN PCWSTR pszKeyName, OUT QWORD *pqwValue); virtual BOOL GetBoolValue(IN PCWSTR pszKeyName, OUT BOOL *pfValue);
//these functions return the default value if value not found
//or if it is in a wrong format
virtual PCWSTR GetStringValue(IN PCWSTR pszKeyName, IN PCWSTR pszDefault); virtual DWORD GetIntValue(IN PCWSTR pszKeyName, IN DWORD dwDefault); virtual QWORD GetQwordValue(IN PCWSTR pszKeyName, IN QWORD qwDefault); virtual BOOL GetBoolValue(IN PCWSTR pszKeyName, IN BOOL fDefault);
//Functions for writing
virtual void GotoEnd();
virtual PCWInfKey AddKey(IN PCWSTR pszKeyName); virtual void AddKey(IN PCWSTR pszKeyName, IN PCWSTR Value); virtual void AddKey(IN PCWSTR pszKeyName, IN DWORD Value); virtual void AddQwordKey(IN PCWSTR pszKeyName, IN QWORD qwValue); virtual void AddHexKey(IN PCWSTR pszKeyName, IN DWORD Value); virtual void AddBoolKey(IN PCWSTR pszKeyName, IN BOOL Value); virtual void AddKeyV(IN PCWSTR pszKeyName, IN PCWSTR Format, IN ...); virtual void AddKey(IN PCWSTR pszKeyName, IN const TStringList &slValues);
virtual void AddComment(IN PCWSTR pszComment); virtual void AddRawLine(IN PCWSTR szLine);
protected: tstring m_Name; WifLinePtrListIter m_posLine, m_posSection; CWInfFile *m_Parent;
CWInfSection(IN PCWSTR pszSectionName, IN PCWInfFile parent); ~CWInfSection();
};
// ----------------------------------------------------------------------
// Class CWInfKey
//
// Inheritance:
// CWInfLine
//
// Purpose:
// Represents a key=value line in a CWInfFile
//
// Hungarian: wik
// ----------------------------------------------------------------------
class CWInfKey : public CWInfLine { friend class CWInfFile;
public: CWInfKey(IN PCWSTR pszKeyName); ~CWInfKey(); static void Init(); static void UnInit();
virtual void GetText(tstring &text) const; virtual void GetTextEx(tstring &text) const; // used by SysPrep
PCWSTR Name() const { return m_Name.c_str(); }
//Read values
//these functions return the FALSE if value not found
//or if it is in a wrong format
virtual BOOL GetStringArrayValue(OUT TStringArray &saStrings) const; virtual BOOL GetStringListValue(OUT TStringList& slList) const; virtual BOOL GetStringValue(OUT tstring& strValue) const; virtual BOOL GetIntValue(OUT DWORD *pdwValue) const; virtual BOOL GetQwordValue(OUT QWORD *pqwValue) const; virtual BOOL GetBoolValue(OUT BOOL *pfValue) const;
//these functions return the default value if value not found
//or if it is in a wrong format
virtual PCWSTR GetStringValue(IN PCWSTR pszDefault) const; virtual DWORD GetIntValue(IN DWORD dwDefault) const; virtual QWORD GetQwordValue(IN QWORD qwDefault) const; virtual BOOL GetBoolValue(IN BOOL fDefault) const;
//Write values
virtual void SetValues(IN PCWSTR Format, va_list arglist); virtual void SetValues(IN PCWSTR Format, IN ...); virtual void SetValue(IN PCWSTR Value); virtual void SetValue(IN DWORD Value); virtual void SetQwordValue(IN QWORD Value); virtual void SetHexValue(IN DWORD Value); virtual void SetBoolValue(IN BOOL Value); virtual void SetValue(IN const TStringList &slValues);
protected: static WCHAR *m_Buffer;
private: tstring m_Name, m_Value; BOOL m_fIsAListAndAlreadyProcessed; // the value is a MULTI_SZ, will be
// written out as a comma-separated
// list, and has already been checked
// to see if it has special chars and
// needs to be surrounded by quotes.
};
// ----------------------------------------------------------------------
// Class CWInfComment
//
// Inheritance:
// CWInfComment
//
// Purpose:
// Represents a comment line in a CWInfFile
//
// Hungarian: wic
// ----------------------------------------------------------------------
class CWInfComment : public CWInfLine { public: CWInfComment(IN PCWSTR pszComment); ~CWInfComment();
virtual void GetText(tstring &text) const; virtual void GetTextEx(tstring &text) const; // used by SysPrep
protected:
private: tstring m_strCommentText; };
// ----------------------------------------------------------------------
// Class CWInfRaw
//
// Inheritance:
// CWInfRaw
//
// Purpose:
// Represents a raw line in a CWInfFile
//
// Hungarian: wir
// ----------------------------------------------------------------------
class CWInfRaw : public CWInfLine { public: CWInfRaw(IN PCWSTR szText); ~CWInfRaw();
virtual void GetText(tstring &text) const; virtual void GetTextEx(tstring &text) const; // used by SysPrep
protected:
private: tstring m_strText; };
// ----------------------------------------------------------------------
|