devicediagnosticsfw/diagframework/inc/diagpluginpoolimpl.h
branchRCL_3
changeset 26 19bba8228ff0
parent 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnosticsfw/diagframework/inc/diagpluginpoolimpl.h	Wed Sep 01 12:27:42 2010 +0100
@@ -0,0 +1,262 @@
+/*
+* 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:  Manages Diagnostics Plug-in
+*
+*/
+
+
+#ifndef DIAGPLUGINPOOLIMPL_H
+#define DIAGPLUGINPOOLIMPL_H
+
+// INCLUDES
+#include <e32base.h>                    // CActive
+#include <implementationinformation.h>  // RImplInfoPtrArray
+
+// FORWARD DECLARATIONS
+class MDiagPlugin;
+class MDiagPluginPoolObserver;
+class CDiagPluginConstructionParam;
+class MDiagSuitePlugin;   
+
+/**
+*  Diagnostics Framework Plugin Pool Implementation Class
+*
+*  This class is used to load Diagnostics ECom plug-ins. It works with both
+*  Suite Plug-in and Test Plug-in. Once loaded, it will manage the life
+*  cycle of the plug-ins.
+*
+*  All loaded plug-ins will be destroyed when pool is deleted.
+*
+*  @since S60 v5.0
+*/
+NONSHARABLE_CLASS( CDiagPluginPoolImpl ) : public CActive
+    {
+public:
+
+    /**
+    * Two-phased constructors
+    *
+    * @param aObserver     Plug-in Pool observer.
+    * @return New instance of CDiagPluginPool
+    */
+    static CDiagPluginPoolImpl* NewL( MDiagPluginPoolObserver& aObserver );
+    static CDiagPluginPoolImpl* NewLC( MDiagPluginPoolObserver& aObserver );
+
+    /**
+    * Destructor
+    *
+    */
+    virtual ~CDiagPluginPoolImpl();
+
+public:     // new API
+
+    /**
+    * Loads all plug-ins. Progress is notified via MDiagPluginPoolObserver.
+    * Leave codes:     KErrNone        - Success.
+    *                  KErrNotFound    - No plugins
+    *                  KErrAlreadyExists    - Plug-ins have already been loaded.
+    */
+    void LoadAsyncL();
+    
+    /**
+    * Create an instance of a plug-in. It can be a test plug-in or suite plug-in.
+    * If this is a suite, it will not have its children associated with it since
+    * will require children to be loaded as well.
+    *
+    * Plug-ins created using this method is not part of plug-in pool. Therefore
+    * client must manage the life cycle of the plug-in.
+    * 
+    * @param aUid - Implementation Uid of plug-in. 
+    * @return Newly instantiated plug-in. Ownership is transferred to caller.
+    */
+    static MDiagPlugin* CreatePluginL( const TUid aUid );
+
+    /**
+    * Find Plug-in that matches given Uid.
+    *
+    * @param aUid      Uid of plug-in to search.
+    * @param aPlugin   Reference to Plugin found. Engine owns this plug-in.
+    *                  Client must not deallocate plug-in.
+    * @return TInt     KErrNone        - Success.
+    *                  KErrNotFound    - Not found.
+    *                  KErrNotReady    - Plug-ins are not yet loaded.
+    */
+    TInt FindPlugin( TUid aUid, MDiagPlugin*& aPlugin ) const;
+
+    /**
+    * Find Plug-in that matches given service name.
+    *
+    * @param aServiceName  Service name of the plug-in. Name must match exactly.
+    * @param aPlugin       Reference to Plugin found. Engine owns this plug-in.
+    *                      Client must not deallocate plug-in.
+    * @return TInt         KErrNone        - Success.
+    *                      KErrNotFound    - Not found.
+    *                      KErrNotReady    - Plug-ins are not yet loaded.
+    */
+    TInt FindPlugin( const TDesC& aServiceName, 
+                             MDiagPlugin*& aPlugin ) const;      
+
+
+private:    // internal types                                   
+    typedef RPointerArray<CDiagPluginConstructionParam> RConstructionParamArray;        
+                             
+private:    // private constructors
+    
+    /**
+    * Construct a CDiagPluginPoolImpl object
+    *
+    * @param aObserver  The observer which listens to plug-in pool events
+    */
+    CDiagPluginPoolImpl( MDiagPluginPoolObserver& aObserver );
+    
+    /**
+    * 2nd phase constructor
+    *
+    */    
+    void ConstructL();  
+
+
+private: // internal API
+
+    /**
+    * Obtain the list construction paramaters to construct a plug-in
+    *    
+    * @return Pointer to construction paramaters pointer array
+    */    
+    static RConstructionParamArray* GeneratePluginListL();
+    
+    /**
+    * Generate parmaters to construct a plug-in given the ECOM implementation
+    * info structure
+    *
+    * @param aInfo  Pointer to the implementation info structure
+    * @return Pointer to newly generated construction params
+    */
+    
+    static CDiagPluginConstructionParam* GenerateConstructionParamsLC(
+            const CImplementationInformation* aInfo );
+            
+    /**
+    * Create a plug-in from given construction data
+    *
+    * @param aInfo  Pointer to the implementation info structure
+    * @return Pointer to the newly created plug-in
+    */
+    static MDiagPlugin* CreatePluginFromConstructionParamsL(
+            const CDiagPluginConstructionParam* aParams );                       
+
+    /**
+    * Setup active object for next iteration of plug-in loading
+    *    
+    */
+    void SetNextIteration();
+    
+    /**
+    * Load the next plug-in in the list per built in iterator
+    *    
+    */
+    void LoadNextPluginL();
+    
+    /**
+    * Add plug-in to plug-in pool by inserting into the plug-in tree.
+    * Plug-in ownership is transferred to the Plug-in Pool if it is
+    * supported.  If the plug-in is not supported, it is deleted.
+    *
+    * @param aPlugin pointer to the new plug-in to be added
+    * @return TUid UID of the plug-in to report back to the application.
+    * Set to TUid::Null() if the plug-in was not added to the pool.
+    */
+    TUid AddPluginToPoolLD( MDiagPlugin* aPlugin );
+    
+    /**
+    * Destroy implementation info regarding ECOM plug-ins
+    *    
+    */
+    void DestroyConstructionParams();            
+
+    /**
+    * Call when a plug-in is loaded to add a newly loaded plug-in to a currently 
+    * loaded suite (if available)
+    * no ownership transfer
+    *
+    * @param aPluginSuite pointer to the new plug-in to be added
+    */
+    void AddNewPluginToSuiteL(MDiagPlugin* aPlugin);
+    
+    /**
+    * Call when a suite is loaded to add any existing parentless plug-ins with
+    * matching parent UID to suite
+    * no ownership transfer
+    *
+    * @param aPluginSuite pointer to the new suite to be added
+    */
+    void AddPluginsToNewSuiteL(MDiagSuitePlugin* aPluginSuite);
+    
+    /**
+    * Resets all member data and notifies observer that load is copmlete
+    *
+    * @param aErrorCode Plug-In load error
+    * @return LoadCompletedL error, if any
+    */
+    TInt ResetAndNotify(TInt aErrorCode);
+
+
+private: // From CActive
+
+    /**
+    * @see CActive::RunL
+    */
+    virtual void RunL();
+
+    /**
+    * @see CActive::DoCancel
+    */
+    virtual void DoCancel();
+
+    /**
+    * @see CActive::RunError
+    */
+    virtual TInt RunError( TInt aError );
+
+private:    //  member data
+
+    MDiagPluginPoolObserver& iObserver;
+            
+    // List of plug-ins that have been loaded
+    RPointerArray<MDiagPlugin> iPlugins;        
+    
+    // Array of plug-in construction params        
+    // owned
+    RConstructionParamArray* iConstructionParamArray;
+    
+    // Indicates that all plug-ins have been loaded
+    TBool iPluginsLoaded;
+    
+    // Indicates that plug-ins are currently loading
+    TBool iPluginsLoading;
+            
+    // Index of current plug-in for plug-in load iteration
+    TInt iCurrentPluginIndex;            
+    
+    // Holds error code for first error found in loading process
+    TInt iErrorCode;
+    
+    // Total number of plug-ins found
+    TInt iTotalPluginsFound;
+    };
+    
+#endif // DIAGPLUGINPOOLIMPL_H
+
+// End of File
+