--- /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 <exterror.h>
+#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<TGsmSmsSlotEntry>& 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
+