diff -r 4697dfb2d7ad -r 238255e8b033 messagingappbase/smsmtm/servermtm/src/SMSSchSend.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/smsmtm/servermtm/src/SMSSchSend.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -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 +#include + +#include "SMSSchSend.h" +#include + +#ifndef _MSG_NO_LOGGING +#include +#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& 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& 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& 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& numbers = iHeader->Recipients(); + TInt count = numbers.Count(); + + while (count--) + { + CSmsNumber* rcpt = numbers[count]; + + if (rcpt->Status() != CMsvRecipient::ESentSuccessfully) + { + rcpt->ResetRetries(); + } + } + } + +void CSmsScheduledEntry::RecipientsIncreaseRetries() + { + CArrayPtrFlat& numbers = iHeader->Recipients(); + TInt count = numbers.Count(); + + while (count--) + { + CSmsNumber* rcpt = numbers[count]; + + if (rcpt->Status() != CMsvRecipient::ESentSuccessfully) + { + rcpt->IncreaseRetries(); + } + } + } + +void CSmsScheduledEntry::RecipientsSetFailed() + { + CArrayPtrFlat& numbers = iHeader->Recipients(); + TInt count = numbers.Count(); + + while (count--) + { + CSmsNumber* rcpt = numbers[count]; + + if (rcpt->Status() != CMsvRecipient::ESentSuccessfully) + { + rcpt->SetStatus(CMsvRecipient::EFailedToSend); + } + } + }