mobilemessaging/smsmtm/servermtm/src/SMSSchSend.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/smsmtm/servermtm/src/SMSSchSend.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,293 @@
+// 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:
+//
+
+#ifdef _DEBUG
+#undef _MSG_NO_LOGGING
+#endif
+
+#include <msvstd.h>
+#include <msventry.h>
+
+#include "SMSSchSend.h"
+#include <smutset.h>
+
+#ifndef _MSG_NO_LOGGING
+#include <flogger.h>
+#endif
+
+/*
+ *	CSmsScheduleSend Implementation
+ */
+ 
+CSmsScheduleSend* CSmsScheduleSend::NewL(CMsvServerEntry& aServerEntry)
+	{
+	CSmsScheduleSend* self = new (ELeave) CSmsScheduleSend(aServerEntry);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CSmsScheduleSend::CSmsScheduleSend(CMsvServerEntry& aServerEntry)
+	: CMsvScheduleSend(aServerEntry)
+	{
+	}
+
+/*
+Returns a pointer to a newly created CSmsScheduledEntry for a specified message.
+
+The CSmsScheduledEntry encapsulates the scheduling and recipient information
+relating to the message identified by aId.
+
+@param	Id
+The ID for the specified message.
+
+@return
+A pointer to the created CSmsScheduledEntry object,
+*/
+CMsvScheduledEntry* CSmsScheduleSend::GetMessageL(const TMsvId aId) const
+	{
+	//Set the iServerEntry to the message identified by aId
+	User::LeaveIfError(iServerEntry.SetEntry(aId));
+	
+	//Create a new CSmsScheduledEntry
+	CSmsScheduledEntry* entry = CSmsScheduledEntry::NewL(iServerEntry.Entry());
+	CleanupStack::PushL(entry);
+	CMsvStore* store = iServerEntry.ReadStoreL();
+	CleanupStack::PushL(store);
+	//Restore the entry from the message's store.
+	entry->RestoreL(*store);
+
+	CleanupStack::PopAndDestroy(store);
+	CleanupStack::Pop(entry);
+
+	return entry;
+	}
+
+/*
+ *	CSmsScheduledEntry Implementation
+ */
+
+CSmsScheduledEntry* CSmsScheduledEntry::NewL(const TMsvEntry& aEntry)
+	{
+	CSmsScheduledEntry* self = new (ELeave) CSmsScheduledEntry(aEntry);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CSmsScheduledEntry::CSmsScheduledEntry(const TMsvEntry& aEntry)
+	: CMsvScheduledEntry(aEntry)
+	{
+	}
+
+void CSmsScheduledEntry::ConstructL()
+	{
+	iParaLayer = CParaFormatLayer::NewL();
+	iCharLayer = CCharFormatLayer::NewL();
+	iRichText = CRichText::NewL( iParaLayer, iCharLayer, CEditableText::EFlatStorage, 256 );
+	iHeader = CSmsHeader::NewL(CSmsPDU::ESmsSubmit,*iRichText);
+	}
+
+CSmsScheduledEntry::~CSmsScheduledEntry()
+	{
+	// don't delete iRecipient
+	delete iHeader;
+	delete iRichText;
+	delete iCharLayer;
+	delete iParaLayer;
+	}
+
+void CSmsScheduledEntry::RecipientsStoreL(CMsvStore& aStore) const
+	{
+	iHeader->StoreL(aStore);
+	}
+
+void CSmsScheduledEntry::RecipientsRestoreL(CMsvStore& aStore)
+	{
+	iHeader->RestoreL(aStore);
+	}
+
+TBool CSmsScheduledEntry::CanSendToAnyRecipients(const TMsvSendErrorAction& aAction)
+	{
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+
+	TBool retVal = EFalse;
+
+	while (count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+
+		retVal |= CheckRecipient(*rcpt, aAction);
+		}
+
+	return retVal;
+	}
+
+TBool CSmsScheduledEntry::RecipientsAllSent() const
+	{
+	//Returns whether all recipients of this SMS have sent successfully.
+	//If there are NO recipients, then returns EFalse.
+
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+	TBool retVal = count;
+
+	while (retVal && count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+		retVal &= (rcpt->Status() == CMsvRecipient::ESentSuccessfully);
+		}
+
+	return retVal;
+	}
+
+TBool CSmsScheduledEntry::CheckRecipient(CSmsNumber& aRcpt, const TMsvSendErrorAction& aAction)
+	{
+#ifndef _MSG_NO_LOGGING
+	TPtrC address(aRcpt.Address());
+	RFileLogger::WriteFormat(KSchSendLogDir, KSchSendLogFile, EFileLoggingModeAppend,
+		_L("\t\tCSmsScheduledEntry::CheckRecipient() aRcpt %S: Status %d Retries %d, aAction: Action %d Retries %d MaxRetries %d"),
+		&address,
+		aRcpt.Status(),
+		aRcpt.Retries(),
+		aAction.iAction,
+		aAction.iRetries,
+		aAction.MaxRetries());
+#endif
+
+	TBool retVal = EFalse;
+
+	if (aRcpt.Status() != CMsvRecipient::ESentSuccessfully)
+		{
+		if (aAction.iAction == ESendActionSentAlready)
+			{
+			aRcpt.SetStatus(CMsvRecipient::ESentSuccessfully);
+			}
+		else if (aAction.iAction == ESendActionFail)
+			{
+			aRcpt.SetStatus(CMsvRecipient::EFailedToSend);
+			}
+		else if (aAction.iRetries == ESendRetriesInfinite || aRcpt.Retries() < aAction.MaxRetries())
+			{
+			aRcpt.SetStatus(CMsvRecipient::ENotYetSent);
+			retVal = ETrue;
+			}
+		else
+			{
+			aRcpt.SetStatus(CMsvRecipient::EFailedToSend);
+			}
+		}
+
+	return retVal;
+	}
+
+/**
+Returns ETrue if the message can still sent to any of its recipients.
+Otherwise returns EFalse.
+
+The appropriate error action is also returned. The error action determines if a
+particular recipient can be re-scheduled. The appropriate error action is given
+from the list of error actions, which defines the action for a particular error
+code.
+
+@param	aErrorActions
+The list of error actions that define what re-schedule is required for particular
+error codes.
+
+@param	aAction
+An output argument with the error action appropriate for the recipient send error.
+
+@return
+A boolean value indicatinng whether the message can be sent to any of its
+recipients.
+*/
+TBool CSmsScheduledEntry::CanSendToAnyRecipients(const CMsvSendErrorActions& aErrorActions, TMsvSendErrorAction& aAction)
+	{
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+
+	TBool retVal = EFalse;
+
+	while (count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+
+		TMsvSendErrorAction action;
+
+		if (aErrorActions.GetSendErrorAction(rcpt->Error(), action) != KErrNone)
+			{
+			action = aErrorActions.Default();
+			}
+
+		if (CheckRecipient(*rcpt, action))
+			{
+			retVal = ETrue;
+			aAction = action;
+			}
+		}
+
+	return retVal;
+	}
+
+void CSmsScheduledEntry::RecipientsResetRetries()
+	{
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+
+	while (count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+		
+		if (rcpt->Status() != CMsvRecipient::ESentSuccessfully)
+			{
+			rcpt->ResetRetries();
+			}
+		}
+	}
+
+void CSmsScheduledEntry::RecipientsIncreaseRetries()
+	{
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+
+	while (count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+		
+		if (rcpt->Status() != CMsvRecipient::ESentSuccessfully)
+			{
+			rcpt->IncreaseRetries();
+			}
+		}
+	}
+
+void CSmsScheduledEntry::RecipientsSetFailed()
+	{
+	CArrayPtrFlat<CSmsNumber>& numbers = iHeader->Recipients();
+	TInt count = numbers.Count();
+
+	while (count--)
+		{
+		CSmsNumber* rcpt = numbers[count];
+		
+		if (rcpt->Status() != CMsvRecipient::ESentSuccessfully)
+			{
+			rcpt->SetStatus(CMsvRecipient::EFailedToSend);
+			}
+		}
+	}