diff -r 000000000000 -r 3553901f7fa8 smsprotocols/smsstack/smsprot/Src/smspdel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smsprotocols/smsstack/smsprot/Src/smspdel.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,319 @@ +// 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 "smspdel.h" +#include "smspmain.h" + +#include "smsuset.h" + +#include +#include "SmsuTimer.h" +#include "smspqueue.h" + + +/** + * Creates new CSmsStoreRead instance + * + * @param aSmsComm reference to the MSmsComm class + * @param aSmsSettings reference to the TSmsSettings class + * @param aSmsMessaging reference to the RMobileSmsMessaging class + */ +CSmsPDUDelete* CSmsPDUDelete::NewL(const TSmsSettings& aSmsSettings, + RMobileSmsMessaging& aSmsMessaging + ) + { + LOGSMSPROT1("CSmsPDUDelete::NewL()"); + + CSmsPDUDelete* smsPduDelete = + new(ELeave) CSmsPDUDelete(aSmsSettings,aSmsMessaging); + CleanupStack::PushL(smsPduDelete); + smsPduDelete->ConstructL(); + CleanupStack::Pop(); + return smsPduDelete; + } // CSmsPDUDelete::NewL + + +/** + * Constructor + * + * @param aSmsComm reference to the MSmsComm class + * @param aSmsSettings reference to the TSmsSettings class + * @param aSmsMessaging reference to the RMobileSmsMessaging class + */ +CSmsPDUDelete::CSmsPDUDelete(const TSmsSettings& aSmsSettings, + RMobileSmsMessaging& aSmsMessaging) + : CSmsuActiveBase(KSmsSessionPriority), + iState(ESmsPDUDeleteIdle), + iSmsSettings(aSmsSettings), + iSmsMessaging(aSmsMessaging) + { + // NOP + } // CSmsPDUDelete::CSmsPDUDelete + + +/** + * Creates instance to the class CSmsuTimeout + */ +void CSmsPDUDelete::ConstructL() + { + LOGSMSPROT1("CSmsPDUDelete::ConstructL()"); + + ConstructTimeoutL(); + } // CSmsPDUDelete::ConstructL + + +/** + * Starts CSmsPDUDelete active object + * Calls private methd OpenStore + * + * @param aStatus Reguest status + * @param aStoreIndex Index to the store to be read + */ +void CSmsPDUDelete::Start(CArrayFix& aLocationArray, TRequestStatus& aStatus) + { + LOGSMSPROT1("CSmsPDUDelete::Start()"); + + __ASSERT_DEBUG(iState==ESmsPDUDeleteIdle,SmspPanic(KSmspPanicUnexpectedState)); + + Queue(aStatus); + + iLocationArray=&aLocationArray; + iState=ESmsPDUDeleteOpeningStore; + OpenStore(); + } // CSmsPDUDelete::Start + + +/** + * Called by Active Scheduler + * + * Deletes slots giving in array. Opens new store if store change + */ +void CSmsPDUDelete::DoRunL() + { + LOGSMSPROT2("CSmsPDUDelete::RunL [iStatus=%d]", iStatus.Int()); + + switch (iState) + { + case ESmsPDUDeleteOpeningStore: + { + // + // If the store was opened, then delete the PDU... + // + if (iStatus.Int() == KErrNone) + { + DeletePDU(); + } + } + break; + + case ESmsPDUDeleteDeletingPDU: + { + // + // If deleting the PDU returned not found, then this is a valid + // result so assume KErrNone. + // + if (iStatus.Int() == KErrNotFound || + iStatus.Int() == KErrGsmSMSInvalidMemoryIndex) + { + iStatus = KErrNone; + } + + // + // If the delete was successful (or assumed to be) then remove + // it from the list. If the next one is the on a different store, + // then change stores, otherwise delete it. + // + if (iStatus.Int() == KErrNone) + { + iLocationArray->Delete(0); + + if (iLocationArray->Count() > 0) + { + if (iLocationArray->At(0).iStore != iCurrentStore) + { + OpenStore(); + } + else + { + DeletePDU(); + } + } + } + } + break; + + default: + { + SmspPanic(KSmspPanicUnexpectedState); + } + break; + } + + // + // DoRunL() will now return to CSmsuActiveBase which if the object + // is not active, will call Complete(). + // + } // CSmsPDUDelete::DoRunL + + +/** + * private method for opening the store where slot is saved + */ +void CSmsPDUDelete::OpenStore() + { + LOGSMSPROT1("CSmsPDUDelete::OpenStore()"); + + // + // Open the SMS Store for the first PDU... + // + if (iLocationArray->Count() > 0) + { + // + // Close it first, just in case it was left open... + // + iSmsStorage.Close(); + + // + // Now open the store... + // + TInt ret; + + ret = iSmsStorage.Open(iSmsMessaging, iLocationArray->At(0).iStore); + if (ret == KErrNone) + { + iCurrentStore = iLocationArray->At(0).iStore; + } + + // + // Complete this object to allow correct flow through DoRunL() + // and Complete() if needed. + // + iState = ESmsPDUDeleteOpeningStore; + + CompleteMyself(ret); + } + } // CSmsPDUDelete::OpenStore + + +/** + * private method for deleting slot from the store + */ +void CSmsPDUDelete::DeletePDU() + { + LOGSMSPROT1("CSmsPDUDelete::DeletePDU()"); + + // + // Delete the first entry in the list... + // + if (iLocationArray->Count() > 0) + { + iSmsStorage.Delete(iStatus, iLocationArray->At(0).iIndex); + + iState = ESmsPDUDeleteDeletingPDU; + + TimedSetActive(iSmsSettings.Timeout()); + } + } // CSmsPDUDelete::DeletePDU + + +/** + * Called by Active Scheduler + */ +void CSmsPDUDelete::DoCancel() + { + LOGSMSPROT1("CSmsPDUDelete::DoCancel()"); + + TimedSetActiveCancel(); + + switch (iState) + { + case ESmsPDUDeleteOpeningStore: + { + // + // Will never happen as CompleteMyself() was used... + // + } + break; + + case ESmsPDUDeleteDeletingPDU: + { + iSmsStorage.CancelAsyncRequest(EMobilePhoneStoreDelete); + } + break; + + default: + { + SmspPanic(KSmspPanicUnexpectedState); + } + } + + // + // Handle completion of this Active Object. Note that the object + // may well still be active at this point... + // + if (TimedOut()) + { + Complete(KErrTimedOut); + } + else + { + Complete(KErrCancel); + } + } // CSmsPDUDelete::DoCancel + + +/** + * Completes this object + */ +void CSmsPDUDelete::Complete(TInt aStatus) + { + LOGSMSPROT1("CSmsPDUDelete::Complete()"); + + // + // Only close the SMS Storage if the object is not active (and it may be + // if the operation was cancelled). Otherwise it will be closed on + // destruction. + // + if (!IsActive()) + { + iSmsStorage.Close(); + } + + // + // Resets slot array... + // + iLocationArray->Reset(); + + // + // Call the base function to perform the actual complete... + // + CSmsuActiveBase::Complete(aStatus); + + // + // This active object has completed... + // + iState = ESmsPDUDeleteIdle; + } // CSmsPDUDelete::Complete + + +/** + * Destructor + */ +CSmsPDUDelete::~CSmsPDUDelete() + { + Cancel(); + iSmsStorage.Close(); + } // CSmsPDUDelete::~CSmsPDUDelete +