diff -r f0f2b8682603 -r 3ff3fecb12fe sysanadatacapture/piprofiler/piprofiler/engine/inc/WriterPluginLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysanadatacapture/piprofiler/piprofiler/engine/inc/WriterPluginLoader.h Thu Feb 11 15:52:57 2010 +0200 @@ -0,0 +1,307 @@ +/* +* Copyright (c) 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: +* +*/ + + +#ifndef WRITERPLUGINLOADER_H +#define WRITERPLUGINLOADER_H + +// INCLUDES +#include +#include +#include +#include +#include + +// CONSTANTS + +// Value for a to b comparison result when logically a == b. +const TInt KWriterComparisonEqual = 0; + +// Value for a to b comparison result when logically a < b. +const TInt KWriterComparisonBefore = -1; + +// Value for a to b comparison result when logically a > b. +const TInt KWriterComparisonAfter = 1; + +// CLASS DEFINITIONS +class CWriterPluginInterface; +class MWriterPluginLoadObserver; +class REComSession; + +/** +* CWriterPluginLoader. Mechanism used to load plugins asynchronously. Uses +* MWriterPluginLoadObserver as a callback. +* +* @lib ProfilerEngine.exe/.lib??????????? +* @since Series60_30.1 +*/ +class CWriterPluginLoader : public CActive + { + public: // Constructor and destructor + + /** + * Two-phased constructor. + * + * @param aAppUi Pointer to application UI. Does not take ownership. + */ + static CWriterPluginLoader* NewL(); + + /** + * Destructor + */ + ~CWriterPluginLoader(); + + private: // Internal construction + + /** + * Default C++ contructor + */ + CWriterPluginLoader(); + + /** + * Symbian OS default constructor + * @return void + */ + void ConstructL(); + + public: // API + + /** + * Starts loading GS plug-ins asynchronously. Will call + * MWriterPluginLoadObserver::HandlePluginLoaded() each time a plug-in is + * loaded and when all plugins are loaded. + * + * CWriterPluginLoader transfers the ownership of each loaded plugin view to + * CAknViewAppUi. It is client's responsibility to remove the views from + * CAknViewAppUi and delete the plugins if necessary. + * + * @param aInterfaceUid Uid ofthe interfaces to be loaded. + * @param aParentUid Uid of the parent. Only children of this parent + * will be loaded. + * @param aPluginArray An array for the loaded GS plug-ins. + * CWriterPluginLoader does not take the ownership of this array. + */ + void LoadAsyncL( CArrayPtrFlat* aPluginArray ); + + /** + * Load a specific plugin instance synchronously. + * + * @param aInterfaceUid Uid ofthe interfaces to be loaded. + * @param aImplementationUid Uid of the implementation to load + */ + CWriterPluginInterface& LoadSyncL( TUid aImplementationUid ); + + /** + * Sets observer for this loader. Only one observer per loader in one + * time is possible. + */ + void SetObserver(MWriterPluginLoadObserver* aObserver); + + /** + * Aborts asynchronous loading of the GS plug-ins. + */ + void AbortAsyncLoad(); + + /** + * Sorts the plugin array. + * + * Sorting criterias: + * + * 1. Order number if provider category is Internal. + * 2. Provider category. Precedence as follows: + * 3. Alphabetical + * + * @param aPlugins The array which will be sorted. + */ + void SortPluginsL( CArrayPtrFlat* aPlugins ); + + private: // Internal methods + + /** + * Starts loading next plugin. + */ + void LoadNextPluginL(); + + /** + * Creates a plugin instance from given UID. Ownership is transferred. + */ + CWriterPluginInterface& CreatePluginInstanceL( + const CImplementationInformation& aImpInfo ); + + /** + * Notifies MGSPluginLoadObserver. + */ + void NotifyProgress(); + + /** + * Notifies MGSPluginLoadObserver. + */ + void NotifyFinished(); + + /** + * Wait for the next round of CActive execution. + */ + void CompleteOwnRequest(); + + // Insertion function used by sorting: + + /** + * Inserts plugin in the correct position in the array using sorting + * criterias. Assumes aPlugins is ordered. + * + * @param aPlugin The plugin to be inserted. + * @param aPlugins Array in which the plugin is inserted into the + * corresponding location. + */ + void InsertPluginInOrderL( + CWriterPluginInterface* aPlugin, + CArrayPtrFlat* aPlugins ); + + // Comparison functions: + + /** + * Compares plugins according to comparison criterias. + * + * Note: GS internal comparison constants such as KGSComparisonEqual are + * different from the ones outputted by this function. This is because + * this function is also usable by RArray sort -functionality but BC + * cannot be broken in GS. + * + * @return Negative value: If aFirst before aSecond. + * 0: If equal. + * Positive value: If aSecond before aFirst. + */ + static TInt Compare( const CWriterPluginInterface& aFirst, + const CWriterPluginInterface& aSecond ); + + /** + * + * @return KGSComparisonEqual = equal indexes + * KGSComparisonBefore = aFirst is before aSecond + * KGSComparisonAfter = aFirst is after aSecond + */ + + static TInt CompareIndex( + const CWriterPluginInterface& aFirst, + const CWriterPluginInterface& aSecond ); + + private: // Utility methods + + /** + * Parses descriptor to UID. + */ + static TInt ParseToUid( const TDesC8& aSource, TUid& aTarget ); + + /** + * Parsers plugin's order number + */ + static TInt ParseOrderNumber( const TDesC8& aSource, TInt& aOrderNumber ); + + /** + * Print debug information. + */ + static void PrintInfoDebug( const CImplementationInformation& aInfo, + TInt aIterator, + TInt aPluginCount ); + /** + * Print ordering debug data. + */ + void CWriterPluginLoader::PrintOrderTraces( + CArrayPtrFlat* aPlugins ); + + /** + * Display loading error popup message. + */ + void DisplayErrorPopupL( TInt aError, + const CImplementationInformation* aInfo ); + + private: // From CActive + + /** + * See base class. + */ + void RunL(); + + /** + * See base class. + */ + TInt RunError( TInt aError ); + + /** + * See base class. + */ + void DoCancel(); + + private: // Data + + + // Pluginloader goes through this array and loads the plugins into + // iPluginArray if they fulfill the criterias. + RImplInfoPtrArray iImplInfoArray; + + // Used as an iterator to maintain location in iImplInfoArray. + TInt iImplInfoArrayIterator; + + // Array of loaded plugins.Plugins are owned by iAppUi. Only the array + // pointers are owned by this class and therefore only reset array. + CArrayPtrFlat* iPluginArray; + + // Pointer to observer. Not owned. + MWriterPluginLoadObserver* iObserver; + + // Number of RunL calls. + TInt iRunLDebugCount; + }; + + +/** +* Interface for WriterPluginLoader observer. MWriterPluginLoadObserver gets +* notifications when plugins are loaded. +* +* @lib ProfilerEngine.exe/.lib??????????? +* @since Series60_30.1 +*/ + +class MWriterPluginLoadObserver + { + public: // Enums + enum KWriterPluginLoaderStatus + { + // One plugin loaded successfully, continue to next. + EWriterSuccess, + // Loading one plugin failed, contiue to next. + EWriterFail, + // Client called AbortAsyncLoad(), finished loading. + EWriterAborted, + // All plugins loaded successfully, finished loading. + EWriterFinished, + // Severe error with loader, finished loading. + EWriterError + }; + + public: // New + + //CWriterPluginLoader calls this function when each plug-in is loaded or + //loading is finished.. + + IMPORT_C virtual void HandlePluginLoaded( + KWriterPluginLoaderStatus aStatus ) = 0; + }; + + +#endif // WRITERPLUGINLOADER_H +// End of File