smsprotocols/smsstack/smsprot/Test/TE_Smsprt/te_smsprt_R6.cpp
changeset 0 3553901f7fa8
child 5 7ef16719d8cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/smsprotocols/smsstack/smsprot/Test/TE_Smsprt/te_smsprt_R6.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,3905 @@
+// Copyright (c) 2005-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:
+//
+
+/**
+ @file
+*/
+
+#include "te_smsprt_R6.h"
+#include "e32def.h"
+#include "gsmunonieoperations.h"
+
+
+TVerdict CTestSinglePDUHyperLinks::doTestStepL()
+/**
+ *  Test a simple Transmit and Receive of a TPDU
+ */
+	{
+	INFO_PRINTF1(_L("Test HyperLinks in SMS message"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 70);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is a 95 character msg.
+	_LIT(KTestMsg,"HyperLink message, Symbian. http://www.symbian.com Some content Intranet http://web.intra/homes");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	INFO_PRINTF2(_L("Destination number:..... %S "),&iTelephoneNumber);
+	INFO_PRINTF2(_L("ServiceCenter number:... %S "),&iServiceCenterNumber);
+
+	//Get the operations
+	CSmsHyperLinkOperations& operations = static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	TUint count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	const TUint KFirstHyperLinkPosition=20;
+	const TUint KSecondHyperLinkPosition=65;
+	TUint8 firstHyperLinkLabelLength=8;
+	TUint8 firstHyperLinkURLLength=22;
+
+	//Try to remove index 0 before configuration
+	TUint index=0;
+	TRAPD(err,operations.RemoveHyperLinkL(index));
+	TEST(err==KErrArgument);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	//Try copy with no hyper links installed
+	TUint hyperLinkPosition=0;
+	TUint8 hyperLinkLableLength=0;
+	TUint8 hyperLinkURLLength=0;
+	TRAP(err,operations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength));
+	TEST(err==KErrArgument);
+
+	//Add hyperlinks
+	operations.AddHyperLinkL(KFirstHyperLinkPosition,firstHyperLinkLabelLength, firstHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==1);
+	//Add second hyperlink
+	TUint8 secondHyperLinkLabelLength=10;
+	TUint8 secondHyperLinkURLLength=25;
+	operations.AddHyperLinkL(KSecondHyperLinkPosition,secondHyperLinkLabelLength,secondHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==2);
+	//Add hyperlink with position greater than message size
+	const TUint KPositionLargerThanMessage=2000;
+	TUint8 thirdHyperLinkLabelLength=15;
+	TUint8 thirdHyperLinkURLLength=33;
+	operations.AddHyperLinkL(KPositionLargerThanMessage,thirdHyperLinkLabelLength,thirdHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==3);
+
+	//Get hyperlinks
+	hyperLinkPosition=0;
+	hyperLinkLableLength=0;
+	hyperLinkURLLength=0;
+	//Copy HyperLinks
+	index=0;
+	operations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==KFirstHyperLinkPosition);
+	TEST(hyperLinkLableLength==firstHyperLinkLabelLength);
+	TEST(hyperLinkURLLength==firstHyperLinkURLLength);
+
+	//Copy at the boundares
+	//Index is on the boundary 2
+	hyperLinkPosition=0;
+	hyperLinkLableLength=0;
+	hyperLinkURLLength=0;
+	index=2;
+	operations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==KPositionLargerThanMessage);
+	TEST(hyperLinkLableLength==thirdHyperLinkLabelLength);
+	TEST(hyperLinkURLLength==thirdHyperLinkURLLength);
+	//index is just out of bounds
+	hyperLinkPosition=0;
+	hyperLinkLableLength=0;
+	hyperLinkURLLength=0;
+	index=3;
+	TRAP(err,operations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength));
+	TEST(err==KErrArgument);
+	//Try invalid boundary
+	index=10;
+	TRAP(err,operations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength));
+	TEST(err==KErrArgument);
+
+	//Remove HyperLinks
+	index=0;
+	operations.RemoveHyperLinkL(index);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==2);
+
+	index=4;
+	TRAP(err,operations.RemoveHyperLinkL(index));
+	TEST(err==KErrArgument);
+
+	operations.RemoveAllHyperLinksL();
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	//Try remove all again - on no hyperlinks
+	operations.RemoveAllHyperLinksL();
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	//Send message with no hyperlinks
+	SendSmsL(smsMessage,socket);
+
+	//Add hyperlink
+	operations.AddHyperLinkL(KFirstHyperLinkPosition,firstHyperLinkLabelLength,firstHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==1);
+
+	//Send SMS with one hyperlink
+	SendSmsL(smsMessage,socket);
+	//Send SMS with two hyperlinks
+	//Add hyperlink
+	operations.AddHyperLinkL(KSecondHyperLinkPosition,secondHyperLinkLabelLength,secondHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==2);
+	SendSmsL(smsMessage,socket);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//---------------------------------
+	//Receive SMS's
+	// 1 - Receive PDU with a single hyperlink
+	// 2 - Receive PDU with two hyperlinks
+	// 3 - Receive PDU with no hyperlinks
+	//---------------------------------
+	//Single Hyperlink SMS
+	INFO_PRINTF1(_L("waiting for incoming SMS with single hyperlink...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsHyperLinkOperations& deliverPDUOperations = static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+	//NumberOfHyperLinks
+	count=deliverPDUOperations.NumberOfHyperLinksL();
+	TEST(count==1);
+	//Copy HyperLinks
+	index=0;
+	deliverPDUOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==KFirstHyperLinkPosition);
+	TEST(hyperLinkLableLength==firstHyperLinkLabelLength);
+	TEST(hyperLinkURLLength==firstHyperLinkURLLength);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Multiple Hyperlink SMS
+	INFO_PRINTF1(_L("waiting for incoming SMS with two hyperlinks...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+	//Get the operations
+	CSmsHyperLinkOperations& multipleHyperLinkOperations = static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+	//NumberOfHyperLinks
+	count=multipleHyperLinkOperations.NumberOfHyperLinksL();
+	TEST(count==2);
+	//Copy HyperLinks
+	index=0;
+	multipleHyperLinkOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==KFirstHyperLinkPosition);
+	TEST(hyperLinkLableLength==firstHyperLinkLabelLength);
+	TEST(hyperLinkURLLength==firstHyperLinkURLLength);
+	index=1;
+	multipleHyperLinkOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==KSecondHyperLinkPosition);
+	TEST(hyperLinkLableLength==secondHyperLinkLabelLength);
+	TEST(hyperLinkURLLength==secondHyperLinkURLLength);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive third sms with no hyperlinks
+	INFO_PRINTF1(_L("waiting for incoming SMS with no hyperlinks...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+	//Get the operations
+	CSmsHyperLinkOperations& noneHyperLinkOperations = static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+	//NumberOfHyperLinks
+	count=noneHyperLinkOperations.NumberOfHyperLinksL();
+	TEST(count==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult() ;
+}
+
+
+//Multiple PDU's
+
+TVerdict CTestMultiplePDUHyperLinks::doTestStepL()
+/**
+ *  Test a simple Transmit and Receive of a TPDU
+ */
+	{
+	INFO_PRINTF1(_L("Test multiple PDUs with hyperLinks in SMS message"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 71);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KLongText,"YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCC");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KLongText,alphabet);
+
+	CleanupStack::PushL(smsMessage);
+
+	//Check number of hyperlinks
+	//Get the operations
+	CSmsHyperLinkOperations& operations =
+		static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	//NumberOfHyperLinks
+	TUint count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	//Try remove all
+	operations.RemoveAllHyperLinksL();
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	//Send multiple PDU with no hyperlinks
+	SendSmsL(smsMessage,socket);
+
+	//Send multiple PDU with multiple hyperlinks.  Hyperlinks are all in the first PDU.
+	//hyperlinks with positions referencing two in the 1st PDU, three in 2nd, and four in 3rd
+	TUint firstHyperLinkPosition=25;
+	TUint secondHyperLinkPosition=75;
+	TUint thirdHyperLinkPosition=200;
+	TUint fourthHyperLinkPosition=235;
+	TUint fifthHyperLinkPosition=265;
+	TUint sixthHyperLinkPosition=450;
+	TUint seventhHyperLinkPosition=485;
+	TUint eighthHyperLinkPosition=510;
+	TUint ninethHyperLinkPosition=535;
+
+	TUint8 KHyperLinkLabelLength=8;
+	TUint8 KHyperLinkURLLength=25;
+
+	//1st PDU
+	operations.AddHyperLinkL(firstHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==1);
+	operations.AddHyperLinkL(secondHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==2);
+
+	//2nd PDU
+	operations.AddHyperLinkL(thirdHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==3);
+	operations.AddHyperLinkL(fourthHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==4);
+	operations.AddHyperLinkL(fifthHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==5);
+
+	//3rd PDU
+	operations.AddHyperLinkL(sixthHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==6);
+	operations.AddHyperLinkL(seventhHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==7);
+	operations.AddHyperLinkL(eighthHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==8);
+	operations.AddHyperLinkL(ninethHyperLinkPosition,KHyperLinkLabelLength,KHyperLinkURLLength);
+	count=operations.NumberOfHyperLinksL();
+	TEST(count==9);
+
+	(void) smsMessage->TextPresent();
+	(void) smsMessage->NumMessagePDUsL();
+	(void) smsMessage->MaxMessageLength();
+	(void) smsMessage->MessageLengthL();
+
+	//Send multiple PDU with nine hyperlinks
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Reveive multiple PDU with no hyperlinks
+	INFO_PRINTF1(_L("waiting for incoming SMS with no hyperlinks...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsHyperLinkOperations& deliveredPDUOperations =
+		static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	//NumberOfHyperLinks
+	count=deliveredPDUOperations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Reveive multiple PDU with multiple (9) hyperlinks all in the first PDU
+	INFO_PRINTF1(_L("waiting for incoming SMS with 9 hyperlinks...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsHyperLinkOperations& multipleHyperLinkPDUOperations =
+		static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	//NumberOfHyperLinks
+	count=multipleHyperLinkPDUOperations.NumberOfHyperLinksL();
+	TEST(count==9);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive multiple PDU with hyperlinks in all PDU's
+	INFO_PRINTF1(_L("waiting for incoming SMS with hyperlinks in all PDU...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsHyperLinkOperations& hyperlinkInEveryPDUOperations =
+		static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	//NumberOfHyperLinks
+	count=hyperlinkInEveryPDUOperations.NumberOfHyperLinksL();
+	TEST(count==6);
+
+	//Copy the hyperlinks
+	//Get hyperlinks
+	TUint hyperLinkPosition=0;
+	TUint8 hyperLinkLableLength=0;
+	TUint8 hyperLinkURLLength=0;
+	TUint expectedHyperLinkPosition=0;
+	TUint8 expectedHyperLinkLableLength=0;
+	TUint8 expectedHyperLinkURLLength=0;
+
+	//Copy HyperLinks
+	//Fist hyperlink
+	TUint index=0;
+	expectedHyperLinkPosition=25;
+	expectedHyperLinkLableLength=8;
+	expectedHyperLinkURLLength=25;
+	hyperlinkInEveryPDUOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==expectedHyperLinkPosition);
+	TEST(hyperLinkLableLength==expectedHyperLinkLableLength);
+	TEST(hyperLinkURLLength==expectedHyperLinkURLLength);
+
+	//first hyper link in second PDU
+	index=1;
+	expectedHyperLinkPosition=265;
+	expectedHyperLinkLableLength=10;
+	expectedHyperLinkURLLength=30;
+	hyperlinkInEveryPDUOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==expectedHyperLinkPosition);
+	TEST(hyperLinkLableLength==expectedHyperLinkLableLength);
+	TEST(hyperLinkURLLength==expectedHyperLinkURLLength);
+
+	//Last hyperlink in thrid PDU
+	index=5;
+	expectedHyperLinkPosition=535;
+	expectedHyperLinkLableLength=15;
+	expectedHyperLinkURLLength=45;
+	hyperlinkInEveryPDUOperations.CopyHyperLinkAtIndexL(index,hyperLinkPosition,hyperLinkLableLength,hyperLinkURLLength);
+	TEST(hyperLinkPosition==expectedHyperLinkPosition);
+	TEST(hyperLinkLableLength==expectedHyperLinkLableLength);
+	TEST(hyperLinkURLLength==expectedHyperLinkURLLength);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+
+	//receive mulitple PDU message with no hyperlinks in the first PDU and hyperlinks in the third.
+	INFO_PRINTF1(_L("waiting for incoming SMS with no hyperlinks in first PDU...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsHyperLinkOperations& noHyperlinksInFirstPDUOperations =
+		static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	//NumberOfHyperLinks
+	count=noHyperlinksInFirstPDUOperations.NumberOfHyperLinksL();
+	TEST(count==9);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult() ;
+}
+
+
+TVerdict CTestSinglePDUReplyAddress::doTestStepL()
+/**
+ *  Test reply address can be different to the senders address
+ */
+	{
+	__UHEAP_MARK;
+
+	INFO_PRINTF1(_L("Test reply address in SMS message"));
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 72);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is character msg
+	_LIT(KTestMsg,"Reply address message.  Message will be sent to other address than sender");
+	_LIT(KEmptyMsg,"");
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* specialMessageAndReplyAddresMessage=CreateSmsMessageL(KEmptyMsg,alphabet);
+	CleanupStack::PushL(specialMessageAndReplyAddresMessage);
+
+	//Get the operations
+	CSmsReplyAddressOperations& replyAddressOperations =
+		static_cast<CSmsReplyAddressOperations&>(specialMessageAndReplyAddresMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Check for reply address
+	TBool result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(!result);
+
+	//Remove - should not leave
+	TRAPD(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Try to get non existent address
+	// as HBufC
+	HBufC* replyAddressHBuf = NULL;
+	TRAP(err,replyAddressHBuf=replyAddressOperations.GetReplyAddressL());
+	TEST(err==KErrNotFound);
+
+	// as TGsmSmsTelNumber
+	TGsmSmsTelNumber replyAddressTGsm;
+	TRAP(err,result=replyAddressOperations.GetParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+	TEST(!result);
+
+
+	//send a message with lots of information elements (e.g. special message waiting ) with a reply address.
+	//  The reply address will not fit into the 1st PDU.  Sending should fail.
+
+	//Get hyperlink operations
+	CSmsSpecialSMSMessageOperations& specialMessageOperations =
+		static_cast<CSmsSpecialSMSMessageOperations&>(specialMessageAndReplyAddresMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	//PDU maximym of 140 octects = C8
+	//Each special message is 4 octects.
+	//Maximum variations on the type of messages for 5 bits is 32
+	for(TInt indicationType=EGsmSmsVoiceMessageWaiting; indicationType<=EGsmSmsExtendedMessageTypeWaiting;
+				indicationType++)
+	{
+		TBool toStore=EFalse;
+		TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+		TUint8 messageCount=5;
+
+		for(TUint extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+					extendedType<=EGsmSmsExtendedIndicationType7; extendedType++)
+		{
+			TRAP(err,specialMessageOperations.AddSpecialMessageIndicationL(toStore,TSmsMessageIndicationType(indicationType),
+									TExtendedSmsIndicationType(extendedType),messageProfileType,messageCount));
+			TEST(err==KErrNone);
+
+		}
+
+	}
+
+	//Add six zero length information elements
+	//Get the PDU
+	CSmsPDU &pdu=specialMessageAndReplyAddresMessage->SmsPDU();
+	//Get the UserData
+	CSmsUserData &userData=pdu.UserData();
+	_LIT8(KEmptyString,"");
+	//Add the information element
+	//TSmsId
+	for(TUint informationElement=CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders1;
+				informationElement<=CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders5;
+				informationElement++)
+	{
+		//CSmsInformationElement::TSmsInformationElementIdentifier informationElement;
+		TRAP(err,userData.AddInformationElementL(
+			CSmsInformationElement::TSmsInformationElementIdentifier(informationElement),KEmptyString()));
+		TEST(err==KErrNone);
+	}
+
+
+	//Add address
+	TPtrC replyAddress;
+	GetStringFromConfig(ConfigSection(), _L("replyAddressInternational"), replyAddress);
+	TRAP(err,replyAddressOperations.AddReplyAddressL(replyAddress));
+	TEST(err==KErrNone);
+	//Check for reply address - should not contain
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	(void) specialMessageAndReplyAddresMessage->TextPresent();
+	TRAP(err,(void) specialMessageAndReplyAddresMessage->NumMessagePDUsL());
+	TEST(err==KErrArgument);
+	(void) specialMessageAndReplyAddresMessage->MaxMessageLength();
+	(void) specialMessageAndReplyAddresMessage->MessageLengthL();
+
+	//Send the message
+	SendSmsErrorL(specialMessageAndReplyAddresMessage,socket);
+
+	//Remove addresses
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Check boundary value lengths for reply addreses.
+	//	The IE for reply address has it's own length specified as IEL.
+	//Maximum length for this is: KSmsAddressMaxAddressLength = 12.  That is 10 plus 2 for the type
+	//Gives us a maximum of 10 octects.  That allows us a maximum of 20 digits.
+	//Boundary values would therefore be 19, 20, and 21 digit numbers
+	TPtrC minReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("nineteenDigitReplyAddress"), minReplyAddress);
+	TRAP(err,replyAddressOperations.AddReplyAddressL(minReplyAddress));
+	TEST(err==KErrNone);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(result);
+	//Get the reply address
+	HBufC* returnedHBufReplyAddress=NULL;
+	TRAP(err,returnedHBufReplyAddress=replyAddressOperations.GetReplyAddressL());
+	TEST(err==KErrNone);
+	CleanupStack::PushL(returnedHBufReplyAddress);
+	TPtr returnedBuffPtr(returnedHBufReplyAddress->Des());
+	TEST(returnedBuffPtr==minReplyAddress);
+	CleanupStack::PopAndDestroy(returnedHBufReplyAddress);
+
+	//Remove addresses
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//On the boundary
+	TPtrC boundaryReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("twentyDigitReplyAddress"), boundaryReplyAddress);
+	TRAP(err,replyAddressOperations.AddReplyAddressL(boundaryReplyAddress));
+	TEST(err==KErrNone);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(result);
+	TRAP(err,returnedHBufReplyAddress=replyAddressOperations.GetReplyAddressL());
+	TEST(err==KErrNone);
+	CleanupStack::PushL(returnedHBufReplyAddress);
+	TPtr boundaryBuffPtr=returnedHBufReplyAddress->Des();
+	TEST(boundaryBuffPtr==boundaryReplyAddress);
+	CleanupStack::PopAndDestroy(returnedHBufReplyAddress);
+
+	//Remove addresses
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Just outside the boundary (21)
+	TPtrC overBoundaryReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("twentyOneDigitReplyAddress"), overBoundaryReplyAddress);
+	TRAP(err,replyAddressOperations.AddReplyAddressL(overBoundaryReplyAddress));
+	TEST(err==KErrArgument);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(!result);
+	TRAP(err,returnedHBufReplyAddress=replyAddressOperations.GetReplyAddressL());
+	TEST(err==KErrNotFound);
+
+	//Remove addresses
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Check boundary value lengths for parsed reply addresses.
+	//	The IE for reply address has it's own length specified as IEL.
+	//Maximum length for this is: KSmsAddressMaxAddressLength = 12.  That is 10 plus 2 for the type
+	//Gives us a maximum of 10 octects.  That allows us a maximum of 10 characters @ 7 bit coding as per spec.
+	//Boundary values would therefore be 10, 11, and 12 character numbers
+	TPtrC smallBoundaryParsedReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("tenCharacterParsedReplyAddress"), smallBoundaryParsedReplyAddress);
+	replyAddressTGsm.iTelNumber=smallBoundaryParsedReplyAddress;
+	replyAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	TRAP(err,replyAddressOperations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(result);
+	TGsmSmsTelNumber retrievedParsedReplyAddress;
+	TRAP(err,result=replyAddressOperations.GetParsedReplyAddressL(retrievedParsedReplyAddress));
+	TEST(err==KErrNone);
+	TEST(result);
+	TEST(replyAddressTGsm.iTelNumber==retrievedParsedReplyAddress.iTelNumber);
+
+	//Remove address
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Check length 11
+	TPtrC onBoundaryParsedReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("elevenCharacterParsedReplyAddress"), onBoundaryParsedReplyAddress);
+	replyAddressTGsm.iTelNumber=onBoundaryParsedReplyAddress;
+	replyAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	TRAP(err,replyAddressOperations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Remove address
+	TRAP(err,replyAddressOperations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Check length 12
+	TPtrC overBoundaryParsedReplyAddress;
+	GetStringFromConfig(ConfigSection(), _L("twelveCharacterParsedReplyAddress"), overBoundaryParsedReplyAddress);
+	replyAddressTGsm.iTelNumber=overBoundaryParsedReplyAddress;
+	replyAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	TRAP(err,replyAddressOperations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrOverflow);
+	result=replyAddressOperations.ContainsReplyAddressIEL();
+	TEST(!result);
+
+	CleanupStack::PopAndDestroy(specialMessageAndReplyAddresMessage);
+
+	//Create a new message
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsReplyAddressOperations& operations =
+		static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Add international number
+	TRAP(err,operations.AddReplyAddressL(replyAddress));
+	TEST(err==KErrNone);
+
+	//Read value as a parsed address
+	TRAP(err,result=operations.GetParsedReplyAddressL(retrievedParsedReplyAddress));
+	TEST(err==KErrNone);
+	TEST(result);
+	_LIT(KInternationalPrefix, "+");
+	const TUint KMaxNumberSize=15;
+	TBuf<KMaxNumberSize> internationalNumber(KInternationalPrefix);
+	internationalNumber.Append( retrievedParsedReplyAddress.iTelNumber);
+	TEST(replyAddress==internationalNumber);
+
+	//Remove address
+	TRAP(err,operations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Add address as a parsed address
+	GetStringFromConfig(ConfigSection(), _L("elevenCharacterParsedReplyAddress"), onBoundaryParsedReplyAddress);
+	replyAddressTGsm.iTelNumber=onBoundaryParsedReplyAddress;
+	replyAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	TRAP(err,operations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+
+	//Read address as an international number
+	TRAP(err,returnedHBufReplyAddress=operations.GetReplyAddressL());
+	TEST(err==KErrNone);
+	CleanupStack::PushL(returnedHBufReplyAddress);
+	TPtr parsedAddressPtr=returnedHBufReplyAddress->Des();
+	TEST(parsedAddressPtr==onBoundaryParsedReplyAddress);
+	CleanupStack::PopAndDestroy(returnedHBufReplyAddress);
+
+	//Remove address
+	TRAP(err,operations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+
+	//Add address
+	TRAP(err,operations.AddReplyAddressL(replyAddress));
+	TEST(err==KErrNone);
+	//Check for reply address - should contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Add parsed address
+	replyAddressTGsm.iTelNumber=_L("+447583927594");
+	replyAddressTGsm.iTypeOfAddress=EGsmSmsTONInternationalNumber;
+	TRAP(err,operations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrAlreadyExists);
+	//Check for reply address - should contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Remove address
+	TRAP(err,operations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+	//Check for reply address - should not contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(!result);
+
+	//Add Parsed reply address
+	TRAP(err,operations.AddParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+	//Check for reply address - should not contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Remove parsed address
+	TRAP(err,operations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+	//Check for reply address - should not contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(!result);
+
+	//Send message with no reply address
+	SendSmsL(smsMessage,socket);
+	// -------- END Sending no reply
+
+	//Add reply address
+	TRAP(err,operations.AddReplyAddressL(replyAddress));
+	TEST(err==KErrNone);
+
+	//Check for reply address
+	result=operations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Get the reply address
+	// as HBufC
+	TRAP(err,replyAddressHBuf=operations.GetReplyAddressL());
+	CleanupStack::PushL(replyAddressHBuf);
+	TEST(err==KErrNone);
+	TPtr buffPtr(replyAddressHBuf->Des());
+	TEST(buffPtr==replyAddress);
+
+	//Send message with one reply address
+	CleanupStack::PopAndDestroy(replyAddressHBuf);
+	SendSmsL(smsMessage,socket);
+	// ------- END Send with Reply address
+
+	//Send message with one parsed reply address
+	//Remove address
+	TRAP(err,operations.RemoveReplyAddressL());
+	TEST(err==KErrNone);
+	//Check for reply address - should not contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(!result);
+
+	//Add parsed address
+	TGsmSmsTelNumber parsedReplyAddressTGsm;
+	parsedReplyAddressTGsm.iTelNumber=_L("44758ABCD3");
+	parsedReplyAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	TRAP(err,operations.AddParsedReplyAddressL(parsedReplyAddressTGsm));
+	TEST(err==KErrNone);
+	//Check for reply address - should contain
+	result=operations.ContainsReplyAddressIEL();
+	TEST(result);
+
+	//Get Parsed address
+	TGsmSmsTelNumber retrievedReplyAddressTGsm;
+	TRAP(err,result=operations.GetParsedReplyAddressL(retrievedReplyAddressTGsm));
+	TEST(err==KErrNone);
+	TEST(result);
+	TEST(parsedReplyAddressTGsm.iTelNumber==retrievedReplyAddressTGsm.iTelNumber);
+
+	//Send message with one parsed reply address
+	SendSmsL(smsMessage,socket);
+	// ------- END Send parsed reply
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END Sending
+
+	//Receive a message with no reply address
+	INFO_PRINTF1(_L("waiting for incoming SMS with no reply address...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	INFO_PRINTF1(_L("incoming SMS") );
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsReplyAddressOperations& deliverOperations =
+		static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Check has no reply address
+	result=deliverOperations.ContainsReplyAddressIEL();
+	TEST(result==0);
+
+	//Try to get non existent address
+	// as HBufC
+	TRAP(err,replyAddressHBuf=deliverOperations.GetReplyAddressL());
+	TEST(err==KErrNotFound);
+
+	// as TGsmSmsTelNumber
+	TRAP(err,result=deliverOperations.GetParsedReplyAddressL(replyAddressTGsm));
+	TEST(err==KErrNone);
+	TEST(result==0);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END Receive with no reply address
+
+	INFO_PRINTF1(_L("waiting for incoming SMS with reply address...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	INFO_PRINTF1(_L("incoming SMS") );
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsReplyAddressOperations& deliverReplyOperations =
+		static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Check has reply address
+	result=deliverReplyOperations.ContainsReplyAddressIEL();
+	TEST(result==1);
+
+	//Get address
+	// as HBufC
+	TRAP(err,replyAddressHBuf=deliverReplyOperations.GetReplyAddressL());
+	CleanupStack::PushL(replyAddressHBuf);
+	TEST(err==KErrNone);
+	TPtr buffReplyPtr(replyAddressHBuf->Des());
+	TEST(buffReplyPtr==replyAddress);
+
+	CleanupStack::PopAndDestroy(replyAddressHBuf);
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END Receive with reply address
+
+	INFO_PRINTF1(_L("waiting for incoming SMS with parsed reply address...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	INFO_PRINTF1(_L("incoming SMS") );
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsReplyAddressOperations& deliverParsedReplyOperations =
+		static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Check has reply address
+	result=deliverParsedReplyOperations.ContainsReplyAddressIEL();
+	TEST(result==1);
+
+	//Get Parsed address
+	//Test is panicing here ---
+	TRAP(err,result=deliverParsedReplyOperations.GetParsedReplyAddressL(retrievedReplyAddressTGsm));
+	TEST(err==KErrNone);
+	TEST(result);
+	TEST(parsedReplyAddressTGsm.iTelNumber==retrievedReplyAddressTGsm.iTelNumber);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END Receive with parsed reply address
+
+	//This PDU has three reply address in it.  We are looking for the stack to store only the last occurence
+	INFO_PRINTF1(_L("waiting for incoming SMS with three reply addresses...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	INFO_PRINTF1(_L("incoming SMS") );
+
+	CleanupStack::PushL(smsMessage);
+	//TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsReplyAddressOperations& deliverMultipleReplyOperations =
+		static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+
+	//Check has reply address
+	result=deliverMultipleReplyOperations.ContainsReplyAddressIEL();
+	TEST(result==1);
+
+	//Get Parsed address
+	TPtrC multiReplyAddress(_L("+447583927596"));
+
+	TRAP(err,replyAddressHBuf=deliverMultipleReplyOperations.GetReplyAddressL());
+	TEST(err==KErrNone);
+	CleanupStack::PushL(replyAddressHBuf);
+	TPtr multiBuffPtr(replyAddressHBuf->Des());
+	TEST(multiBuffPtr==multiReplyAddress);
+	CleanupStack::PopAndDestroy(replyAddressHBuf);
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END receive with multiple reply address
+
+	//This PDU has three reply address in it.  We are looking for the stack to store only the last occurence
+	INFO_PRINTF1(_L("waiting for incoming SMS with corrupt reply address...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsReplyAddressOperations& corruptReplyOperations = static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+	//Check has reply address
+	result=deliverMultipleReplyOperations.ContainsReplyAddressIEL();
+	TEST(result==1);
+	//Get address
+	TRAP(err,replyAddressHBuf=corruptReplyOperations.GetReplyAddressL());
+	TEST(err==KErrCorrupt);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//-------- END receive with corrupt reply address
+	//-------- END receive
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+
+}
+
+
+TVerdict CTestMultiplePDUReplyAddress::doTestStepL()
+/**
+ *  Test a simple Transmit and Receive of a TPDU
+ */
+	{
+	INFO_PRINTF1(_L("Test multiple PDUs with reply address in SMS message"));
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestSpecialMessageOperations::doTestStepL()
+/**
+ *  Test the operations available for special message waiting
+ */
+	{
+	INFO_PRINTF1(_L("Test special message waiting operations"));
+
+	__UHEAP_MARK;
+
+	//This is character msg - 96 characters
+	_LIT(KTestMsg,"This message is a special message waiting message. You have a special message waiting for you :)");
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations for a version 0 message i.e. before operations for IE were added
+	smsMessage->SetVersion(CSmsMessage::ESmsMessageV0);
+	TRAPD(err,smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+	TEST(err==KErrNotSupported);
+
+	smsMessage->SetVersion(CSmsMessage::ESmsMessageV1);
+	//Get the operations for a version 1 message
+	CSmsSpecialSMSMessageOperations& operations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	//get a IE Identifier operations for future use
+	TRAP(err,smsMessage->GetOperationsForIEL(CSmsInformationElement::TSmsInformationElementIdentifier(0xE0) ));
+	TEST(err==KErrArgument);
+
+	//get operations for a IE identifier not currently supported: ESmsIEIRFC822EmailHeader
+	TRAP(err,smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEIRFC822EmailHeader ));
+	TEST(err==KErrArgument);
+
+	//Lets bash these API's, make sure they work correctly !
+	INFO_PRINTF1(_L("Testing API's with message with no special messages"));
+	TUint count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+
+	//Set the type
+	//Voice message, No extended message type
+	TSmsMessageIndicationType messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	TExtendedSmsIndicationType extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+
+	//delete a special message
+	TRAP(err,operations.RemoveSpecialMessageIndicationL(messageIndicationType,extendedType));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+	//delete all special messagRemoveAllSpecialMessageIndicationsLe
+	TRAP(err,operations.RemoveAllSpecialMessageIndicationsL());
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+
+	//Get special message
+	TUint index=0;
+	TBool toStore=EFalse;
+	TSmsMessageProfileType messageProfileType;
+	TUint8 messageCount=0;
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrArgument);
+
+	//Add special messages
+	INFO_PRINTF1(_L("Testing API AddSpecialMessageIndicationL"));
+	toStore=ETrue;
+	messageCount=1;
+	messageProfileType=EGsmSmsProfileId1;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==1);
+
+	//Get this message
+	//Change the current values = ensure the API is changing them
+	INFO_PRINTF1(_L("Testing API GetMessageIndicationIEL"));
+	toStore=EFalse;
+	messageCount=10;
+	messageIndicationType=EGsmSmsFaxMessageWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsVoiceMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==1);
+
+	//Add the same type, special message will be updated.
+	toStore=ETrue;
+	messageCount=10;
+	messageProfileType=EGsmSmsProfileId1;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+							extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==1);
+
+	//Add a different type
+	//Add special messages
+	toStore=ETrue;
+	messageIndicationType=EGsmSmsFaxMessageWaiting;
+	extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	messageProfileType=EGsmSmsProfileId1;
+	messageCount=3;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==2);
+
+	//Get the type
+	toStore=EFalse;
+	messageCount=10;
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=1;
+
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsFaxMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==3);
+
+
+	//Add another different type
+	//Email message, No extended message type
+	messageIndicationType=EGsmSmsElectronicMailMessageWaiting;
+	extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	messageProfileType=EGsmSmsProfileId1;
+	messageCount=5;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==3);
+
+	//Get this type
+	toStore=EFalse;
+	messageCount=10;
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=2;
+
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsElectronicMailMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==5);
+
+	//Add another diffent type
+	//Special message, extended type=video message
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageCount=7;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==4);
+
+	//Get this type
+	toStore=EFalse;
+	messageCount=10;
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=3;
+
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsExtendedMessageTypeWaiting);
+	TEST(extendedType==EGsmSmsVideoMessageWaiting);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==7);
+
+	//Remove first Special message
+	INFO_PRINTF1(_L("Testing API RemoveSpecialMessageIndicationL"));
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	TRAP(err,operations.RemoveSpecialMessageIndicationL(messageIndicationType,extendedType));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==3);
+
+	//Get index 0
+	toStore=EFalse;
+	messageCount=10;
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=0;
+
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsFaxMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount=3);
+
+	//Get Index out of range, boundary condition
+	index=3;
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrArgument);
+
+	//Get index out of range, massive
+	index=25;
+	TRAP(err,operations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrArgument);
+
+	//Remove all
+	INFO_PRINTF1(_L("Testing API RemoveAllSpecialMessageIndicationsL"));
+	TRAP(err,operations.RemoveAllSpecialMessageIndicationsL());
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+
+
+	//Regression test of previous existing API's
+	CSmsPDU &pdu=smsMessage->SmsPDU();
+	//Get the UserData
+	CSmsUserData &userData=pdu.UserData();
+
+	_LIT8(KSpecialMessageString,"0500");	//5 voice mails
+	TRAP(err,userData.AddInformationElementL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication,KSpecialMessageString));
+	TEST(err==KErrNone);
+	count=userData.NumInformationElements();
+	TEST(count==1);
+
+	//Get using Type
+	TInt returnedIndex=-5;
+	TBool callResult = EFalse;
+	TRAP(err,callResult=userData.InformationElementIndex(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication,returnedIndex));
+	TEST(err==KErrNone);
+	TEST(callResult);
+	TEST(returnedIndex==0);
+
+	//Get using index
+	index=0;
+	CSmsInformationElement& informationElement=userData.InformationElement(index);
+	CSmsInformationElement::TSmsInformationElementIdentifier identifier=informationElement.Identifier();
+	TEST(identifier==CSmsInformationElement::ESmsIEISpecialSMSMessageIndication);
+
+	//Remove the indication
+	index=0;
+	userData.RemoveInformationElement(index);
+	count=userData.NumInformationElements();
+	TEST(count==0);
+
+	//What about a combination
+	//Add with existing CUserData::AddInformationElement
+	TRAP(err,userData.AddInformationElementL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication,KSpecialMessageString));
+	TEST(err==KErrNone);
+	count=userData.NumInformationElements();
+	TEST(count==1);
+
+	//Add special message waiting with operations
+	toStore=ETrue;
+	messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	messageProfileType=EGsmSmsProfileId1;
+	messageCount=5;
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==2);
+
+	//Add another with existing CUserData::AddInformationElement
+	TRAP(err,userData.AddInformationElementL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication,KSpecialMessageString));
+	TEST(err==KErrAlreadyExists);
+	count=userData.NumInformationElements();
+	TEST(count==2);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==2);
+
+	//Get IE
+	index=0;
+	CSmsInformationElement &informationElementIndexZero=userData.InformationElement(index);
+	identifier=informationElementIndexZero.Identifier();
+	TEST(identifier==CSmsInformationElement::ESmsIEISpecialSMSMessageIndication);
+
+	index=1;
+	CSmsInformationElement &informationElementIndexOne=userData.InformationElement(index);
+	identifier=informationElementIndexOne.Identifier();
+	TEST(identifier==CSmsInformationElement::ESmsIEISpecialSMSMessageIndication);
+
+	//Remove
+	index=1;
+	userData.RemoveInformationElement(index);
+	count=userData.NumInformationElements();
+	TEST(count==1);
+
+	index=0;
+	userData.RemoveInformationElement(index);
+	count=userData.NumInformationElements();
+	TEST(count==0);
+
+	INFO_PRINTF1(_L("Test step end !"));
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END API Test for special message operations
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestSinglePDUSpecialMessageWaiting::doTestStepL()
+/**
+ *  Test a simple Transmit and Receive of a TPDU
+ */
+	{
+	INFO_PRINTF1(_L("Test special message waiting in single PDU SMS message"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 73);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is a 95 character msg.
+	_LIT(KTestMsg,"This message is a special message waiting message. You have a special message waiting for you :)");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	INFO_PRINTF2(_L("Destination number:..... %S "),&iTelephoneNumber);
+	INFO_PRINTF2(_L("ServiceCenter number:... %S "),&iServiceCenterNumber);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& operations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+	TUint count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+
+	//Send message with no special message indication
+	SendSmsL(smsMessage,socket);
+
+	//Send message with special message indication - voice mail
+	INFO_PRINTF1(_L("Creating message with voice mail waiting"));
+	TSmsMessageIndicationType messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	TExtendedSmsIndicationType extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+	TUint index=0;
+	TBool toStore=ETrue;
+	TUint8 messageCount=5;
+
+	//Add special messages
+	TRAPD(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==1);
+
+	//Send message with no voice mail message indication
+	SendSmsL(smsMessage,socket);
+
+	//Send message with special message indication - voice mail, fax, email, and enhanced message
+	//Add the special message indications - FAX
+	INFO_PRINTF1(_L("Creating message with fax waiting"));
+	messageIndicationType=EGsmSmsFaxMessageWaiting;
+	extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	messageCount=2;
+	//Add IE
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==2);
+
+	//Add the special message indications - Email
+	INFO_PRINTF1(_L("Creating message with email waiting"));
+	messageIndicationType=EGsmSmsElectronicMailMessageWaiting;
+	messageCount=3;
+
+	//Add IE
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==3);
+
+	//Add the special message indications - Enhanced message waiting
+	INFO_PRINTF1(_L("Creating message with enhanced message waiting"));
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageCount=1;
+	//Add IE
+	TRAP(err,operations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	count=operations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==4);
+
+	(void) smsMessage->TextPresent();
+	(void) smsMessage->NumMessagePDUsL();
+	(void) smsMessage->MaxMessageLength();
+	(void) smsMessage->MessageLengthL();
+
+	//Send message with one of each type of special message IE
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END Sending Single PDU
+
+	//-------- START receiving
+	INFO_PRINTF1(_L("waiting for incoming SMS...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& noSpecialMessageOperations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+	count=noSpecialMessageOperations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==0);
+
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- End receive no SMW
+
+	INFO_PRINTF1(_L("waiting for incoming SMS with voice mail waiting...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& voiceMailMessageOperations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	count=voiceMailMessageOperations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==1);
+
+	//Get this type
+	toStore=EFalse;
+	messageCount=0;
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=0;
+
+	TRAP(err,voiceMailMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsVoiceMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==10);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- End receive with voice mail, count==10
+
+	INFO_PRINTF1(_L("waiting for incoming SMS with one of each type of special message waiting IE...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& multipleSpecialMessageOperations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	count=multipleSpecialMessageOperations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==4);
+
+	//Get them
+	//Reset values
+	toStore=EFalse;
+	messageCount=0;
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=0;
+
+	//Get at index 0 - voice mail
+	TRAP(err,multipleSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsVoiceMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==8);
+
+	//Get at index 1 - Fax
+	toStore=EFalse;
+	messageCount=0;
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=1;
+	TRAP(err,multipleSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsFaxMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==3);
+
+	//Get at index 2 - Email
+	toStore=EFalse;
+	messageCount=0;
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=2;
+	TRAP(err,multipleSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsElectronicMailMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==1);
+
+	//Get at index 3 - Enhanced message
+	toStore=EFalse;
+	messageCount=0;
+	messageProfileType=EGsmSmsProfileId2;
+	index=3;
+	TRAP(err,multipleSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsExtendedMessageTypeWaiting);
+	TEST(extendedType==EGsmSmsVideoMessageWaiting);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==2);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- End receive with all instanced of special message,voice mail(8),Fax(3),Email(1),Enhanced(2)
+
+	//Receive message with three fax IE,and one enhanced
+	INFO_PRINTF1(_L("waiting for incoming SMS with multiple instances of special message waiting IE...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& multipleInstancesSpecialMessageOperations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	//Should only detect two valid
+	count=multipleInstancesSpecialMessageOperations.GetCountOfSpecialMessageIndicationsL();
+	TEST(count==4);
+
+	//Get these two, FAX,and Enhanced
+	//Reset values
+	toStore=EFalse;
+	messageCount=0;
+	messageIndicationType=EGsmSmsExtendedMessageTypeWaiting;
+	extendedType=EGsmSmsVideoMessageWaiting;
+	messageProfileType=EGsmSmsProfileId2;
+	index=0;
+
+	//Get at index 0 - Fax mail
+	TRAP(err,multipleInstancesSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsFaxMessageWaiting);
+	TEST(extendedType==EGsmSmsNoExtendedMessageTypeIndication);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==1);
+
+	//Reset values
+	toStore=EFalse;
+	messageCount=0;
+	messageProfileType=EGsmSmsProfileId2;
+	index=3;
+
+	//Get at index 3 - Enhanced
+	TRAP(err,multipleInstancesSpecialMessageOperations.GetMessageIndicationIEL(index,toStore,messageIndicationType,
+								extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+	TEST(toStore);
+	TEST(messageIndicationType==EGsmSmsExtendedMessageTypeWaiting);
+	TEST(extendedType==EGsmSmsVideoMessageWaiting);
+	TEST(messageProfileType==EGsmSmsProfileId1);
+	TEST(messageCount==4);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//-------- END receive multiple instances of enhanced IE
+
+	//-------- END receive
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestMultiplePDUSpecialMessageWaiting::doTestStepL()
+/**
+ *  Test a simple Transmit and Receive of a TPDU
+ */
+	{
+	INFO_PRINTF1(_L("Test special message waiting in multiple PDU SMS message"));
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestEnhancedVoiceMailOperations::doTestStepL()
+/**
+ *  Test the operations available for special message waiting
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail message operations"));
+
+	__UHEAP_MARK;
+
+	//This is character msg - 96 characters
+	_LIT(KTestMsg,"This is a enhanced voice mail information message!");
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& operations =
+			static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//Lets bash these API's, make sure they work correctly !
+	INFO_PRINTF1(_L("Testing API's for enhanced voice mail information operations"));
+	//ContainsEnhancedVoiceMailL
+	TBool result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+	//RemoveEnhancedVoiceMailL
+	TRAPD(err,operations.RemoveEnhancedVoiceMailIEL());
+	TEST(err==KErrNotFound);
+	//CopyEnhancedVoidMail
+	TRAP(err,operations.CopyEnhancedVoiceMailIEL());
+	TEST(err==KErrNotFound);
+
+	//Create CEnhancedVoiceMailNotification
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification=CEnhancedVoiceMailNotification::NewL();
+	CleanupStack::PushL(enhancedVoiceMailNotification);
+	//Set the properties
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+	enhancedVoiceMailNotification->SetProfile(messageProfileType);
+	enhancedVoiceMailNotification->SetStorage(ETrue);
+	enhancedVoiceMailNotification->SetAlmostMaximumCapacity(ETrue);
+	enhancedVoiceMailNotification->SetMaximumCapacity(EFalse);
+	enhancedVoiceMailNotification->SetNumberOfVoiceMessages(10);
+
+	//Add access address - mail box address
+	TPtrC parsedAccessAddress;
+	GetStringFromConfig(ConfigSection(), _L("parsedAccessAddress"), parsedAccessAddress);
+	TGsmSmsTelNumber accessAddressTGsm;
+	accessAddressTGsm.iTelNumber=parsedAccessAddress;
+	accessAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	enhancedVoiceMailNotification->SetParsedAccessAddressL(accessAddressTGsm);
+
+	//Create mail messages
+	CVoiceMailNotification* voiceMailNotification=CVoiceMailNotification::NewL();
+
+	//Setup the message
+	TUint16 messageId=1;
+	TUint8 messageLength=20;
+	voiceMailNotification->SetMessageId(messageId);
+	voiceMailNotification->SetMessageLength(messageLength);
+	TUint8 daysRetention=5;
+	voiceMailNotification->SetRetentionDays(daysRetention);
+	voiceMailNotification->SetPriorityIndication(ETrue);
+
+	//Test the boundary values for calling line identity
+	TUint count=0;
+	//Do this test for both parsed address and international numbers
+	for (TUint addressType=EInternational;addressType<=EParsed;addressType++)
+	{
+		for(TUint boundaryCheck=EInside; boundaryCheck<=EOutside;boundaryCheck++)
+		{
+			//Just before the boundary
+			TPtrC boundaryCallingLineIdentity;
+			if (boundaryCheck==EInside)
+			{
+				if(addressType==EParsed)
+				{
+					GetStringFromConfig(ConfigSection(), _L("tenCharacterParsedReplyAddress"), boundaryCallingLineIdentity);
+				}
+				else
+				{
+					GetStringFromConfig(ConfigSection(), _L("nineteenDigitReplyAddress"), boundaryCallingLineIdentity);
+				}
+			}
+			//on the boundary
+			else if(boundaryCheck==EOn)
+			{
+				if(addressType==EParsed)
+				{
+					GetStringFromConfig(ConfigSection(), _L("elevenCharacterParsedReplyAddress"), boundaryCallingLineIdentity);
+				}
+				else
+				{
+					GetStringFromConfig(ConfigSection(), _L("twentyDigitReplyAddress"), boundaryCallingLineIdentity);
+				}
+
+			}
+			//Just past the boundary
+			else if(boundaryCheck==EOutside)
+			{
+				if(addressType==EParsed)
+				{
+					GetStringFromConfig(ConfigSection(), _L("twelveCharacterParsedReplyAddress"), boundaryCallingLineIdentity);
+				}
+				else
+				{
+					GetStringFromConfig(ConfigSection(), _L("twentyOneDigitReplyAddress"), boundaryCallingLineIdentity);
+				}
+			}
+
+			//Add
+			AddAddressToNotifcationL(enhancedVoiceMailNotification,
+					voiceMailNotification, boundaryCallingLineIdentity,addressType);
+
+			//Add the enhanced voice mail to the message
+			TRAP(result,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+
+			//Outside the boundary produces different results
+			if(boundaryCheck==EOutside)
+			{
+				TEST(result==KErrArgument);
+				result=operations.ContainsEnhancedVoiceMailIEL();
+				TEST(!result);
+
+			}
+			else
+			{
+				TEST(result==KErrNone);
+				result=operations.ContainsEnhancedVoiceMailIEL();
+				TEST(result);
+
+				//Remove
+				CEnhancedVoiceMailNotification* notNeededEnhancedVoiceMailNotification =
+					static_cast<CEnhancedVoiceMailNotification*>(operations.RemoveEnhancedVoiceMailIEL() );
+				result=operations.ContainsEnhancedVoiceMailIEL();
+				TEST(!result);
+				count=notNeededEnhancedVoiceMailNotification->NumberOfVoiceMails();
+				TEST(count==1);
+
+				delete notNeededEnhancedVoiceMailNotification;
+			}
+
+
+		}
+	}
+
+
+	voiceMailNotification->SetParsedCallingLineIdentityL(accessAddressTGsm);
+
+	//Get the notifications in the enhanced message
+	RPointerArray<CVoiceMailNotification>& newNotificationsList=
+					enhancedVoiceMailNotification->GetVoiceMailNotifications();
+
+	count=newNotificationsList.Count();
+	//Remove all pointers to notifications
+	if(count)
+	{
+		newNotificationsList.Reset();
+	}
+
+	result=newNotificationsList.Append(voiceMailNotification);
+	TEST(result==KErrNone);
+	count=enhancedVoiceMailNotification->NumberOfVoiceMails();
+	TEST(count==1);
+	//Add
+	TRAP(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+	TEST(err==KErrNone);
+
+	//Contains
+	//ContainsEnhancedVoiceMailL
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+	//Add
+	TRAP(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+	TEST(err==KErrAlreadyExists);
+	//Copy
+	CEnhancedVoiceMailBoxInformation* retrievedNotification = NULL;
+	TRAP(err,retrievedNotification=operations.CopyEnhancedVoiceMailIEL() );
+	TEST(err==KErrNone);
+	CleanupStack::PushL(retrievedNotification);
+
+	//Check the contents
+	//Type
+	TVoiceMailInfoType typeInfo=retrievedNotification->Type();
+	TEST(typeInfo==EGsmSmsVoiceMailNotification);
+	//Profile
+	TSmsMessageProfileType profile=retrievedNotification->Profile();
+	TEST(profile==EGsmSmsProfileId1);
+	//Store
+	TBool isStore=retrievedNotification->Store();
+	TEST(isStore);
+	//Almost Capacity
+	TBool isAlmostMaxCapacity=retrievedNotification->AlmostMaximumCapacity();
+	TEST(isAlmostMaxCapacity);
+	//MaximumCapacity
+	TBool isMaximumCapacity=retrievedNotification->MaximumCapacity();
+	TEST(!isMaximumCapacity);
+	//Access address - mail box address
+	TGsmSmsTelNumber retrievedAccessAddressTGsm;
+	retrievedNotification->ParsedAccessAddress(retrievedAccessAddressTGsm);
+	TEST(retrievedAccessAddressTGsm.iTelNumber==accessAddressTGsm.iTelNumber);
+	//Number Of Voice Messages
+	count=retrievedNotification->NumberOfVoiceMessages();
+	TEST(count==10);
+
+	//Cast the type, get the numberOfVoiceMails
+	//Number of voice mails
+	CEnhancedVoiceMailNotification* retrievedEnhancedNotification=
+						static_cast<CEnhancedVoiceMailNotification*>(retrievedNotification);
+	count=retrievedEnhancedNotification->NumberOfVoiceMails();
+	TEST(count==1);
+	//contains
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+	//remove
+	CEnhancedVoiceMailNotification* throwAwayEnhancedVoiceMailNotification = NULL;
+	TRAP(err, throwAwayEnhancedVoiceMailNotification =
+		static_cast<CEnhancedVoiceMailNotification*>(operations.RemoveEnhancedVoiceMailIEL() ));
+
+	TEST(err==KErrNone);
+
+	delete throwAwayEnhancedVoiceMailNotification;
+
+	//contains
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	CleanupStack::PopAndDestroy(retrievedNotification);
+	CleanupStack::PopAndDestroy(enhancedVoiceMailNotification);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+//Helper function:  Adds the address to a notification
+void CTestEnhancedVoiceMailOperations::AddAddressToNotifcationL(
+			CEnhancedVoiceMailNotification* aEnhancedVoiceMailNotification,
+			CVoiceMailNotification* aVoiceMailNotification,
+			TPtrC aCallingLineIdentity,TUint aAddressType)
+{
+	//Get the notifications in the enhanced message
+	RPointerArray<CVoiceMailNotification>& notificationsList=
+					aEnhancedVoiceMailNotification->GetVoiceMailNotifications();
+
+	TUint count=notificationsList.Count();
+
+	if(count==1)
+	{
+		notificationsList.Remove(0);
+	}
+
+	//Add the address
+	if(aAddressType==EParsed)
+	{
+		//Create Calling Line Identity
+		TGsmSmsTelNumber callingLineIdentityTGsm;
+		callingLineIdentityTGsm.iTelNumber=aCallingLineIdentity;
+		callingLineIdentityTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+		aVoiceMailNotification->SetParsedCallingLineIdentityL(callingLineIdentityTGsm);
+	}
+	else
+	{
+		aVoiceMailNotification->SetCallingLineIdentityL(aCallingLineIdentity);
+	}
+
+	//Add the notification to the voice mail
+	TInt result=notificationsList.Append(aVoiceMailNotification);
+	TEST(result==KErrNone);
+}
+
+
+TVerdict CTestSinglePDUEnhancedVoiceMailInformation::doTestStepL()
+/**
+ *  Test the sending and receiving of enhanced voice mail
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail information with a single PDU message"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 74);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is an enhanced voice mail character msg.
+	_LIT(KTestMsg,"");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	INFO_PRINTF2(_L("Destination number:..... %S "),&iTelephoneNumber);
+	INFO_PRINTF2(_L("ServiceCenter number:... %S "),&iServiceCenterNumber);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& operations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	TBool result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	//Send message with no special message indication
+	SendSmsL(smsMessage,socket);
+
+	//Create message with Enhanced void mail information
+	//Add access address - mail box address
+	TPtrC usualAccessAddress;
+	GetStringFromConfig(ConfigSection(), _L("accessAddress"), usualAccessAddress);
+	TGsmSmsTelNumber accessAddressTGsm;
+	accessAddressTGsm.iTelNumber=usualAccessAddress;
+	accessAddressTGsm.iTypeOfAddress=EGsmSmsTONInternationalNumber;
+
+	TUint length=accessAddressTGsm.iTelNumber.Length();
+
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification=CreateEnhancedVoiceMailNotificationL(accessAddressTGsm);
+	CleanupStack::PushL(enhancedVoiceMailNotification);
+
+	//Create notifications
+	TPtrC usualCallingLineIdentity;
+	GetStringFromConfig(ConfigSection(), _L("callingLineIdentity"), usualCallingLineIdentity);
+	TGsmSmsTelNumber callingLineIdentityTGsm;
+	callingLineIdentityTGsm.iTelNumber=usualCallingLineIdentity;
+	callingLineIdentityTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+
+	length=callingLineIdentityTGsm.iTelNumber.Length();
+
+
+	CVoiceMailNotification* voiceMailNotification=CreateVoiceMailNotificationL(callingLineIdentityTGsm);
+
+	//Add this to the list of notifications in the enhanced message
+	RPointerArray<CVoiceMailNotification>& notificationsList=
+					enhancedVoiceMailNotification->GetVoiceMailNotifications();
+
+	result=notificationsList.Append(voiceMailNotification);
+	TEST(result==KErrNone);
+	TUint count=enhancedVoiceMailNotification->NumberOfVoiceMails();
+	TEST(count==1);
+	//Add Enhanced Voice Mail Information to message
+	TRAPD(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+	TEST(err==KErrNone);
+
+	(void) smsMessage->TextPresent();
+	(void) smsMessage->NumMessagePDUsL();
+	(void) smsMessage->MaxMessageLength();
+	(void) smsMessage->MessageLengthL();
+
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::Pop(enhancedVoiceMailNotification);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//-----------------------------------
+	//Send message with enhanced voice mail length at boundary values
+	//Single pdu, max size = 137.  That is 140-2(UDHL) -1(IEId) = 137
+	//User data = 8C
+	//Make a new message
+	for (TUint i = 0; i < enhancedVoiceMailNotification->NumberOfVoiceMails(); i++)
+	    {
+	    delete notificationsList[i];
+	    }
+
+	notificationsList.Reset();
+
+	CSmsMessage* boundaryValueVoiceMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(boundaryValueVoiceMessage);
+	CleanupStack::PushL(enhancedVoiceMailNotification);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& boundaryValueVoiceMailOperations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(boundaryValueVoiceMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//Add five more notifications
+	const TUint KNumNotifications=4;
+	for(count=0;count<KNumNotifications; count++)
+	{
+		CVoiceMailNotification* voiceMailNotification=CreateVoiceMailNotificationL(callingLineIdentityTGsm);
+		result=notificationsList.Append(voiceMailNotification);
+		TEST(result==KErrNone);
+	}
+
+	//Add the number to make the size on the boundary
+	TPtrC boundaryCallingLineIdentity;
+	GetStringFromConfig(ConfigSection(), _L("boundaryAccessAddress"), boundaryCallingLineIdentity);
+	callingLineIdentityTGsm.iTelNumber=boundaryCallingLineIdentity;
+	callingLineIdentityTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	CVoiceMailNotification* boundaryMailNotification=CreateVoiceMailNotificationL(callingLineIdentityTGsm);
+	result=notificationsList.Append(boundaryMailNotification);
+	TEST(result==KErrNone);
+	count=enhancedVoiceMailNotification->NumberOfVoiceMails();
+	TEST(count==5);
+
+	//Add Enhanced Voice Mail Information to message
+	TRAP(err,boundaryValueVoiceMailOperations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+	TEST(err==KErrNone);
+	//Send the message
+	SendSmsL(boundaryValueVoiceMessage,socket);
+
+	CleanupStack::Pop(enhancedVoiceMailNotification);
+	CleanupStack::PopAndDestroy(boundaryValueVoiceMessage);
+	delete enhancedVoiceMailNotification;
+
+	//---------- END sending
+
+
+	//Receiving message with no enhanced voice mail
+	INFO_PRINTF1(_L("waiting for incoming SMS with no enhanced voice mail...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& noEnhancedVoiceMailOperations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	result=noEnhancedVoiceMailOperations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive message with enhanced voice mail information
+	INFO_PRINTF1(_L("waiting for incoming SMS with enhanced voice information...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& enhancedVoiceMailOperations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	result=enhancedVoiceMailOperations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+
+	//Copy
+	CEnhancedVoiceMailBoxInformation* retrievedNotification = NULL;
+	TRAP(err,retrievedNotification=enhancedVoiceMailOperations.CopyEnhancedVoiceMailIEL() );
+	TEST(err==KErrNone);
+	CleanupStack::PushL(retrievedNotification);
+	//Check the contents
+	//Type
+	TVoiceMailInfoType typeInfo=retrievedNotification->Type();
+	TEST(typeInfo==EGsmSmsVoiceMailNotification);
+	//Profile
+	TSmsMessageProfileType profile=retrievedNotification->Profile();
+	TEST(profile==EGsmSmsProfileId1);
+	//Store
+	TBool isStore=retrievedNotification->Store();
+	TEST(isStore);
+	//Almost Capacity
+	TBool isAlmostMaxCapacity=retrievedNotification->AlmostMaximumCapacity();
+	TEST(isAlmostMaxCapacity);
+	//MaximumCapacity
+	TBool isMaximumCapacity=retrievedNotification->MaximumCapacity();
+	TEST(!isMaximumCapacity);
+	//Access address - mail box address
+	TGsmSmsTelNumber retrievedAccessAddressTGsm;
+	retrievedNotification->ParsedAccessAddress(retrievedAccessAddressTGsm);
+	TEST(retrievedAccessAddressTGsm.iTelNumber==accessAddressTGsm.iTelNumber);
+	//Number Of Voice Messages
+	count=retrievedNotification->NumberOfVoiceMessages();
+	TEST(count==5);
+	//Cast the type, get the numberOfVoiceMails
+	//Number of voice mails
+	CEnhancedVoiceMailNotification* retrievedEnhancedNotification=
+						static_cast<CEnhancedVoiceMailNotification*>(retrievedNotification);
+	count=retrievedEnhancedNotification->NumberOfVoiceMails();
+	TEST(count==1);
+
+	CleanupStack::PopAndDestroy(retrievedNotification);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//---------- END receiving
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+CEnhancedVoiceMailNotification* CTestEnhancedVoiceMail::CreateEnhancedVoiceMailNotificationL(TGsmSmsTelNumber aAccessAddress)
+{
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification=CEnhancedVoiceMailNotification::NewL();
+
+	//Set the properties
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+	enhancedVoiceMailNotification->SetProfile(messageProfileType);
+	enhancedVoiceMailNotification->SetStorage(ETrue);
+	enhancedVoiceMailNotification->SetAlmostMaximumCapacity(ETrue);
+	enhancedVoiceMailNotification->SetMaximumCapacity(EFalse);
+	enhancedVoiceMailNotification->SetNumberOfVoiceMessages(5);
+	enhancedVoiceMailNotification->SetParsedAccessAddressL(aAccessAddress);
+
+	return enhancedVoiceMailNotification;
+}
+
+
+CVoiceMailNotification*  CTestEnhancedVoiceMail::CreateVoiceMailNotificationL(TGsmSmsTelNumber aCallingLineIdentity)
+{
+	CVoiceMailNotification* voiceMailNotification=CVoiceMailNotification::NewL();
+
+	//Setup the notification
+	TUint16 messageId=2;
+	TUint8 messageLength=25;
+	voiceMailNotification->SetMessageId(messageId);
+	voiceMailNotification->SetMessageLength(messageLength);
+	TUint8 daysRetention=3;
+	voiceMailNotification->SetRetentionDays(daysRetention);
+	voiceMailNotification->SetPriorityIndication(EFalse);
+	voiceMailNotification->SetParsedCallingLineIdentityL(aCallingLineIdentity);
+
+	return voiceMailNotification;
+}
+
+
+TVerdict CTestMultiplePDUEnhancedVoiceMailInformation::doTestStepL()
+/**
+ *  Test the sending and receiving of enhanced voice mail
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail information with multiple PDU message"));
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestEnhancedVoiceMailDeleteOperations::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail delete confirmation operations"));
+
+	__UHEAP_MARK;
+
+	//This is character msg - 96 characters
+	_LIT(KTestMsg,"This is a enhanced voice mail information message!");
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& operations =
+			static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//Lets bash these API's, make sure they work correctly !
+	INFO_PRINTF1(_L("Testing API's for enhanced voice mail delete confirmation operations"));
+	//ContainsEnhancedVoiceMailL
+	TBool result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+	//RemoveEnhancedVoiceMailL
+	TRAPD(err,operations.RemoveEnhancedVoiceMailIEL());
+	TEST(err==KErrNotFound);
+	//CopyEnhancedVoidMail
+	TRAP(err,operations.CopyEnhancedVoiceMailIEL());
+	TEST(err==KErrNotFound);
+
+	//Create CEnhancedVoiceMailDeleteConfirmations
+	CEnhancedVoiceMailDeleteConfirmations* enhancedVoiceMailDeleteConfirmation=
+			CEnhancedVoiceMailDeleteConfirmations::NewL();
+	CleanupStack::PushL(enhancedVoiceMailDeleteConfirmation);
+
+	//Set the properties
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+	enhancedVoiceMailDeleteConfirmation->SetProfile(messageProfileType);
+	enhancedVoiceMailDeleteConfirmation->SetStorage(ETrue);
+	enhancedVoiceMailDeleteConfirmation->SetAlmostMaximumCapacity(EFalse);
+	enhancedVoiceMailDeleteConfirmation->SetMaximumCapacity(EFalse);
+	enhancedVoiceMailDeleteConfirmation->SetNumberOfVoiceMessages(3);
+	//Add access address - mail box address
+	TGsmSmsTelNumber accessAddressTGsm;
+	accessAddressTGsm.iTelNumber=_L("44758ABCD3");
+	accessAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	enhancedVoiceMailDeleteConfirmation->SetParsedAccessAddressL(accessAddressTGsm);
+
+	//Create mail messages
+	CVoiceMailDeletion* voiceMailDeletion=CVoiceMailDeletion::NewL();
+	//CleanupStack::PushL(voiceMailDeletion);
+
+	//Setup the message
+	TUint16 messageId=3;
+	voiceMailDeletion->SetMessageId(messageId);
+	TEST(voiceMailDeletion->MessageId() == messageId);
+	TEST(voiceMailDeletion->MessageExtensionIndication() == EFalse);
+
+	//Add the deletion to the enhanced message
+	RPointerArray<CVoiceMailDeletion>& deletionsList=
+					enhancedVoiceMailDeleteConfirmation->GetVoiceMailDeletions();
+	result=deletionsList.Append(voiceMailDeletion);
+	TEST(result==KErrNone);
+	TUint count=enhancedVoiceMailDeleteConfirmation->NumberOfDeletes();
+	TEST(count==1);
+	//Add
+	TRAP(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailDeleteConfirmation));
+	TEST(err==KErrNone);
+	//Contains
+	//ContainsEnhancedVoiceMailL
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+	//Add
+	TRAP(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailDeleteConfirmation));
+	TEST(err==KErrAlreadyExists);
+
+	//Copy
+	CEnhancedVoiceMailDeleteConfirmations* retrievedDeletion = NULL;
+	TRAP(err,retrievedDeletion=static_cast<CEnhancedVoiceMailDeleteConfirmations*>(operations.CopyEnhancedVoiceMailIEL() ));
+	TEST(err==KErrNone);
+	CleanupStack::PushL(retrievedDeletion);
+
+	//Check the contents
+	//Type
+	TVoiceMailInfoType typeInfo=retrievedDeletion->Type();
+	TEST(typeInfo==EGsmSmsVoiceMailDeleteConfirmation);
+	//Profile
+	TSmsMessageProfileType profile=retrievedDeletion->Profile();
+	TEST(profile==EGsmSmsProfileId1);
+	//Store
+	TBool isStore=retrievedDeletion->Store();
+	TEST(isStore);
+	//Almost Capacity
+	TBool isAlmostMaxCapacity=retrievedDeletion->AlmostMaximumCapacity();
+	TEST(!isAlmostMaxCapacity);
+	//MaximumCapacity
+	TBool isMaximumCapacity=retrievedDeletion->MaximumCapacity();
+	TEST(!isMaximumCapacity);
+	//Access address - mail box address
+	TGsmSmsTelNumber retrievedAccessAddressTGsm;
+	retrievedDeletion->ParsedAccessAddress(retrievedAccessAddressTGsm);
+	TEST(retrievedAccessAddressTGsm.iTelNumber==accessAddressTGsm.iTelNumber);
+	//Number Of Voice Messages
+	count=retrievedDeletion->NumberOfVoiceMessages();
+	TEST(count==3);
+	//Number of deletes
+	count=retrievedDeletion->NumberOfDeletes();
+	TEST(count==1);
+	//contains
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+	//remove
+	CEnhancedVoiceMailBoxInformation* enhancedVoiceMailBoxInformation = 0;
+	TRAP(err,enhancedVoiceMailBoxInformation = operations.RemoveEnhancedVoiceMailIEL());
+	TEST(err==KErrNone);
+	delete enhancedVoiceMailBoxInformation;
+	//contains
+	result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	CleanupStack::PopAndDestroy(retrievedDeletion);
+	CleanupStack::PopAndDestroy(enhancedVoiceMailDeleteConfirmation);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestSinglePDUEnhancedVoiceMailDeleteConfirmation::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail single PDU message delete confirmation"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 75);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is an enhanced voice mail character msg.
+	_LIT(KTestMsg,"");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	INFO_PRINTF2(_L("Destination number:..... %S "),&iTelephoneNumber);
+	INFO_PRINTF2(_L("ServiceCenter number:... %S "),&iServiceCenterNumber);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& operations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	TBool result=operations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	//Send message with no special message indication
+	SendSmsL(smsMessage,socket);
+
+	//---- Add enhanced voice mail delete confirmation to the message
+	//Create the delete confirmation
+	CEnhancedVoiceMailDeleteConfirmations* enhancedVoiceMailDeleteConfirmation=
+			CEnhancedVoiceMailDeleteConfirmations::NewL();
+	CleanupStack::PushL(enhancedVoiceMailDeleteConfirmation);
+
+	//Set the properties
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId2;
+	enhancedVoiceMailDeleteConfirmation->SetProfile(messageProfileType);
+	enhancedVoiceMailDeleteConfirmation->SetStorage(EFalse);
+	enhancedVoiceMailDeleteConfirmation->SetAlmostMaximumCapacity(EFalse);
+	enhancedVoiceMailDeleteConfirmation->SetMaximumCapacity(EFalse);
+	enhancedVoiceMailDeleteConfirmation->SetNumberOfVoiceMessages(2);
+	//Add access address - mail box address
+	TGsmSmsTelNumber accessAddressTGsm;
+	accessAddressTGsm.iTelNumber=_L("44758ABCD3");
+	accessAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	enhancedVoiceMailDeleteConfirmation->SetParsedAccessAddressL(accessAddressTGsm);
+
+	//Create mail messages
+	CVoiceMailDeletion* voiceMailDeletion=CVoiceMailDeletion::NewL();
+	//Setup the message
+	TUint16 messageId=5;
+	voiceMailDeletion->SetMessageId(messageId);
+
+	//Add the deletion to the enhanced message
+	RPointerArray<CVoiceMailDeletion>& deletionsList=
+					enhancedVoiceMailDeleteConfirmation->GetVoiceMailDeletions();
+	result=deletionsList.Append(voiceMailDeletion);
+	TEST(result==KErrNone);
+	TUint count=enhancedVoiceMailDeleteConfirmation->NumberOfDeletes();
+	TEST(count==1);
+
+	//Add to message
+	TRAPD(err,operations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailDeleteConfirmation));
+	TEST(err==KErrNone);
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(enhancedVoiceMailDeleteConfirmation);
+	CleanupStack::PopAndDestroy(smsMessage);
+	//---------- END sending
+
+	//---------- BEGIN receiving
+	//Receiving message with no enhanced voice mail
+	INFO_PRINTF1(_L("waiting for incoming SMS with no enhanced voice mail delete confirmation...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& noEnhancedVoiceMailOperations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	result=noEnhancedVoiceMailOperations.ContainsEnhancedVoiceMailIEL();
+	TEST(!result);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//---
+	//Receive message with enhanced voice mail, one delete confirmation
+	INFO_PRINTF1(_L("waiting for incoming SMS with enhanced voice mail delete confirmation, one deletion...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& enhancedVoiceMailOperations =
+		static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//ContainsEnhancedVoiceMailL
+	result=enhancedVoiceMailOperations.ContainsEnhancedVoiceMailIEL();
+	TEST(result);
+
+	//Copy
+	CEnhancedVoiceMailBoxInformation* retrievedNotification = NULL;
+	TRAP(err,retrievedNotification=enhancedVoiceMailOperations.CopyEnhancedVoiceMailIEL() );
+	TEST(err==KErrNone);
+	CleanupStack::PushL(retrievedNotification);
+
+	//Check the contents
+	//Type
+	TVoiceMailInfoType typeInfo=retrievedNotification->Type();
+	TEST(typeInfo==EGsmSmsVoiceMailDeleteConfirmation);
+	//Extension Indicator
+	TEST(retrievedNotification->ExtensionIndicator() == EFalse);
+	//Profile
+	TSmsMessageProfileType profile=retrievedNotification->Profile();
+	TEST(profile==EGsmSmsProfileId2);
+	//Store
+	TBool isStore=retrievedNotification->Store();
+	TEST(!isStore);
+	//Almost Capacity
+	TBool isAlmostMaxCapacity=retrievedNotification->AlmostMaximumCapacity();
+	TEST(!isAlmostMaxCapacity);
+	//MaximumCapacity
+	TBool isMaximumCapacity=retrievedNotification->MaximumCapacity();
+	TEST(!isMaximumCapacity);
+	//Access address - mail box address
+	TGsmSmsTelNumber retrievedAccessAddressTGsm;
+	retrievedNotification->ParsedAccessAddress(retrievedAccessAddressTGsm);
+	TEST(retrievedAccessAddressTGsm.iTelNumber==accessAddressTGsm.iTelNumber);
+	//Number Of Voice Messages
+	count=retrievedNotification->NumberOfVoiceMessages();
+	TEST(count==2);
+	//Cast the type, get the numberOfVoiceMails
+	//Number of voice mails
+	CEnhancedVoiceMailDeleteConfirmations* retrievedEnhancedVoiceMailDeleteConfirmation=
+						static_cast<CEnhancedVoiceMailDeleteConfirmations*>(retrievedNotification);
+	count=retrievedEnhancedVoiceMailDeleteConfirmation->NumberOfDeletes();
+	TEST(count==1);
+
+	CleanupStack::PopAndDestroy(retrievedNotification);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//---------- END receiving
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestMultiplePDUEnhancedVoiceMailDeleteConfirmation::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test enhanced voice mail multiple PDU message delete confirmation"));
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTest7BitDefaultAlphabet::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test 7 bit default alphabet"));
+
+	__UHEAP_MARK;
+
+	//Send a message with no alphabet set
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 76);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//This is a msg.
+	_LIT(KTestMsg,"This message has no coding scheme set.  Assume 7 bit default.");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//Create message
+	CSmsPDU::TSmsPDUType messageType = CSmsPDU::ESmsSubmit;
+	CSmsBuffer* buffer=CSmsBuffer::NewL();
+	CSmsMessage* smsMessage=CSmsMessage::NewL(iFs, messageType, buffer);
+	CleanupStack::PushL(smsMessage);
+
+	smsMessage->SetToFromAddressL(iTelephoneNumber);
+	smsMessage->SmsPDU().SetServiceCenterAddressL(iServiceCenterNumber);
+	buffer->InsertL(0,KTestMsg);
+
+	SendSmsL(smsMessage,socket);
+	CleanupStack::PopAndDestroy(smsMessage);
+	//Data coding scheme received by SIM TSY is correct 00000000 = 7 bit default alphabet
+
+	//Receive message with no coding scheme specified
+	//Basically receive the message that was sent
+	//Receive message with enhanced voice mail, one delete confirmation
+	INFO_PRINTF1(_L("waiting for incoming SMS with no coding scheme (DCS)...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Check the coding scheme
+	TSmsUserDataSettings smsSettings;
+	smsMessage->UserDataSettings(smsSettings);
+
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=smsSettings.Alphabet();
+	TEST(alphabet==TSmsDataCodingScheme::ESmsAlphabet7Bit);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a second message, this time a (U)SIM specific message
+	INFO_PRINTF1(_L("waiting for incoming SMS with no coding scheme and type USIM message...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Check the coding scheme
+	smsMessage->UserDataSettings(smsSettings);
+	alphabet=smsSettings.Alphabet();
+	TEST(alphabet==TSmsDataCodingScheme::ESmsAlphabet7Bit);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestZeroLengthIE::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test zero length IE, USIM toolkit IE"));
+
+	__UHEAP_MARK;
+
+	//Send a message with no alphabet set
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 77);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KTestMsg,"This message has a zero length information element.  USIM toolkit security header.");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//Create message
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	INFO_PRINTF2(_L("Destination number:..... %S "),&iTelephoneNumber);
+	INFO_PRINTF2(_L("ServiceCenter number:... %S "),&iServiceCenterNumber);
+
+	//Add zero length IE
+	//Get the PDU
+	CSmsPDU &pdu=smsMessage->SmsPDU();
+
+	//Get the UserData
+	CSmsUserData &userData=pdu.UserData();
+
+	//Add the information element
+	_LIT8(KEmptyString,"");
+	//TSmsId
+	CSmsInformationElement::TSmsInformationElementIdentifier informationElement=CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders1;
+	TRAPD(err,userData.AddInformationElementL(informationElement,KEmptyString()));
+	TEST(err==KErrNone);
+
+	TRAP(err,userData.AddInformationElementL(informationElement,KEmptyString()));
+	TEST(err==KErrAlreadyExists);
+
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//---------- END sending
+
+	//----------
+	//Receive message with USIM security header IE, 7F, with zero length
+	INFO_PRINTF1(_L("waiting for incoming SMS with USIM security header IE, 7F, with zero length...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Interrogate PDU for contents
+	CSmsPDU &receivedPdu=smsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &receivedUserData=receivedPdu.UserData();
+	TInt count=receivedUserData.NumInformationElements();
+	TEST(count==1);
+
+	TInt index=0;
+	CSmsInformationElement &receivedPDUInformationElement=receivedUserData.InformationElement(index);
+	informationElement=receivedPDUInformationElement.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders16);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//-----------
+	//Receive message with multiple USIM security headers - 7F and 70, with zero length
+	INFO_PRINTF1(_L("waiting for incoming SMS with multiple USIM security headers, 7F and 70, with zero length...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Interrogate
+	CSmsPDU &receivedPduMultipleIE=smsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &receivedUserDataMultipleIE=receivedPduMultipleIE.UserData();
+	count=receivedUserDataMultipleIE.NumInformationElements();
+	TEST(count==2);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//-----------
+	//Receive message with multiple USIM security headers - 7F and 7F, with zero length
+	//This is a duplicate information element
+	INFO_PRINTF1(_L("waiting for incoming SMS with multiple USIM security headers, 7F and 7F, with zero length...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Interrogate
+	CSmsPDU &receivedPduMultipleDuplicateIE=smsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &receivedUserDataDuplicateIE=receivedPduMultipleDuplicateIE.UserData();
+	count=receivedUserDataDuplicateIE.NumInformationElements();
+	TEST(count==2);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//End receiving
+
+	//-----Send multiple PDU message with one zero length IE =  0x70
+	 _LIT(KLongMessage,"We might as well use our SMS stack in these phones.  It is by far the most robust, and it performs well under stress.  We have built a stack that is worth being inside a phone, processing messages for the wireless communnity :)");
+	CSmsMessage *longSmsMessage=CreateSmsMessageL(KLongMessage,alphabet);
+	CleanupStack::PushL(longSmsMessage);
+
+	//Get the PDU
+	CSmsPDU &multiplePdu=longSmsMessage->SmsPDU();
+
+	//Get the UserData
+	CSmsUserData &userDataMultiplePdu=multiplePdu.UserData();
+
+	//Add IE
+	informationElement=CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders1;
+	TRAP(err,userDataMultiplePdu.AddInformationElementL(informationElement,KEmptyString()));
+	TEST(err==KErrNone);
+
+	//Send the message
+	SendSmsL(longSmsMessage,socket);
+	CleanupStack::PopAndDestroy(longSmsMessage);
+
+	//--------------Receiving
+	//Receive multiple PDU with no zero length USIM security headers
+	INFO_PRINTF1(_L("waiting for incoming multiple PDU SMS...") );
+	WaitForRecvL(socket);
+	longSmsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(longSmsMessage);
+	TestSmsContentsL(longSmsMessage,KLongMessage);
+
+	//Interrogate
+	CSmsPDU &multiplePduMessage=longSmsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &multiplePDUUserDataMessage=multiplePduMessage.UserData();
+	count=multiplePDUUserDataMessage.NumInformationElements();
+	TEST(count==1);
+
+	index=0;
+	CSmsInformationElement &multiplePDUInformationElement=multiplePDUUserDataMessage.InformationElement(index);
+	informationElement=multiplePDUInformationElement.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEIConcatenatedShortMessages8BitReference);
+
+	CleanupStack::PopAndDestroy(longSmsMessage);
+
+	//--------------
+	//Receive multiple PDU with IE 70 and zero length in each PDU
+	INFO_PRINTF1(_L("waiting for incoming multiple PDU SMS with one USIM security header, 70 with zero length, in each PDU ...") );
+	WaitForRecvL(socket);
+	longSmsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(longSmsMessage);
+	TestSmsContentsL(longSmsMessage,KLongMessage);
+
+	//Interrogate
+	CSmsPDU &receivedMultiplePduIE=longSmsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &receivedMultiplePDUUserData=receivedMultiplePduIE.UserData();
+	count=receivedMultiplePDUUserData.NumInformationElements();
+	TEST(count==2);
+
+	index=0;
+	CSmsInformationElement &multiplePDUIE=receivedMultiplePDUUserData.InformationElement(index);
+	informationElement=multiplePDUIE.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders1);
+
+	index=1;
+	CSmsInformationElement &secondElementIE=receivedMultiplePDUUserData.InformationElement(index);
+	informationElement=secondElementIE.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEIConcatenatedShortMessages8BitReference);
+
+	CleanupStack::PopAndDestroy(longSmsMessage);
+
+	//----------------------
+	//Receive multiple PDU with IE USIM security header only in first pdu
+	INFO_PRINTF1(_L("waiting for incoming multiple PDU SMS with one USIM security header, 70 with zero length, only in first PDU ...") );
+	WaitForRecvL(socket);
+	longSmsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(longSmsMessage);
+	TestSmsContentsL(longSmsMessage,KLongMessage);
+
+	//Interrogate
+	CSmsPDU &multiplePduIEInFirst=longSmsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &multiplePDUUserData=multiplePduIEInFirst.UserData();
+
+	count=multiplePDUUserData.NumInformationElements();
+	TEST(count==2);
+
+	CSmsInformationElement &multiplePDUInformationElementInFirst=multiplePDUUserData.InformationElement(index);
+	informationElement=multiplePDUInformationElementInFirst.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEIConcatenatedShortMessages8BitReference);
+
+	//Check the second IE
+	index=1;
+	CSmsInformationElement &secondElement=multiplePDUUserData.InformationElement(index);
+	informationElement=secondElement.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEIConcatenatedShortMessages8BitReference);
+
+	CleanupStack::PopAndDestroy(longSmsMessage);
+
+	//-----------------------
+	//Receive multiple PDU with IE USIM security header in second PDU
+	INFO_PRINTF1(_L("waiting for incoming multiple PDU SMS with one USIM security header, 70 with zero length, in second PDU ...") );
+	WaitForRecvL(socket);
+	longSmsMessage = RecvSmsL(socket);
+
+	CleanupStack::PushL(longSmsMessage);
+	TestSmsContentsL(longSmsMessage,KLongMessage);
+
+	//Interrogate
+	CSmsPDU &multiplePduIEInSecond=longSmsMessage->SmsPDU();
+	//Get UserData
+	CSmsUserData &multiplePDUUserDataWithIEInSecondPDU=multiplePduIEInSecond.UserData();
+
+	count=multiplePDUUserDataWithIEInSecondPDU.NumInformationElements();
+	TEST(count==2);
+
+	CSmsInformationElement &multiplePDUInformationElementInSecondPDU=multiplePDUUserDataWithIEInSecondPDU.InformationElement(index);
+	informationElement=multiplePDUInformationElementInSecondPDU.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders6);
+
+	//Check the second IE
+	index=1;
+	CSmsInformationElement &secondInformationElement=multiplePDUUserDataWithIEInSecondPDU.InformationElement(index);
+	informationElement=secondInformationElement.Identifier();
+	TEST(informationElement==CSmsInformationElement::ESmsIEISIMToolkitSecurityHeaders6);
+
+	CleanupStack::PopAndDestroy(longSmsMessage);
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+/*
+	Class 2 Messages are stored on the SIM.  Automatic deletion in the DCS does not delete these messages
+	from the SIM.  This is the default behaviour.  This behaviour can be changed and it is done in
+	the esk file.  This is tested in test step CTestAutomaticDeletionInDCSAndInESK.
+*/
+TVerdict CTestAutomaticDeletionInDCS::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test automatic deletion of messages marked as such in the code data segment(cds)"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 78);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KTestMsg,"");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Set message to class 2
+	TSmsDataCodingScheme::TSmsClass pduClass=TSmsDataCodingScheme::ESmsClass2;
+	CSmsPDU& pdu = smsMessage->SmsPDU();
+	pdu.SetClass(ETrue,pduClass);
+
+	//Enumerate the Sim Store
+	INFO_PRINTF1(_L("Enumerating messages"));
+
+	TPckgBuf<TUint> sbuf;
+	sbuf()=0;
+
+	//Now enumerate messages from store
+	TRequestStatus status;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+
+	//sbuf() includes the count of messages on Store
+	TInt count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages"), count);
+	TEST(count==0);
+
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	//Set bits 7-4 of DCS
+	//Set message to auto delete
+	TInt autoDeleteHexValue=0x40;
+	pdu.SetBits7To4(TSmsDataCodingScheme::TSmsDCSBits7To4(autoDeleteHexValue));
+	//Send this message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//----------End Sending
+
+	//Receive a message of class 2 - message will be stored on the SIM
+	INFO_PRINTF1(_L("waiting for incoming SMS...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& classTwoPdu = smsMessage->SmsPDU();
+	//Class
+	//TSmsDataCodingScheme::TSmsClass pduClass;
+	classTwoPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass2);
+	//Test the storage
+	CSmsMessage::TMobileSmsStorage storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	//Test the slots
+	count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	TGsmSmsSlotEntry smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 2 with automatic delete - message will be stored on the SIM
+	INFO_PRINTF1(_L("waiting for incoming SMS class 2 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& pduClass2 = smsMessage->SmsPDU();
+	//Class
+	pduClass2.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass2);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	//Test the slots
+	count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 1 with automatic delete
+	INFO_PRINTF1(_L("waiting for incoming SMS class 1 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& pduClass1 = smsMessage->SmsPDU();
+	//Class
+	pduClass1.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass1);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 3 with automatic delete
+	INFO_PRINTF1(_L("waiting for incoming SMS class 3 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& pduClass3 = smsMessage->SmsPDU();
+	//Class
+	pduClass3.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass3);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 0 with automatic delete
+	INFO_PRINTF1(_L("waiting for incoming SMS class 0 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& pduClass0 = smsMessage->SmsPDU();
+	//Class
+	pduClass0.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass0);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message with no class with automatic delete
+	INFO_PRINTF1(_L("waiting for incoming SMS with no class and with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	User::After(3000000);	//KIoctlEnumerateSmsMessages returns -14 (KErrInUse) if no wait.
+	//Enuermate
+	sbuf()=0;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+
+	//sbuf() includes the count of messages on Store
+	count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages after receiving messages"), count);
+
+	//These are the two class messages received.
+	TEST(count==2);
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+/*
+	Class 2 Messages are stored on the SIM.  Automatic deletion in the DCS does not delete these messages
+	from the SIM.  This is the default behaviour.  This behaviour can be changed and it is done in
+	the esk file.  This tested in test step CTestAutomaticDeletionInDCSAndInESK.
+*/
+TVerdict CTestAutomaticDeletionInDCSAndInESK::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test automatic deletion of messages marked in dcs, and set for delete in the ESK file"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 79);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KTestMsg,"Esk file has been set to delete class 2 messages marked for automatic deletion");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme - create message
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Set message to class 2
+	TSmsDataCodingScheme::TSmsClass pduClass=TSmsDataCodingScheme::ESmsClass2;
+	CSmsPDU& pdu = smsMessage->SmsPDU();
+	pdu.SetClass(ETrue,pduClass);
+
+	//Enumerate the Sim Store
+	INFO_PRINTF1(_L("Enumerating messages"));
+	TPckgBuf<TUint> sbuf;
+	sbuf()=0;
+	TRequestStatus status;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+	//sbuf() includes the count of messages on Store
+	TInt count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages"), count);
+	TEST(count==0);
+
+	//Set bits 7-4 of DCS
+	//Set message to auto delete
+	TInt autoDeleteHexValue=0x40;
+	pdu.SetBits7To4(TSmsDataCodingScheme::TSmsDCSBits7To4(autoDeleteHexValue));
+	//Send this message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//----------End Sending
+
+	//Receive a message with no class
+	INFO_PRINTF1(_L("waiting for incoming SMS with no class...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Test the storage
+	CSmsMessage::TMobileSmsStorage storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 0
+	INFO_PRINTF1(_L("waiting for incoming SMS class 0 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& classZeroPdu = smsMessage->SmsPDU();
+	classZeroPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass0);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 1
+	INFO_PRINTF1(_L("waiting for incoming SMS class 1 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& classOnePdu = smsMessage->SmsPDU();
+	classOnePdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass1);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 3
+	INFO_PRINTF1(_L("waiting for incoming SMS class 3 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& classThreePdu = smsMessage->SmsPDU();
+	classThreePdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass3);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive a message of class 2 - message will be deleted from SIM
+	INFO_PRINTF1(_L("waiting for incoming SMS class 2 with automatic delete...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	//Get PDU
+	CSmsPDU& classTwoPdu = smsMessage->SmsPDU();
+	classTwoPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass2);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	User::After(3000000);
+	//Enuermate
+	sbuf()=0;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+
+	//sbuf() includes the count of messages on Store
+	count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages after receiving messages"), count);
+	TEST(count==0);
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestAutomaticDeletionTypeZeroSMS::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test automatic deletion of messages of type zero"));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 80);
+	
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KTestMsg,"Type 0 Sms message");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme - create message
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Set message to type 0
+	CSmsPDU& pdu = smsMessage->SmsPDU();
+	//Set the PID type
+	TSmsProtocolIdentifier::TSmsPIDType pIdType=TSmsProtocolIdentifier::ESmsPIDShortMessageType;
+	pdu.SetPIDType(pIdType);
+	TSmsProtocolIdentifier::TSmsShortMessageType shortMessageType=TSmsProtocolIdentifier::ESmsShortMessageType0;
+	pdu.SetShortMessageType(shortMessageType);
+
+	//Send this message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//----------End Sending
+
+	//----------Start Receiving
+	//Receive a class 0 type 0 message
+	INFO_PRINTF1(_L("waiting for incoming SMS, type 0 class 0...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Test PID and class
+	CSmsPDU& classZeroPdu = smsMessage->SmsPDU();
+	//Get the PID type
+	pIdType=classZeroPdu.PIDType();
+	TEST(pIdType==TSmsProtocolIdentifier::ESmsPIDShortMessageType);
+	shortMessageType=classZeroPdu.ShortMessageType();
+	TEST(shortMessageType==TSmsProtocolIdentifier::ESmsShortMessageType0);
+	//Class
+	TSmsDataCodingScheme::TSmsClass pduClass;
+	classZeroPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass0);
+	//Test the storage
+	CSmsMessage::TMobileSmsStorage storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsNoStorage);
+	//Test the slots
+	TUint count=smsMessage->iSlotArray.Count();
+	TEST(count==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+
+	//All type 0 messages will be deleted an not given to the client.  The only exception is for class 0, and class 2
+	// messages.  These will be given to the client.
+	//Sim TSY is setup to receive multiple type 0 messages, the last two are class 0 class 2.
+
+	//Receive a class 2, type 0 message
+	INFO_PRINTF1(_L("waiting for incoming SMS, type 0 class 2...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Interrorgate this message to verify it is the one we are expecting
+	TestSmsContentsL(smsMessage,KTestMsg);
+	//Test PID and class
+	CSmsPDU& classTwoPdu = smsMessage->SmsPDU();
+	pIdType=classTwoPdu.PIDType();
+	TEST(pIdType==TSmsProtocolIdentifier::ESmsPIDShortMessageType);
+	shortMessageType=classTwoPdu.ShortMessageType();
+	TEST(shortMessageType==TSmsProtocolIdentifier::ESmsShortMessageType0);
+	//Class
+	classTwoPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass2);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	//Test the slots
+	count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	TGsmSmsSlotEntry smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iIndex==1);
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+
+	//Receive a class 0 message which is NOT Type 0
+	INFO_PRINTF1(_L("waiting for incoming SMS, class 0 but NOT type 0...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+
+	//Interrorgate this message to verify it is the one we are expecting
+	TestSmsContentsL(smsMessage,KTestMsg);
+	//Test PID and class
+	CSmsPDU& classZeroNotTypeZeroPdu = smsMessage->SmsPDU();
+	pIdType=classZeroNotTypeZeroPdu.PIDType();
+	TEST(pIdType==0x00); // PID defining a Short Message Type
+
+	//Class
+	classZeroNotTypeZeroPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass0);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iIndex==2);
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Enumerate the Sim Store
+	INFO_PRINTF1(_L("Enumerating messages"));
+	TPckgBuf<TUint> sbuf;
+	sbuf()=0;
+	TRequestStatus status;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+	count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages"), count);
+	TEST(count==2);
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+
+TVerdict CTestAutomaticDeletionTypeZeroAndSetInESK::doTestStepL()
+/**
+ *  Test the enhanced voice mail delete confirmation
+ */
+	{
+	INFO_PRINTF1(_L("Test automatic deletion of messages of type zero, and set for deletion for Class 0 in ESK file."));
+
+	__UHEAP_MARK;
+
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 81);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	_LIT(KTestMsg,"Type 0 Sms message");
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	//8 bit coding scheme - create message
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Set message to type 0
+	CSmsPDU& pdu = smsMessage->SmsPDU();
+	//Set the PID type
+	TSmsProtocolIdentifier::TSmsPIDType pIdType=TSmsProtocolIdentifier::ESmsPIDShortMessageType;
+	pdu.SetPIDType(pIdType);
+	TSmsProtocolIdentifier::TSmsShortMessageType shortMessageType=TSmsProtocolIdentifier::ESmsShortMessageType0;
+	pdu.SetShortMessageType(shortMessageType);
+
+	//Send this message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	//----------End Sending
+
+	//----------Start Receiving
+	//All type 0 messages will be deleted an not given to the client.
+	//Sim TSY is setup to receive multiple type 0 messages
+	//
+	//No type 0 messages will be sent to the client
+	//Two type 0 messages will be sent, one before the type 0s, and one after.  This is just to confirm
+	//that no messages are being received during these two.
+
+	//Receive class two message
+	INFO_PRINTF1(_L("waiting for incoming SMS, class 2...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Test class and storage
+	CSmsPDU& classTwoPdu = smsMessage->SmsPDU();
+	//Class
+	TSmsDataCodingScheme::TSmsClass pduClass;
+	classTwoPdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass2);
+	//Test the storage
+	CSmsMessage::TMobileSmsStorage storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	//Test the slots
+	TUint count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	TGsmSmsSlotEntry smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iIndex==1);
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Receive class one message
+	INFO_PRINTF1(_L("waiting for incoming SMS, class 1...") );
+	WaitForRecvL(socket);
+	smsMessage = RecvSmsL(socket);
+	CleanupStack::PushL(smsMessage);
+	TestSmsContentsL(smsMessage,KTestMsg);
+
+	//Test class and storage
+	CSmsPDU& classOnePdu = smsMessage->SmsPDU();
+	//Class
+	classOnePdu.Class(pduClass);
+	TEST(pduClass==TSmsDataCodingScheme::ESmsClass1);
+	//Test the storage
+	storage=smsMessage->Storage();
+	TEST(storage==CSmsMessage::ESmsSIMStorage);
+	//Test the slots
+	count=smsMessage->iSlotArray.Count();
+	TEST(count==1);
+	smsSlot=smsMessage->iSlotArray[0];
+	TEST(smsSlot.iIndex==2);
+	TEST(smsSlot.iStore.Compare(_L("S14"))==0);
+	CleanupStack::PopAndDestroy(smsMessage);
+
+	//Enumerate the Sim Store
+	INFO_PRINTF1(_L("Enumerating messages"));
+	TPckgBuf<TUint> sbuf;
+	sbuf()=0;
+	TRequestStatus status;
+	socket.Ioctl(KIoctlEnumerateSmsMessages,status,&sbuf, KSolSmsProv);
+	User::WaitForRequest(status);
+	TEST(status.Int() == KErrNone);
+	count = sbuf();
+	INFO_PRINTF2(_L("%d enumerated messages"), count);
+	//This is the class 2 message and the class 1 message with PID=00, i.e. Not type 0
+	TEST(count==2);
+
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+
+TVerdict CTestOOMSendR6Sms::doTestStepL()
+/**
+ *  Intent:
+ *  
+ *  The intent of the test is to check that the stack can recover from every potential
+ *  memory failure that can occur whilst the stack is trying to send a message.
+ *  
+ *  Test description:
+ *  
+ *  1) Create a SMS Message containing a hyperlink, special message waiting indication,
+ *  reply address and enhanced voice mail notification.
+ *  2) Configure the ESockServer so that request for memory from the heap fails after
+ *  'i' number of times.
+ *  3) Send the message and check that the stack recovers successfully from the out of memory
+ *  failure.
+ *  4) Repeat the test iteratively, incrementing the counter "i" each time until the message is sent
+ *  successfully.
+ */
+	{
+	INFO_PRINTF1(_L("Test out of memory handling"));
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 82);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	//Set destination and SC numbers
+	iTelephoneNumber=KPekka;
+	iServiceCenterNumber=KRadiolinjaSC;
+
+	_LIT(KTestMsg1,"test message, 8bits, length 30");
+
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg1,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	//Get the operations
+	CSmsHyperLinkOperations& hyperLinkOperations = static_cast<CSmsHyperLinkOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsHyperLinkFormat));
+
+	TUint count=hyperLinkOperations.NumberOfHyperLinksL();
+	TEST(count==0);
+
+	const TUint KFirstHyperLinkPosition=20;
+	TUint8 firstHyperLinkLabelLength=8;
+	TUint8 firstHyperLinkURLLength=22;
+
+	//Add hyperlinks
+	hyperLinkOperations.AddHyperLinkL(KFirstHyperLinkPosition,firstHyperLinkLabelLength, firstHyperLinkURLLength);
+	count=hyperLinkOperations.NumberOfHyperLinksL();
+	TEST(count==1);
+
+	//Get the operations
+	CSmsSpecialSMSMessageOperations& specialMsgOperations = static_cast<CSmsSpecialSMSMessageOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISpecialSMSMessageIndication));
+
+	//Send message with special message indication - voice mail
+	INFO_PRINTF1(_L("Creating message with voice mail waiting"));
+	TSmsMessageIndicationType messageIndicationType=EGsmSmsVoiceMessageWaiting;
+	TExtendedSmsIndicationType extendedType=EGsmSmsNoExtendedMessageTypeIndication;
+	TSmsMessageProfileType messageProfileType=EGsmSmsProfileId1;
+	//TUint index=0;
+	TBool toStore=ETrue;
+	TUint8 messageCount=5;
+
+	//Add special messages
+	TRAPD(err,specialMsgOperations.AddSpecialMessageIndicationL(toStore,messageIndicationType,
+								   extendedType,messageProfileType,messageCount));
+	TEST(err==KErrNone);
+
+	//Get the operations
+	CSmsReplyAddressOperations& replyAddressOperations = static_cast<CSmsReplyAddressOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsReplyAddressFormat));
+	TPtrC replyAddress;
+	GetStringFromConfig(ConfigSection(), _L("replyAddressInternational"), replyAddress);
+	TRAP(err,replyAddressOperations.AddReplyAddressL(replyAddress));
+	TEST(err==KErrNone);
+
+
+	//Get the operations
+	CSmsEnhancedVoiceMailOperations& enhanceVoiceMailOperations =
+			static_cast<CSmsEnhancedVoiceMailOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation));
+
+	//Create CEnhancedVoiceMailNotification
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification=CEnhancedVoiceMailNotification::NewL();
+	CleanupStack::PushL(enhancedVoiceMailNotification);
+
+	//Set the properties
+	messageProfileType=EGsmSmsProfileId1;
+	enhancedVoiceMailNotification->SetProfile(messageProfileType);
+	enhancedVoiceMailNotification->SetStorage(ETrue);
+	enhancedVoiceMailNotification->SetAlmostMaximumCapacity(ETrue);
+	enhancedVoiceMailNotification->SetMaximumCapacity(EFalse);
+	enhancedVoiceMailNotification->SetNumberOfVoiceMessages(10);
+
+	//Add access address - mail box address
+	TGsmSmsTelNumber accessAddressTGsm;
+	accessAddressTGsm.iTelNumber=_L("44758ABCD3");
+	accessAddressTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	enhancedVoiceMailNotification->SetParsedAccessAddressL(accessAddressTGsm);
+
+	//Create mail messages
+	CVoiceMailNotification* voiceMailNotification=CVoiceMailNotification::NewL();
+
+	//Setup the message
+	TUint16 messageId=1;
+	TUint8 messageLength=20;
+	voiceMailNotification->SetMessageId(messageId);
+	TEST(messageId == voiceMailNotification->MessageId());
+	voiceMailNotification->SetMessageLength(messageLength);
+	TEST(messageLength == voiceMailNotification->MessageLength());
+	TUint8 daysRetention=5;
+	voiceMailNotification->SetRetentionDays(daysRetention);
+	TEST(daysRetention == voiceMailNotification->RetentionDays());
+	voiceMailNotification->SetPriorityIndication(ETrue);
+    TEST(voiceMailNotification->PriorityIndication() != EFalse);
+    TEST(voiceMailNotification->MessageExtensionIndication() == EFalse);
+
+	//Create Calling Line Identity
+    _LIT16(KCaller, "+447747065405");
+    TBuf<14> buff(KCaller);
+    voiceMailNotification->SetCallingLineIdentityL(buff);
+    TEST(voiceMailNotification->CallingLineIdentity().Compare(_L("+447747065405")) == 0);
+
+	TGsmSmsTelNumber callingLineIdentityTGsm;
+	callingLineIdentityTGsm.iTelNumber=_L("44999DCBA8");
+	callingLineIdentityTGsm.iTypeOfAddress=EGsmSmsTONAlphaNumeric;
+	voiceMailNotification->SetParsedCallingLineIdentityL(callingLineIdentityTGsm);
+	TGsmSmsTelNumber verifiedCallingLineIdentityTGsm;
+	voiceMailNotification->ParsedCallingLineIdentity(verifiedCallingLineIdentityTGsm);
+	TEST(verifiedCallingLineIdentityTGsm.iTypeOfAddress == EGsmSmsTONAlphaNumeric);
+	TEST(verifiedCallingLineIdentityTGsm.iTelNumber.Compare(_L("44999DCBA8")) == 0);
+
+	//Add this to the list of notifications in the enhanced message
+	RPointerArray<CVoiceMailNotification>& notificationsList=
+					enhancedVoiceMailNotification->GetVoiceMailNotifications();
+
+	TBool result=notificationsList.Append(voiceMailNotification);
+
+	TRAP(err,enhanceVoiceMailOperations.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification));
+	TEST(err==KErrNone);
+	CleanupStack::PopAndDestroy(enhancedVoiceMailNotification);
+
+	INFO_PRINTF1(_L("Testing status report schemes..."));
+	INFO_PRINTF1(_L("SMSC Scheme"));
+
+	//SMSC Scheme
+	CSmsSMSCCtrlParameterOperations& smscOperations = static_cast<CSmsSMSCCtrlParameterOperations&>(smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsIEISMSCControlParameters));
+	smscOperations.SetSchemeL();
+
+	count=0;
+	TInt ret=KErrNoMemory;
+	TInt successfullSends=0;  //maximum expected number of succeeded sends is 2 in TSY config file
+	while (successfullSends<8)
+		{
+		socketServer.__DbgFailNext(count);		
+		socketServer.__DbgMarkHeap();
+		TRAP(ret,SendSmsDontCheckReturnValueL(smsMessage,socket));
+		socketServer.__DbgMarkEnd(0);
+		if(ret==KErrNone)
+			successfullSends++;
+		count++;
+		}
+
+	TEST(ret == KErrNone);
+	socketServer.__DbgFailNext(-1); // Reset heap
+
+	INFO_PRINTF1(_L("TPSRR Scheme"));
+	
+	// TPSRR Scheme
+	CSmsTPSRROperations& TPSRROperations = static_cast<CSmsTPSRROperations&>(smsMessage->GetOperationsForNonIEL(ESmsTPSRRParameter));
+	TPSRROperations.SetSchemeL();
+	TPSRROperations.SetLastSegmentStatusReportL(ETrue);
+
+	count=0;
+	ret=KErrNoMemory;
+	successfullSends=0;  //maximum expected number of succeeded sends is 2 in TSY config file
+	while (successfullSends<12)
+		{
+		socketServer.__DbgFailNext(count);
+		
+		socketServer.__DbgMarkHeap();
+		TRAP(ret,SendSmsDontCheckReturnValueL(smsMessage,socket));
+		socketServer.__DbgMarkEnd(0);
+		if(ret==KErrNone)
+			successfullSends++;
+		count++;
+		}
+
+	TEST(ret == KErrNone);
+	socketServer.__DbgFailNext(-1); // Reset heap
+
+	CleanupStack::PopAndDestroy(2);	//smsMessage, socket
+
+	//Ensure socket server session is closed to remove cache
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	return TestStepResult() ;
+	}
+
+
+TVerdict CEnhancedVoiceMessageBoundaryTest::doTestStepL()
+{
+	/**
+	 *  Create a Enhanced Voice Mail Information Element that occupies 139 bytes.
+	 *  139 bytes is the maximum that fit into a single segment message.
+	 */
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 83);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification = CEnhancedVoiceMailNotification::NewL();
+
+	// Set up base class
+	enhancedVoiceMailNotification->SetProfile(EGsmSmsProfileId3);
+	enhancedVoiceMailNotification->SetStorage(ETrue);
+ 	enhancedVoiceMailNotification->SetAlmostMaximumCapacity(ETrue);
+	enhancedVoiceMailNotification->SetMaximumCapacity(ETrue);
+
+	_LIT(KPhoneNumber, "+44774706"); // Sets up test for max length information element, 139 bytes.
+
+	enhancedVoiceMailNotification->SetAccessAddressL(KPhoneNumber);
+	enhancedVoiceMailNotification->SetNumberOfVoiceMessages(0xFF);
+
+	RPointerArray<CVoiceMailNotification>& voiceMailNotificationArray = enhancedVoiceMailNotification->GetVoiceMailNotifications();
+	for (TUint i = 0; i < 8; i++)
+		{
+		// Set up notification 1
+		CVoiceMailNotification* voiceMailNotification = CVoiceMailNotification::NewL();
+
+		voiceMailNotification->SetMessageId(0xFFFF);
+		voiceMailNotification->SetMessageLength(0xAA);
+    	voiceMailNotification->SetRetentionDays(31);
+    	voiceMailNotification->SetPriorityIndication(ETrue);
+
+    	TGsmSmsTelNumber gsmSmsTelNumber;
+    	gsmSmsTelNumber.iTypeOfAddress.SetTON(EGsmSmsTONAlphaNumeric);
+    	_LIT(KReplyAddress,"SONNERA1234");
+    	gsmSmsTelNumber.iTelNumber = KReplyAddress;
+    	voiceMailNotification->SetParsedCallingLineIdentityL(gsmSmsTelNumber);
+
+    	voiceMailNotificationArray.Append(voiceMailNotification);
+    	}
+
+	_LIT(KTestMsg1,"");
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg1,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	TSmsUserDataSettings userDataSettings;
+	userDataSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet8Bit);
+	smsMessage->SetUserDataSettingsL(userDataSettings);
+
+	CSmsEnhancedVoiceMailOperations& enhancedVoiceMailInformation = (CSmsEnhancedVoiceMailOperations&) smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation);
+	enhancedVoiceMailInformation.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification);
+	delete enhancedVoiceMailNotification;
+
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	return TestStepResult();
+}
+
+
+TVerdict CEnhancedVoiceMessageBoundaryTest1::doTestStepL()
+{
+	/*Creates the maximum size enhanced voice message ie that will fit
+	* into a concatenated message, size 134 bytes, allowing 5 bytes for
+	* a concatenation ie in the PDU.
+	*/
+	RSocketServ socketServer;
+	PrepareRegTestLC(socketServer, 84);
+
+	RSocket socket;
+	iSmsStackTestUtils->OpenSmsSocketLC(socketServer,socket,ESmsAddrRecvAny);
+
+	CEnhancedVoiceMailNotification* enhancedVoiceMailNotification = CEnhancedVoiceMailNotification::NewL();
+
+	// Set up base class
+	enhancedVoiceMailNotification->SetProfile(EGsmSmsProfileId3);
+	enhancedVoiceMailNotification->SetStorage(ETrue);
+	enhancedVoiceMailNotification->SetAlmostMaximumCapacity(ETrue);
+	enhancedVoiceMailNotification->SetMaximumCapacity(ETrue);
+
+	_LIT(KPhoneNumber, "+447747");
+
+	enhancedVoiceMailNotification->SetAccessAddressL(KPhoneNumber);
+	enhancedVoiceMailNotification->SetNumberOfVoiceMessages(0xFF);
+
+	RPointerArray<CVoiceMailNotification>& voiceMailNotificationArray = enhancedVoiceMailNotification->GetVoiceMailNotifications();
+	for (TUint i = 0; i < 8; i++)
+	{
+		// Set up notification 1
+		CVoiceMailNotification* voiceMailNotification = CVoiceMailNotification::NewL();
+
+		voiceMailNotification->SetMessageId(0xFFFF);
+		voiceMailNotification->SetMessageLength(0xAA);
+		voiceMailNotification->SetRetentionDays(31);
+		voiceMailNotification->SetPriorityIndication(ETrue);
+
+		TGsmSmsTelNumber gsmSmsTelNumber;
+		gsmSmsTelNumber.iTypeOfAddress.SetTON(EGsmSmsTONAlphaNumeric);
+		_LIT(KReplyAddress,"SONNERA1234");  // Test limit 11 characters 10 bytes can hold 11 7 bit characters
+		_LIT(KReplyAddress_8th,"SONNER");   // reduce the size the final address so that the IE has a length of 134 bytes.
+		if (i == 7)
+			{
+			gsmSmsTelNumber.iTelNumber = KReplyAddress_8th;
+			}
+		else
+			{
+			gsmSmsTelNumber.iTelNumber = KReplyAddress;
+			}
+
+			voiceMailNotification->SetParsedCallingLineIdentityL(gsmSmsTelNumber);
+
+			voiceMailNotificationArray.Append(voiceMailNotification);
+	}
+
+	_LIT(KTestMsg1,"Dundee United");
+	TSmsDataCodingScheme::TSmsAlphabet alphabet=TSmsDataCodingScheme::ESmsAlphabet8Bit;
+	CSmsMessage* smsMessage=CreateSmsMessageL(KTestMsg1,alphabet);
+	CleanupStack::PushL(smsMessage);
+
+	TSmsUserDataSettings userDataSettings;
+	userDataSettings.SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet8Bit);
+	smsMessage->SetUserDataSettingsL(userDataSettings);
+
+	CSmsEnhancedVoiceMailOperations& enhancedVoiceMailInformation = (CSmsEnhancedVoiceMailOperations&) smsMessage->GetOperationsForIEL(CSmsInformationElement::ESmsEnhanceVoiceMailInformation);
+	enhancedVoiceMailInformation.AddEnhancedVoiceMailIEL(*enhancedVoiceMailNotification);
+	delete enhancedVoiceMailNotification;
+
+	//Send the message
+	SendSmsL(smsMessage,socket);
+
+	CleanupStack::PopAndDestroy(smsMessage);
+	CleanupStack::PopAndDestroy(&socket);
+    CleanupStack::PopAndDestroy(&socketServer);
+
+	return TestStepResult();
+}
+
+
+TVerdict CSubmitReportDefaultsTo7BitDecoding::doTestStepL()
+{
+	TBuf8<30> buff;
+	buff.SetLength(30);
+	buff[0]  =   1;
+	buff[1]  =   5; // Parameter Id
+	buff[2]  =   0; // Time Stamp 1
+	buff[3]  =  16; // Time Stamp 2
+	buff[4]  =  16; // Time Stamp 3
+	buff[5]  =   0; // Time Stamp 4
+	buff[6]  =   0; // Time Stamp 5
+	buff[7]  =   0; // Time Stamp 6
+	buff[8]  =   0; // Time Stamp 7
+	buff[9]  =   0; // PID
+	buff[10] =  11; // User data length
+	buff[11] = 196; // David Narey
+	buff[12] = 176; //
+	buff[13] =  61; //
+	buff[14] =  77; //
+	buff[15] =   6; //
+	buff[16] =  57; //
+	buff[17] = 195; //
+	buff[18] = 242; //
+	buff[19] = 114; //
+	buff[20] =  30; //
+
+	TGsmSms sms;
+	sms.SetPdu(buff);
+
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+	CSmsBuffer* receiveBuffer = CSmsBuffer::NewL();
+	CSmsMessage* decodedMessage = CSmsMessage::NewL(fs, sms, receiveBuffer, EFalse, ETrue);
+    CleanupStack::PushL(decodedMessage);
+	CSmsBuffer& aBuffer = (CSmsBuffer&) decodedMessage->Buffer();
+
+    TBuf16<12> name;
+    name.SetLength(12);
+	aBuffer.Extract(name, 0, 11);
+
+    // Verify that the message has been decoded with the DCS defaulted to 7 Bit
+	_LIT(KTestMsg,"David Narey");
+	TestSmsContentsL(decodedMessage,KTestMsg);
+
+
+	CleanupStack::PopAndDestroy(decodedMessage);
+
+    return TestStepResult();
+}
+
+
+TVerdict CDeliverReportDefaultsTo7BitDecoding::doTestStepL()
+{
+	TBuf8<30> buff;
+	buff.SetLength(30);
+	buff[0]  =   0; // change from a 1
+	buff[1]  =   5; // Parameter Id
+	buff[2]  =   0; // PID
+	buff[3]  =  11; // User data length
+	buff[4]  = 196; // David Narey
+	buff[5]  = 176; //
+	buff[6]  =  61; //
+	buff[7]  =  77; //
+	buff[8]  =   6; //
+	buff[9]  =  57; //
+	buff[10] = 195; //
+	buff[11] = 242; //
+	buff[12] = 114; //
+	buff[13] =  30; //
+
+	TGsmSms sms;
+	sms.SetPdu(buff);
+
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+	CSmsBuffer* receiveBuffer = CSmsBuffer::NewL();
+	CSmsMessage* decodedMessage = CSmsMessage::NewL(fs, sms, receiveBuffer, EFalse, EFalse);
+    CleanupStack::PushL(decodedMessage);
+	CSmsBuffer& aBuffer = (CSmsBuffer&) decodedMessage->Buffer();
+
+    TBuf16<12> name;
+    name.SetLength(12);
+	aBuffer.Extract(name, 0, 11);
+
+    // Verify that the message has been decoded with the DCS defaulted to 7 Bit
+	_LIT(KTestMsg,"David Narey");
+	TestSmsContentsL(decodedMessage,KTestMsg);
+
+
+	CleanupStack::PopAndDestroy(decodedMessage);
+
+    return TestStepResult();
+}
+
+
+TVerdict CStatusReportDefaultsTo7BitDecoding::doTestStepL()
+{
+	TBuf8<40> buff;
+	buff.SetLength(40);
+
+	buff[0]  = 6;
+	buff[1]  = 0;
+	buff[2]  = 0;
+	buff[3]  = 129;
+	buff[4]  = 0;
+	buff[5]  = 16;
+	buff[6]  = 16;
+	buff[7]  = 0;
+	buff[8]  = 0;
+	buff[9]  = 0;
+	buff[10]  = 0;
+	buff[11]  = 0;
+	buff[12]  = 16;
+	buff[13]  = 16;
+	buff[14]  = 0;
+	buff[15]  = 0;
+	buff[16]  = 0;
+	buff[17]  = 0;
+	buff[18]  = 0;
+	buff[19]  = 5; // Parameter Indicator
+	buff[20]  = 0;
+	buff[21]  = 11; // User data length
+	buff[22]  = 196;// David Narey
+	buff[23]  = 176;
+	buff[24]  = 61;
+	buff[25]  = 77;
+	buff[26]  = 6;
+	buff[27]  = 57;
+	buff[28]  = 195;
+	buff[29]  = 242;
+	buff[30]  = 114;
+	buff[31]  = 30;
+
+	TGsmSms sms;
+	sms.SetPdu(buff);
+
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+	CSmsBuffer* receiveBuffer = CSmsBuffer::NewL();
+	CSmsMessage* decodedMessage = CSmsMessage::NewL(fs, sms, receiveBuffer, EFalse, ETrue);
+    CleanupStack::PushL(decodedMessage);
+	CSmsBuffer& aBuffer = (CSmsBuffer&) decodedMessage->Buffer();
+
+    TBuf16<12> name;
+    name.SetLength(12);
+	aBuffer.Extract(name, 0, 11);
+
+    // Verify that the message has been decoded with the DCS defaulted to 7 Bit
+	_LIT(KTestMsg,"David Narey");
+	TestSmsContentsL(decodedMessage,KTestMsg);
+
+
+	CleanupStack::PopAndDestroy(decodedMessage);
+
+    return TestStepResult();
+}