telephonyserverplugins/multimodetsy/Multimode/sms/mSMSDEL.CPP
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/Multimode/sms/mSMSDEL.CPP	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,226 @@
+// 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:
+// Deletes an SMS message present on the ME (Mobile Equipment). AT+CMGD=xx
+// 
+//
+
+#include "NOTIFY.H"
+#include "mSMSSTOR.H"
+#include "mSMSDEL.H"
+#include "mSLOGGER.H"
+#include "ATIO.H"
+#include "Matstd.h"
+#include "smsbase.H"
+#include "et_phone_util.h"
+
+_LIT8(KSmsDeleteCommand,"AT+CMGD=%d\r");
+
+
+CATSmsStorageDelete* CATSmsStorageDelete::NewL(CATIO* aIo, CTelObject* aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals)
+	{
+	CATSmsStorageDelete* self = new(ELeave) CATSmsStorageDelete(aIo, aTelObject, aInit, aPhoneGlobals);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CATSmsStorageDelete::CATSmsStorageDelete(CATIO* aIo, CTelObject* aTelObject, CATInit* aInit, CPhoneGlobals* aPhoneGlobals)
+	:CATSmsCommands(aIo, aTelObject, aInit, aPhoneGlobals), 
+	iCancelled(EFalse),
+	iSmsStore(REINTERPRET_CAST(CMobileSmsStore*, aTelObject))
+	{}
+
+CATSmsStorageDelete::~CATSmsStorageDelete()
+	{}
+
+void CATSmsStorageDelete::ConstructL()
+	{
+	CATCommands::ConstructL();
+	}
+
+void CATSmsStorageDelete::Start(TTsyReqHandle aTsyReqHandle, TAny* aParams)
+//
+// Places BufferMarker and then starts the FSM (Finite State Machine).
+//
+	{
+	__ASSERT_DEBUG(aParams,Panic(EMobileSmsMessagingNullParameter));
+	__ASSERT_DEBUG(aTsyReqHandle!=TSY_HANDLE_INIT_VALUE,Panic(EMobileSmsMessagingNullParameter));
+
+	iReqHandle = aTsyReqHandle;
+	iCancelled=EFalse;
+	iDeleteIndex = *(static_cast<TInt*>(aParams));
+
+	if (ComparePrefMem(iSmsStore->iStoreName))
+		StartDeleteSequence();
+	else //ie: the compared memories are different, must change phone mem to temporary mem
+		{
+		SetCurrentPrefMem(iSmsStore->iStoreName);
+		iState = EATWaitForSendingPrefMemComplete;
+		}
+	}
+
+void CATSmsStorageDelete::StartDeleteSequence()
+	{
+	iTxBuffer.Format(KSmsDeleteCommand,iDeleteIndex); // Delete Command as per ETSI std (GSM 07.05, May 1996)
+	iIo->Write(this, iTxBuffer);
+	iIo->SetTimeOut(this, 5000);
+	iState = EATWaitForSendingDeleteComplete;
+	}
+
+void CATSmsStorageDelete::EventSignal(TEventSource aSource)
+//
+// FSM for GSmsStorageDelete
+//
+	{
+	LOGTEXT2(_L8("CATSmsStorageDelete:\tiState = %D"), iState);
+	if (aSource == ETimeOutCompletion)
+		{
+		LOGTEXT(_L8("CATSmsStorageDelete:\tTimeout error during Sms Delete"));
+		iIo->WriteAndTimerCancel(this);
+		if ((iState != EATWaitForPrefMemResponse)&&(!ComparePrefMem(iSmsStore->iStoreName)))
+			iPhoneGlobals->iPhonePrefMem = iSmsStore->iStoreName; 
+		Complete(KErrTimedOut);	
+		return;
+		} //if
+
+	switch(iState)
+		{
+	// the following 2 cases deal with changing to the client's preferred memory, if the situation arrises
+	// there are also two cases at the end of this state machine (EventSignal) that change the settings back
+	// to the original configuration.
+	case EATWaitForSendingPrefMemComplete:
+		__ASSERT_ALWAYS(aSource == EWriteCompletion, Panic(EATCommand_IllegalCompletionWriteExpected));
+		iIo->WriteAndTimerCancel(this);
+		StandardWriteCompletionHandler(aSource, 5);
+		iState = EATWaitForPrefMemResponse;
+		break;
+
+	case EATWaitForPrefMemResponse:
+		__ASSERT_ALWAYS(aSource == EReadCompletion, Panic(EATCommand_IllegalCompletionReadExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			TInt pos=iIo->BufferFindF(KCPMSResponseString);
+			RemoveStdExpectStrings();
+			if (pos == KErrNotFound)
+				{
+				Complete(pos, aSource);
+				return;
+				}
+			LOGTEXT(_L8("CATSmsStorageDelete:\tPhones's preferred memory successfully set to client's preferred memory"));
+			iPhoneGlobals->iPhonePrefMem=iSmsStore->iStoreName;
+			if (!iCancelled)
+				StartDeleteSequence();
+			else
+				{
+				Complete(KErrCancel, aSource);
+				}
+			}
+		break;
+
+	// The next 2 cases deal with deleting....
+
+	case EATWaitForSendingDeleteComplete:
+		{
+		__ASSERT_ALWAYS(aSource == EWriteCompletion, Panic(EATCommand_IllegalCompletionWriteExpected));
+		iIo->WriteAndTimerCancel(this);
+		StandardWriteCompletionHandler(aSource,5);
+		AddCmsErrorExpectString();
+		iState=EATWaitForOKResponseComplete;
+		}
+		break;
+
+	case EATWaitForOKResponseComplete:
+		__ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			TInt ret=ValidateExpectStringsWithCmsError();
+			RemoveCmsErrorExpectString();
+			RemoveStdExpectStrings();
+			// Delete has completed - hopefully successfully!
+			Complete(ret,aSource);
+			}
+		break;
+
+	default:
+		break;
+		}
+	}
+
+
+void CATSmsStorageDelete::Stop(TTsyReqHandle aTsyReqHandle)
+	{
+	__ASSERT_ALWAYS(aTsyReqHandle == iReqHandle, Panic(EIllegalTsyReqHandle));
+	LOGTEXT(_L8("CATSmsStorageDelete:\tCancel called."));
+	// Wait for convenient place in FSM to cancel
+	iCancelled=ETrue;
+	}
+
+
+void CATSmsStorageDelete::Complete(TInt aError)
+	{
+	Complete(aError, EReadCompletion);
+	}
+
+void CATSmsStorageDelete::Complete(TInt aError, TEventSource aSource)
+	{
+	iIo->RemoveExpectStrings(this);
+	iOKExpectString=NULL;
+	iErrorExpectString=NULL;
+
+	//
+	// Call our base classes Complete so that
+	// we allow it do what ever it needs to do.
+	CATCommands::Complete(aError,aSource);
+
+	if (iReqHandle != 0 )
+		iTelObject->ReqCompleted(iReqHandle, aError);
+
+	if (aSource == EWriteCompletion)
+		iIo->Read();
+
+	iState = EATNotInProgress;
+	}
+
+void CATSmsStorageDelete::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+	{
+	if (iState!=EATNotInProgress)
+		{
+		iIo->WriteAndTimerCancel(this);
+		iOKExpectString=NULL;
+		iErrorExpectString=NULL;
+		iTelObject->ReqCompleted(iReqHandle, aStatus);
+		iState = EATNotInProgress;
+		}
+	}
+
+TInt CATSmsStorageDelete::ValidateExpectStringsWithCmsError()
+//
+// Check for "ERROR" or "+CMS ERROR:" expect strings
+// This would be the place to add more intelligent processing of the +CMS ERROR: xxx
+// response.  At the moment this is rather crude.  "+CMS ERROR: 300" translates to a ME error
+// which should not set aRetry, whereas a "+CMS ERROR: <anything>" might translate
+// to a PDU error.
+//
+	{
+	TInt ret(KErrNone);
+	if((iIo->FoundChatString()==iErrorExpectString)||
+	   (iIo->FoundChatString()==iCmsExpectString))
+		{
+		LOGTEXT(_L8("CATSmsStorageDelete:\tSMS Delete error detected."));
+		ret=KErrGeneral;
+		}
+	return ret;
+	}
+