messagingfw/wappushfw/tpushscriptbased/wappushmsggen.cpp
changeset 0 8e480a14352b
--- /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, "<?xml version=\"1.0\"?>\r\n");
+_LIT8(KBadXmlVersion, "<?xml version=\"2.0\"?>\r\n");  // Unsupported XML version
+_LIT8(KSiStart, "<!DOCTYPE si PUBLIC \"-//WAPFORUM//DTD SI 1.0//EN\"\r\n\"http://www.wapforum.org/DTD/si.dtd\">\r\n<si>\r\n<indication ");
+_LIT8(KSiEnd, "</indication>\r\n</si>\r\n");
+_LIT8(KSlStart, "<!DOCTYPE sl PUBLIC \"-//WAPFORUM//DTD SL 1.0//EN\"\r\n\"http://www.wapforum.org/DTD/sl.dtd\">\r\n<sl ");
+_LIT8(KSlEnd, ">\r\n</sl>\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);
+	}