--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/scheduledsendmtm/schedulesendmtm/src/MsvSendErrorAction.cpp Fri Jun 04 10:32:16 2010 +0100
@@ -0,0 +1,386 @@
+// Copyright (c) 1999-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 <e32base.h>
+#include <msvstd.h>
+#include <msventry.h>
+#include <barsread.h>
+#include <msvsenderroraction.h>
+#include <schsend_panic.h>
+
+
+//
+//
+// TMsvSendErrorAction Implementation
+//
+//
+
+/**
+Default constructor.
+*/
+
+EXPORT_C TMsvSendErrorAction::TMsvSendErrorAction()
+ {
+ Reset();
+ }
+
+
+/*
+EXPORT_C TMsvSendErrorAction::TMsvSendErrorAction(const TMsvSendErrorAction& aErrorAction)
+ {
+ iAction = aErrorAction.iAction;
+ iError = aErrorAction.iError;
+ iMaxRetries = aErrorAction.iMaxRetries;
+ iRetries = aErrorAction.iRetries;
+ iRetrySpacing = aErrorAction.iRetrySpacing;
+ iVersion = aErrorAction.iVersion;
+ }
+*/
+
+
+
+/**
+Sets all member data to default values.
+*/
+
+EXPORT_C void TMsvSendErrorAction::Reset()
+ {
+ iError = KErrNone;
+ SetMaxRetries(3);
+ iAction = ESendActionFail;
+ iRetries = ESendRetriesFixed;
+ iRetrySpacing = ESendRetrySpacingStatic;
+ }
+
+
+/**
+Sets the maximum number of retries.
+
+@param aMaxRetries
+Maximum number of retries.
+
+@panic ScheduleSend-DLL 21
+The maximum number of retries is negative.
+*/
+
+EXPORT_C void TMsvSendErrorAction::SetMaxRetries(const TInt16 aMaxRetries)
+ {
+ __ASSERT_ALWAYS(aMaxRetries >= 0, gPanic(EMaxRetriesMustBePositive));
+
+ iMaxRetries = aMaxRetries;
+ }
+
+
+/**
+Gets the maximum number of retries.
+
+@return Maximum number of retries
+*/
+
+EXPORT_C TInt16 TMsvSendErrorAction::MaxRetries() const
+ {
+ return iMaxRetries;
+ }
+
+
+//
+//
+// CMsvSendErrorActions Implementation
+//
+//
+
+/**
+Allocates and creates a new CMsvSendErrorActions object.
+
+@return New object
+*/
+EXPORT_C CMsvSendErrorActions* CMsvSendErrorActions::NewL()
+ {
+ CMsvSendErrorActions* self = CMsvSendErrorActions::NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+/**
+Allocates and creates a new CMsvSendErrorActions object.
+
+@return New object
+*/
+EXPORT_C CMsvSendErrorActions* CMsvSendErrorActions::NewLC()
+ {
+ CMsvSendErrorActions* self = new (ELeave) CMsvSendErrorActions();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+//
+// CMsvSendErrorActions Constructor
+//
+
+CMsvSendErrorActions::CMsvSendErrorActions()
+ {
+ iDefault.Reset();
+ }
+
+
+void CMsvSendErrorActions::ConstructL()
+ {
+ iErrors = new (ELeave) CArrayFixFlat<TMsvSendErrorAction>(1);
+ }
+
+
+/**
+Destructor.
+*/
+
+EXPORT_C CMsvSendErrorActions::~CMsvSendErrorActions()
+ {
+ delete iErrors;
+ }
+
+EXPORT_C void CMsvSendErrorActions::Reset()
+ {
+ iDefault.Reset();
+ iErrors->Reset();
+ }
+
+
+/**
+Adds a TMsvSendErrorAction object.
+
+If a TMsvSendErrorAction already exists in the collection for the same error,
+then it is replaced by aAction.
+
+@param aErrorAction
+Error action to add.
+
+@leave Any error code but KErrNone and KErrNotFound
+We tried to delete the error action if it already exists and
+RemoveSendErrorAction() returned an error.
+
+@leave KErrAlreadyExists
+A duplicate was found when inserting the error action in the array.
+*/
+
+EXPORT_C void CMsvSendErrorActions::AddSendErrorActionL(const TMsvSendErrorAction& aErrorAction)
+ {
+ //Delete the error if it already exists.
+ TInt error = RemoveSendErrorAction(aErrorAction.iError);
+
+ if (error != KErrNone && error != KErrNotFound)
+ {
+ User::Leave(error);
+ }
+
+ TInt offSet = _FOFF(TMsvSendErrorAction, iError);
+ TKeyArrayFix key(offSet, ECmpTInt);
+
+ //Insert the error action into the array of errors sorted by iError.
+ //No duplicates allowed
+ iErrors->InsertIsqL(aErrorAction, key);
+ }
+
+
+/**
+Gets an error action for a specified error.
+
+@param aError
+Error to find.
+
+@param aErrorAction
+On return, the corresponding TMsvSendErrorAction.
+
+@return KErrNotFound if there is no corresponding TMsvSendErrorAction
+for aError.
+*/
+
+EXPORT_C TInt CMsvSendErrorActions::GetSendErrorAction(const TInt aError, TMsvSendErrorAction& aErrorAction) const
+ {
+ TInt index = 0;
+ TInt error = Find(aError, index);
+
+ if (error == KErrNone)
+ {
+ aErrorAction = iErrors->At(index);
+ }
+
+ return error;
+ }
+
+
+/*
+ Find
+
+ Returns the index of the TMsvSendErrorAction in iErrors where
+ TMsvSendErrorAction::iError == aError.
+
+ Return KErrNotFound if the aError is not found in iErrors
+*/
+
+TInt CMsvSendErrorActions::Find(const TInt aError, TInt& aIndex) const
+ {
+ TMsvSendErrorAction tempAction;
+ tempAction.iError = aError;
+
+ TInt offSet = _FOFF(TMsvSendErrorAction, iError);
+ TKeyArrayFix key(offSet, ECmpTInt);
+
+ TInt found = iErrors->FindIsq(tempAction, key, aIndex);
+
+ if (found != 0) //Not Found
+ {
+ return KErrNotFound;
+ }
+
+ return KErrNone;
+ }
+
+
+/**
+Removes an error action.
+
+@param aError
+Error to remove.
+
+@return KErrNotFound if there is no corresponding TMsvSendErrorAction for
+aError
+*/
+
+EXPORT_C TInt CMsvSendErrorActions::RemoveSendErrorAction(const TInt aError)
+ {
+ TInt index = 0;
+
+ const TInt error = Find(aError, index);
+
+ if (error == KErrNone)
+ {
+ iErrors->Delete(index);
+ }
+
+ return error;
+ }
+
+
+
+
+/**
+Restores the object from a resource.
+
+The resource must be of type SEND_ERROR_ACTIONS.
+
+@param aReader
+Resource reader at appropriate resource.
+
+@leave AddSendErrorActionL()
+*/
+
+EXPORT_C void CMsvSendErrorActions::RestoreFromResourceL(TResourceReader& aReader)
+ {
+ iErrors->Reset();
+
+ RestoreErrorActionL(aReader, 1, ETrue);
+
+ TInt actionTotal = aReader.ReadInt16();
+
+ RestoreErrorActionL(aReader, actionTotal, EFalse);
+ }
+
+
+void CMsvSendErrorActions::RestoreErrorActionL(TResourceReader& aReader, TInt aActionCount, const TBool aDefault)
+ {
+ while (aActionCount--)
+ {
+ TInt actionFlags = aReader.ReadInt8();
+ TMsvSendErrorAction errorAction;
+
+ errorAction.iAction = (TMsvSendAction) (actionFlags & KActionMask);
+ errorAction.iRetries = (TMsvSendRetries) (actionFlags & KRetriesMask);
+ errorAction.iRetrySpacing = (TMsvSendRetrySpacing) (actionFlags & KRetrySpacingMask);
+
+ errorAction.SetMaxRetries((TInt16) aReader.ReadInt16());
+
+ TInt errorCount = aReader.ReadInt16();
+
+ while (errorCount--)
+ {
+ errorAction.iError = aReader.ReadInt32();
+ aDefault ? SetDefault(errorAction) : AddSendErrorActionL(errorAction);
+ }
+ }
+ }
+
+
+
+/**
+Gets the object's array of error-actions.
+
+@return The object's array of error-actions
+*/
+
+EXPORT_C const CArrayFixFlat<TMsvSendErrorAction>& CMsvSendErrorActions::Errors() const
+ {
+ return *iErrors;
+ }
+
+
+/**
+Sets the object to an array of error-actions.
+
+@param aErrors
+Array to use.
+
+@leave AddSendErrorActionL()
+*/
+
+EXPORT_C void CMsvSendErrorActions::SetErrorsL(const CArrayFixFlat<TMsvSendErrorAction>& aErrors)
+ {
+ iErrors->Reset();
+
+ const TInt count = aErrors.Count();
+
+ for (TInt i = 0; i < count; i++)
+ {
+ AddSendErrorActionL(aErrors[i]);
+ }
+ }
+
+
+/**
+Gets the default error-action.
+
+The default is used if a specified error-action is not found for the error.
+
+@return Default error-action
+*/
+
+EXPORT_C const TMsvSendErrorAction& CMsvSendErrorActions::Default() const
+ {
+ return iDefault;
+ }
+
+
+/**
+Sets the default error-action.
+
+@param aAction
+Default error-action.
+*/
+
+EXPORT_C void CMsvSendErrorActions::SetDefault(const TMsvSendErrorAction& aAction)
+ {
+ iDefault = aAction;
+ }
+