//+--------------------------------------------------------------------------- // // Copyright (C) 1996, Microsoft Corporation. // // File: htx.hxx // // Contents: Parser for an HTX file // // History: 96/Jan/3 DwightKr Created // //---------------------------------------------------------------------------- #pragma once // // This is the total number of include files allowed // const ULONG MAX_HTX_INCLUDE_FILES = 32; //+--------------------------------------------------------------------------- // // Class: CHTXScanner // // Purpose: Breaks up a string into a number of HTX tokens // // History: 96/Jan/23 DwightKr Created // //---------------------------------------------------------------------------- class CHTXScanner { public: CHTXScanner( CVariableSet & variableSet, WCHAR const * wcsPrefix, WCHAR const * wcsSuffix ); void Init( WCHAR * wcsString ); BOOL FindNextToken(); BOOL IsToken(WCHAR * wcs); int TokenType() const { return _type; } WCHAR * GetToken(); private: WCHAR * _wcsString; // String to parse WCHAR const * _wcsPrefix; // Token prefix delimiter WCHAR const * _wcsSuffix; // Token suffix delimiter WCHAR * _wcsPrefixToken; // Start of current token WCHAR * _wcsSuffixToken; // End of current token CVariableSet & _variableSet; // List of replaceabe parameters // used to identify replaceable tokens unsigned _cchPrefix; // Length of the prefix delimiter unsigned _cchSuffix; // Length of the suffix delimiter WCHAR * _wcsNextToken; // Ptr to next token unsigned _type; // Type of current token unsigned _nextType; // Type of next token if not eNone }; #define CANONIC_HTX_FILE L"//CANONIC.HTX" class CParameterReplacer; //+--------------------------------------------------------------------------- // // Class: CHTXFile // // Purpose: Scans and parses an HTX file. // // History: 96/Jan/23 DwightKr Created // //---------------------------------------------------------------------------- class CHTXFile { public: CHTXFile( XPtrST & wcsTemplate, UINT codePage, CSecurityIdentity const & securityIdentity, ULONG ulServerInstance ); ~CHTXFile(); void ParseFile( WCHAR const * wcsFileName, CVariableSet & variableSet, CWebServer & webServer ); void GetHeader( CVirtualString & string, CVariableSet & variableSet, COutputFormat & outputFormat ); void GetFooter( CVirtualString & string, CVariableSet & variableSet, COutputFormat & outputFormat ); BOOL DoesDetailSectionExist() { return 0 != _pVarRowDetails; } void GetDetailSection( CVirtualString & string, CVariableSet & variableSet, COutputFormat & outputFormat ) { Win4Assert( 0 != _pVarRowDetails ); _pVarRowDetails->ReplaceParams( string, variableSet, outputFormat ); } WCHAR const * GetVirtualName() const { return _wcsVirtualName; } WCHAR const * GetPhysicalName() const { return _wcsPhysicalName; } BOOL IsCachedDataValid(); inline BOOL CheckSecurity( CSecurityIdentity const & securityIdentity ) const; void SetSecurityToken( CSecurityIdentity const & securityIdentity ) { _securityIdentity.SetSecurityToken( securityIdentity ); } BOOL IsSequential() const { return _fSequential; } void LokAddRef() { InterlockedIncrement(&_refCount); } void Release() { InterlockedDecrement(&_refCount); Win4Assert( _refCount >= 0 ); } LONG LokGetRefCount() { return _refCount; } ULONG GetServerInstance() { return _ulServerInstance; } void GetFileNameAndLineNumber( int offset, WCHAR *& wcsFileName, LONG & lineNumber ); UINT GetCodePage() const { return _codePage; } private: WCHAR * ReadFile( WCHAR const * wcsFileName, FILETIME & ftLastWrite ); BOOL CheckForSequentialAccess(); void ExpandFile( WCHAR const * wcsFileName, CWebServer & webServer, CVirtualString & vString, FILETIME & ftLastWrite ); LONG CountLines( WCHAR const * wcsStart, WCHAR const * wcsEnd ) const; FILETIME _ftHTXLastWriteTime; // Last write time of HTX file FILETIME _aftIncludeLastWriteTime[MAX_HTX_INCLUDE_FILES]; WCHAR * _wcsVirtualName; // Virtual name of HTX file WCHAR _wcsPhysicalName[_MAX_PATH]; // Physical name WCHAR * _awcsIncludeFileName[MAX_HTX_INCLUDE_FILES]; ULONG _aulIncludeFileOffset[MAX_HTX_INCLUDE_FILES]; WCHAR * _wcsFileBuffer; // Contents of combined HTX files CParameterReplacer * _pVarHeader; // Buffer containing HTX header CParameterReplacer * _pVarRowDetails; // Buffer containing detail section CParameterReplacer * _pVarFooter; // Buffer containing footer BOOL _fSequential; // File can be expanded using seq cursor ULONG _cIncludeFiles; // # of include files LONG _refCount; // Refcount for this file UINT _codePage; // Code page used to read this file ULONG _ulServerInstance; // VServer Instance ID CSecurityIdentity _securityIdentity; // Security ID used to open file }; //+--------------------------------------------------------------------------- // // Class: CHTXFileList // // Purpose: List of parsed and cached HTX files // // History: 96/Mar/27 DwightKr Created // //---------------------------------------------------------------------------- class CHTXFileList { public: CHTXFileList() : _ulSignature( LONGSIG( 'h', 't', 'x', 'l' ) ), _pCanonicHTX( 0 ) { END_CONSTRUCTION(CHTXFileList); } ~CHTXFileList(); CHTXFile & FindCanonicHTX( CVariableSet & variableSet, UINT codePage, CSecurityIdentity const & securityIdentity, ULONG ulServerInstance ); CHTXFile & Find( WCHAR const * wcsVirtualName, CVariableSet & variableSet, COutputFormat & outputFormat, CSecurityIdentity const & securityIdentity, ULONG ulServerInstance ); void Release( CHTXFile & htxFile ); void DeleteZombies(); private: ULONG _ulSignature; // Signature of start of privates CMutexSem _mutex; // To serialize access to list CDynArrayInPlace _aHTXFile; // parsed HTX files CHTXFile * _pCanonicHTX; // HTX file for canonic output. }; //+--------------------------------------------------------------------------- // // Method: CHTXFile::CheckSecurity // // Purpose: Compare user id with one used to load IDQ file // // Arguments: [securityIdentity] - Check against this // // Returns: TRUE if check passes // // History: 26-Oct-1996 KyleP Created // //---------------------------------------------------------------------------- inline BOOL CHTXFile::CheckSecurity( CSecurityIdentity const & securityIdentity ) const { return _securityIdentity.IsEqual( securityIdentity ); }