/*
* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:  XML file handler for DM-settings
*
*/


#ifndef __DMPROFILECONTENTHANDLER_H
#define __DMPROFILECONTENTHANDLER_H

//  INCLUDES
#include <e32std.h>
#include <f32file.h>
#include "MXMLAttributes.h"
#include "MXMLContentHandler.h"
#include "NSmlDMResourceProfile.h"

const TInt KNSmlDmFileNameLength=255;
const TInt KNSmlDmProfileNameMaxLength = 100;
const TInt KNSmlDmSettingsSuccess = 1;
const TInt KNSmlDmSettingsFail = 0; 
const TInt KNSmlDmInternetType = 0x101F99F0;
const TInt KNSmlDmBluetoothType = 0x101F99F1;
const TInt KNSmlDmMaxPortLength = 5;
const TUint8 KNSmlDMColon = ':';
const TUint8 KNSmlDMUriSeparator = '/';

_LIT( KNSmlDMXmlFactorySettings, 				"DMFactorySettings" );
_LIT( KNSmlDMXmlServerId,						"ServerID" );
_LIT( KNSmlDMXmlProfileName,					"ProfileName" );
_LIT( KNSmlDMXmlProfileAP,						"AccessPoint" );
_LIT( KNSmlDMXmlProfileTransportId,				"TransportID" );
_LIT( KNSmlDMXmlProfileUsername,				"UserName" );
_LIT( KNSmlDMXmlProfileServerPassword,			"ServerPassword" );
_LIT( KNSmlDMXmlProfileClientPassword, 			"ClientPassword" );
_LIT( KNSmlDMXmlProfileServerUrl,				"ServerURL" );
_LIT( KNSmlDMXmlProfileServerAlertedAction,		"ServerAlertedAction" );
_LIT( KNSmlDMXmlProfileAuthentication,	 		"Authentication" );
_LIT( KNSmlDMXmlProfileDeleteAllowed,			"DeleteAllowed" );
_LIT( KNSmlDMXmlProfileView,					"ProfileView" );
_LIT( KNSmlDMXmlProfileNetworkAuthentication,	"NetworkAuthentication" );
_LIT( KNSmlDMXmlProfileHttpAuthUsername,	 	"HTTPUserName" );
_LIT( KNSmlDMXmlProfileHttpAuthPassword,	 	"HTTPPassword" );
_LIT( KNSmlDMInternetTypeString,	 			"0x101F99F0" );
_LIT( KNSmlDMBluetoothTypeString,	 			"0x101F99F1" );
_LIT( KNSmlDMDefaultProfile,					"Unnamed server" );
_LIT( KNSmlDMXmlProfileLock,					"ProfileLock" );

_LIT( KNSmlDMSettingsHTTP,  "http://" );
_LIT( KNSmlDMSettingsHTTPS, "https://" );

enum TDMparameterState
	{
	//Management operations
	EStateHandled = 0,
	EProfileName,
	EServerID,
	EServerPassword,
	EUserName,
	EUserPwd,
	EClientPwd,
	EServerURL,
	ETransportID,
	EAccessPoint,
	EServerAlertedAction,
	EAuthentication,
	EDeleteAllowed,
	EProfileView,
	ENetworkAuthentication,
	EHTTPUserName,
	EHTTPPwd,
	EProfileLock	
	};

// CLASS DECLARATION

// FORWARD DECLARATIONS
class CNSmlDMSettings;

/**
*  Interface for SAX Parser Callback events.
*  If an application (client) needs to be informed of basic parsing events, 
*  it implements this interface and registers an instance with the SAX parser using the SetContentHandler() method.
*  The parser uses the instance to report basic document-related events like the start and end of elements.
*
*  @lib ?library
*  @since ?Series60_version
*/
class CDMProfileContentHandler: public CBase, public MXMLContentHandler
{
public:


	/**
    * Two-phased constructor.
    */
    static CDMProfileContentHandler* NewL(CNSmlDMSettings* aSettings);

	static CDMProfileContentHandler* NewLC();
        
    /**
    * Destructor.
    */
    virtual ~CDMProfileContentHandler();

	/**
	* Appends the new profile
	* @param -
	* @return -
	*/
	void AddProfileL();
	
	/** 
	* Assign the profile element value
	* @param -
	* @return -
	*/
	void AddProfileElementL(TDesC& aBuf);
	
	/**
	* Removes duplicate profiles from array
	* @param -
	* @return -
	*/
	void RemoveDuplicateEntry();
	
	/**
	* Removes RSC duplicate profiles from array
	* @param -
	* @return -
	*/
	void RemoveRSCEntryL();

