diff -r 000000000000 -r 72b543305e3a messagingappbase/obexmtms/irmtm/irclient/source/CIRCancelObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingappbase/obexmtms/irmtm/irclient/source/CIRCancelObserver.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,125 @@ +// Copyright (c) 2004-2009 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: +// + +#include "CIRCancelObserver.h" + +/** +Standard 2-phase constructor. +@param aObserverRequestStatus Request status of the observer to be completed when the operation completes. +@param aSession Handle to an opened session with the message server. +@param aEntryId The entry id for the message for the IR operation. +@return Pointer to the newly created object. +*/ +CIRCancelObserver* CIRCancelObserver::NewL(TRequestStatus& aObserverRequestStatus, CMsvSession& aSession, TMsvId aEntryId) + { + CIRCancelObserver* me = new(ELeave) CIRCancelObserver(aObserverRequestStatus, aSession, aEntryId); + return me; + } + +CIRCancelObserver::CIRCancelObserver(TRequestStatus& aObserverRequestStatus, CMsvSession& aSession, TMsvId aEntryId) + :CMsvOperation(aSession, EPriorityStandard, aObserverRequestStatus), iEntryId(aEntryId) + { + CActiveScheduler::Add(this); + iObserverRequestStatus = KRequestPending; + SetActive(); + } + +/** +Default destructor. +*/ +CIRCancelObserver::~CIRCancelObserver() + { + Cancel(); + delete iMsvOperation; + } + +void CIRCancelObserver::RunL() + { + // The operation has completed, relay the status completion to the observer + TRequestStatus* observerStatus = &iObserverRequestStatus; + User::RequestComplete(observerStatus, iStatus.Int()); + } + +TInt CIRCancelObserver::RunError(TInt /*aError*/) + { + // The RunL does not leave + return KErrNone; + } + +void CIRCancelObserver::DoCancel() + { + // This is an explicit cancel from the user, cancel the operation and complete the client + if( iMsvOperation!=NULL ) + iMsvOperation->Cancel(); + TRequestStatus* st = &iObserverRequestStatus; + User::RequestComplete(st, KErrCancel); + + // If the operation is queued, clean up the entries + if(!iOperationStarted) + CleanupEntry(); + } + +void CIRCancelObserver::CleanupEntryL() const + { + // Delete the entry + CMsvEntry* entry = iMsvSession.GetEntryL(iEntryId); + CleanupStack::PushL(entry); + entry->DeleteL(iEntryId); + CleanupStack::PopAndDestroy(entry); + } + +void CIRCancelObserver::CleanupEntry() const + { + // Call leaving version of CleanupEntry and ignore any errors + TRAPD(err, CleanupEntryL()); + } + +void CIRCancelObserver::SetOperation(CMsvOperation* aMsvOperation) + { + __ASSERT_DEBUG(iMsvOperation==NULL, User::Invariant()); + + // Initialise the members now that we have the operation + iMsvOperation = aMsvOperation; + iMtm = iMsvOperation->Mtm(); + iService = iMsvOperation->Service(); + } + +TRequestStatus& CIRCancelObserver::Status() + { + return iStatus; + } + +const TDesC8& CIRCancelObserver::ProgressL() + { + __ASSERT_DEBUG(iMsvOperation!=NULL, User::Invariant()); + + // This call will leave if the operation is queued + const TDesC8& progressDes = iMsvOperation->ProgressL(); + + // Will only get to here when the operation has started so updated the flag if not already done + if(!iOperationStarted) + iOperationStarted = ETrue; + + return progressDes; + + } + +const TDesC8& CIRCancelObserver::FinalProgress() + { + __ASSERT_DEBUG(iMsvOperation!=NULL, User::Invariant()); + + return iMsvOperation->FinalProgress(); + } +