startupservices/startupanimation/sanimengine/src/sanimpluginctrl.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/startupservices/startupanimation/sanimengine/src/sanimpluginctrl.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,292 @@
+/*
+* 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:  Implementation of CSAnimPluginCtrl class
+*
+*/
+
+
+#include <ecom/ecom.h>
+
+#include "sanimpluginctrl.h"
+#include "sanimplugin.h"
+#include "assert.h"
+#include "trace.h"
+
+/** Maximum length for any file name extension (actually 4 should be enough). */
+const TInt KMaxFileExtLength = 6;
+/** Buffer long enough to hold any file name extension. */
+typedef TBuf<KMaxFileExtLength> TFileNameExtension;
+typedef TBuf8<KMaxFileExtLength> TFileNameExtension8;
+
+// ======== LOCAL FUNCTIONS ========
+
+static void CleanupRImplInfoPtrArray( TAny* aPtr )
+    {
+    static_cast<RImplInfoPtrArray*>( aPtr )->ResetAndDestroy();
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CSAnimPluginCtrl* CSAnimPluginCtrl::NewL(
+    const TDesC& aFileName,
+    const TUint32 aIfUid,
+    TAny* aConstructionParameters )
+    {
+    FUNC_LOG;
+
+    CSAnimPluginCtrl* self = new( ELeave ) CSAnimPluginCtrl;
+    CleanupStack::PushL( self );
+    self->ConstructL( aFileName, aIfUid, aConstructionParameters );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::~CSAnimPluginCtrl
+//
+// ---------------------------------------------------------------------------
+//
+CSAnimPluginCtrl::~CSAnimPluginCtrl()
+    {
+    FUNC_LOG;
+
+    Cancel();
+
+    delete iPlugin;
+    REComSession::DestroyedImplementation( iDtorIDKey );
+
+    delete iFileName;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::Load
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::Load( RFs& aFs, const TCallBack& aCallBack )
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( !IsActive(), SAnimPanic::EInternalError );
+
+    iSuccessCode = KRequestPending;
+    iCallBack = aCallBack;
+
+    TIMESTAMP( "Load - start" );
+
+    iPlugin->Load( aFs, *iFileName, iStatus );
+    SetActive();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::Start
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::Start( const TCallBack& aCallBack )
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( !IsActive(), SAnimPanic::EInternalError );
+
+
+    if ( !iReadyToStart )
+        {
+        iSuccessCode = KErrNotReady;
+        aCallBack.CallBack();
+        }
+    else
+        {
+        iSuccessCode = KRequestPending;
+        iCallBack = aCallBack;
+
+        iPlugin->Start( iStatus );
+        SetActive();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::SuccessCode
+//
+// ---------------------------------------------------------------------------
+//
+TInt CSAnimPluginCtrl::SuccessCode() const
+    {
+    return iSuccessCode;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::Plugin
+//
+// ---------------------------------------------------------------------------
+//
+CSAnimPlugin& CSAnimPluginCtrl::Plugin()
+    {
+    return *iPlugin;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::DoCancel
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::DoCancel()
+    {
+    FUNC_LOG;
+
+    iPlugin->Cancel();
+    iSuccessCode = KErrCancel;
+    iCallBack.CallBack();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::RunL
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::RunL()
+    {
+    FUNC_LOG;
+    INFO_1( "Plug-in command completed with %d", iStatus.Int() );
+
+    if ( !iReadyToStart && iStatus.Int() == KErrNone )
+        {
+        TIMESTAMP( "Load - end" );
+
+        iReadyToStart = ETrue;
+        }
+
+    iSuccessCode = iStatus.Int();
+    iCallBack.CallBack();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::CSAnimPluginCtrl
+//
+// ---------------------------------------------------------------------------
+//
+CSAnimPluginCtrl::CSAnimPluginCtrl()
+  : CActive( EPriorityStandard ),
+    iReadyToStart( EFalse )
+    {
+    FUNC_LOG;
+
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::ConstructL
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::ConstructL(
+    const TDesC& aFileName,
+    const TUint32 aIfUid,
+    TAny* aConstructionParameters )
+    {
+    FUNC_LOG;
+
+    iFileName = aFileName.AllocL();
+
+    TFileNameExtension ext;
+    GetExtension( aFileName, ext );
+    if ( ext.Length() > 0 )
+        {
+        FindPluginByExtensionL( ext, aIfUid, aConstructionParameters );
+        }
+    else
+        {
+        User::Leave( KErrNotFound );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::GetExtension
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::GetExtension( const TDesC& aFileName, TDes& aExtension )
+    {
+    FUNC_LOG;
+
+    aExtension = KNullDesC;
+
+    TInt pos = aFileName.LocateReverse( '.' );
+    if ( pos >= 0 && aFileName.Length() - pos - 1 <= aExtension.MaxLength() )
+        {
+        aExtension = aFileName.Right( aFileName.Length() - pos - 1 );
+        }
+
+    aExtension.LowerCase();
+
+    INFO_1( "File extension: '%S'", &aExtension );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSAnimPluginCtrl::FindPluginByExtensionL
+//
+// ---------------------------------------------------------------------------
+//
+void CSAnimPluginCtrl::FindPluginByExtensionL(
+    const TDesC& aExtension,
+    const TUint32 aIfUid,
+    TAny* aConstructionParameters )
+    {
+    FUNC_LOG;
+    ASSERT_TRACE( aExtension.Length() > 0, SAnimPanic::EInternalError );
+
+    TEComResolverParams params;
+    params.SetGenericMatch( ETrue );
+    TFileNameExtension8 ext;
+    ext.Copy( aExtension );
+    params.SetDataType( ext );
+
+    RImplInfoPtrArray implInfoArray;
+    CleanupStack::PushL(
+        TCleanupItem( CleanupRImplInfoPtrArray, &implInfoArray ) );
+    REComSession::ListImplementationsL(
+        TUid::Uid( aIfUid ),
+        params,
+        implInfoArray );
+    if ( implInfoArray.Count() > 0 )
+        {
+        TUid implUid = implInfoArray[ 0 ]->ImplementationUid();
+        INFO_2( "%d plug-ins found, using 0x%08x", implInfoArray.Count(), implUid );
+
+        iPlugin = static_cast<CSAnimPlugin*>(
+            REComSession::CreateImplementationL(
+                implUid, iDtorIDKey, aConstructionParameters ) );
+        }
+
+    CleanupStack::PopAndDestroy( &implInfoArray );
+    if ( !iPlugin )
+        {
+        User::Leave( KErrNotFound );
+        }
+    }