diff -r 000000000000 -r 72b543305e3a mmsengine/mmsserver/src/mmsreadreport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsengine/mmsserver/src/mmsreadreport.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2006-2006 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: operation for sending a read report +* +*/ + + + +#include +#include + +#include "mmsreadreport.h" +#include "mmsheaders.h" +#include "mmsservercommon.h" +#include "mmsserverentry.h" +#include "mmsencode.h" +#include "mmserrors.h" +#include "mmssettings.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CMmsReadReport::CMmsReadReport( RFs& aFs ): + CMmsBaseOperation( aFs ) + { + // + // members that get initial value 0, need not be intialized here + // + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CMmsReadReport::ConstructL( CMmsSettings* aMmsSettings ) + { + CMmsBaseOperation::ConstructL( aMmsSettings ); + iMmsHeaders = CMmsHeaders::NewL( iMmsSettings->MmsVersion() ); + CActiveScheduler::Add( this ); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CMmsReadReport* CMmsReadReport::NewL( RFs& aFs, CMmsSettings* aMmsSettings ) + { + CMmsReadReport* self = new( ELeave ) CMmsReadReport( aFs ); + CleanupStack::PushL( self ); + self->ConstructL( aMmsSettings ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CMmsReadReport::~CMmsReadReport() + { + Cancel(); // has to be called first + delete iMmsHeaders; + } + +// --------------------------------------------------------- +// +// --------------------------------------------------------- +// +CMsvEntrySelection& CMmsReadReport::Failed() const + { + return *iFailed; + } + +// --------------------------------------------------------------------------- +// From class CMmsBaseOperation +// +// --------------------------------------------------------------------------- +// +void CMmsReadReport::StartL( + CMsvEntrySelection& aSelection, + CMsvServerEntry& aServerEntry, + TMsvId aService, + TRequestStatus& aStatus ) + { +#ifndef _NO_MMSS_LOGGING_ + TMmsLogger::Log( _L("CMmsReadReport::StartL") ); +#endif + // initialize common variables + CMmsBaseOperation::InitializeL( aSelection, aServerEntry, aService ); + iMmsHeaders->Reset(); + + if ( iCurrentMessageNo < 1 ) + { + // nothing to send. Give up immediately + aStatus = KRequestPending; + TRequestStatus* status = &aStatus; + User::RequestComplete( status, KErrNotFound ); + return; + } + + Queue( aStatus ); + FallThrough(); + } + +// --------------------------------------------------------------------------- +// From class CActive +// +// --------------------------------------------------------------------------- +// +void CMmsReadReport::DoCancel() + { + #ifndef _NO_MMSS_LOGGING_ + TMmsLogger::Log( _L("CMmsReadReport::DoCancel") ); + #endif + CMmsBaseOperation::DoCancel(); + + // Unhandled entries are deleted in CMmsServerMtm::UpdateEntriesL() + } + + +// --------------------------------------------------------- +// From class CMsgActive +// +// --------------------------------------------------------- +// +void CMmsReadReport::DoComplete( TInt& aError ) + { + +#ifndef _NO_MMSS_LOGGING_ + TMmsLogger::Log( _L("CMmsReadReport DoComplete")); +#endif + // We should get here if we are cancelled, or if + // the cycle has completed (with or without error) + + // Only final cleanup can be done here, nothing asychronous is allowed + + if ( aError == KMmsErrorOfflineMode ) + { + // if we cannot connect, read report is not sent + // It will not be retried. + aError = KErrNone; + } + + // Normally we are not supposed to have anything in the failed list + // Even if read report sending fails, entries are deleted. + // Read report sending is "best effort" only, no retries. + UnSetSendMask( *iFailed, aError ); + + } + +// --------------------------------------------------------------------------- +// From class CMmsBaseOperation +// +// --------------------------------------------------------------------------- +// +void CMmsReadReport::EncodePDUL() + { + #ifndef _NO_MMSS_LOGGING_ + TMmsLogger::Log( _L("CMmsReadReport::EncodePDU") ); + #endif + + if( iError != KErrNone ) + { + FallThrough(); + return; + } + // Encode the PDU to be sent to MMSC + // + // Set entry's context to next message in the selection + // + iError = iServerEntry->SetEntry( iSelection->At( iCurrentMessageNo - 1 ) ); + if( iError != KErrNone ) + { + FallThrough(); + return; + } + + CMsvStore* store = NULL; + TRAP( iError, store = iServerEntry->ReadStoreL(); ) + if ( iError != KErrNone ) + { + FallThrough(); + return; + } + CleanupStack::PushL( store ); + + // + // Filling headers object from the data in the MessageStore + // + iMmsHeaders->RestoreL( *store ); + iMmsHeaders->SetMessageType( KMmsMessageTypeReadRecInd ); + CleanupStack::PopAndDestroy( store ); + store = NULL; + + iError = iEntryWrapper->SetCurrentEntry( iSelection->At( iCurrentMessageNo - 1 ) ); + if ( iError != KErrNone ) + { + FallThrough(); + } + else + { + iEncoder->EncodeHeadersL( *iMmsHeaders, *iEncodeBuffer ); + FallThrough(); + } + + } + + +// --------------------------------------------------------------------------- +// From class CMmsBaseOperation +// +// --------------------------------------------------------------------------- +// +void CMmsReadReport::MoveEntryL() + { + #ifndef _NO_MMSS_LOGGING_ + TMmsLogger::Log( _L( "CMmsReadReport::MoveEntryL" ) ); + #endif + + // The entry will be just deleted - no need to report failure + TInt error = KErrNone; + error = iServerEntry->SetEntry( iSelection->At( iCurrentMessageNo - 1 ) ); + if ( error == KErrNone ) + { + TMsvEntry entry = iServerEntry->Entry(); + error = iServerEntry->SetEntry( entry.Parent() ); + + if ( error == KErrNone ) + { + // Delete entry + error = iServerEntry->DeleteEntry( entry.Id() ); + } + if ( error == KErrNone ) + { + // Everything has been originally appended to the failed list + // If an entry was successfully deleted, it is removed from + // the list. The rest will be deleted in MMS Server MTM - + // or garbage collected later. + iFailed->Delete( iCurrentMessageNo - 1 ); + } + } + + iServerEntry->SetEntry( KMsvNullIndexEntryId ); + FallThrough(); + + } +