	/**
	* Returns true value for other than numerical character.
	* @param - aChar
	* @return - true if aChar is other than numerical character.
	*/
	TBool IsChar( const TUint8 aChar );
	
	/**
	* Gets IAP id from the db
	* @param - TInt count, TInt &iapId
	* @return - TBool - ETrue if server id was found
	*/
	TBool GetAccessPointIdL(TInt count, TInt &iapId);
	
	/**
	* Save profiles to db
	* @param - 
	* @return -
	*/
	void SaveProfilesL();
	
	/**
	* Receive notification of the beginning of a document.
	* @param none
	* @return none
	*/		
    TInt StartDocument();

	/**
	* Receive notification of the end of a document.
	* @param none
	* @return none
	*/
	TInt EndDocument();

	/**
	* Receive notification of the beginning of an element.
	* @param aURI: The Namespace URI, or the empty string if the element has no Namespace URI or if Namespace
	*              processing is not being performed.
	* @param aLocalName: The local name (without prefix), or the empty string if Namespace processing is not being
	*                    performed.
	* @param aName: The qualified name, or the empty string if qualified names are not available.
	* @param aAttributeList: The attributes attached to the element. If there are no attributes, it shall be an 
	*                        empty Attributes object. 
	*        
	* @return none
	*/
	TInt StartElement(TDesC& aURI, TDesC& aLocalName, TDesC& aName, MXMLAttributes *aAttributeList);

	/**
	* Receive notification of the end of an element.
	* @param aURI: The Namespace URI, or the empty string if the element has no Namespace URI or if Namespace
	*              processing is not being performed.
	* @param aLocalName: The local name (without prefix), or the empty string if Namespace processing is not being
	*                    performed.
	* @param aName: The qualified name, or the empty string if qualified names are not available.
	* @return none
	*/
	TInt EndElement(TDesC& aURI, TDesC& aLocalName, TDesC& aName);

	/**
	* Receive notification of the start of a CDATA section. 
	* The contents of the CDATA section will be reported through the Characters() event. 
	* @param none. 
	* @return none.
	*/
	TInt StartCDATA();

	/**
	* Receive notification of the end of a CDATA section.  
	* @param none. 
	* @return none.
	*/
	TInt EndCDATA();

	/**
	* Receive notification of character data inside an element.
	* @param aBuff: The characters.
	* @param aStart: The start position in the character buffer.
	* @param aLength: The number of characters to use from the character buffer.
	* @return none
	*/
	TInt Charecters(TDesC& aBuf, TInt aStart, TInt aLength);

	/**
	* Receive notification of XML comment.
	* @param aComment: Buffer containing the comment.
	* @return none
	*/
	TInt Comment(TDesC& aComment); // JIM might need start and end index as params.

	/**
	* Receive notification of a processing instruction
	* @param aTarget: The processing instruction target.
	* @param aData: The processing instruction data, or null if none is supplied.
	* @return none
	*/
   TInt ProcessingInstructions(TDesC& aTarget, TDesC& aData);

	/**
	* Receive notification of ignorable whitespace in element content.
	* @param aString: The whitespace characters.
	* @return none
	*/
	TInt IgnoreWhiteSpace(TDesC& aString); // JIM might need start and end index as params.

	/**
	* Receive notification of beginning of some internal and external XML entities.
	* @param aName: The name of the entity.
	* @return none
	*/
	TInt StartEntity(TDesC& aName);

	/**
	* Receive notification of end of XML entities.
	* @param aName: The name of the entity.
	* @return none
	*/
	TInt EndEntity(TDesC& aName);

	/**
	* Receive notification of a skipped entity.
	* @param aName: The name of the skipped entity.
	* @return none
	*/
	TInt SkippedEntity(TDesC& aName);

	/**
	* Receive notification of error situation during parsing.
	* @param aErrorCode: Error status code.
	* @param aSeverity: Error Severity.
	* @return none.
	*/
	TInt Error(TInt aErrorCode, TInt aSeverity);

protected:
	CDMProfileContentHandler();
		

private:
	void ConstructL(CNSmlDMSettings* aSettings);
	
	/** 
	* Assign the profile element value
	* @param aBuf : element value
	* @return -
	*/
	void AddRemainingElementsL(TDesC& aBuf);

private:

// List of attributes
	RFile iFile;
	RFs iSession;
	TBuf<KNSmlDmFileNameLength> iFilename;

	TDMparameterState iState;
	TInt iCounter;
	TBool iDMAccountInProgress;
	CArrayPtrFlat<CNSmlDMResourceProfile>* iProfileArray;
	CNSmlDMSettings* iSettings;
};
            
#endif	// End of File
