diff -r 000000000000 -r 8e480a14352b messagingfw/wappushfw/tpushscriptbased/wappushmsggen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/wappushfw/tpushscriptbased/wappushmsggen.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,262 @@ +// Copyright (c) 2007-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: +// + + +#include "wappushmsggen.h" + +_LIT8(KXmlVersion, "\r\n"); +_LIT8(KBadXmlVersion, "\r\n"); // Unsupported XML version +_LIT8(KSiStart, "\r\n\r\n\r\n\r\n"); +_LIT8(KSlStart, "\r\n\r\n\r\n"); + +// Valid XML tags and data +_LIT8(KHRefField, "href=\""); +_LIT8(KSiIdField, "si-id=\""); +_LIT8(KSiCreatedField, "created=\""); +_LIT8(KSiExpiresField, "si-expires=\""); +_LIT8(KActionField, "action=\""); + + +//Invalid XML tags & data +_LIT8(KBadHRefField, "hreg=\""); +_LIT8(KBadSiIdField, "si-eyed=\""); +_LIT8(KBadSiCreatedField, "crated=\""); +_LIT8(KBadSiExpiresField, "si-xpires=\""); +_LIT8(KBadActionField, "adtion=\""); + + +_LIT8(KCrLf, "\r\n"); +_LIT8(KDoubleQuote,"\""); + +/** amount used to lengthen the buffer when appending data to it that would otherwise overflow it +*/ +const TInt KMsgBufferSegmentLength=256; + +/** public constructor */ +CWapPushMsgGen* CWapPushMsgGen::NewL() + { + CWapPushMsgGen* thisptr = new(ELeave) CWapPushMsgGen(); + return thisptr; + } + + +/** destructor */ +CWapPushMsgGen::~CWapPushMsgGen() + { + delete iMsgBuffer; + delete iMsgFieldBuffer; + } + + +/** appends a field to the end of the current message being generated + @param aField The type of field to be set + @param aFieldValue The value of the field to be set. This should not + include CR/LF at the end for fields included in " " + @leave HBufC8::NewL + @leave HBufC8::ReAllocL + @return void +*/ +void CWapPushMsgGen::AppendFieldL(TMsgField aFieldType, const TDesC8& aFieldValue) + { + if (!iMsgFieldBuffer) + iMsgFieldBuffer=HBufC8::NewL(KMsgBufferSegmentLength); + + switch (aFieldType) + { + case EHRef: + AppendMsgFieldDesL(KHRefField); + break; + case EServiceIndicationID: + AppendMsgFieldDesL(KSiIdField); + break; + case EServiceIndicationCreated: + AppendMsgFieldDesL(KSiCreatedField); + break; + case EServiceIndicationExpires: + AppendMsgFieldDesL(KSiExpiresField); + break; + case EServiceIndicationText: + { + _LIT8(KEndIndication,">\r\n"); + AppendMsgFieldDesL(KEndIndication); + } + break; + case EAction: + AppendMsgFieldDesL(KActionField); + break; + + case EBadHRef: + AppendMsgFieldDesL(KBadHRefField); + break; + case EBadServiceIndicationID: + AppendMsgFieldDesL(KBadSiIdField); + break; + case EBadServiceIndicationCreated: + AppendMsgFieldDesL(KBadSiCreatedField); + break; + case EBadServiceIndicationExpires: + AppendMsgFieldDesL(KBadSiExpiresField); + break; + case EBadAction: + AppendMsgFieldDesL(KBadActionField); + break; + case EXMLNoFieldStr: + case EWBXMLNoFieldStr: + //Present so that can create an empty body using the msg Gen + break; + default: + Panic(EInvalidPushMessageField); + } + + AppendMsgFieldDesL(aFieldValue); + //if (iMsgType != EServiceIndicationText) + if (aFieldType != EServiceIndicationText && aFieldType != EXMLNoFieldStr + && aFieldType != EWBXMLNoFieldStr) + AppendMsgFieldDesL(KDoubleQuote); + if (aFieldType!= EWBXMLNoFieldStr) + AppendMsgFieldDesL(KCrLf); + } + + +/** closes the current message and returns the whole generated message + @return returns a dynamic descriptor that is on the cleanup stack + @leave HBufC8::NewLC +*/ +HBufC8* CWapPushMsgGen::CreateMsgLC() + { + TInt size = (*iMsgBuffer).Length() + (*iMsgFieldBuffer).Length(); + switch(iMsgType) + { + case EServiceIndication: + size+= KSiEnd().Length(); + break; + case EServiceLoad: + size+=KSlEnd().Length(); + break; + case ECorruptMsgTest: + case ECorruptXmlVersionTest: + case EEmptyMsgBody: + // No action - don't add anything extra to the body + break; + default: + Panic(EInvalidPushMessageType); + }; + + HBufC8* finalMsg=HBufC8::NewLC(size); + TPtr8 finalMsgPtr = finalMsg->Des(); + finalMsgPtr.Append(*iMsgBuffer); + finalMsgPtr.Append(*iMsgFieldBuffer); + + switch(iMsgType) + { + case EServiceIndication: + finalMsgPtr.Append(KSiEnd); + break; + case EServiceLoad: + finalMsgPtr.Append(KSlEnd); + break; + case ECorruptMsgTest: + case ECorruptXmlVersionTest: + case EEmptyMsgBody: + // Do nothing - leave body as is + break; + default: + Panic(EInvalidPushMessageType); + } + return finalMsg; +} + + +/** starts a new message + This starts a new message by clearing the current one. It then appends the + header for the type of message being generated + + @param aMsgType an enum of type TMsgType specifing the type of message to be generated +*/ +void CWapPushMsgGen::StartNewMsgL(TMsgType aMsgType) + { + delete iMsgBuffer; + iMsgBuffer = NULL; + delete iMsgFieldBuffer; + iMsgFieldBuffer = NULL; + iMsgType = aMsgType; + iMsgBuffer = HBufC8::NewL(KMsgBufferSegmentLength); + + + switch (iMsgType) + { + case EServiceIndication: + AppendMsgDesL(KXmlVersion); + AppendMsgDesL(KSiStart); + break; + case EServiceLoad: + AppendMsgDesL(KXmlVersion); + AppendMsgDesL(KSlStart); + break; + case ECorruptMsgTest: + AppendMsgDesL(KXmlVersion); + break; + case ECorruptXmlVersionTest: + AppendMsgDesL(KBadXmlVersion); + break; + case EEmptyMsgBody: + // do nothing - all we want is a Null Descriptor + break; + default: + Panic(EInvalidPushMessageType); + } + } + + +/** used to append a descriptor to the current message buffer + @param aDes, the descriptor to be added to the message buffer +*/ +void CWapPushMsgGen::AppendMsgDesL(const TDesC8& aDes) + { + TInt maxLength = iMsgBuffer->Des().MaxLength(); + if (maxLength < aDes.Length() + (*iMsgBuffer).Length()) + { + TInt newMaxLength = maxLength; + newMaxLength += aDes.Length() > KMsgBufferSegmentLength? aDes.Length() : KMsgBufferSegmentLength; + iMsgBuffer = iMsgBuffer->ReAllocL(newMaxLength); + } + iMsgBuffer->Des().Append(aDes); + } + + +/** used to append a descriptor to the current message field buffer + @param aDes, the descriptor to be added to the message buffer +*/ +void CWapPushMsgGen::AppendMsgFieldDesL(const TDesC8& aDes) + { + TInt maxLength = iMsgFieldBuffer->Des().MaxLength(); + if (maxLength < aDes.Length() + (*iMsgFieldBuffer).Length()) + { + TInt newMaxLength = maxLength; + newMaxLength += aDes.Length() > KMsgBufferSegmentLength? aDes.Length() : KMsgBufferSegmentLength; + iMsgFieldBuffer = iMsgFieldBuffer->ReAllocL(newMaxLength); + } + iMsgFieldBuffer->Des().Append(aDes); + } + +/** Panic function +*/ +void CWapPushMsgGen::Panic(TWapPushMsgGenPanic aPanicCode) + { + _LIT(KWapPushMsgGenName,"PushMsgGen"); + User::Panic(KWapPushMsgGenName, aPanicCode); + }