telephonyserverplugins/multimodetsy/Multimode/sms/cmt_unstored.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/multimodetsy/Multimode/sms/cmt_unstored.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/multimodetsy/Multimode/sms/cmt_unstored.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,310 +1,310 @@
-// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-//
-
-#include <etelmm.h>				// for RMobileSmsMessaging::TMobileSmsReceiveAttributesV1
-#include "mSLOGGER.H"			// for LOGTEXT2 and other logging utilities
-#include "ATIO.H"			
-#include "Matstd.h"
-#include "cmt_unstored.h"		// header file for this cpp file
-#include "sms_rx_queue.h"		// for CReceiveSmsQueue
-
-#ifdef __LOGDEB__
-_LIT8(KLogEntry,"CATSmsWaitForAndHandleCMTUnstored::%S\t%S");
-#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);}
-#else
-#define LOCAL_LOGTEXT(function,text)
-#endif
-
-
-CATSmsWaitForAndHandleCMTUnstored* CATSmsWaitForAndHandleCMTUnstored::NewL(CATIO* aIo,CTelObject* aTelObject, CPhoneGlobals* aGlobals,
-									                                     CReceiveSmsQueue& aReceiveQueue)
-	{
-	CATSmsWaitForAndHandleCMTUnstored* wait=new(ELeave) CATSmsWaitForAndHandleCMTUnstored(aIo,aTelObject,aGlobals,aReceiveQueue);
-	// Currently no need for a ConstructL call
-	return wait;
-	}
-
-CATSmsWaitForAndHandleCMTUnstored::CATSmsWaitForAndHandleCMTUnstored(CATIO* aIo, CTelObject* aTelObject,
-												   CPhoneGlobals* aGlobals, CReceiveSmsQueue& aReceiveQueue) 
-	:CATBase(aIo,aTelObject,aGlobals)
-	,iReceiveQueue(aReceiveQueue)
-	{}
-
-
-CATSmsWaitForAndHandleCMTUnstored::~CATSmsWaitForAndHandleCMTUnstored()
-	{
-	iIo->RemoveExpectStrings(this);	
-	// We do not need to NULL iCMTExpectString and iCDSExpectString
-	// as this object is about to de destroyed
-	}
-
-void CATSmsWaitForAndHandleCMTUnstored::Enable()
-	{
-	LOCAL_LOGTEXT("Enable","Enabled listening for CMT & CDS");
-
-	if (iState==ENoState)
-		{
-		iState=EWaitForCMT;
-		
-		// Add +CMT:* expect string
-		if (!iCMTExpectString)
-			iCMTExpectString=iIo->AddExpectString(this,KCMTMatchString);
-
-		// Add +CDS:* expect string
-		if (!iCDSExpectString)
-			iCDSExpectString=iIo->AddExpectString(this,KCDSMatchString);
-		}
-	}
-
-void CATSmsWaitForAndHandleCMTUnstored::Disable()
-	{
-	LOCAL_LOGTEXT("Disable","Disabled listening for CMT & CDS");
-	
-	if (iState!=EWaitForCmtSecondLine)
-		{
-		iIo->RemoveExpectStrings(this);		
-		iCMTExpectString=NULL;
-		iCDSExpectString=NULL;
-		iState=ENoState;
-		}
-	else
-		{
-		// wait to receive message we're half-way through before disabling
-		iState=EWaitForCmtSecondLineThenDisable;
-		}
-	}
-
-
-void CATSmsWaitForAndHandleCMTUnstored::EventSignal(TEventSource aSource)
-/**
- * Called when a '+CMT:' or '+CDS:' is received.
- * +CMT: [<alpha>],<length><CR><LF><pdu>
- * +CDS: <length><CR><LF><pdu>
- *
- * This is a two state machine that first waits for the +CMT: [<alpha>],<length><CR><LF>
- * and then waits for the final <pdu>
- *
- * When a PDU has been read from the phone, it is pushed into the CReceiveSmsQueue.
- */
-	{
-	TInt ret(KErrNone);
-	iIo->WriteAndTimerCancel(this);
-	LOCAL_LOGTEXT("EventSignal","Enter function");
-		
-	switch(iState)
-		{
-	case EWaitForCMT:
-		LOCAL_LOGTEXT("EventSignal","EWaitForCMT");
-		__ASSERT_ALWAYS(aSource == EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected));
-		
-		TRAP(ret,ParseFirstCMTLineL(iPduLen));
-		if(ret!=KErrNone)
-			{
-			LOCAL_LOGTEXT("EventSignal","Failed to parse 1st line");
-			// No need for more error handling - just wait for next CMT
-			}
-		else
-			{
-			//
-			// Add the expect string * so that we receive whatever is on the next line
-			// (the conditional expression below ensures no memory leak if "+CMT:"
-			// is found on consecutive lines)
-			if(!iWaitForAnything)
-				iWaitForAnything=iIo->AddExpectString(this,KAsterisk);
-		
-			//
-			// We need to keep the buffered data so we...
-			iIo->SetPreserveBufferFlag(ETrue);			
-
-			//
-			// Wait for the reception of the second line
-			iState=EWaitForCmtSecondLine;
-			}
-		break;
-
-	case EWaitForCmtSecondLine:
-	case EWaitForCmtSecondLineThenDisable:
-
-		LOCAL_LOGTEXT("EventSignal","EWaitForCmtSecondLine");
-		__ASSERT_ALWAYS(aSource == EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
-		iIo->RemoveExpectString(iWaitForAnything);
-		iWaitForAnything=NULL;
-		iIo->SetPreserveBufferFlag(EFalse);			// We've got the PDU, and will delete the buffer when the line is parsed
-
-		{		// Curly brackets used to scope pdu and attr local data
-		//
-		// Parse and Push received message into CReceiveSmsQueue
-		RMobileSmsMessaging::TMobileSmsGsmTpdu pdu;
-		RMobileSmsMessaging::TMobileSmsReceiveAttributesV1 attr;
-		TRAPD(ret,ParseSecondCMTLineL(pdu,attr));
-		if(ret!=KErrNone)
-			{
-			LOCAL_LOGTEXT("EventSignal","Failed to parse 2nd line");
-			}
-		else
-			{
-			LOCAL_LOGTEXT("EventSignal","Adding SMS to iReceiveQueue");
-			iReceiveQueue.Push(pdu,attr);
-			}
-		}
-
-		//
-		// We are done, but there is no client request to complete
-		// we just return and wait until we get our next CMT command
-		// unless we should disable now
-		if (iState==EWaitForCmtSecondLineThenDisable)
-			Disable();
-		else
-			iState=EWaitForCMT;
-		break;
-
-	case ENoState:
-	default:
-		// We should never get here, but we don't need to panic in release code.
-		__ASSERT_DEBUG(EFalse,Panic(EATWaitForCMTNoState));
-		break;
-		} 
-	}
-
-
-
-void CATSmsWaitForAndHandleCMTUnstored::ParseFirstCMTLineL(TInt& aPduLen)
-/**
- * Parse 1st line of CMT response, of the format: "+CMT: [<alpha>], <pdu_len>"
- * Stores the <pdu_len> in aPduLen
- */
-	{
-	ParseLineLC();
-
-	CATParamListEntry* entry;
-	CATParamListEntry* alpha;
-	TDblQueIter<CATParamListEntry> iter(iRxResults);
-
-	entry=iter++;
-	if (entry==NULL || (entry->iResultPtr!=KCMTResponseString && entry->iResultPtr!=KCDSResponseString))
-		{
-		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed to find response +CMT: or +CDS:");
-		User::Leave(KErrGeneral);
-		}
-
-	//
-	// Get the <alpha> token, optional this token may return the message length token
-	alpha=iter++;
-	if(alpha==NULL)
-		{
-		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed with 1st argument");
-		User::Leave(KErrGeneral);
-		}
-
-	//
-	// Get the message length token
-	entry=iter++;
-	if(entry==NULL)
-		entry=alpha;	// The alpha token must have been missing and thus alpha holds the message length
-
-	if(entry==NULL)		
-		{
-		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed with 2nd argument");
-		User::Leave(KErrGeneral);
-		}
-
-	//
-	// Process the message length
-	aPduLen=CATParamListEntry::EntryValL(entry);
-	LOGTEXT2(_L8("New SMS detected of length %d"),iPduLen);
-
-	CleanupStack::PopAndDestroy();		// ParseLineLC pushed object
-	}
-
-
-void CATSmsWaitForAndHandleCMTUnstored::ParseSecondCMTLineL(RMobileSmsMessaging::TMobileSmsGsmTpdu& aPdu,RMobileSmsMessaging::TMobileSmsReceiveAttributesV1& aAttr)
-/**
- * Parse second line of CMT or DS response, of the format: "<pdu>"
- * The <pdu> is saved to aPdu. If the <pdu> is found to have a prefixed SCA
- * then that is removed before the save to aPdu.
- */
-	{
-	LOCAL_LOGTEXT("ParseSecondCMTLineL","Enter funciton");
-
-	// Intiailise the attributes
-	aAttr.iFlags=0;
-	//
-	// Copy the received pdu to local storage so that we can process
-	// and modify it.
-	// Buffer size calculated as follows;
-	//   (max pdu size + max prefixed SCA size) * number of ASCII chars used to code an octet
-	TBuf8<(RMobileSmsMessaging::KGsmTpduSize+12)*2> localPdu;	
-	{
-	ParseLineLC();
-	TDblQueIter<CATParamListEntry> iter(iRxResults);
-	CATParamListEntry* entry=iter++;			// Have to increment iter so it returns a pointer
-	if(entry==NULL)
-		User::Leave(KErrGeneral);		// Would prefer not to leave and return an error
-		                                // but this function has to be trapped as we 
-										// have the ParseLineLC() call.
-	localPdu.Copy(entry->iResultPtr);
-	CleanupStack::PopAndDestroy();		// ParseLineLC pushed object
-	}
-
-	// Nokia 9210 sometimes aborts the CMT frame in the middle of pdu.
-	// Worst, it is sometimes contains odd number of nibbles which
-	// causes panic in ConvertAsciiToBinary() method. This type of
-	// frames will simply be discarded.
-	if(localPdu.Length()<(iPduLen*2))
-		User::Leave(KErrUnderflow);
-	
-	//
-	// Check if we have a prefixed SCA on our pdu.
-	// If we do then remove it.
-	if(localPdu.Length()>(iPduLen*2))
-		{
-		if(CATSmsUtils::ReadAndRemoveAddressFromAscii(localPdu,aAttr.iGsmServiceCentre,ETrue)!=KErrNone)
-			{
-			LOCAL_LOGTEXT("ParseAndStoreCMGRResponseL","Failed to read and remove SCA from PDU");
-			}
-		else
-			{
-			aAttr.iFlags|=RMobileSmsMessaging::KGsmServiceCentre;
-			}
-		}
-
-	//
-	// Convert received pdu from ASCII into binary
-	if (CATSmsUtils::ConvertAsciiToBinary(localPdu,aPdu)!=KErrNone)
-		{
-		LOCAL_LOGTEXT("ParseAndStoreCMGRResponseL","Failed to code PDU into binary");
-		}
-	else
-		{
-		aAttr.iDataFormat=RMobileSmsMessaging::EFormatGsmTpdu;
-		aAttr.iFlags|=RMobileSmsMessaging::KSmsDataFormat;
-		aAttr.iStatus=RMobileSmsMessaging::EMtMessageUnstoredPhoneAck;
-		aAttr.iFlags|=RMobileSmsMessaging::KIncomingStatus;
-		}
-	}	
-	
-
-
-void CATSmsWaitForAndHandleCMTUnstored::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
-	{
-	LOCAL_LOGTEXT("CompleteWithIOError","Enter function");
-	// CATIO removes expect strings in event of IO error so don't do it here
-	iCMTExpectString=NULL;			
-	iCDSExpectString=NULL;			
-	// inform client of error so that it does not continue to wait for incoming SMS
-	// now that this wait object has been disabled
-	iReceiveQueue.CompleteClientReqWithError(aStatus);
-	}
-
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <etelmm.h>				// for RMobileSmsMessaging::TMobileSmsReceiveAttributesV1
+#include "mSLOGGER.H"			// for LOGTEXT2 and other logging utilities
+#include "ATIO.H"			
+#include "Matstd.h"
+#include "cmt_unstored.h"		// header file for this cpp file
+#include "sms_rx_queue.h"		// for CReceiveSmsQueue
+
+#ifdef __LOGDEB__
+_LIT8(KLogEntry,"CATSmsWaitForAndHandleCMTUnstored::%S\t%S");
+#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);}
+#else
+#define LOCAL_LOGTEXT(function,text)
+#endif
+
+
+CATSmsWaitForAndHandleCMTUnstored* CATSmsWaitForAndHandleCMTUnstored::NewL(CATIO* aIo,CTelObject* aTelObject, CPhoneGlobals* aGlobals,
+									                                     CReceiveSmsQueue& aReceiveQueue)
+	{
+	CATSmsWaitForAndHandleCMTUnstored* wait=new(ELeave) CATSmsWaitForAndHandleCMTUnstored(aIo,aTelObject,aGlobals,aReceiveQueue);
+	// Currently no need for a ConstructL call
+	return wait;
+	}
+
+CATSmsWaitForAndHandleCMTUnstored::CATSmsWaitForAndHandleCMTUnstored(CATIO* aIo, CTelObject* aTelObject,
+												   CPhoneGlobals* aGlobals, CReceiveSmsQueue& aReceiveQueue) 
+	:CATBase(aIo,aTelObject,aGlobals)
+	,iReceiveQueue(aReceiveQueue)
+	{}
+
+
+CATSmsWaitForAndHandleCMTUnstored::~CATSmsWaitForAndHandleCMTUnstored()
+	{
+	iIo->RemoveExpectStrings(this);	
+	// We do not need to NULL iCMTExpectString and iCDSExpectString
+	// as this object is about to de destroyed
+	}
+
+void CATSmsWaitForAndHandleCMTUnstored::Enable()
+	{
+	LOCAL_LOGTEXT("Enable","Enabled listening for CMT & CDS");
+
+	if (iState==ENoState)
+		{
+		iState=EWaitForCMT;
+		
+		// Add +CMT:* expect string
+		if (!iCMTExpectString)
+			iCMTExpectString=iIo->AddExpectString(this,KCMTMatchString);
+
+		// Add +CDS:* expect string
+		if (!iCDSExpectString)
+			iCDSExpectString=iIo->AddExpectString(this,KCDSMatchString);
+		}
+	}
+
+void CATSmsWaitForAndHandleCMTUnstored::Disable()
+	{
+	LOCAL_LOGTEXT("Disable","Disabled listening for CMT & CDS");
+	
+	if (iState!=EWaitForCmtSecondLine)
+		{
+		iIo->RemoveExpectStrings(this);		
+		iCMTExpectString=NULL;
+		iCDSExpectString=NULL;
+		iState=ENoState;
+		}
+	else
+		{
+		// wait to receive message we're half-way through before disabling
+		iState=EWaitForCmtSecondLineThenDisable;
+		}
+	}
+
+
+void CATSmsWaitForAndHandleCMTUnstored::EventSignal(TEventSource aSource)
+/**
+ * Called when a '+CMT:' or '+CDS:' is received.
+ * +CMT: [<alpha>],<length><CR><LF><pdu>
+ * +CDS: <length><CR><LF><pdu>
+ *
+ * This is a two state machine that first waits for the +CMT: [<alpha>],<length><CR><LF>
+ * and then waits for the final <pdu>
+ *
+ * When a PDU has been read from the phone, it is pushed into the CReceiveSmsQueue.
+ */
+	{
+	TInt ret(KErrNone);
+	iIo->WriteAndTimerCancel(this);
+	LOCAL_LOGTEXT("EventSignal","Enter function");
+		
+	switch(iState)
+		{
+	case EWaitForCMT:
+		LOCAL_LOGTEXT("EventSignal","EWaitForCMT");
+		__ASSERT_ALWAYS(aSource == EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected));
+		
+		TRAP(ret,ParseFirstCMTLineL(iPduLen));
+		if(ret!=KErrNone)
+			{
+			LOCAL_LOGTEXT("EventSignal","Failed to parse 1st line");
+			// No need for more error handling - just wait for next CMT
+			}
+		else
+			{
+			//
+			// Add the expect string * so that we receive whatever is on the next line
+			// (the conditional expression below ensures no memory leak if "+CMT:"
+			// is found on consecutive lines)
+			if(!iWaitForAnything)
+				iWaitForAnything=iIo->AddExpectString(this,KAsterisk);
+		
+			//
+			// We need to keep the buffered data so we...
+			iIo->SetPreserveBufferFlag(ETrue);			
+
+			//
+			// Wait for the reception of the second line
+			iState=EWaitForCmtSecondLine;
+			}
+		break;
+
+	case EWaitForCmtSecondLine:
+	case EWaitForCmtSecondLineThenDisable:
+
+		LOCAL_LOGTEXT("EventSignal","EWaitForCmtSecondLine");
+		__ASSERT_ALWAYS(aSource == EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+		iIo->RemoveExpectString(iWaitForAnything);
+		iWaitForAnything=NULL;
+		iIo->SetPreserveBufferFlag(EFalse);			// We've got the PDU, and will delete the buffer when the line is parsed
+
+		{		// Curly brackets used to scope pdu and attr local data
+		//
+		// Parse and Push received message into CReceiveSmsQueue
+		RMobileSmsMessaging::TMobileSmsGsmTpdu pdu;
+		RMobileSmsMessaging::TMobileSmsReceiveAttributesV1 attr;
+		TRAPD(ret,ParseSecondCMTLineL(pdu,attr));
+		if(ret!=KErrNone)
+			{
+			LOCAL_LOGTEXT("EventSignal","Failed to parse 2nd line");
+			}
+		else
+			{
+			LOCAL_LOGTEXT("EventSignal","Adding SMS to iReceiveQueue");
+			iReceiveQueue.Push(pdu,attr);
+			}
+		}
+
+		//
+		// We are done, but there is no client request to complete
+		// we just return and wait until we get our next CMT command
+		// unless we should disable now
+		if (iState==EWaitForCmtSecondLineThenDisable)
+			Disable();
+		else
+			iState=EWaitForCMT;
+		break;
+
+	case ENoState:
+	default:
+		// We should never get here, but we don't need to panic in release code.
+		__ASSERT_DEBUG(EFalse,Panic(EATWaitForCMTNoState));
+		break;
+		} 
+	}
+
+
+
+void CATSmsWaitForAndHandleCMTUnstored::ParseFirstCMTLineL(TInt& aPduLen)
+/**
+ * Parse 1st line of CMT response, of the format: "+CMT: [<alpha>], <pdu_len>"
+ * Stores the <pdu_len> in aPduLen
+ */
+	{
+	ParseLineLC();
+
+	CATParamListEntry* entry;
+	CATParamListEntry* alpha;
+	TDblQueIter<CATParamListEntry> iter(iRxResults);
+
+	entry=iter++;
+	if (entry==NULL || (entry->iResultPtr!=KCMTResponseString && entry->iResultPtr!=KCDSResponseString))
+		{
+		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed to find response +CMT: or +CDS:");
+		User::Leave(KErrGeneral);
+		}
+
+	//
+	// Get the <alpha> token, optional this token may return the message length token
+	alpha=iter++;
+	if(alpha==NULL)
+		{
+		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed with 1st argument");
+		User::Leave(KErrGeneral);
+		}
+
+	//
+	// Get the message length token
+	entry=iter++;
+	if(entry==NULL)
+		entry=alpha;	// The alpha token must have been missing and thus alpha holds the message length
+
+	if(entry==NULL)		
+		{
+		LOCAL_LOGTEXT("ParseFirstCMTLineL","Failed with 2nd argument");
+		User::Leave(KErrGeneral);
+		}
+
+	//
+	// Process the message length
+	aPduLen=CATParamListEntry::EntryValL(entry);
+	LOGTEXT2(_L8("New SMS detected of length %d"),iPduLen);
+
+	CleanupStack::PopAndDestroy();		// ParseLineLC pushed object
+	}
+
+
+void CATSmsWaitForAndHandleCMTUnstored::ParseSecondCMTLineL(RMobileSmsMessaging::TMobileSmsGsmTpdu& aPdu,RMobileSmsMessaging::TMobileSmsReceiveAttributesV1& aAttr)
+/**
+ * Parse second line of CMT or DS response, of the format: "<pdu>"
+ * The <pdu> is saved to aPdu. If the <pdu> is found to have a prefixed SCA
+ * then that is removed before the save to aPdu.
+ */
+	{
+	LOCAL_LOGTEXT("ParseSecondCMTLineL","Enter funciton");
+
+	// Intiailise the attributes
+	aAttr.iFlags=0;
+	//
+	// Copy the received pdu to local storage so that we can process
+	// and modify it.
+	// Buffer size calculated as follows;
+	//   (max pdu size + max prefixed SCA size) * number of ASCII chars used to code an octet
+	TBuf8<(RMobileSmsMessaging::KGsmTpduSize+12)*2> localPdu;	
+	{
+	ParseLineLC();
+	TDblQueIter<CATParamListEntry> iter(iRxResults);
+	CATParamListEntry* entry=iter++;			// Have to increment iter so it returns a pointer
+	if(entry==NULL)
+		User::Leave(KErrGeneral);		// Would prefer not to leave and return an error
+		                                // but this function has to be trapped as we 
+										// have the ParseLineLC() call.
+	localPdu.Copy(entry->iResultPtr);
+	CleanupStack::PopAndDestroy();		// ParseLineLC pushed object
+	}
+
+	// Nokia 9210 sometimes aborts the CMT frame in the middle of pdu.
+	// Worst, it is sometimes contains odd number of nibbles which
+	// causes panic in ConvertAsciiToBinary() method. This type of
+	// frames will simply be discarded.
+	if(localPdu.Length()<(iPduLen*2))
+		User::Leave(KErrUnderflow);
+	
+	//
+	// Check if we have a prefixed SCA on our pdu.
+	// If we do then remove it.
+	if(localPdu.Length()>(iPduLen*2))
+		{
+		if(CATSmsUtils::ReadAndRemoveAddressFromAscii(localPdu,aAttr.iGsmServiceCentre,ETrue)!=KErrNone)
+			{
+			LOCAL_LOGTEXT("ParseAndStoreCMGRResponseL","Failed to read and remove SCA from PDU");
+			}
+		else
+			{
+			aAttr.iFlags|=RMobileSmsMessaging::KGsmServiceCentre;
+			}
+		}
+
+	//
+	// Convert received pdu from ASCII into binary
+	if (CATSmsUtils::ConvertAsciiToBinary(localPdu,aPdu)!=KErrNone)
+		{
+		LOCAL_LOGTEXT("ParseAndStoreCMGRResponseL","Failed to code PDU into binary");
+		}
+	else
+		{
+		aAttr.iDataFormat=RMobileSmsMessaging::EFormatGsmTpdu;
+		aAttr.iFlags|=RMobileSmsMessaging::KSmsDataFormat;
+		aAttr.iStatus=RMobileSmsMessaging::EMtMessageUnstoredPhoneAck;
+		aAttr.iFlags|=RMobileSmsMessaging::KIncomingStatus;
+		}
+	}	
+	
+
+
+void CATSmsWaitForAndHandleCMTUnstored::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+	{
+	LOCAL_LOGTEXT("CompleteWithIOError","Enter function");
+	// CATIO removes expect strings in event of IO error so don't do it here
+	iCMTExpectString=NULL;			
+	iCDSExpectString=NULL;			
+	// inform client of error so that it does not continue to wait for incoming SMS
+	// now that this wait object has been disabled
+	iReceiveQueue.CompleteClientReqWithError(aStatus);
+	}
+