mmsengine/mmsserver/src/mmsreadreport.cpp
changeset 0 72b543305e3a
child 26 ebe688cedc25
--- /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();
+
+    }
+