diff -r e9463401011b -r c1bd57533c56 commondrm/drmutility/src/DrmUiHandlingImpl.cpp --- a/commondrm/drmutility/src/DrmUiHandlingImpl.cpp Wed Sep 15 12:30:23 2010 +0300 +++ b/commondrm/drmutility/src/DrmUiHandlingImpl.cpp Wed Oct 13 14:51:23 2010 +0300 @@ -389,6 +389,10 @@ { DRM::CDrmUiHandlingData* data( PopFront() ); + // reset the current observer + // it may already be deleted so don't do any calls to it. + iObserver = NULL; + // Empty the queue: while ( data ) { @@ -1126,17 +1130,26 @@ break; } - // Complete the client request - iObserver->OperationCompleted( iOperationId, KErrNone ); - + // if the observer exists and it has not been deleted, call complete + // for the operation and get ready for another round + // this should prevent crashes in case the class is deleted before + // and operation finihes. + + if( iObserver && reinterpret_cast(iObserver) != 0xDEDEDEDE ) + { + // Complete the client request + iObserver->OperationCompleted( iOperationId, KErrNone ); + + // Get ready for another round: + SetActive(); + + // complete internal request: + User::RequestComplete( status, KErrNone ); + } + // destroy the object: CleanupStack::PopAndDestroy( data ); - // Get ready for another round: - SetActive(); - - // complete internal request: - User::RequestComplete( status, KErrNone ); } // -----------------------------------------------------------------------------