--- a/smsprotocols/smsstack/smsprot/Src/smsppara.cpp Mon May 03 13:37:20 2010 +0300
+++ b/smsprotocols/smsstack/smsprot/Src/smsppara.cpp Thu May 06 15:10:38 2010 +0100
@@ -1,600 +1,600 @@
-// Copyright (c) 2001-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 "smsppara.h"
-#include "smsuset.h"
-#include "smsulog.h"
-#include "smspmain.h"
-
-#include "gsmubuf.h"
-#include "Gsmumsg.h"
-#include <mmretrieve.h>
-#include "SmsuTimer.h"
-
-
-/**
- * Constructor
- *
- * @param aSmsComm a reference to the protocol.
- * @param aSmsSettings a reference to the global SMS settings.
- * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
- *
- */
-CSmsParamsBase::CSmsParamsBase(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging)
- : CSmsuActiveBase(KSmsSessionPriority),
- iSmsComm(aSmsComm),
- iSmsSettings(aSmsSettings),
- iSmsMessaging(aSmsMessaging)
- {
- } // CSmsParamsBase::CSmsParamsBase
-
-
-/**
- * 2nd Phase of construction.
- *
- * Creates CSmsTimeout object.
- *
- */
-void CSmsParamsBase::ConstructL()
- {
- LOGSMSPROT1("CSmsParamsBase::ConstructL()");
-
- ConstructTimeoutL();
- } // CSmsParamsBase::ConstructL
-
-
-/**
- * 2 Phase constructor.
- *
- * @param aSmsComm a reference to the protocol.
- * @param aSmsSettings a reference to the global SMS settings.
- * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
- * @leave Leaves if ContructL() leaves, or not enough memory is available.
- * @return a new CSmsReadParams object.
- *
- */
-CSmsReadParams* CSmsReadParams::NewL(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging)
- {
- LOGSMSPROT1("CSmsReadParams::NewL()");
-
- CSmsReadParams* smsReadParams=new(ELeave) CSmsReadParams(aSmsComm,aSmsSettings,aSmsMessaging);
- CleanupStack::PushL(smsReadParams);
- smsReadParams->ConstructL();
- CleanupStack::Pop(smsReadParams);
- return smsReadParams;
- } // CSmsReadParams::NewL
-
-
-/**
- * Destructor
- *
- * Cancel reading process and delete all created objects.
- *
- */
-CSmsReadParams::~CSmsReadParams()
- {
- Cancel();
- delete iRetrieveMobilePhoneSmspList;
- delete iMobilePhoneSmspList;
- } // CSmsReadParams::~CSmsReadParams
-
-
-/**
- * Start retrieving of SMS parameters. Called by CSmsProtocol.
- *
- * The behavour has been changed so that these parameters
- * will always be retrieved from the TSY. [Previously the
- * algorithm only retrieved the parameters from the TSY once
- * and cached them so the TSY would not need to be polled if
- * a client asked for the again, the assumption being that the
- * SC number would never change. Subsequent client requests to
- * read the SMS parameters would result in the cached parameters
- * being returned rather than retrieving the parameters from the
- * SIM. However this can cause problems (DEF40029) if the SIM is
- * replaced with a new SIM that has an incorrect service center
- * number: the stack can be requested to load the SMS parameters
- * twice, once when the phone boots with the new SIM and again when
- * the SIM is updated with the new Service Centre Number. If 2nd
- * request only results in the cached parameters being returned then
- * the incorrect SC Address will be returned.]
- *
- * @param aObserver a reference to the observer object.
- */
-void CSmsReadParams::Start(MSmsMessageObserver& aObserver)
- {
- LOGSMSPROT1("CSmsReadParams::Start()");
-
- __ASSERT_DEBUG(iSmsMessageObserver == NULL && iReport == NULL,
- SmspPanic(KSmspPanicUnexpectedState));
-
- //
- // Store the observer interface object for and start the retrieve
- // operation.
- //
- iSmsMessageObserver = &aObserver;
-
- iRetrieveMobilePhoneSmspList->Start(iStatus);
-
- TimedSetActive(iSmsSettings.Timeout());
- } // CSmsReadParams::Start
-
-
-/**
- * Start retrieving of SMS parameters. Called by CSmsWriteParams.
- *
- * The behavour has been changed so that these parameters
- * will always be retrieved from the TSY. [Previously the
- * algorithm only retrieved the parameters from the TSY once
- * and cached them so the TSY would not need to be polled if
- * a client asked for the again, the assumption being that the
- * SC number would never change. Subsequent client requests to
- * read the SMS parameters would result in the cached parameters
- * being returned rather than retrieving the parameters from the
- * SIM. However this can cause problems (DEF40029) if the SIM is
- * replaced with a new SIM that has an incorrect service center
- * number: the stack can be requested to load the SMS parameters
- * twice, once when the phone boots with the new SIM and again when
- * the SIM is updated with the new Service Centre Number. If 2nd
- * request only results in the cached parameters being returned then
- * the incorrect SC Address will be returned.]
- *
- * @param aStatus a reference to the outstanding request.
- */
-void CSmsReadParams::Start(TRequestStatus& aStatus)
- {
- LOGSMSPROT1("CSmsReadParams::Start()");
-
- __ASSERT_DEBUG(iSmsMessageObserver == NULL && iReport == NULL,
- SmspPanic(KSmspPanicUnexpectedState));
-
- //
- // Store the TRequestStatus in the CSmsuActiveBase object for later
- // completion and start the retrieve operation.
- //
- Queue(aStatus);
-
- iRetrieveMobilePhoneSmspList->Start(iStatus);
-
- TimedSetActive(iSmsSettings.Timeout());
- } // CSmsReadParams::Start
-
-
-/**
- * Retrieves parameter list from CRetrieveMobilePhoneSmspList object.
- * Cancel timeout timer. Delete old SMSP list and retrieve new list from
- * CMobilePhoneSmspList object if retrieving was successful.
- *
- * @leave Leave if RetrieveListL() leaves.
- */
-void CSmsReadParams::DoRunL()
- {
- LOGSMSPROT2("CSmsReadParams::RunL [iStatus=%d]", iStatus.Int() );
-
- //
- // If the start retrieve was successful, then continue retrieving the list.
- // A temporary variable is used to keep the old list until the new one is
- // obtained successfully.
- //
- if (iStatus == KErrNone)
- {
- CMobilePhoneSmspList* tempList = iRetrieveMobilePhoneSmspList->RetrieveListL();
-
- delete iMobilePhoneSmspList;
- iMobilePhoneSmspList = tempList;
- }
-
- //
- // DoRunL() will now return to CSmsuActiveBase which if the object
- // is not active, will call Complete().
- //
- } // CSmsReadParams::DoRunL
-
-
-/**
- * Handles cancel read parameters request.
- *
- * Cancel timeout timer.
- * Cancel also retrieving of parameters process.
- * Call complete.
- */
-void CSmsReadParams::DoCancel()
- {
- LOGSMSPROT1("CSmsReadParams::DoCancel()");
-
- TimedSetActiveCancel();
-
- //
- // Cancel the request...
- //
- iRetrieveMobilePhoneSmspList->Cancel();
-
- //
- // 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);
- }
- } // CSmsReadParams::DoCancel
-
-
-/**
- * Constructor
- *
- * @param aSmsComm a reference to the protocol.
- * @param aSmsSettings a reference to the global SMS settings.
- * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
- *
- */
-CSmsReadParams::CSmsReadParams(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging):
- CSmsParamsBase(aSmsComm,aSmsSettings,aSmsMessaging)
- {
- } // CSmsReadParams::CSmsReadParams
-
-
-/**
- * 2nd Phase of construction.
- *
- * Creates CRetrieveMobilePhoneSmspList object.
- *
- */
-void CSmsReadParams::ConstructL()
- {
- LOGSMSPROT1("CSmsReadParams::ConstructL()");
-
- CSmsParamsBase::ConstructL();
-
- iRetrieveMobilePhoneSmspList = CRetrieveMobilePhoneSmspList::NewL(iSmsMessaging);
- } // CSmsReadParams::ConstructL
-
-
-/**
- * Check validity of SMSP list. List shouldn't contain more entries that can be stored
- * to phone-side storage.
- * Set maximum number of enties value to the client's list.
- *
- * @param aMobilePhoneSmspList a reference to the CMobilePhoneSmspList object.
- * @leave Leave if aMobilePhoneSmspList object contains too many SMSP sets.
- *
- */
-void CSmsReadParams::CheckListValidityL(CMobilePhoneSmspList& aMobilePhoneSmspList)
- {
- LOGSMSPROT1("CSmsReadParams::CheckListValidityL()");
-
- //
- // MaxNumberEntries method returns the maximum number of entries that can
- // be stored in this list. This attribute is required because most phone-side
- // storage will have an upper storage limit. If the TSY has not set this
- // attribute during a list retrieval then the value returned will be -1.
- //
- if (iMobilePhoneSmspList->MaxNumberEntries() != -1)
- {
- if (aMobilePhoneSmspList.Enumerate() > iMobilePhoneSmspList->MaxNumberEntries())
- {
- User::Leave(KErrArgument);
- }
-
- aMobilePhoneSmspList.SetMaxNumberEntries(iMobilePhoneSmspList->MaxNumberEntries());
- }
- } // CSmsReadParams::CheckListValidityL
-
-
-/**
- * Store successfully saved parameters also to SMSPROT's internal memory. Actually
- * StoreParameters takes ownership of aMobilePhoneSmspList.
- *
- * Delete old list and set iMobilePhoneSmspList to point to the new SMSP list.
- *
- * @param aMobilePhoneSmspList a reference to the CMobilePhoneSmspList object.
- *
- */
-void CSmsReadParams::StoreParameters(CMobilePhoneSmspList* aMobilePhoneSmspList)
- {
- LOGSMSPROT1("CSmsReadParams::StoreParameters()");
-
- __ASSERT_DEBUG(iMobilePhoneSmspList != NULL && aMobilePhoneSmspList != NULL && iMobilePhoneSmspList->MaxNumberEntries() == aMobilePhoneSmspList->MaxNumberEntries(),SmspPanic(KSmspPanicCorruptedSmspList));
-
- delete iMobilePhoneSmspList;
- iMobilePhoneSmspList = aMobilePhoneSmspList;
- } // CSmsReadParams::StoreParameters
-
-
-/**
- * Completes read request or cancel read request.
- *
- * Cancel timeout timer.
- * Complete request to the CSmsWriteParams object or observer.
- *
- * @param aStatus a status value.
- *
- */
-void CSmsReadParams::Complete(TInt aStatus)
- {
- LOGSMSPROT1("CSmsReadParams::Complete()");
-
- //
- // Call the base function to perform the actual complete...
- //
- CSmsuActiveBase::Complete(aStatus);
-
- if (iSmsMessageObserver != NULL &&
- iSmsComm.ObserverIsPresent(*iSmsMessageObserver))
- {
- iSmsMessageObserver->ReadSmsParamsCompleted(aStatus, iMobilePhoneSmspList);
- iSmsMessageObserver = NULL;
- }
- } // CSmsReadParams::Complete
-
-
-/**
- * 2 Phase constructor.
- *
- * @param aSmsComm a reference to the protocol.
- * @param aSmsSettings a reference to the global SMS settings.
- * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
- * @param aSmsReadParams a reference to the CSmsReadParams object.
- * @leave Leaves if ContructL() leaves, or not enough memory is available.
- * @return a new CSmsReadParams object.
- *
- */
-CSmsWriteParams* CSmsWriteParams::NewL(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging,CSmsReadParams& aSmsReadParams)
- {
- LOGSMSPROT1("CSmsWriteParams::NewL()");
-
- CSmsWriteParams* smsWriteParams=new(ELeave) CSmsWriteParams(aSmsComm,aSmsSettings,aSmsMessaging,aSmsReadParams);
- CleanupStack::PushL(smsWriteParams);
- smsWriteParams->ConstructL();
- CleanupStack::Pop(smsWriteParams);
- return smsWriteParams;
- } // CSmsWriteParams::NewL
-
-
-/**
- * Destructor
- *
- * Cancel writing process and delete all created objects.
- *
- */
-CSmsWriteParams::~CSmsWriteParams()
- {
- Cancel();
- delete iMobilePhoneSmspList;
- } // CSmsWriteParams::~CSmsWriteParams
-
-
-/**
- * Start writing of SMS parameters process.
- * Set state to ESmsParamsStoringList.
- * Read parameters to SMSPROT's internal memory if client tries to write
- * parameters before SMSPROT has read them. This is because SMSPROT has to
- * deliver whole SMSP list while making StoreSmspList request to the MM ETel.
- * If client deliver only some SMSP sets while making write request, we have
- * to add missing SMSP sets to the clients list.
- * Set timeout timer on.
- *
- * @param aObserver a reference to the observer object.
- * @param aMobilePhoneSmspList a pointer to SMSP list to be saved.
- *
- */
-void CSmsWriteParams::Start(MSmsMessageObserver& aObserver,CMobilePhoneSmspList* aMobilePhoneSmspList)
- {
- LOGSMSPROT1("CSmsWriteParams::Start()");
-
- __ASSERT_DEBUG(iState==ESmsParamsIdle,SmspPanic(KSmspPanicUnexpectedState));
-
- iState = ESmsParamsStoringList;
-
- iSmsMessageObserver= &aObserver;
- iMobilePhoneSmspList=aMobilePhoneSmspList;
-
- //
- //Read parameters to SMSPROT's internal memory before starting writing process...
- //
- iSmsReadParams.Start(iStatus);
-
- TimedSetActive(iSmsSettings.Timeout());
- } // CSmsWriteParams::Start
-
-
-/**
- * Store SMSP list to phone. If storing was successful, store list also
- * to CSmsReadParams object.
- *
- * Cancel timeout timer.
- * State ESmsParamsStoringList:
- * Change state to ESmsParamsStoringListToInternal.
- * Check validity of SMSP list using CSmsReadParams objects services.
- * After that makes StoreSmspList request to the MM ETel.
- * Set timeout timer on.
- * State ESmsParamsStoringListToInternal:
- * Store successfully stored parameters to CSmsReadParams object.
- *
- * @leave Leaves if there was an error.
- * @leave Leave if RetrieveListL() leaves.
- * @leave Leave if StoreSmspListL() leaves.
- * @leave Panic if RunL is called while object is in idle state.
- *
- */
-void CSmsWriteParams::DoRunL()
- {
- LOGSMSPROT2("CSmsWriteParams::DoRunL [iStatus=%d]", iStatus.Int() );
-
- switch (iState)
- {
- case ESmsParamsStoringList:
- {
- //
- // Request the list to be stored...
- //
- if (iStatus.Int() == KErrNone)
- {
- iState = ESmsParamsStoringListToInternal;
-
- iSmsReadParams.CheckListValidityL(*iMobilePhoneSmspList);
- iSmsMessaging.StoreSmspListL(iStatus, iMobilePhoneSmspList);
-
- TimedSetActive(iSmsSettings.Timeout());
- }
- }
- break;
-
- case ESmsParamsStoringListToInternal:
- {
- //
- // If the list was stored successfully, then store it internally.
- //
- if (iStatus.Int() == KErrNone)
- {
- iSmsReadParams.StoreParameters(iMobilePhoneSmspList);
-
- //
- // Set iMobilePhoneSmspList to NULL because it points now to SMSPROT's
- // internal parameter storage.
- //
- iMobilePhoneSmspList = NULL;
- }
- }
- break;
-
- default:
- {
- SmspPanic(KSmspPanicUnexpectedState);
- }
- break;
- }
-
- //
- // DoRunL() will now return to CSmsuActiveBase which if the object
- // is not active, will call Complete().
- //
- } // CSmsWriteParams::DoRunL
-
-
-/**
- * Handles cancel write parameters request.
- *
- * Cancel timeout timer. Cancel reading and writing processes
- * if they are running.
- *
- */
-void CSmsWriteParams::DoCancel()
- {
- LOGSMSPROT1("CSmsWriteParams::DoCancel()");
-
- TimedSetActiveCancel();
-
- switch (iState)
- {
- case ESmsParamsStoringList:
- {
- iSmsReadParams.Cancel();
- }
- break;
-
- case ESmsParamsStoringListToInternal:
- {
- iSmsMessaging.CancelAsyncRequest(EMobileSmsMessagingStoreSmspList);
- }
- break;
-
- default:
- {
- SmspPanic(KSmspPanicUnexpectedState);
- }
- break;
- }
-
- //
- // 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);
- }
- } // CSmsWriteParams::DoCancel
-
-
-/**
- * Constructor
- *
- * @param aSmsComm a reference to the protocol.
- * @param aSmsSettings a reference to the global SMS settings.
- * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
- * @param aSmsReadParams a reference to the CSmsReadParams object.
- *
- */
-CSmsWriteParams::CSmsWriteParams(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging,CSmsReadParams& aSmsReadParams):
- CSmsParamsBase(aSmsComm,aSmsSettings,aSmsMessaging),
- iState(ESmsParamsIdle),
- iSmsReadParams(aSmsReadParams)
- {
- } // CSmsWriteParams::CSmsWriteParams
-
-
-/**
- * 2nd Phase of construction.
- *
- * Creates CSmsuTimeout object.
- *
- */
-void CSmsWriteParams::ConstructL()
- {
- LOGSMSPROT1("CSmsWriteParams::ConstructL()");
-
- CSmsParamsBase::ConstructL();
- } // CSmsWriteParams::ConstructL
-
-
-/**
- * Completes write request or cancel write request.
- *
- * Cancel timeout timer. Set state to ESmsParamsIdle. Complete request to the
- * observer.
- *
- * @param aStatus a status value.
- * @leave Panic if Complete is called while object is in ESmsParamsIdle state.
- *
- */
-void CSmsWriteParams::Complete(TInt aStatus)
- {
- LOGSMSPROT1("CSmsWriteParams::Complete()");
-
- //
- // Call the base function to perform the actual complete...
- //
- CSmsuActiveBase::Complete(aStatus);
-
- delete iMobilePhoneSmspList;
- iMobilePhoneSmspList = NULL;
-
- iState = ESmsParamsIdle;
-
- if (iSmsComm.ObserverIsPresent(*iSmsMessageObserver))
- {
- iSmsMessageObserver->WriteSmsParamsCompleted(aStatus);
- iSmsMessageObserver = NULL;
- }
- } // CSmsWriteParams::Complete
+// Copyright (c) 2001-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 "smsppara.h"
+#include "smsuset.h"
+#include "smsulog.h"
+#include "smspmain.h"
+
+#include "gsmubuf.h"
+#include "Gsmumsg.h"
+#include <mmretrieve.h>
+#include "SmsuTimer.h"
+
+
+/**
+ * Constructor
+ *
+ * @param aSmsComm a reference to the protocol.
+ * @param aSmsSettings a reference to the global SMS settings.
+ * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
+ *
+ */
+CSmsParamsBase::CSmsParamsBase(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging)
+ : CSmsuActiveBase(KSmsSessionPriority),
+ iSmsComm(aSmsComm),
+ iSmsSettings(aSmsSettings),
+ iSmsMessaging(aSmsMessaging)
+ {
+ } // CSmsParamsBase::CSmsParamsBase
+
+
+/**
+ * 2nd Phase of construction.
+ *
+ * Creates CSmsTimeout object.
+ *
+ */
+void CSmsParamsBase::ConstructL()
+ {
+ LOGSMSPROT1("CSmsParamsBase::ConstructL()");
+
+ ConstructTimeoutL();
+ } // CSmsParamsBase::ConstructL
+
+
+/**
+ * 2 Phase constructor.
+ *
+ * @param aSmsComm a reference to the protocol.
+ * @param aSmsSettings a reference to the global SMS settings.
+ * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
+ * @leave Leaves if ContructL() leaves, or not enough memory is available.
+ * @return a new CSmsReadParams object.
+ *
+ */
+CSmsReadParams* CSmsReadParams::NewL(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging)
+ {
+ LOGSMSPROT1("CSmsReadParams::NewL()");
+
+ CSmsReadParams* smsReadParams=new(ELeave) CSmsReadParams(aSmsComm,aSmsSettings,aSmsMessaging);
+ CleanupStack::PushL(smsReadParams);
+ smsReadParams->ConstructL();
+ CleanupStack::Pop(smsReadParams);
+ return smsReadParams;
+ } // CSmsReadParams::NewL
+
+
+/**
+ * Destructor
+ *
+ * Cancel reading process and delete all created objects.
+ *
+ */
+CSmsReadParams::~CSmsReadParams()
+ {
+ Cancel();
+ delete iRetrieveMobilePhoneSmspList;
+ delete iMobilePhoneSmspList;
+ } // CSmsReadParams::~CSmsReadParams
+
+
+/**
+ * Start retrieving of SMS parameters. Called by CSmsProtocol.
+ *
+ * The behavour has been changed so that these parameters
+ * will always be retrieved from the TSY. [Previously the
+ * algorithm only retrieved the parameters from the TSY once
+ * and cached them so the TSY would not need to be polled if
+ * a client asked for the again, the assumption being that the
+ * SC number would never change. Subsequent client requests to
+ * read the SMS parameters would result in the cached parameters
+ * being returned rather than retrieving the parameters from the
+ * SIM. However this can cause problems (DEF40029) if the SIM is
+ * replaced with a new SIM that has an incorrect service center
+ * number: the stack can be requested to load the SMS parameters
+ * twice, once when the phone boots with the new SIM and again when
+ * the SIM is updated with the new Service Centre Number. If 2nd
+ * request only results in the cached parameters being returned then
+ * the incorrect SC Address will be returned.]
+ *
+ * @param aObserver a reference to the observer object.
+ */
+void CSmsReadParams::Start(MSmsMessageObserver& aObserver)
+ {
+ LOGSMSPROT1("CSmsReadParams::Start()");
+
+ __ASSERT_DEBUG(iSmsMessageObserver == NULL && iReport == NULL,
+ SmspPanic(KSmspPanicUnexpectedState));
+
+ //
+ // Store the observer interface object for and start the retrieve
+ // operation.
+ //
+ iSmsMessageObserver = &aObserver;
+
+ iRetrieveMobilePhoneSmspList->Start(iStatus);
+
+ TimedSetActive(iSmsSettings.Timeout());
+ } // CSmsReadParams::Start
+
+
+/**
+ * Start retrieving of SMS parameters. Called by CSmsWriteParams.
+ *
+ * The behavour has been changed so that these parameters
+ * will always be retrieved from the TSY. [Previously the
+ * algorithm only retrieved the parameters from the TSY once
+ * and cached them so the TSY would not need to be polled if
+ * a client asked for the again, the assumption being that the
+ * SC number would never change. Subsequent client requests to
+ * read the SMS parameters would result in the cached parameters
+ * being returned rather than retrieving the parameters from the
+ * SIM. However this can cause problems (DEF40029) if the SIM is
+ * replaced with a new SIM that has an incorrect service center
+ * number: the stack can be requested to load the SMS parameters
+ * twice, once when the phone boots with the new SIM and again when
+ * the SIM is updated with the new Service Centre Number. If 2nd
+ * request only results in the cached parameters being returned then
+ * the incorrect SC Address will be returned.]
+ *
+ * @param aStatus a reference to the outstanding request.
+ */
+void CSmsReadParams::Start(TRequestStatus& aStatus)
+ {
+ LOGSMSPROT1("CSmsReadParams::Start()");
+
+ __ASSERT_DEBUG(iSmsMessageObserver == NULL && iReport == NULL,
+ SmspPanic(KSmspPanicUnexpectedState));
+
+ //
+ // Store the TRequestStatus in the CSmsuActiveBase object for later
+ // completion and start the retrieve operation.
+ //
+ Queue(aStatus);
+
+ iRetrieveMobilePhoneSmspList->Start(iStatus);
+
+ TimedSetActive(iSmsSettings.Timeout());
+ } // CSmsReadParams::Start
+
+
+/**
+ * Retrieves parameter list from CRetrieveMobilePhoneSmspList object.
+ * Cancel timeout timer. Delete old SMSP list and retrieve new list from
+ * CMobilePhoneSmspList object if retrieving was successful.
+ *
+ * @leave Leave if RetrieveListL() leaves.
+ */
+void CSmsReadParams::DoRunL()
+ {
+ LOGSMSPROT2("CSmsReadParams::RunL [iStatus=%d]", iStatus.Int() );
+
+ //
+ // If the start retrieve was successful, then continue retrieving the list.
+ // A temporary variable is used to keep the old list until the new one is
+ // obtained successfully.
+ //
+ if (iStatus == KErrNone)
+ {
+ CMobilePhoneSmspList* tempList = iRetrieveMobilePhoneSmspList->RetrieveListL();
+
+ delete iMobilePhoneSmspList;
+ iMobilePhoneSmspList = tempList;
+ }
+
+ //
+ // DoRunL() will now return to CSmsuActiveBase which if the object
+ // is not active, will call Complete().
+ //
+ } // CSmsReadParams::DoRunL
+
+
+/**
+ * Handles cancel read parameters request.
+ *
+ * Cancel timeout timer.
+ * Cancel also retrieving of parameters process.
+ * Call complete.
+ */
+void CSmsReadParams::DoCancel()
+ {
+ LOGSMSPROT1("CSmsReadParams::DoCancel()");
+
+ TimedSetActiveCancel();
+
+ //
+ // Cancel the request...
+ //
+ iRetrieveMobilePhoneSmspList->Cancel();
+
+ //
+ // 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);
+ }
+ } // CSmsReadParams::DoCancel
+
+
+/**
+ * Constructor
+ *
+ * @param aSmsComm a reference to the protocol.
+ * @param aSmsSettings a reference to the global SMS settings.
+ * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
+ *
+ */
+CSmsReadParams::CSmsReadParams(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging):
+ CSmsParamsBase(aSmsComm,aSmsSettings,aSmsMessaging)
+ {
+ } // CSmsReadParams::CSmsReadParams
+
+
+/**
+ * 2nd Phase of construction.
+ *
+ * Creates CRetrieveMobilePhoneSmspList object.
+ *
+ */
+void CSmsReadParams::ConstructL()
+ {
+ LOGSMSPROT1("CSmsReadParams::ConstructL()");
+
+ CSmsParamsBase::ConstructL();
+
+ iRetrieveMobilePhoneSmspList = CRetrieveMobilePhoneSmspList::NewL(iSmsMessaging);
+ } // CSmsReadParams::ConstructL
+
+
+/**
+ * Check validity of SMSP list. List shouldn't contain more entries that can be stored
+ * to phone-side storage.
+ * Set maximum number of enties value to the client's list.
+ *
+ * @param aMobilePhoneSmspList a reference to the CMobilePhoneSmspList object.
+ * @leave Leave if aMobilePhoneSmspList object contains too many SMSP sets.
+ *
+ */
+void CSmsReadParams::CheckListValidityL(CMobilePhoneSmspList& aMobilePhoneSmspList)
+ {
+ LOGSMSPROT1("CSmsReadParams::CheckListValidityL()");
+
+ //
+ // MaxNumberEntries method returns the maximum number of entries that can
+ // be stored in this list. This attribute is required because most phone-side
+ // storage will have an upper storage limit. If the TSY has not set this
+ // attribute during a list retrieval then the value returned will be -1.
+ //
+ if (iMobilePhoneSmspList->MaxNumberEntries() != -1)
+ {
+ if (aMobilePhoneSmspList.Enumerate() > iMobilePhoneSmspList->MaxNumberEntries())
+ {
+ User::Leave(KErrArgument);
+ }
+
+ aMobilePhoneSmspList.SetMaxNumberEntries(iMobilePhoneSmspList->MaxNumberEntries());
+ }
+ } // CSmsReadParams::CheckListValidityL
+
+
+/**
+ * Store successfully saved parameters also to SMSPROT's internal memory. Actually
+ * StoreParameters takes ownership of aMobilePhoneSmspList.
+ *
+ * Delete old list and set iMobilePhoneSmspList to point to the new SMSP list.
+ *
+ * @param aMobilePhoneSmspList a reference to the CMobilePhoneSmspList object.
+ *
+ */
+void CSmsReadParams::StoreParameters(CMobilePhoneSmspList* aMobilePhoneSmspList)
+ {
+ LOGSMSPROT1("CSmsReadParams::StoreParameters()");
+
+ __ASSERT_DEBUG(iMobilePhoneSmspList != NULL && aMobilePhoneSmspList != NULL && iMobilePhoneSmspList->MaxNumberEntries() == aMobilePhoneSmspList->MaxNumberEntries(),SmspPanic(KSmspPanicCorruptedSmspList));
+
+ delete iMobilePhoneSmspList;
+ iMobilePhoneSmspList = aMobilePhoneSmspList;
+ } // CSmsReadParams::StoreParameters
+
+
+/**
+ * Completes read request or cancel read request.
+ *
+ * Cancel timeout timer.
+ * Complete request to the CSmsWriteParams object or observer.
+ *
+ * @param aStatus a status value.
+ *
+ */
+void CSmsReadParams::Complete(TInt aStatus)
+ {
+ LOGSMSPROT1("CSmsReadParams::Complete()");
+
+ //
+ // Call the base function to perform the actual complete...
+ //
+ CSmsuActiveBase::Complete(aStatus);
+
+ if (iSmsMessageObserver != NULL &&
+ iSmsComm.ObserverIsPresent(*iSmsMessageObserver))
+ {
+ iSmsMessageObserver->ReadSmsParamsCompleted(aStatus, iMobilePhoneSmspList);
+ iSmsMessageObserver = NULL;
+ }
+ } // CSmsReadParams::Complete
+
+
+/**
+ * 2 Phase constructor.
+ *
+ * @param aSmsComm a reference to the protocol.
+ * @param aSmsSettings a reference to the global SMS settings.
+ * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
+ * @param aSmsReadParams a reference to the CSmsReadParams object.
+ * @leave Leaves if ContructL() leaves, or not enough memory is available.
+ * @return a new CSmsReadParams object.
+ *
+ */
+CSmsWriteParams* CSmsWriteParams::NewL(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging,CSmsReadParams& aSmsReadParams)
+ {
+ LOGSMSPROT1("CSmsWriteParams::NewL()");
+
+ CSmsWriteParams* smsWriteParams=new(ELeave) CSmsWriteParams(aSmsComm,aSmsSettings,aSmsMessaging,aSmsReadParams);
+ CleanupStack::PushL(smsWriteParams);
+ smsWriteParams->ConstructL();
+ CleanupStack::Pop(smsWriteParams);
+ return smsWriteParams;
+ } // CSmsWriteParams::NewL
+
+
+/**
+ * Destructor
+ *
+ * Cancel writing process and delete all created objects.
+ *
+ */
+CSmsWriteParams::~CSmsWriteParams()
+ {
+ Cancel();
+ delete iMobilePhoneSmspList;
+ } // CSmsWriteParams::~CSmsWriteParams
+
+
+/**
+ * Start writing of SMS parameters process.
+ * Set state to ESmsParamsStoringList.
+ * Read parameters to SMSPROT's internal memory if client tries to write
+ * parameters before SMSPROT has read them. This is because SMSPROT has to
+ * deliver whole SMSP list while making StoreSmspList request to the MM ETel.
+ * If client deliver only some SMSP sets while making write request, we have
+ * to add missing SMSP sets to the clients list.
+ * Set timeout timer on.
+ *
+ * @param aObserver a reference to the observer object.
+ * @param aMobilePhoneSmspList a pointer to SMSP list to be saved.
+ *
+ */
+void CSmsWriteParams::Start(MSmsMessageObserver& aObserver,CMobilePhoneSmspList* aMobilePhoneSmspList)
+ {
+ LOGSMSPROT1("CSmsWriteParams::Start()");
+
+ __ASSERT_DEBUG(iState==ESmsParamsIdle,SmspPanic(KSmspPanicUnexpectedState));
+
+ iState = ESmsParamsStoringList;
+
+ iSmsMessageObserver= &aObserver;
+ iMobilePhoneSmspList=aMobilePhoneSmspList;
+
+ //
+ //Read parameters to SMSPROT's internal memory before starting writing process...
+ //
+ iSmsReadParams.Start(iStatus);
+
+ TimedSetActive(iSmsSettings.Timeout());
+ } // CSmsWriteParams::Start
+
+
+/**
+ * Store SMSP list to phone. If storing was successful, store list also
+ * to CSmsReadParams object.
+ *
+ * Cancel timeout timer.
+ * State ESmsParamsStoringList:
+ * Change state to ESmsParamsStoringListToInternal.
+ * Check validity of SMSP list using CSmsReadParams objects services.
+ * After that makes StoreSmspList request to the MM ETel.
+ * Set timeout timer on.
+ * State ESmsParamsStoringListToInternal:
+ * Store successfully stored parameters to CSmsReadParams object.
+ *
+ * @leave Leaves if there was an error.
+ * @leave Leave if RetrieveListL() leaves.
+ * @leave Leave if StoreSmspListL() leaves.
+ * @leave Panic if RunL is called while object is in idle state.
+ *
+ */
+void CSmsWriteParams::DoRunL()
+ {
+ LOGSMSPROT2("CSmsWriteParams::DoRunL [iStatus=%d]", iStatus.Int() );
+
+ switch (iState)
+ {
+ case ESmsParamsStoringList:
+ {
+ //
+ // Request the list to be stored...
+ //
+ if (iStatus.Int() == KErrNone)
+ {
+ iState = ESmsParamsStoringListToInternal;
+
+ iSmsReadParams.CheckListValidityL(*iMobilePhoneSmspList);
+ iSmsMessaging.StoreSmspListL(iStatus, iMobilePhoneSmspList);
+
+ TimedSetActive(iSmsSettings.Timeout());
+ }
+ }
+ break;
+
+ case ESmsParamsStoringListToInternal:
+ {
+ //
+ // If the list was stored successfully, then store it internally.
+ //
+ if (iStatus.Int() == KErrNone)
+ {
+ iSmsReadParams.StoreParameters(iMobilePhoneSmspList);
+
+ //
+ // Set iMobilePhoneSmspList to NULL because it points now to SMSPROT's
+ // internal parameter storage.
+ //
+ iMobilePhoneSmspList = NULL;
+ }
+ }
+ break;
+
+ default:
+ {
+ SmspPanic(KSmspPanicUnexpectedState);
+ }
+ break;
+ }
+
+ //
+ // DoRunL() will now return to CSmsuActiveBase which if the object
+ // is not active, will call Complete().
+ //
+ } // CSmsWriteParams::DoRunL
+
+
+/**
+ * Handles cancel write parameters request.
+ *
+ * Cancel timeout timer. Cancel reading and writing processes
+ * if they are running.
+ *
+ */
+void CSmsWriteParams::DoCancel()
+ {
+ LOGSMSPROT1("CSmsWriteParams::DoCancel()");
+
+ TimedSetActiveCancel();
+
+ switch (iState)
+ {
+ case ESmsParamsStoringList:
+ {
+ iSmsReadParams.Cancel();
+ }
+ break;
+
+ case ESmsParamsStoringListToInternal:
+ {
+ iSmsMessaging.CancelAsyncRequest(EMobileSmsMessagingStoreSmspList);
+ }
+ break;
+
+ default:
+ {
+ SmspPanic(KSmspPanicUnexpectedState);
+ }
+ break;
+ }
+
+ //
+ // 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);
+ }
+ } // CSmsWriteParams::DoCancel
+
+
+/**
+ * Constructor
+ *
+ * @param aSmsComm a reference to the protocol.
+ * @param aSmsSettings a reference to the global SMS settings.
+ * @param aSmsMessaging a reference to the ETEL SMS messaging subsession.
+ * @param aSmsReadParams a reference to the CSmsReadParams object.
+ *
+ */
+CSmsWriteParams::CSmsWriteParams(MSmsComm& aSmsComm,const TSmsSettings& aSmsSettings,RMobileSmsMessaging& aSmsMessaging,CSmsReadParams& aSmsReadParams):
+ CSmsParamsBase(aSmsComm,aSmsSettings,aSmsMessaging),
+ iState(ESmsParamsIdle),
+ iSmsReadParams(aSmsReadParams)
+ {
+ } // CSmsWriteParams::CSmsWriteParams
+
+
+/**
+ * 2nd Phase of construction.
+ *
+ * Creates CSmsuTimeout object.
+ *
+ */
+void CSmsWriteParams::ConstructL()
+ {
+ LOGSMSPROT1("CSmsWriteParams::ConstructL()");
+
+ CSmsParamsBase::ConstructL();
+ } // CSmsWriteParams::ConstructL
+
+
+/**
+ * Completes write request or cancel write request.
+ *
+ * Cancel timeout timer. Set state to ESmsParamsIdle. Complete request to the
+ * observer.
+ *
+ * @param aStatus a status value.
+ * @leave Panic if Complete is called while object is in ESmsParamsIdle state.
+ *
+ */
+void CSmsWriteParams::Complete(TInt aStatus)
+ {
+ LOGSMSPROT1("CSmsWriteParams::Complete()");
+
+ //
+ // Call the base function to perform the actual complete...
+ //
+ CSmsuActiveBase::Complete(aStatus);
+
+ delete iMobilePhoneSmspList;
+ iMobilePhoneSmspList = NULL;
+
+ iState = ESmsParamsIdle;
+
+ if (iSmsComm.ObserverIsPresent(*iSmsMessageObserver))
+ {
+ iSmsMessageObserver->WriteSmsParamsCompleted(aStatus);
+ iSmsMessageObserver = NULL;
+ }
+ } // CSmsWriteParams::Complete