mobilemessaging/mmsui/viewersrc/MmsViewerOperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/mmsui/viewersrc/MmsViewerOperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2004-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:  
+*       CMmsViewerOperation
+*
+*/
+
+
+
+// ========== INCLUDE FILES ================================
+#include <e32std.h>
+
+#include "MmsMtmConst.h"	// For logging support
+
+#include "MmsViewerOperation.h"
+
+// ========== EXTERNAL DATA STRUCTURES =====================
+
+// ========== EXTERNAL FUNCTION PROTOTYPES =================
+
+// ========== CONSTANTS ====================================
+
+// ========== MACROS =======================================
+
+// ========== LOCAL CONSTANTS AND MACROS ===================
+
+// ========== MODULE DATA STRUCTURES =======================
+
+// ========== LOCAL FUNCTION PROTOTYPES ====================
+
+// ========== LOCAL FUNCTIONS ==============================
+#ifdef CANCEL_TEST_CODE
+// ---------------------------------------------------------
+// Testing code of Cancel
+// ---------------------------------------------------------
+//
+class CHighOperation : public CActive
+    {
+    public: 
+        virtual ~CHighOperation()
+            {
+            Cancel();
+            }
+
+        CHighOperation( CMmsViewerOperation&    aObserver,
+                        TInt                    aUseRandomCancel );
+        void CompleteSelf();
+
+        /**
+        * From CActive
+        */
+        void RunL();
+
+        /**
+        * From CActive
+        */
+        void DoCancel();
+            
+    public:
+        CMmsViewerOperation&    iObserver;
+        TInt                    iUseRandomCancel;
+    };
+
+CHighOperation::CHighOperation( CMmsViewerOperation&    aObserver,
+                                TInt                    aUseRandomCancel ): 
+    CActive( EPriorityStandard ),
+    iObserver( aObserver ),
+    iUseRandomCancel( aUseRandomCancel )
+    {
+    CActiveScheduler::Add( this );
+    if ( iUseRandomCancel > 100 )
+        {
+        SetPriority( EPriorityStandard + 1);
+        }
+    if ( iUseRandomCancel < 100 )
+        {
+        SetPriority( EPriorityStandard - 1);
+        }
+    }
+void CHighOperation::CompleteSelf()
+    {
+    iStatus = KRequestPending;
+    TRequestStatus* pStatus = &iStatus;
+    SetActive();
+    User::RequestComplete( pStatus, KErrNone );
+    }
+
+void CHighOperation::RunL()
+    {
+    if ( iUseRandomCancel > 100 )
+        {
+        iObserver.Cancel();
+        }
+    else
+        {
+        /*// probability determines frequency
+        TTime myTime;
+        myTime.HomeTime();
+        TTimeIntervalMicroSeconds micros = myTime.MicroSecondsFrom( 0 ); 
+        TInt fraction = (TInt)micros.Int64()%99;
+        if ( fraction < 0 )
+            fraction = 0 - fraction;
+        if ( fraction < iUseRandomCancel )
+            {
+            iObserver.Cancel();
+            }*/
+        iObserver.Cancel();
+        }
+        
+    /*if ( iUseRandomCancel <= 100 )
+        {
+        CompleteSelf();
+        }*/
+    }
+            
+        /**
+        * From CActive
+        */
+void CHighOperation::DoCancel()
+    {
+    }
+
+
+#endif
+
+// ========== MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------
+// CMmsViewerOperation::CMmsViewerOperation
+//
+// Constructor.
+// ---------------------------------------------------------
+//
+CMmsViewerOperation::CMmsViewerOperation(
+        MMmsViewerOperationObserver& aObserver,
+        CMmsViewerDocument& aDocument,
+        RFs& aFs ) :
+    CActive( EPriorityStandard ),
+    iObserver( aObserver ),
+    iDocument( aDocument ),
+    iFs( aFs )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------
+// CMmsViewerOperation::CMmsViewerOperation
+//
+// Destructor.
+// ---------------------------------------------------------
+//
+CMmsViewerOperation::~CMmsViewerOperation()
+    {
+#ifdef CANCEL_TEST_CODE
+    delete iHighOp;
+#endif
+    }
+
+// ---------------------------------------------------------
+// CompleteSelf
+//
+// Sets current operation active and completes it
+// ---------------------------------------------------------
+//
+void CMmsViewerOperation::CompleteSelf( TInt aError )
+    {
+    iStatus = KRequestPending;
+    SetActive();
+    TRequestStatus* pStatus = &iStatus;
+    User::RequestComplete( pStatus, aError );
+    }
+
+// ---------------------------------------------------------
+// SetActiveNoCompleteSelf
+//
+// Sets active but does not complete
+// ---------------------------------------------------------
+//
+void CMmsViewerOperation::SetActiveNoCompleteSelf( )
+    {
+    iStatus = KRequestPending;
+    SetActive();
+    }
+
+// ---------------------------------------------------------
+// CompleteActiveSelf
+//
+// Completes already active operation
+// ---------------------------------------------------------
+//
+void CMmsViewerOperation::CompleteActiveSelf( TInt aError )
+    {
+    LOGTEXT(_L8("MMSE: CMmsViewerOperation::CompleteActiveSelf"));
+    // When CActive based operation is completed, User::RequestComplete sets 
+    // iStatus to KRequestPending. Then User::RequestComplete calls RThread::RequestComplete(),
+    // which copies aReason to iStatus. 
+    // Operation stays active just until RunL() is called. When RunL() is running,
+    // operation is no more active.
+    // When RunL() is not yet called and operation is still active, we know that 
+    // operation is NOT completed, if iStatus == KRequestPending. 
+    // Note also that if operation has been completed by CompleteSelf(),
+    // and Cancel is called(), Cancel() 'eats' the active object. RunL() is not more called.
+    if (    IsActive() 
+        &&  iStatus == KRequestPending )
+        {
+        TRequestStatus* pStatus = &iStatus;
+        User::RequestComplete( pStatus, aError );
+        }
+    }
+
+// ---------------------------------------------------------
+// IsCompleted
+// ---------------------------------------------------------
+//
+TBool CMmsViewerOperation::IsCompleted( )
+    {
+    return ( IsActive() &&  iStatus != KRequestPending );
+    }
+    
+// ---------------------------------------------------------
+// IsCompleted
+// ---------------------------------------------------------
+//
+#ifdef CANCEL_TEST_CODE
+void CMmsViewerOperation::LaunchCancelTestL( TInt aUseRandomCancel )
+    {
+    if ( !iHighOp )
+        {
+        iHighOp = new (ELeave) CHighOperation( *this, aUseRandomCancel );
+        iHighOp->CompleteSelf();
+        }
+    }
+
+void CMmsViewerOperation::CancelCancelTest( )
+    {
+    if ( iHighOp )
+        iHighOp->Cancel();
+    delete iHighOp;
+    iHighOp = NULL;
+    }
+
+#endif    
+
+
+// EOF