diff -r 000000000000 -r 72b543305e3a mobilemessaging/mmsui/viewersrc/MmsViewerOperation.cpp --- /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 + +#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