diff -r b183ec05bd8c -r 19bba8228ff0 devicediagnosticsfw/diagpluginbase/src/diagsuitepluginbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnosticsfw/diagpluginbase/src/diagsuitepluginbase.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,460 @@ +/* +* Copyright (c) 2007 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: Class definition of CDiagSuitePluginBase +* +*/ + + +// CLASS DECLARATION +#include // CDiagSuitePluginBase + +// SYSTEM INCLUDE FILES +#include // REComSession +#include // CCoeEnv::Static() +#include // StringLoader +#include // CDiagPluginConstructionParam +#include // TDiagSuiteExecParam +#include // MDiagSuiteObserver +#include // LOGSTRING +#include // CDiagPluginWaitingDialogWrapper + +// USER INCLUDE FILES +#include "diagpluginbaseutils.h" // DiagPluginBaseUtils +#include "diagpluginbase.pan" // Panic Codes + + +// LOCAL TYPES +/** +* Internal private data class for CDiagSuitePluginBase +*/ +class CDiagSuitePluginBase::TPrivateData + { +public: + /** + * C++ Constructor + * All variables must be initialized here since this does not derive from + * CBase. + * Note that this class does not manage memory. Instead it is left to + * CDiagSuitePluginBase class to allocate/free memory. + */ + TPrivateData( CCoeEnv& aCoeEnv ) + : iDtorIdKey( TUid::Null() ), + iWaitingDialogWrapper( NULL ), + iChildren(), + iPluginResourceLoader( aCoeEnv ) + { + } + +public: // data + /** + * ECOM Destructor key. + */ + TUid iDtorIdKey; + + /** + * Wrapper class for displaying waiting dialogs. + * Ownership: Shared. Normally, dialog will dismiss itself. However, + * if plug-in is being deleted, it can be deleted by the plug-in as well. + */ + CDiagPluginWaitingDialogWrapper* iWaitingDialogWrapper; + + /** + * Array of children. + */ + RPointerArray iChildren; + + /** + * Resource loader for derived class resource. + */ + RConeResourceLoader iPluginResourceLoader; + }; + + +// ======== LOCAL FUNCTIONS ======== +// --------------------------------------------------------------------------- +// Compares two plug-ins by order number. +// --------------------------------------------------------------------------- +// +static TInt ComparePluginByOrder( const MDiagPlugin& aFirst, + const MDiagPlugin& aSecond ) + { + return aFirst.Order() - aSecond.Order(); + } + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::CDiagSuitePluginBase +// --------------------------------------------------------------------------- +// +EXPORT_C CDiagSuitePluginBase::CDiagSuitePluginBase( + CDiagPluginConstructionParam* aParam ) + : CActive( EPriorityStandard ), + iConstructionParam( aParam ), + iCoeEnv( *CCoeEnv::Static() ) + { + } + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::BaseConstructL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::BaseConstructL( const TDesC& aResourceFileName ) + { + iData = new ( ELeave ) TPrivateData( CoeEnv() ); + + DiagPluginBaseUtils::OpenResourceFileL( + aResourceFileName, iData->iPluginResourceLoader, CoeEnv().FsSession() ); + } + + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::~CDiagSuitePluginBase +// --------------------------------------------------------------------------- +// +EXPORT_C CDiagSuitePluginBase::~CDiagSuitePluginBase() + { + if ( iData ) + { + DismissWaitingDialog(); + iData->iChildren.Close(); + + if ( iData->iDtorIdKey != TUid::Null() ) + { + REComSession::DestroyedImplementation( iData->iDtorIdKey ); + } + + iData->iPluginResourceLoader.Close(); + + delete iData; + iData = NULL; + } + + delete iConstructionParam; + iConstructionParam = NULL; + } + +// --------------------------------------------------------------------------- +// from MDiagPlugin +// CDiagSuitePluginBase::ServiceLogicalName +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC& CDiagSuitePluginBase::ServiceLogicalName() const + { + return iConstructionParam->ServiceProvided(); + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::GetLogicalDependenciesL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::GetLogicalDependenciesL( + CPtrCArray& aArray ) const + { + aArray.CopyL( iConstructionParam->ServicesRequired() ); + } + + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::Type +// --------------------------------------------------------------------------- +// +EXPORT_C MDiagPlugin::TPluginType CDiagSuitePluginBase::Type() const + { + return ETypeSuitePlugin; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::CreateIconL +// --------------------------------------------------------------------------- +// +EXPORT_C CGulIcon* CDiagSuitePluginBase::CreateIconL() const + { + // Currently, GetTitleL() is not supported. + User::Leave( KErrNotSupported ); + return NULL; + } + + +// --------------------------------------------------------------------------- +// From MDiagTestPlugin +// CDiagSuitePluginBase::IsSupported +// --------------------------------------------------------------------------- +// +EXPORT_C TBool CDiagSuitePluginBase::IsSupported() const + { + return ETrue; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::ParentUid +// --------------------------------------------------------------------------- +// +EXPORT_C TUid CDiagSuitePluginBase::ParentUid() const + { + return iConstructionParam->ParentUid(); + } + + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::SetDtorIdKey +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::SetDtorIdKey( TUid aDtorIdKey ) + { + LOGSTRING2( "CDiagTestPluginBase::SetDtorIdKey: New=0x%x", + aDtorIdKey.iUid ) + + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + + iData->iDtorIdKey = aDtorIdKey; + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::GetTitleL +// --------------------------------------------------------------------------- +// +EXPORT_C HBufC* CDiagSuitePluginBase::GetTitleL() const + { + // Currently, GetTitleL() is not supported. + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::GetDescriptionL +// --------------------------------------------------------------------------- +// +EXPORT_C HBufC* CDiagSuitePluginBase::GetDescriptionL() const + { + // Currently, GetDescriptionL() is not supported. + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::CustomOperationL +// --------------------------------------------------------------------------- +// +EXPORT_C TAny* CDiagSuitePluginBase::CustomOperationL( TUid /*aUid*/, + TAny* /*aParam*/ ) + { + LOGSTRING( "CDiagTestPluginBase::CustomOperationL: KErrNotSupported" ) + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::GetCustomL +// --------------------------------------------------------------------------- +// +EXPORT_C TAny* CDiagSuitePluginBase::GetCustomL( TUid /* aUid */, + TAny* /*aParam*/ ) + { + LOGSTRING( "CDiagTestPluginBase::CustomOperationL: KErrNotSupported" ) + User::Leave( KErrNotSupported ); + return NULL; + } + +// --------------------------------------------------------------------------- +// From MDiagPlugin +// CDiagSuitePluginBase::Order +// --------------------------------------------------------------------------- +// +EXPORT_C TUint CDiagSuitePluginBase::Order() const + { + return iConstructionParam->Order(); + } + + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::GetChildrenL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::GetChildrenL( RPointerArray& aChildren, + TSortOrder aOrder ) const + { + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + __ASSERT_ALWAYS( (aOrder == ENotSorted || aOrder == ESortByPosition), + Panic( EDiagPluginBasePanicBadArgument ) ); + + TInt count = iData->iChildren.Count(); + for ( TInt i = 0; i < count; i++ ) + { + aChildren.AppendL( iData->iChildren[i] ); + } + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::AddChildL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::AddChildL( MDiagPlugin* aChild ) + { + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + + TLinearOrder order( *ComparePluginByOrder ); + User::LeaveIfError( iData->iChildren.InsertInOrderAllowRepeats( aChild, order ) ); + } + +// --------------------------------------------------------------------------- +// From MDiagTestPlugin +// CDiagSuitePluginBase::TestSessionBeginL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::TestSessionBeginL( + MDiagEngineCommon& /* aEngine */, + TBool /* aSkipDependencyCheck */, + TAny* /* aCustomParams */ ) + { + } + +// --------------------------------------------------------------------------- +// From MDiagTestPlugin +// CDiagSuitePluginBase::TestSessionEndL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::TestSessionEndL( + MDiagEngineCommon& /* aEngine */, + TBool /* aSkipDependencyCheck */, + TAny* /* aCustomParams */ ) + { + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::PrepareExecutionL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::PrepareChildrenExecutionL( + TDiagSuiteExecParam* aParam, + TBool /* aSkipDependencyCheck */, + TBool /* aDependencyExecution */) + { + CleanupStack::PushL( aParam ); + aParam->Observer().ContinueExecutionL( *this ); + CleanupStack::PopAndDestroy ( aParam ); + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::FinalizeExecutionL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::FinalizeChildrenExecutionL( + TDiagSuiteExecParam* aParam, + TBool /* aSkipDependencyCheck */, + TBool /* aDependencyExecution */ ) + { + CleanupStack::PushL( aParam ); + aParam->Observer().ContinueExecutionL( *this ); + CleanupStack::PopAndDestroy ( aParam ); + } + + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::GetChildrenUidsL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::GetChildrenUidsL( RArray& aUids, + TSortOrder aOrder ) const + { + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + __ASSERT_ALWAYS( (aOrder == ENotSorted || aOrder == ESortByPosition), + Panic( EDiagPluginBasePanicBadArgument ) ); + + TInt count = iData->iChildren.Count(); + for ( TInt i = 0; i < count; i++ ) + { + aUids.AppendL( iData->iChildren[i]->Uid() ); + } + } + +// --------------------------------------------------------------------------- +// From MDiagSuitePlugin +// CDiagSuitePluginBase::ExecutionStopL +// --------------------------------------------------------------------------- +// +EXPORT_C void CDiagSuitePluginBase::ExecutionStopL( TStopReason /* aReason */ ) + { + // Currently, GetTitleL() is not supported. + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::RunWaitingDialogLD +// --------------------------------------------------------------------------- +EXPORT_C TBool CDiagSuitePluginBase::RunWaitingDialogL( CAknDialog* aDialog, + TInt& aDialogResponse ) + { + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + + // this function can display only one dialog at a time. + __ASSERT_ALWAYS( iData->iWaitingDialogWrapper == NULL, + Panic( EDiagPluginBasePanicDialogAlreadyUp ) ); + + iData->iWaitingDialogWrapper = CDiagPluginWaitingDialogWrapper::NewL( aDialog ); + + TBool isUserResonse = iData->iWaitingDialogWrapper->RunLD( aDialogResponse ); + + if ( isUserResonse ) + { + // local variable can be accessed only if it was returned due to + // user response. + iData->iWaitingDialogWrapper = NULL; + } + + return isUserResonse; + } + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::DismissWaitingDialog +// --------------------------------------------------------------------------- +EXPORT_C void CDiagSuitePluginBase::DismissWaitingDialog() + { + __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) ); + + if ( iData->iWaitingDialogWrapper ) + { + LOGSTRING( "CDiagTestPluginBase::DismissWaitingDialog() Dialog dismissed." ) + delete iData->iWaitingDialogWrapper; + iData->iWaitingDialogWrapper = NULL; + } + } + +// --------------------------------------------------------------------------- +// CDiagSuitePluginBase::CoeEnv +// --------------------------------------------------------------------------- +// +EXPORT_C CCoeEnv& CDiagSuitePluginBase::CoeEnv() + { + return iCoeEnv; + } + +// End of File +