/*
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*      Declaration of class TCodParser.   
*      
*
*/
#ifndef COD_PARSER_H
#define COD_PARSER_H
// INCLUDES
#include <e32base.h>
// FORWARD DECLARATION
class CCodData;
// CLASS DECLARATION
/**
* COD Parser.
*/
NONSHARABLE_CLASS( TCodParser )
    {
    public:     // constructor
        /**
        * Constructor.
        */
        inline TCodParser();
    public:     // new methods
        /**
        * Parse the buffer into aData. Existing data in aData is lost.
        * Leaves on failure; leave code can be KErrCodInvalidDescriptor as well
        * as general errors. The resulting data is not checked semantically
        * (i.e. mandatory attributes may be missing).
        * @param aBuf COD content buffer to be parsed.
        * @param aData COD will be parsed into this.
        */
        void ParseL( const TDesC& aBuf, CCodData& aData );
    private:    // types
        enum TCodAttr               ///< COD Attributes.
            {
            ECodName,               ///< COD-Name.
            ECodVendor,             ///< COD-Vendor.
            ECodDescription,        ///< COD-Description.
            ECodUrl,                ///< COD-URL.
            ECodSize,               ///< COD-Size.
            ECodType,               ///< COD-Type.
            ECodInstallNotify,      ///< COD-Install-Notify.
            ECodNextUrl,            ///< COD-Netx-URL.
            ECodNextUrlAtError,     ///< COD-Next-URLatError.
            ECodInfoUrl,            ///< COD-Info-URL.
            ECodPrice,              ///< COD-Price.
            ECodIcon,               ///< COD-Icon.
            ECodUnknownAttr         ///< Future COD attributes.
            };
    private:    // parsing
        /**
        * Parse one line.
        * @return ETrue if more lines to go, EFalse if done.
        */
        TBool AttrLineL();
        /**
        * Parse an attribute name. Empty token sets error.
        * @return Attribute name type.
        */
        TCodAttr AttrName();
        /**
        * Parse an attribute value.
        * @return pointer to the value.
        */
        TPtrC AttrValue();
        /**
        * Skip (optional) white space.
        */
        void SkipWhiteSpace();
        /**
        * Skip past the end of current line (ignoring anything).
        */
        void NextLine();
        /**
        * Parse *WS until ?CR LF. Set error if something else found.
        * (Advance to LF, leaving the LF as lookahead char).
        */
        void EndOfLine();
        /**
        * Parse *WS : *WS. Set error if no colon found.
        * @return ETrue if colon found.
        */
        TBool Colon();
        /**
        * Check if current character is value char.
        * @return ETrue if current character is value char.
        */
        TBool IsValueChar() const;
        /**
        * Check if current character is control char.
        * @return ETrue if current character is control char.
        */
        TBool IsControl() const;
        /**
        * Check if current character is white space.
        * @return ETrue if current character is white space.
        */
        TBool IsWhiteSpace() const;
        /**
        * Check if current character is separator.
        * @return ETrue if current character is separator.
        */
        TBool IsSeparator() const;
        /**
        * Check if current character is CR LF or LF.
        * @return ETrue if current character is CR LF or LF.
        */
        TBool IsEndOfLine() const;
        /**
        * Set error code if not already set.
        * @param aError Error.
        */
        inline void Error( TInt aError );
    private:    // data
        const TDesC* iBuf;      ///< Data buffer. Not owned.
        CCodData* iData;        ///< COD Data. Not owned.
        const TText* iCurP;     ///< Current character position.
        const TText* iEndP;     ///< End pointer (past the buffer);
        TInt iError;            ///< Error code.
    };
#include "CodParser.inl"
#endif /* def COD_PARSER_H */