/*++ Copyright (c) 1995 Microsoft Corporation Module Name: parmlist.hxx Abstract: Simple class for parsing and storing parameter list pairs Author: John Ludeman (johnl) 22-Feb-1995 Revision History: --*/ #ifndef _PARMLIST_HXX_ #define _PARMLIST_HXX_ // // This is a simple class that parses and stores a field/value list // of the form // // field=value,field2=value2;param,field3=value3 // // Returned values include any parameters // class PARAM_LIST { public: PARAM_LIST( VOID ) { InitializeListHead( &_FieldListHead ); InitializeListHead( &_FreeHead ); _fCanonicalized = FALSE; } ~PARAM_LIST(); VOID Reset( VOID ); VOID SetIsCanonicalized( BOOL fIsCanon = FALSE ) { _fCanonicalized = fIsCanon; } // // Takes a list of '=' or ',' separated strings // HRESULT ParsePairs( const CHAR * pszList, BOOL fDefaultParams = FALSE, BOOL fAddBlankValues = TRUE, BOOL fCommaIsDelim = TRUE ); // // Parses simple comma delimited list and adds with empty value // HRESULT ParseSimpleList( const CHAR * pszList ); // // Looks up a value for a field, returns NULL if not found // CHAR * FindValue( const CHAR * pszField, BOOL * pfIsMultiValue = NULL, DWORD * pcbField = NULL ); // // Adds a field/value pair. Field doesn't get replaced if it // already exists and the value is not empty. // HRESULT AddParam( const CHAR * pszFieldName, const CHAR * pszValue ); // // Unconditionally adds the field/value pair to the end of the list // HRESULT AddEntry( const CHAR * pszFieldName, const CHAR * pszValue, BOOL fUnescape = FALSE, BOOL fPossibleFastMap = TRUE ); // // Adds an entry not using the fast map and not unescaping // HRESULT AddEntry( const CHAR * pszField, DWORD cbField, const CHAR * pszValue, DWORD cbValue ); // // concatenate with existing entry of same name or // adds the field/value pair to the end of the list if not // already present // HRESULT AddEntryUsingConcat( const CHAR * pszField, const CHAR * pszValue, BOOL fPossibleFastMap = TRUE ); // // Removes all occurrences of the specified field from the list // BOOL RemoveEntry( const CHAR * pszFieldName ); // // Enumerates the field/value pairs. Pass pCookie as NULL to start, // pass the return value on subsequent iterations until the return is // NULL. // VOID * NextPair( VOID * pCookie, CHAR * * ppszField, CHAR * * ppszValue ); // // Return lengths also - This version does NOT use the fast map // VOID * NextPair( VOID * pCookie, CHAR * * ppszField, DWORD * pcbField, CHAR * * ppszValue, DWORD * pcbValue ); // // Gets the number of elements in this parameter list // DWORD GetCount( VOID ); // // Canonicalize the list // VOID CanonList( VOID ); BOOL IsCanonicalized( VOID ) const { return _fCanonicalized; } private: // // Actual list of FIELD_VALUE_PAIR object // LIST_ENTRY _FieldListHead; LIST_ENTRY _FreeHead; BOOL _fCanonicalized; }; // // The list of field/value pairs used in the PARAM_LIST class // class FIELD_VALUE_PAIR { public: CHAR * QueryField( VOID ) { return _strField.QueryStr(); } CHAR * QueryValue( VOID ) { return _strValue.QueryStr(); } // // Means multiple fields were combined to make this value // BOOL IsMultiValued( VOID ) const { return _cValues > 1; } LIST_ENTRY ListEntry; STRA _strField; STRA _strValue; DWORD _cValues; }; #endif //_PARMLIST_HXX_