--- /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 <msvstd.h>
+#include <msventry.h>
+
+#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();
+
+ }
+