--- /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 );
+ }
+ }