accessoryservices/accessoryserver/src/ASYProxy/ASYProxyAsyLoader.cpp
changeset 0 4e1aa6a622a0
child 20 1ddbe54d0645
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/ASYProxy/ASYProxyAsyLoader.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,474 @@
+/*
+* Copyright (c) 2002-2006 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:  Loader of ASYs
+*
+*/
+
+
+// INCLUDE FILES
+#include "ASYProxy.h"
+#include "ASYProxyAsyHandler.h"
+#include "acc_debug.h"
+#include <e32svr.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::CASYProxyAsyLoader
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CASYProxyAsyLoader::CASYProxyAsyLoader(
+                    CASYProxy* aAsyProxy ) :
+                        CActive( CActive::EPriorityStandard ),
+                        iListRet( EFalse ),
+                        iArrayItemCounter( 0 ),
+                        iStepToDo( EASYLoadingStepListInit ),
+                        iAsyProxy( aAsyProxy )
+
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::CASYProxyAsyLoader(0x%x)", &aAsyProxy );
+
+    CActiveScheduler::Add( this );
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::CASYProxyAsyLoader" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::ConstructL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ConstructL()" );
+
+    iTimer = CASYProxyLoaderTimer::NewL( this );
+    iTimer->StartTimer();
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ConstructL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CASYProxyAsyLoader* CASYProxyAsyLoader::NewL(
+                    CASYProxy* aAsyProxy )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::NewL(0x%x)", aAsyProxy );
+
+    CASYProxyAsyLoader* self = new (ELeave) CASYProxyAsyLoader( aAsyProxy );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::NewL - return 0x%x", self );
+
+    return self;
+    }
+
+// Destructor
+CASYProxyAsyLoader::~CASYProxyAsyLoader()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::~CASYProxyAsyLoader()" );
+
+    Cancel();
+    Cleanup();
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::~CASYProxyAsyLoader" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::DoCancel
+// Cancel of Active object
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::DoCancel()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoCancel()" );
+
+    // Cancel is called only from destructor
+    // Cleanup is called from destructor
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoCancel - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::DoCancel
+// Deletes own class members
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::Cleanup()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::Cleanup()" );
+
+    delete iTimer;
+    iTimer = NULL;
+
+    iImplUidsHandlerArray.Reset();
+    iServiceImplInfoArray.ResetAndDestroy();
+    iHandlerImplInfoArray.ResetAndDestroy();
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::Cleanup - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::RunL
+// Loading has been splitted to five section
+// Each of them are under time out control.
+// - case ListImplementations
+// - case CheckListValues
+// - case OrderImplementations
+// - case LoadASY
+// - case LoadingOver
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::RunL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::RunL()" );
+
+    User::LeaveIfError( iStatus.Int() );
+    
+    if ( iTimer && iTimer->IsActive() )
+        {
+        NextStep();
+        switch ( iStepToDo )
+            {
+            case EASYLoadingStepListImplementations :
+                    ListImplementationsL();
+                    SetActive();
+                    break;
+
+            case EASYLoadingStepOrderImplementations :
+                    ArrangeImplementationsL();
+                    SetActive();
+                    break;
+
+            case EASYLoadingStepLoadASY :
+                    DoIssueRequestL();
+                    SetActive();
+                    break;
+
+            case EASYLoadingOver :
+                    break;
+
+            default :
+                    // Nothing to do. Assert if it comes here.
+                    TRACE_ASSERT_ALWAYS;
+                    break;
+            }
+        }
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::RunL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::RunError
+// Returns KErrNone
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CASYProxyAsyLoader::RunError( TInt aError )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::RunError(%d)", aError );
+
+     // Avoid Panic in CActiveScheduler
+    aError = KErrNone;
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::RunError - return KErrNone" );
+
+    return aError;
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::IssueRequest
+// Starts the loading process of ASY
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::IssueRequest()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::IssueRequest()" );
+
+    SetActive();
+    TRequestStatus* ptrStat = &iStatus;
+    *ptrStat = KRequestPending;
+
+    User::RequestComplete( ptrStat, KErrNone );
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::IssueRequest - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyAsyLoader::DoIssueRequestL
+// Last step of loading process of ASY
+// Creates own CASYProxyASYHandler -object for each ASY to continue it's loading
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::DoIssueRequestL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoIssueRequest()" );
+    
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoIssueRequestL() - iArrayItemCounter == %d", iArrayItemCounter ); 
+
+    if ( iArrayItemCounter < iServiceImplInfoArray.Count() )
+        {
+        TRequestStatus* ptrStat = &iStatus;
+        *ptrStat = KRequestPending;
+
+        CASYProxyASYHandler* createdAccHandler = NULL;
+
+        // Starts new ASY creating
+        TRAPD( err, createdAccHandler = CASYProxyASYHandler::NewL(
+                iAsyProxy,
+                iArrayItemCounter,
+                iImplUidsHandlerArray.operator[]( iArrayItemCounter ),
+                *iServiceImplInfoArray[ iArrayItemCounter ]
+                ) );
+
+        COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoIssueRequest() - err == %d", err );
+		if ( createdAccHandler )
+			{
+			CleanupStack::PushL ( createdAccHandler );
+	        iAsyProxy->iAccHandlerArray.AppendL( createdAccHandler );
+	        iArrayItemCounter++;
+	        CleanupStack::Pop ( createdAccHandler );
+			}
+					
+        User::RequestComplete( ptrStat, err );
+        }
+     else 
+        {
+        User::Leave( KErrArgument );
+        }
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::DoIssueRequest - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxy::ListImplementationsL
+// List implementations for ASY by using RECom library
+//    - List service parts to iServiceImplInfoArray
+//    - List handler parts to iHandlerImplInfoArray
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::ListImplementationsL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ListImplementationsL()" );
+
+    TRequestStatus* ptrStat = &iStatus;
+    *ptrStat = KRequestPending;
+
+    TBufC8<KMaxImplementationInfoDataLength>
+            ASYPluginMainServiceName( ( TText8* ) KACCESSORYPLUGINAPIMAINSERVICE );
+
+    TBufC8<KMaxImplementationInfoDataLength>
+            ASYPluginHandlerName    ( ( TText8* ) KACCESSORYPLUGINAPIHANDLER );
+
+     // ASY interface_uid
+    TUid pluginInterfaceUid;
+    pluginInterfaceUid.iUid = KACCESSORYPLUGINAPIUID;
+
+    TEComResolverParams resolverParam;
+
+    // MainService
+    // -----------------------------------------------------
+    resolverParam.SetDataType( ASYPluginMainServiceName );
+    REComSession::ListImplementationsL( pluginInterfaceUid, 
+                                        resolverParam, 
+                                        iServiceImplInfoArray );
+
+    // Handler
+    // -----------------------------------------------------
+    resolverParam.SetDataType( ASYPluginHandlerName );
+    REComSession::ListImplementationsL( pluginInterfaceUid, 
+                                        resolverParam, 
+                                        iHandlerImplInfoArray );
+
+    iListRet = ( iServiceImplInfoArray.Count() > 0 ) ? ETrue : EFalse;
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::ListImplementationsL - count == %d", iServiceImplInfoArray.Count() );
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::ListImplementationsL - iListRet == %d", iListRet );
+
+    User::RequestComplete( ptrStat, KErrNone );
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ListImplementationsL - return void");
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxy::ArrangeImplementationsL
+// Arranges the listed implementations
+// 1. Find "Idle ASYs" ( i.e. ASY has only service part and not handler part )
+//    - Service parts are in iServiceImplInfoArray
+//    - Handler parts are in iHandlerImplInfoArray
+// 2. Move idle ASYs to last ones within iServiceImplInfoArray
+// 3. Find Service / Handler pairs
+//    - Service parts are still in iServiceImplInfoArray
+//    - Handler parts implementation Uids added to iImplUidsHandlerArray
+// 4. Add zero values to iImplUidsHandlerArray until it's length is same as
+//    length of iServiceImplInfoArray
+// 5. Create CASYProxyASYHandler -array
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::ArrangeImplementationsL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ArrangeImplementationsL()" );
+
+    TRequestStatus* ptrStat = &iStatus;
+    *ptrStat = KRequestPending;
+
+    RArray<TInt> onlyServicesIndexArray;
+    CleanupClosePushL( onlyServicesIndexArray );
+
+    TBuf<KMaxImplementationInfoDataLength>  bufDisplayNameService;
+    TBuf<KMaxImplementationInfoDataLength>  bufDisplayNameHandler;
+
+    // Find implementation indexes of idle ASYs
+    // ----------------------------------------------------------------
+    TInt lastServiceIndex = iServiceImplInfoArray.Count() - 1;
+    TInt lastHandlerIndex = iHandlerImplInfoArray.Count() - 1;
+
+    for ( TInt i=0; i<=lastServiceIndex; i++ )
+        { 
+        TBool found( EFalse );
+        bufDisplayNameService = iServiceImplInfoArray.operator[]( i )->DisplayName();
+        for ( TInt j=0; j<=lastHandlerIndex; j++ )
+            {
+            bufDisplayNameHandler = iHandlerImplInfoArray.operator[]( j )->DisplayName();
+            if ( KErrNotFound != bufDisplayNameService.Match( bufDisplayNameHandler ) )
+                {
+                found = ETrue;
+                break; // Break j loop
+                }
+            }
+
+        if ( found == EFalse )
+            {
+            onlyServicesIndexArray.Append( i );
+            }
+        }
+
+    // ASYProxy must know the "real" ASYs count
+    iAsyProxy->SetASYsCount( iServiceImplInfoArray.Count() - onlyServicesIndexArray.Count() );
+
+    // Move idle ASYs to last ones within iServiceImplInfoArray
+    // ----------------------------------------------------------------
+    for ( TInt k = onlyServicesIndexArray.Count() - 1; k>=0; k-- )
+        {
+        CImplementationInformation *implementationInformation =
+            iServiceImplInfoArray.operator[]( onlyServicesIndexArray.operator[]( k ) );
+
+        iServiceImplInfoArray.Remove( onlyServicesIndexArray.operator[]( k ) );
+        iServiceImplInfoArray.Append( implementationInformation );
+        }
+
+    // Find Service / Handler pairs
+    // ----------------------------------------------------------------
+    for ( TInt i=0; i<=lastServiceIndex; i++ )
+        {
+        bufDisplayNameService = iServiceImplInfoArray.operator[]( i )->DisplayName();
+        for ( TInt j=0; j<=lastHandlerIndex; j++ )
+            {
+            bufDisplayNameHandler = iHandlerImplInfoArray.operator[]( j )->DisplayName();
+            if ( KErrNotFound != bufDisplayNameService.Match( bufDisplayNameHandler ) )
+                {
+                TUid implementUid = iHandlerImplInfoArray.operator[]( j )->ImplementationUid();
+
+                User::LeaveIfError( iImplUidsHandlerArray.Append( implementUid ) );
+                }
+            }
+        }
+
+    // Add zero -values to iImplUidsHandlerArray for the last idle ASYs
+    // ----------------------------------------------------------------
+    TUid zeroUid;
+    zeroUid.iUid = ZEROHANDLERUID;
+    while ( iImplUidsHandlerArray.Count() < iServiceImplInfoArray.Count() )
+        {
+        iImplUidsHandlerArray.Append( zeroUid );
+        }
+
+    User::RequestComplete( ptrStat, KErrNone );
+    CleanupStack::PopAndDestroy( &onlyServicesIndexArray );
+    // only ServicesIndexArray.Close() was called;
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::ArrangeImplementationsL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxy::NextStep
+// Increases the loading process control splitter variable
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyAsyLoader::NextStep()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::NextStep()" );
+
+    switch ( iStepToDo )
+        {
+        case EASYLoadingStepListInit :
+            iStepToDo = EASYLoadingStepListImplementations;
+            break;
+        case EASYLoadingStepListImplementations :
+            iStepToDo = iListRet ? EASYLoadingStepOrderImplementations : EASYLoadingOver;
+            break;
+        case EASYLoadingStepOrderImplementations :
+            iStepToDo = EASYLoadingStepLoadASY;
+            break;
+        case EASYLoadingStepLoadASY :
+            if ( iArrayItemCounter == iServiceImplInfoArray.Count() )
+                {
+                iStepToDo = EASYLoadingOver;
+                }
+            break;
+        default :
+            iStepToDo = EASYLoadingOver;
+            break;
+        }
+
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyAsyLoader::NextStep - iStepToDo == %d", iStepToDo );
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyAsyLoader::NextStep - return void" );
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File