pushmtm/plugins/PushContentHandler/CSIContentHandler.h
branchRCL_3
changeset 69 4455192101e4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pushmtm/plugins/PushContentHandler/CSIContentHandler.h	Mon Sep 13 17:13:53 2010 +0100
@@ -0,0 +1,436 @@
+/*
+* 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 CSIContentHandler.
+*
+*/
+
+
+
+#ifndef __CSICONTENTHANDLER_H__
+#define __CSICONTENTHANDLER_H__
+
+
+// INCLUDE FILES
+
+#include "CPushContentHandlerBase.h"
+#include "PushContentHandlerDef.hrh"
+#include <E32Base.h>
+#include <msvstd.h>
+#include <nw_dom_attribute.h>
+#include <CharConv.h>
+
+// CONSTANTS
+
+const TUid KUidPushSIContentHandler	= { EUidPushSIContentHandler };
+_LIT(KSIContentHandlerData,"text/vnd.wap.si||application/vnd.wap.sic");
+
+// FORWARD DECLARATIONS
+
+class CSIPushMsgEntry;
+
+// CLASS DECLARATION
+
+/** 
+* CSIContentHandler handles Service Indication content  
+*
+* This handler takes ownership of the SI message and processes it
+* according to the Reception rules 
+* [WAP Service Indication version 31-July-2001]
+* and either stores the message or deletes it.
+* Also S60 specific requirements are applied.
+*
+* OVERVIEW:
+*	The main body of this class and its functionality lies within
+*	HandleMessage (asynchonous). This :
+*		1. takes ownership of the push message
+*		2. validates the message and generates a parsed document tree
+*		3. extracts the message attribute values from document tree 
+*		4. processes the received message
+*		5. finishes
+*
+* NB: A received message with no creation date will be stored (unless 
+* its action is set to delete or the expiry condition is met). This 
+* means that the si-id in the message store will not be unique.
+*/
+class CSIContentHandler : public CPushContentHandlerBase
+	{
+    public: // Constructors and destructor
+
+        /**
+        * Two-phased constructor. Leaves on failure.
+        * @return The constructed object.
+        */
+	    static CSIContentHandler* NewL();
+
+        /**
+        * Destructor.
+        */
+	    virtual ~CSIContentHandler();
+
+    private: // Constructors
+
+        /**
+        * Constructor.
+        */
+	    CSIContentHandler();
+
+        /**
+        * Symbian OS constructor.
+        */
+	    void  ConstructL();
+
+    private: // New functions
+
+        /**
+        * Do Garbage Collection synchronously.
+        * @return None.
+        */
+	    void  CollectGarbageL();
+
+        /**
+        * Parse the current message. If the SI is wbxml encoded then it is 
+        * decoded first to XML format. Then the message details (attributes) 
+        * are earned from the XML tree.
+        * @return None.
+        */
+	    void  ParsePushMsgL();
+
+        /**
+        * Parse the indication element.
+        * @param aIndication The element to be parsed.
+        * @return None.
+        */
+	    void  ParseIndicationL( NW_DOM_ElementNode_t& aIndication );
+
+        /**
+        * Parse an attribute of the indication element.
+        * @param aAttrHandle The attribute to be parsed.
+        * @return None.
+        */
+	    void  ParseIndAttributeL( NW_DOM_AttributeHandle_t& aAttrHandle );
+
+        /**
+        * Parse the text of the indication element.
+        * @param aTextNode The text node to be parsed.
+        * @return None.
+        */
+	    void  ParseTextL( NW_DOM_TextNode_t& aTextNode );
+
+
+        /**
+        * Converts the given buffer to unicode (UCS-2).
+        * @param aSrc Source text.
+        * @param aCharSetId Character set ID.
+        * @return The UCS-2 unicode buffer.
+        */
+	    HBufC16*  ConvertToUnicodeL( const TDesC8& aSrc, TUint aCharSetId );
+
+        /**
+        * Converts the given buffer to unicode (UCS-2).
+        * @param aString Source text.
+        * @param aCharEncoding Character encoding.
+        * @return The UCS-2 unicode buffer.
+        */
+	    HBufC16*  ConvertToUnicodeL( NW_String_t& aString, NW_Uint32 aCharEncoding );
+
+        /**
+        * Initialise the converter. 
+        * @return None.
+        */
+        void InitialiseCharacterSetConverterL();
+
+
+        /**
+        * Convert the action string to a representative numeric value to 
+        * facilitate storing the message.
+        * @param aActionString The attribute value indicating the action level 
+        *        eg 'signal-high'
+        * @return TUint: a value representing the action type.
+        */
+	    TUint ConvertActionString( const TDesC8& aActionString ) const;
+
+        /**
+        * The entry fields are set to the correct values.
+        * @return None.
+        */
+	    void  SetSIPushMsgEntryFieldsL( CSIPushMsgEntry& aSIPushMsgEntry );
+
+        /**
+        * Do the final processing of the message according to the OMA and S60 
+        * requirements.
+        * @return None.
+        */
+	    void  ProcessingPushMsgEntryL();
+
+        /**
+        * Store the new message to Messaging.
+        * @param aMatchingEntryId ID of the matching SI entry.
+        * @return None.
+        */
+	    void StoreSIMessageL( TMsvId aMatchingEntryId );
+
+        /**
+        * Handle message order reception.
+        * NB: A received message with no creation date will be stored (unless 
+        * its action is set to delete or the expiry condition is met). This 
+        * means that the si-id in the message store will not be unique.
+        * @param aMatchingEntryId ID of the matching SI entry.
+        *        It is changed only if the function returns EFalse (replace)!
+        * @return ETrue if the entry has to be discarded.
+        */
+	    TBool HandleMsgOrderReceptionL( TMsvId& aMatchingEntryId );
+
+	    // conversion utilities
+
+        /** 
+        * Convert UTC date time into native TTime format. Method can leave.
+        * @param aDateTime The UTC string representing the date and time.
+        * @param aConvertedDate Member date variable passed in to accept 
+        *        converted UTC date as TTime varaible.
+        * @return TBool indicates if conversion successful (ETrue) or 
+        *         conversion failed (EFalse)
+        */
+	    TBool ConvertDateTimeL( const TDesC& aDateTime, 
+                                TTime& aConvertedDate ) const;
+
+        /** 
+        * Convert OPAQUE data to UTC date time as specified in SI spec.
+        * @param aOpaque OPAQUE data.
+        * @return The UTC time.
+        */
+	    HBufC* ConvertOpaqueToUtcL( const TDesC8& aOpaque ) const;
+
+        /**
+        * Check given UTC time string conforms to expected format:
+        * YYYY-MM-DDTHH:MM:SSZ and strip out formatting characters
+        * then validate the remaining characters are all digits.
+        * If validated then add TTime formating character so final
+        * string returned will be of the format YYYYMMDD:HHMMSS.
+        * @param aDateTime UTC string which is validated and returned.
+        * @return boolean: indicates if given date is valid (ETrue) 
+        *         or not (EFalse)
+        */
+	    TBool IsValidUTCTime( TDes& aDateTime ) const;
+
+        /** 
+        * Convert OPAQUE or STRING attribute to TTime.
+        * @param aAttrHandle Handle to the attribute.
+        * @param aConvertedDate The resulted TTime.
+        * @return ETrue if the conversion succeeded.
+        */
+	    TBool AttributeToTTimeL( NW_DOM_AttributeHandle_t& aAttrHandle, 
+                                 TTime& aConvertedDate ) const;
+
+	    // Attribute flags
+
+        /**
+        * Flag whether message has an action attribute
+        * @param aAction boolean to set flag to - 
+        *                ETrue for action attrib present
+        *                EFalse for no action attrib.
+        */ 
+	    inline void SetActionFlag( TBool aAction );
+
+        /**
+        * Check status of action flag to see if message has an action 
+        * attribute.
+        * @return TBool ETrue - action attribute present in message
+        *               EFalse - no action attribute.
+        */
+	    inline TBool ActionFlag() const;
+
+        /**
+        * Flag whether message has a created date attribute.
+        * @param aCreated boolean to set flag to - 
+        *                 ETrue for si-created attrib present
+        *                 EFalse for no si-created attrib
+        */ 
+	    inline void SetCreatedFlag( TBool aCreated );
+
+        /**
+        * Check status of created flag to see if message has a si-created 
+        * attribute.
+        * @return TBool ETrue - si-created attribute present in message
+        *               EFalse - no si-created attribute
+        */
+	    inline TBool CreatedFlag() const;
+
+        /**
+        * Flag whether message has a Href attribute
+        * @param aHref boolean to set flag to - 
+        *              ETrue for Href attrib present
+        *              EFalse for no href attrib
+        */ 
+	    inline void SetHrefFlag( TBool aHref );
+
+        /**
+        * Check status of href flag to see if message has an href attribute.
+        * @return TBool
+        *         ETrue - href attribute present in message
+        *         EFalse - no href attribute
+        */
+	    inline TBool HrefFlag() const;
+
+        /**
+        * Flag whether message has an expiry date attribute (si-expires).
+        * @param aExpires boolean to set flag to - 
+        *                 ETrue for si-expires present
+        *                 EFalse for no si-expires date
+        */ 
+	    inline void SetExpiresFlag( TBool aExpires );
+
+        /**
+        * Check status of flag to see if message has an expiry date attribute.
+        * @return TBool
+        *         ETrue - si-expires attribute present in message
+        *         EFalse - no si-expires attribute
+        */
+	    inline TBool ExpiresFlag() const;
+	    
+        /**
+        * Flag whether message has a si-id attribute
+        * @param aSiId boolean to set flag to - 
+        *              ETrue for si-id attrib present
+        *              EFalse for no si-id attrib
+        */ 
+	    inline void SetSiIdFlag( TBool aSiId );
+
+        /**
+        * Check status of flag to see if message has an si-id attribute.
+        * @return TBool
+        *         ETrue - si-id attribute present in message
+        *         EFalse - no si-id attribute
+        */
+	    inline TBool SiIdFlag() const;
+
+        /**
+        * Flag whether message has a Data attribute (text)
+        * @param aData
+        *        boolean to set flag to - ETrue for data attrib present
+        *                                 EFalse for no data attrib
+        */ 
+	    inline void SetDataFlag( TBool aData );
+
+        /**
+        * Check status of data flag to see if message has any data.
+        * @return TBool
+        *         ETrue - data attribute present in message
+        *         EFalse - no data attribute
+        */
+	    inline TBool DataFlag() const;
+
+    private: // Methods from CPushHandlerBase
+	    
+        /**
+        * HandleMessage Async. Version. Takes ownership of Push Message and 
+        * sets self active to continue processing message.
+        * @param aPushMsg CPushMessage to process.
+        * @param aStatus Request status variable for use in asynchronous 
+        *        operations.
+        * @return None.
+        */
+	    void HandleMessageL( CPushMessage* aPushMsg, TRequestStatus& aStatus );
+
+        /**
+        * HandleMessage Sync. Version. Takes ownership of Push Message and 
+        * sets self active to continue processing message.
+        * Initial State: Set data members then go to the next state 
+        * @param aPushMsg CPushMessage to process.
+        */
+	    void HandleMessageL( CPushMessage* aPushMsg );
+
+        /** 
+        * Same functionality as DoCancel()
+        */
+	    void CancelHandleMessage();
+
+        /**
+        * Reserved function.
+        */
+	    void CPushHandlerBase_Reserved1();
+
+        /**
+        * Reserved function.
+        */
+	    void CPushHandlerBase_Reserved2();
+
+    private: // Methods from CActive
+
+        /**
+        * Terminates any activity
+        * @return None.
+        */
+	    void DoCancel();
+
+        /**
+        * Step through the various representative states for handling a message 
+        * States:
+        *  EGarbageCollecting - Deleting expired SI msgs from messaging
+        *  EFilteringAndParsing - Filter push msg according to Service message 
+        *                settings and Parses SI push message (retrieving the 
+        *                attributes)
+        *  EProcessing - Processing the current entry. OMA and S60 rules are 
+        *                applied, then save or update SI msg in the Msg store
+        *  EDone - Clean up, complete observer
+        * @return None.
+        */
+	    void RunL();
+
+        /**
+        * This is invoked when RunL Leaves with an error so clean up and 
+        * return.
+        * @return Error code to scheduler.
+        */
+	    TInt RunError(TInt aError);
+
+    private: // Data
+
+	    enum
+            {
+            EAction = 0x01, 
+            ECreated = 0x02, 
+            EHref = 0x04, 
+            EExpires = 0x08, 
+            ESiId = 0x10, 
+            EData = 0x20
+            };
+
+	    enum TState
+            {
+            EGarbageCollecting, 
+            EFilteringAndParsing, 
+            EProcessing, 
+            EDone
+            };
+
+        TMsvId          iSavedMsgId; ///< ID of the message saved.
+	    TUint32         iAttributes; ///< Attribute indication (set or not).
+	    TInt            iPushMsgAction;	///< Action attribute
+	    HBufC*          iHrefBuf; ///< Href attribute. Has.
+	    HBufC*          iSiIdBuf; ///< Si-id attribute. Has.
+	    TTime           iExpiresTime; ///< Expiration attribute.
+	    TTime           iCreatedTime; ///< Created attribute.
+	    HBufC*          iData; ///< Message text. Has.
+
+        NW_Uint32       iCharEncoding; ///< Char encoding of the current msg.
+
+        //
+        CCnvCharacterSetConverter* iCharacterSetConverter; ///< Owned.
+        CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* iCharacterSetsAvailable; ///< Owned.
+    };
+
+#include "CSIContentHandler.inl"
+
+#endif	// __CSICONTENTHANDLER_H__
+