diff -r 000000000000 -r 2e3d3ce01487 startupservices/startupanimation/sanimengine/src/sanimpluginctrl.cpp --- /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 + +#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 TFileNameExtension; +typedef TBuf8 TFileNameExtension8; + +// ======== LOCAL FUNCTIONS ======== + +static void CleanupRImplInfoPtrArray( TAny* aPtr ) + { + static_cast( 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( + REComSession::CreateImplementationL( + implUid, iDtorIDKey, aConstructionParameters ) ); + } + + CleanupStack::PopAndDestroy( &implInfoArray ); + if ( !iPlugin ) + { + User::Leave( KErrNotFound ); + } + }