--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pnpmobileservices/pnpms/PnpPaosFilter/src/PnpPaosXml.h Thu Dec 17 08:40:12 2009 +0200
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2005-2006 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: For checking a PAOS XML document
+*
+*/
+
+
+
+#ifndef PNP_PAOS_XML_H
+#define PNP_PAOS_XML_H
+
+#include <e32std.h>
+#include <sysutil.h>
+#include <xml/parser.h> // for XML parser
+#include <xml/contenthandler.h> // for MContentHandler
+#include <http/mhttpdatasupplier.h>
+#include <PnpUtilImpl.h>
+
+
+using namespace Xml;
+
+class CPnpUtil;
+
+
+/**
+For checking a PAOS XML document. Checks that the XML is of right format.
+Currently only a request for "SetOfKeys" is allowed.
+*/
+
+class CPnpPaosXml :
+ public CBase,
+ public MContentHandler,
+ public MHTTPDataSupplier /* to set the body of a http request*/
+ {
+public:
+ /**
+ Possible PAOS request states, currently only ERequestingKeys is available.
+ */
+ enum TPaosStates
+ {
+ EPaosStatusUnknown = 0,
+ EPaosStatusRequestingPnPKeys, /* Received a PAOS request for PnP-MS parameters */
+ EPaosStatusRequestingHdcKeys /* Received a PAOS request for HelpDeskConnect parameters */
+ };
+
+ static CPnpPaosXml* NewL();
+ ~CPnpPaosXml();
+
+ /**
+ Construct a response to the PnP PAOS request received,
+ the response is put into iPaosResponse buffer.
+ */
+ void ConstructPnPPaosResponseL();
+
+ /**
+ Construct a response to the HelpDeskConnect PAOS request received,
+ the response is put into iPaosResponse buffer.
+ */
+ void ConstructHdcPaosResponseL();
+
+ /**
+ Construct a response to a PAOS request. The response is put into
+ iPaosResponse buffer.
+ @param aResponse The literal used in formatting the response. It is assumed
+ to have %S directives to be replaced by the given parameter values. Maximum
+ number of the directives is 8 as the first occurrence is always replaced by
+ XML that contains PAOS message ids.
+ @param aParameter1 Descriptor that replaces the second occurrence of %S directive in aResponse.
+ The default value is an empty descriptor.
+ @param aParameter2 Descriptor that replaces the third occurrence of %S directive in aResponse.
+ The default value is an empty descriptor.
+ @param aParameter3 And so on...
+ */
+ void ConstructPaosResponseL(
+ const TDesC8& aResponse,
+ const TDesC8& aParameter1 = KNullDesC8,
+ const TDesC8& aParameter2 = KNullDesC8,
+ const TDesC8& aParameter3 = KNullDesC8,
+ const TDesC8& aParameter4 = KNullDesC8,
+ const TDesC8& aParameter5 = KNullDesC8,
+ const TDesC8& aParameter6 = KNullDesC8,
+ const TDesC8& aParameter7 = KNullDesC8,
+ const TDesC8& aParameter8 = KNullDesC8
+ );
+
+ /**
+ Goes through the PAOS request received from the server. Leaves with
+ KErrArgument if the XML document was not correctly formatted.
+ */
+ void ParseL( TPaosStates& aPaosRequest );
+
+ /**
+ For storing the PAOS request piece by piece.
+ @return ETrue if this was the last data part from MHTTPDataSupplier.
+ */
+ TBool CollectResponseBodyL( MHTTPDataSupplier& aBody );
+
+//#ifndef __SERIES60_
+ /**
+ @return A pointer to a descriptor containing response body.
+ */
+// TPtrC8 ResponseBodyL();
+//#endif
+
+ /**
+ Returns the parameter responseConsumerUrl of the previous PAOS request parsed.
+ */
+ const TDesC8& GetPaosPostUrlL(){ return *iPaosPostUrlPath; };
+
+ /**
+ Returns the parameter referenceMessageId for the constructed PAOS response message
+ */
+ const TDesC8& GetReferenceMessageId(){ return *iReferenceMessageId; };
+
+ /**
+ Resets the PAOS request.
+ */
+ void ResetPaosRequest();
+
+public: // from MContentHandler
+
+ /**
+ This method is a callback to indicate the start of the document.
+ @param aDocParam Specifies the various parameters of the document.
+ @arg aDocParam.iCharacterSetName The character encoding of the document.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartDocumentL( const RDocumentParameters& aDocParam, TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate the end of the document.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndDocumentL( TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate an element has been parsed.
+ @param aElement is a handle to the element's details.
+ @param aAttributes contains the attributes for the element.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartElementL( const RTagInfo& aElement,
+ const RAttributeArray& aAttributes, TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate the end of the element has been reached.
+ @param aElement is a handle to the element's details.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndElementL( const RTagInfo& aElement, TInt aErrorCode );
+
+
+ /**
+ This method is a callback that sends the content of the element.
+ Not all the content may be returned in one go. The data may be sent in chunks.
+ When an OnEndElementL is received this means there is no more content to be sent.
+ @param aBytes is the raw content data for the element.
+ The client is responsible for converting the data to the
+ required character set if necessary.
+ In some instances the content may be binary and must not be converted.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnContentL( const TDesC8& aBytes, TInt aErrorCode );
+
+
+ /**
+ This method is a notification of the beginning of the scope of
+ a prefix-URI Namespace mapping.
+ This method is always called before the corresponding OnStartElementL method.
+ @param aPrefix is the Namespace prefix being declared.
+ @param aUri is the Namespace URI the prefix is mapped to.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartPrefixMappingL( const RString& aPrefix, const RString& aUri,
+ TInt aErrorCode );
+
+ /**
+ This method is a notification of the end of the scope of a prefix-URI mapping.
+ This method is called after the corresponding DoEndElementL method.
+ @param aPrefix is the Namespace prefix that was mapped.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndPrefixMappingL( const RString& aPrefix, TInt aErrorCode );
+
+ /**
+ This method is a notification of ignorable whitespace in element content.
+ @param aBytes are the ignored bytes from the document being parsed.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, TInt aErrorCode );
+
+
+ /**
+ This method is a notification of a skipped entity. If the parser encounters an
+ external entity it does not need to expand it - it can return the entity as aName
+ for the client to deal with.
+ @param aName is the name of the skipped entity.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnSkippedEntityL( const RString& aName, TInt aErrorCode );
+
+ /**
+ This method is a receive notification of a processing instruction.
+ @param aTarget is the processing instruction target.
+ @param aData is the processing instruction data. If empty none was supplied.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnProcessingInstructionL( const TDesC8& aTarget, const TDesC8& aData,
+ TInt aErrorCode );
+
+ /**
+ This method indicates an error has occurred.
+ @param aError is the error code
+ */
+ void OnError( TInt aErrorCode );
+
+ /**
+ This method obtains the interface matching the specified uid.
+ @return 0 if no interface matching the uid is found.
+ Otherwise, the this pointer cast to that interface.
+ @param aUid the uid identifying the required interface.
+ */
+ TAny* GetExtendedInterface( const TInt32 aUid );
+
+ /**
+ This method is indicates there is no more data in the data supplier to parse.
+ If there is more data to parse the Start method should be called once there
+ is more data in the supplier to continue parsing.
+ */
+ virtual void OnOutOfData();
+
+public: // From MHTTPDataSupplier
+ /**
+ From MHTTPDataSupplier.
+
+ Obtains a data part from the supplier.
+ The data is guaranteed to survive until a call is made to ReleaseData().
+
+ @param aDataPart The data part
+ @return ETrue if this is the last part, EFalse otherwise
+ */
+ virtual TBool GetNextDataPart( TPtrC8& aDataPart );
+
+ /**
+ From MHTTPDataSupplier.
+
+ Releases the current data part being held at the data supplier.
+ This call indicates to the supplier that the part is no longer needed,
+ and another one can be supplied, if appropriate.
+ */
+ virtual void ReleaseData();
+
+ /**
+ From MHTTPDataSupplier.
+
+ Obtains the overall size of the data being supplied, if known to the
+ supplier. Where a body of data is supplied in several parts, this size is
+ the sum of all the part sizes. If the size is not known, KErrNotFound is
+ returned; in this case the caller must use the return code of
+ GetNextDataPart() to find out when the data is complete.
+ @return A size in bytes, or KErrNotFound if the size is not known.
+ */
+ virtual TInt OverallDataSize();
+
+ /**
+ From MHTTPDataSupplier.
+ Resets the data supplier.
+
+ This indicates to the data supplier that it should return to the first part
+ of the data. This could be used in a situation where the data consumer has
+ encountered an error and needs the data to be supplied afresh. Even if the
+ last part has been supplied (i.e. GetNextDataPart() has returned ETrue),
+ the data supplier should reset to the first part.
+
+ @return If the supplier cannot reset, it should return an error code,
+ otherwise it should return KErrNone, where the reset will be
+ assumed to have succeeded.
+ */
+ virtual TInt Reset();
+
+private:
+ CPnpPaosXml();
+ void ConstructL();
+
+ /**
+ Generates a random character string. The original descriptor contents is lost.
+ */
+ void GenerateNonceString( TDes8& aString );
+
+ /**
+ * Fetch product model
+ * @since 2.0
+ * @return void
+ */
+ void FetchProductModelL( TDes8& aModel );
+
+ /** For parsing XML */
+ CParser* iParser;
+
+ /** Buffer for storing a http response (PAOS request) */
+ HBufC8* iPaosRequest;
+ /** Buffer for storing a http request (PAOS response) */
+ HBufC8* iPaosResponse;
+ /** The path for posting PAOS response to (responseConsumerURL) */
+ HBufC8* iPaosPostUrlPath;
+ /** messageID parameter PAOS spec:
+ "RECOMMENDED that the value of this attribute have nonce characteristic" */
+ HBufC8* iMessageId;
+ /** refToMessageID parameter; references to the messageID of the PAOS query received.
+ PAOS spec: "RECOMMENDED that the value of this attribute have nonce characteristic" */
+ HBufC8* iReferenceMessageId;
+ TPaosStates iPaosStatus;
+ /** ETrue if there was the parameter responseConsumerURL in the xml,
+ EFalse otherwise */
+ TBool iResponseConsumerUrlFound;
+ /** Set to ETrue if parsing the XML caused a call to MContentHandler::OnError */
+ TBool iErrorFound;
+ /** An enum value for storing the current xml element */
+ TInt iCurrentElement;
+};
+
+#endif // PNP_PAOS_XML_H