diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiFramework/inc/HtiMessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/HtiFramework/inc/HtiMessage.h Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,253 @@ +/* +* Copyright (c) 2009 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: Hti Message incapsulates HTI protocol messages structure. +* +*/ + + +#ifndef MESSAGEPARSER_H__ +#define MESSAGEPARSER_H__ + +#include +#include + + +const TInt KDefaultPriority = 0; +const TInt KPriorityMask = 0x2; +const TInt KHtiMsgServiceUidLen = 4; + + +NONSHARABLE_CLASS(CHtiMessage) : public CBase + { +public: + /** + * Constructs and parses a new message from descriptor in question. + * This method is used to construct hti message from incoming data. + * The descriptor must start from HTI header. + * Available amount of data is copied from the descriptor depending + * on the message size value in the header. The remaining data of + * message body must be added using method AddToBody(). + * + * @return new Hti message + * + * @see CheckValidHeader() for function to define either descriptor + * starts from a valid Hti message header + * @see AddToBody() + */ + static CHtiMessage* NewL(const TDesC8& aMessage); + + /** + * Creates a new HTI message without extension. + * Can leave with KErrArgument if passed data are invalid + * or other system-wide leave code (e.g. KErrNoMemory). + * Ownership of aMessagBody is transfered. + * This method is used to create a new outgoing HTI message. + * + * @param aMessageBody message body content + * @param aServiceUid target service name + * @param aWraped flag to indicate either + * Security manager must wrap message body + * @param aPriority message priority + * + */ + static CHtiMessage* NewL(TDesC8* aMessageBody, + const TUid aServiceUid, + TBool aWraped = EFalse, + TInt aPriority = KDefaultPriority); + + /** + * Creates a new HTI message with extension. + * Can leave with KErrArgument if passed data are invalid + * or other system-wide leave code (e.g. KErrNoMemory). + * Ownership of aMessagBody is transfered. + * This method is used to create a new outgoing HTI message. + * + * @param aMessageBody message body content + * @param aServiceUid target service name + * @param aExtBody extension content + * @param aWraped flag to indicate either + * Security manager must wrap message body + * @param aPriority message priority + * + */ + static CHtiMessage* NewL(TDesC8* aMessageBody, + const TUid aServiceUid, + const TDesC8& aExtBody, + TBool aWraped = EFalse, + TInt aPriority = KDefaultPriority); + + /** + * Deletes all message data allocated in heap. + */ + virtual ~CHtiMessage(); + + /** + * Returns ETrue when the descriptor in question starts from + * valid HTI header. + * + * @param aMessage descriptor with probable HTI message + * + * @return ETrue HTI header is valid + */ + static TBool CheckValidHtiHeader(const TDesC8& aMessage); + + /** + * Returns message size based on the header in question + * + * @param aMessage descriptor with an HTI message + */ + static TInt Size(const TDesC8& aMessage); + + /** + * Returns the minimal size of HTI message header. + * + */ + static TInt MinHeaderSize(); + + /** + * Check either HTI message body has body of required size as specified + * in Hti header. + */ + TBool IsBodyComplete() const; + + /** + * Appends to the body a new part. If the descriptor length bigger + * than remaining space for message body, only part + * of the descritpor is copied to fill in all available space. + * + * @param aBodyPart descriptor with remaining message body + * + * @return number of bytes copied from the descriptor + */ + TInt AddToBody(const TDesC8& aBodyPart); + + /** + * Returns the size of a whole message (BodySize()+HeaderSize()) + */ + TInt Size() const; + + /** + * Returns message service uid + */ + TUid DestinationServiceUid() const; + + /** + * Returns message body size + */ + TInt BodySize() const; + + /** + * Returns message priority + */ + TInt Priority() const; + + /** + * Returns wrap flag + */ + TBool IsWrapped() const; + + /** + * Returns header extension + */ + TPtrC8 Extension() const; + + /** + * Returns extention section size + */ + TInt ExtSize() const; + + /** + * Returns header size including extension section. + */ + TInt HeaderSize() const; + + /** + * Returns message body + */ + TPtrC8 Body() const; + + /** + * Return message header + */ + TPtrC8 Header() const; + +public: + /** + * Returns the offset of a link data member + */ + static const TInt iLinkOffset; + +protected: + /** + * Constructor + */ + CHtiMessage(); + + /** + * Second-level constructors + */ + void ConstructL(const TDesC8& aMessage); + void ConstructL(const TUid aServiceUid, + TDesC8* aMessageBody, + const TDesC8& aExtBody, + TBool aWraped, + TInt aPriority); + /** + * helper function that make TInt from 3 bytes in big-endian format + * @param aSrc bytes with integer + * + * @return integer + */ + //static TInt ParseLittleEndian3(const TUint8* aSrc); + +private: + /** + * Link used when creating message queues + */ + TSglQueLink iLink; + + /** + * Message body used when constructing from parts + * when body is ready pointer is copied to iBodyDes + */ + HBufC8* iBody; + + /** + * Complete body, used for access methods + */ + TDesC8* iBodyDes; + + /** + * Message header in binary format + */ + TUint8* iHeader; + + /** + * Body size copied from iHeader for quick access + */ + TInt iBodySize; + + /** + * Service UID extracted from iHeader. + */ + TUid iServiceUid; + + /** + * Size of extension section to be added to the header + * Used during message construction from parts + */ + TInt iExtRemainderSize; + }; + +#endif