devicediagnosticsfw/diagpluginbase/src/diagsuitepluginbase.cpp
branchRCL_3
changeset 26 19bba8228ff0
parent 0 b497e44ab2fc
equal deleted inserted replaced
25:b183ec05bd8c 26:19bba8228ff0
       
     1 /*
       
     2 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Class definition of CDiagSuitePluginBase
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // CLASS DECLARATION
       
    20 #include <DiagSuitePluginBase.h>            // CDiagSuitePluginBase
       
    21 
       
    22 // SYSTEM INCLUDE FILES
       
    23 #include <ecom.h>                           // REComSession
       
    24 #include <coemain.h>                        // CCoeEnv::Static()
       
    25 #include <StringLoader.h>                   // StringLoader
       
    26 #include <DiagPluginConstructionParam.h>    // CDiagPluginConstructionParam
       
    27 #include <DiagSuiteExecParam.h>             // TDiagSuiteExecParam
       
    28 #include <DiagSuiteObserver.h>              // MDiagSuiteObserver
       
    29 #include <DiagFrameworkDebug.h>             // LOGSTRING
       
    30 #include <DiagPluginWaitingDialogWrapper.h> // CDiagPluginWaitingDialogWrapper
       
    31 
       
    32 // USER INCLUDE FILES
       
    33 #include "diagpluginbaseutils.h"            // DiagPluginBaseUtils
       
    34 #include "diagpluginbase.pan"               // Panic Codes
       
    35 
       
    36 
       
    37 // LOCAL TYPES
       
    38 /**
       
    39 * Internal private data class for CDiagSuitePluginBase
       
    40 */
       
    41 class CDiagSuitePluginBase::TPrivateData
       
    42     {
       
    43 public:
       
    44     /** 
       
    45     * C++ Constructor
       
    46     * All variables must be initialized here since this does not derive from
       
    47     * CBase.
       
    48     * Note that this class does not manage memory. Instead it is left to
       
    49     * CDiagSuitePluginBase class to allocate/free memory.
       
    50     */
       
    51     TPrivateData( CCoeEnv& aCoeEnv )
       
    52         :   iDtorIdKey( TUid::Null() ),
       
    53             iWaitingDialogWrapper( NULL ),
       
    54             iChildren(),
       
    55             iPluginResourceLoader( aCoeEnv )
       
    56         {
       
    57         }
       
    58 
       
    59 public: // data
       
    60     /**
       
    61     * ECOM Destructor key.
       
    62     */
       
    63     TUid iDtorIdKey;
       
    64 
       
    65     /**
       
    66     * Wrapper class for displaying waiting dialogs.
       
    67     * Ownership: Shared. Normally, dialog will dismiss itself. However,
       
    68     * if plug-in is being deleted, it can be deleted by the plug-in as well.
       
    69     */
       
    70     CDiagPluginWaitingDialogWrapper* iWaitingDialogWrapper;
       
    71 
       
    72     /**
       
    73     * Array of children.
       
    74     */
       
    75     RPointerArray<MDiagPlugin> iChildren;
       
    76 
       
    77     /**
       
    78     * Resource loader for derived class resource.
       
    79     */
       
    80     RConeResourceLoader iPluginResourceLoader;
       
    81     };
       
    82 
       
    83 
       
    84 // ======== LOCAL FUNCTIONS ========
       
    85 // ---------------------------------------------------------------------------
       
    86 // Compares two plug-ins by order number.
       
    87 // ---------------------------------------------------------------------------
       
    88 //
       
    89 static TInt ComparePluginByOrder( const MDiagPlugin& aFirst,
       
    90                                    const MDiagPlugin& aSecond )
       
    91     {
       
    92     return aFirst.Order() - aSecond.Order();
       
    93     }
       
    94 
       
    95 
       
    96 // ======== MEMBER FUNCTIONS ========
       
    97 
       
    98 // ---------------------------------------------------------------------------
       
    99 // CDiagSuitePluginBase::CDiagSuitePluginBase
       
   100 // ---------------------------------------------------------------------------
       
   101 //
       
   102 EXPORT_C CDiagSuitePluginBase::CDiagSuitePluginBase( 
       
   103         CDiagPluginConstructionParam* aParam )
       
   104     :   CActive( EPriorityStandard ),
       
   105         iConstructionParam( aParam ),
       
   106         iCoeEnv( *CCoeEnv::Static() )
       
   107     {
       
   108     }
       
   109 
       
   110 // ---------------------------------------------------------------------------
       
   111 // CDiagSuitePluginBase::BaseConstructL
       
   112 // ---------------------------------------------------------------------------
       
   113 //
       
   114 EXPORT_C void CDiagSuitePluginBase::BaseConstructL( const TDesC& aResourceFileName )
       
   115     {
       
   116     iData = new ( ELeave ) TPrivateData( CoeEnv() );
       
   117 
       
   118     DiagPluginBaseUtils::OpenResourceFileL(
       
   119         aResourceFileName, iData->iPluginResourceLoader, CoeEnv().FsSession() );
       
   120     }
       
   121 
       
   122 
       
   123 // ---------------------------------------------------------------------------
       
   124 // CDiagSuitePluginBase::~CDiagSuitePluginBase
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 EXPORT_C CDiagSuitePluginBase::~CDiagSuitePluginBase()
       
   128     {
       
   129     if ( iData )
       
   130         {
       
   131         DismissWaitingDialog();
       
   132         iData->iChildren.Close();
       
   133 
       
   134         if ( iData->iDtorIdKey != TUid::Null() )
       
   135             {
       
   136             REComSession::DestroyedImplementation( iData->iDtorIdKey );
       
   137             }
       
   138 
       
   139         iData->iPluginResourceLoader.Close();
       
   140 
       
   141         delete iData;
       
   142         iData = NULL;
       
   143         }
       
   144 
       
   145     delete iConstructionParam;
       
   146     iConstructionParam = NULL;
       
   147     }
       
   148 
       
   149 // ---------------------------------------------------------------------------
       
   150 // from MDiagPlugin
       
   151 // CDiagSuitePluginBase::ServiceLogicalName
       
   152 // ---------------------------------------------------------------------------
       
   153 //
       
   154 EXPORT_C const TDesC& CDiagSuitePluginBase::ServiceLogicalName() const
       
   155     {
       
   156     return iConstructionParam->ServiceProvided();
       
   157     }
       
   158 
       
   159 // ---------------------------------------------------------------------------
       
   160 // From MDiagPlugin
       
   161 // CDiagSuitePluginBase::GetLogicalDependenciesL
       
   162 // ---------------------------------------------------------------------------
       
   163 //
       
   164 EXPORT_C void CDiagSuitePluginBase::GetLogicalDependenciesL( 
       
   165         CPtrCArray& aArray ) const
       
   166     {
       
   167     aArray.CopyL( iConstructionParam->ServicesRequired() );
       
   168     }
       
   169 
       
   170 
       
   171 // ---------------------------------------------------------------------------
       
   172 // From MDiagPlugin
       
   173 // CDiagSuitePluginBase::Type
       
   174 // ---------------------------------------------------------------------------
       
   175 //
       
   176 EXPORT_C MDiagPlugin::TPluginType CDiagSuitePluginBase::Type() const
       
   177     {
       
   178     return ETypeSuitePlugin;
       
   179     }
       
   180 
       
   181 // ---------------------------------------------------------------------------
       
   182 // From MDiagPlugin
       
   183 // CDiagSuitePluginBase::CreateIconL
       
   184 // ---------------------------------------------------------------------------
       
   185 //
       
   186 EXPORT_C CGulIcon* CDiagSuitePluginBase::CreateIconL() const
       
   187     {
       
   188         // Currently, GetTitleL() is not supported.
       
   189         User::Leave( KErrNotSupported );
       
   190         return NULL;
       
   191     }
       
   192 
       
   193 
       
   194 // ---------------------------------------------------------------------------
       
   195 // From MDiagTestPlugin
       
   196 // CDiagSuitePluginBase::IsSupported
       
   197 // ---------------------------------------------------------------------------
       
   198 //
       
   199 EXPORT_C TBool CDiagSuitePluginBase::IsSupported() const
       
   200     {
       
   201     return ETrue;
       
   202     }
       
   203 
       
   204 // ---------------------------------------------------------------------------
       
   205 // From MDiagPlugin
       
   206 // CDiagSuitePluginBase::ParentUid
       
   207 // ---------------------------------------------------------------------------
       
   208 //
       
   209 EXPORT_C TUid CDiagSuitePluginBase::ParentUid() const
       
   210     {
       
   211     return iConstructionParam->ParentUid();
       
   212     }
       
   213 
       
   214 
       
   215 // ---------------------------------------------------------------------------
       
   216 // From MDiagPlugin
       
   217 // CDiagSuitePluginBase::SetDtorIdKey
       
   218 // ---------------------------------------------------------------------------
       
   219 //
       
   220 EXPORT_C void CDiagSuitePluginBase::SetDtorIdKey( TUid aDtorIdKey )
       
   221     {
       
   222     LOGSTRING2( "CDiagTestPluginBase::SetDtorIdKey: New=0x%x",
       
   223         aDtorIdKey.iUid )
       
   224 
       
   225     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   226 
       
   227     iData->iDtorIdKey = aDtorIdKey;
       
   228     }
       
   229 
       
   230 // ---------------------------------------------------------------------------
       
   231 // From MDiagSuitePlugin
       
   232 // CDiagSuitePluginBase::GetTitleL
       
   233 // ---------------------------------------------------------------------------
       
   234 //
       
   235 EXPORT_C HBufC* CDiagSuitePluginBase::GetTitleL() const
       
   236     {
       
   237     // Currently, GetTitleL() is not supported.
       
   238     User::Leave( KErrNotSupported );
       
   239     return NULL;
       
   240     }
       
   241 
       
   242 // ---------------------------------------------------------------------------
       
   243 // From MDiagSuitePlugin
       
   244 // CDiagSuitePluginBase::GetDescriptionL
       
   245 // ---------------------------------------------------------------------------
       
   246 //
       
   247 EXPORT_C HBufC* CDiagSuitePluginBase::GetDescriptionL() const
       
   248     {
       
   249     // Currently, GetDescriptionL() is not supported.
       
   250     User::Leave( KErrNotSupported );
       
   251     return NULL;
       
   252     }
       
   253 
       
   254 // ---------------------------------------------------------------------------
       
   255 // From MDiagPlugin
       
   256 // CDiagSuitePluginBase::CustomOperationL
       
   257 // ---------------------------------------------------------------------------
       
   258 //
       
   259 EXPORT_C TAny* CDiagSuitePluginBase::CustomOperationL( TUid /*aUid*/, 
       
   260                                                        TAny* /*aParam*/ )
       
   261     {
       
   262     LOGSTRING( "CDiagTestPluginBase::CustomOperationL: KErrNotSupported" )
       
   263     User::Leave( KErrNotSupported );
       
   264     return NULL;
       
   265     }
       
   266 
       
   267 // ---------------------------------------------------------------------------
       
   268 // From MDiagPlugin
       
   269 // CDiagSuitePluginBase::GetCustomL
       
   270 // ---------------------------------------------------------------------------
       
   271 //
       
   272 EXPORT_C TAny* CDiagSuitePluginBase::GetCustomL( TUid /* aUid */,
       
   273                                                  TAny* /*aParam*/ )
       
   274     {
       
   275     LOGSTRING( "CDiagTestPluginBase::CustomOperationL: KErrNotSupported" )
       
   276     User::Leave( KErrNotSupported );
       
   277     return NULL;
       
   278     }
       
   279 
       
   280 // ---------------------------------------------------------------------------
       
   281 // From MDiagPlugin
       
   282 // CDiagSuitePluginBase::Order
       
   283 // ---------------------------------------------------------------------------
       
   284 //
       
   285 EXPORT_C TUint CDiagSuitePluginBase::Order() const
       
   286     {
       
   287     return iConstructionParam->Order();
       
   288     }
       
   289 
       
   290 
       
   291 // ---------------------------------------------------------------------------
       
   292 // From MDiagSuitePlugin
       
   293 // CDiagSuitePluginBase::GetChildrenL
       
   294 // ---------------------------------------------------------------------------
       
   295 //
       
   296 EXPORT_C void CDiagSuitePluginBase::GetChildrenL( RPointerArray<MDiagPlugin>& aChildren,
       
   297                                                   TSortOrder aOrder ) const
       
   298     {
       
   299     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   300     __ASSERT_ALWAYS( (aOrder == ENotSorted || aOrder == ESortByPosition),
       
   301                      Panic( EDiagPluginBasePanicBadArgument ) );
       
   302                       
       
   303     TInt count = iData->iChildren.Count();
       
   304     for ( TInt i = 0; i < count; i++ )
       
   305         {
       
   306         aChildren.AppendL( iData->iChildren[i] );
       
   307         }
       
   308     }
       
   309 
       
   310 // ---------------------------------------------------------------------------
       
   311 // From MDiagSuitePlugin
       
   312 // CDiagSuitePluginBase::AddChildL
       
   313 // ---------------------------------------------------------------------------
       
   314 //
       
   315 EXPORT_C void CDiagSuitePluginBase::AddChildL( MDiagPlugin* aChild )
       
   316     {
       
   317     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   318 
       
   319     TLinearOrder<MDiagPlugin> order( *ComparePluginByOrder );
       
   320     User::LeaveIfError( iData->iChildren.InsertInOrderAllowRepeats( aChild, order ) );
       
   321     }
       
   322 
       
   323 // ---------------------------------------------------------------------------
       
   324 // From MDiagTestPlugin
       
   325 // CDiagSuitePluginBase::TestSessionBeginL
       
   326 // ---------------------------------------------------------------------------
       
   327 //
       
   328 EXPORT_C void CDiagSuitePluginBase::TestSessionBeginL( 
       
   329         MDiagEngineCommon& /* aEngine */,
       
   330         TBool /* aSkipDependencyCheck */,
       
   331         TAny* /* aCustomParams */ )
       
   332     {
       
   333     }
       
   334 
       
   335 // ---------------------------------------------------------------------------
       
   336 // From MDiagTestPlugin
       
   337 // CDiagSuitePluginBase::TestSessionEndL
       
   338 // ---------------------------------------------------------------------------
       
   339 //
       
   340 EXPORT_C void CDiagSuitePluginBase::TestSessionEndL( 
       
   341         MDiagEngineCommon& /* aEngine */,
       
   342         TBool /* aSkipDependencyCheck */,
       
   343         TAny* /* aCustomParams */ )
       
   344     {
       
   345     }
       
   346 
       
   347 // ---------------------------------------------------------------------------
       
   348 // From MDiagSuitePlugin
       
   349 // CDiagSuitePluginBase::PrepareExecutionL
       
   350 // ---------------------------------------------------------------------------
       
   351 //
       
   352 EXPORT_C void CDiagSuitePluginBase::PrepareChildrenExecutionL( 
       
   353         TDiagSuiteExecParam* aParam,
       
   354         TBool /* aSkipDependencyCheck */,
       
   355         TBool /* aDependencyExecution */)
       
   356     {
       
   357     CleanupStack::PushL( aParam );
       
   358     aParam->Observer().ContinueExecutionL( *this );
       
   359     CleanupStack::PopAndDestroy ( aParam );
       
   360     }
       
   361 
       
   362 // ---------------------------------------------------------------------------
       
   363 // From MDiagSuitePlugin
       
   364 // CDiagSuitePluginBase::FinalizeExecutionL
       
   365 // ---------------------------------------------------------------------------
       
   366 //
       
   367 EXPORT_C void CDiagSuitePluginBase::FinalizeChildrenExecutionL( 
       
   368         TDiagSuiteExecParam* aParam,
       
   369         TBool /* aSkipDependencyCheck */,
       
   370         TBool /* aDependencyExecution */ )
       
   371     {
       
   372     CleanupStack::PushL( aParam );
       
   373     aParam->Observer().ContinueExecutionL( *this );
       
   374     CleanupStack::PopAndDestroy ( aParam );
       
   375     }
       
   376 
       
   377 
       
   378 // ---------------------------------------------------------------------------
       
   379 // From MDiagSuitePlugin
       
   380 // CDiagSuitePluginBase::GetChildrenUidsL
       
   381 // ---------------------------------------------------------------------------
       
   382 //
       
   383 EXPORT_C void CDiagSuitePluginBase::GetChildrenUidsL( RArray<TUid>& aUids,
       
   384         TSortOrder aOrder ) const
       
   385     {
       
   386     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   387     __ASSERT_ALWAYS( (aOrder == ENotSorted || aOrder == ESortByPosition),
       
   388                      Panic( EDiagPluginBasePanicBadArgument ) );
       
   389 
       
   390     TInt count = iData->iChildren.Count();
       
   391     for ( TInt i = 0; i < count; i++ )
       
   392         {
       
   393         aUids.AppendL( iData->iChildren[i]->Uid() );
       
   394         }
       
   395     }
       
   396 
       
   397 // ---------------------------------------------------------------------------
       
   398 // From MDiagSuitePlugin
       
   399 // CDiagSuitePluginBase::ExecutionStopL
       
   400 // ---------------------------------------------------------------------------
       
   401 //
       
   402 EXPORT_C void CDiagSuitePluginBase::ExecutionStopL( TStopReason /* aReason */ )
       
   403     {
       
   404         // Currently, GetTitleL() is not supported.
       
   405         User::Leave( KErrNotSupported );
       
   406     }
       
   407 
       
   408 
       
   409 // ---------------------------------------------------------------------------
       
   410 // CDiagSuitePluginBase::RunWaitingDialogLD
       
   411 // ---------------------------------------------------------------------------
       
   412 EXPORT_C TBool CDiagSuitePluginBase::RunWaitingDialogL( CAknDialog* aDialog, 
       
   413         TInt& aDialogResponse )
       
   414     {
       
   415     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   416 
       
   417     // this function can display only one dialog at a time.
       
   418     __ASSERT_ALWAYS( iData->iWaitingDialogWrapper == NULL,
       
   419                      Panic( EDiagPluginBasePanicDialogAlreadyUp ) );
       
   420 
       
   421     iData->iWaitingDialogWrapper = CDiagPluginWaitingDialogWrapper::NewL( aDialog );
       
   422 
       
   423     TBool isUserResonse = iData->iWaitingDialogWrapper->RunLD( aDialogResponse );
       
   424 
       
   425     if ( isUserResonse )
       
   426         {
       
   427         // local variable can be accessed only if it was returned due to
       
   428         // user response.
       
   429         iData->iWaitingDialogWrapper = NULL;
       
   430         }
       
   431 
       
   432     return isUserResonse;
       
   433     }
       
   434 
       
   435 // ---------------------------------------------------------------------------
       
   436 // CDiagSuitePluginBase::DismissWaitingDialog
       
   437 // ---------------------------------------------------------------------------
       
   438 EXPORT_C void CDiagSuitePluginBase::DismissWaitingDialog()
       
   439     {
       
   440     __ASSERT_ALWAYS( iData, Panic( EDiagPluginBasePanicInvalidState ) );
       
   441 
       
   442     if ( iData->iWaitingDialogWrapper )
       
   443         {
       
   444         LOGSTRING( "CDiagTestPluginBase::DismissWaitingDialog() Dialog dismissed." )
       
   445         delete iData->iWaitingDialogWrapper;
       
   446         iData->iWaitingDialogWrapper = NULL;
       
   447         }
       
   448     }
       
   449 
       
   450 // ---------------------------------------------------------------------------
       
   451 // CDiagSuitePluginBase::CoeEnv
       
   452 // ---------------------------------------------------------------------------
       
   453 //
       
   454 EXPORT_C CCoeEnv& CDiagSuitePluginBase::CoeEnv() 
       
   455     {
       
   456     return iCoeEnv;
       
   457     }
       
   458 
       
   459 // End of File
       
   460