diff -r aecbbf00d063 -r d48ab3b357f1 psln/Src/PslnSoundActivator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psln/Src/PslnSoundActivator.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -0,0 +1,265 @@ +/* +* Copyright (c) 2004-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: Activates sound content, if part of the skin. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include + +// Psln specific. +#include "pslnprofilesettingsloader.h" +#include "PslnSoundActivator.h" +#include "PslnConst.h" +#include "PslnDebug.h" + + +// CONSTANTS +// Path and filename of wrapper dll. +_LIT( KPslnProfilesSettingsLoaderName, + "\\system\\libs\\PslnProfileSettingsLoader.dll"); + +// TYPE DEFINITIONS +// Profiles tone setter. +typedef TAny* (*NewProfilesSetterL)(); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPslnSoundActivator::CPslnSoundActivator() + { + } + +// ----------------------------------------------------------------------------- +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPslnSoundActivator* CPslnSoundActivator::NewLC() + { + CPslnSoundActivator* self = new( ELeave ) CPslnSoundActivator; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +void CPslnSoundActivator::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +// +CPslnSoundActivator::~CPslnSoundActivator() + { + delete iProfilesSetter; + if( iProfilesDllLoaded ) + { + iProfilesDll.Close(); + } + iSoundArray.Reset(); + iSoundArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CPslnSoundActivator::CollectSoundsL +// ----------------------------------------------------------------------------- +// +void CPslnSoundActivator::CollectSoundsL( const TDesC& aSkinPath, TInt& aCount ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::CollectSoundsL BEGIN"); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( !skin ) + { + return; + } + iSoundArray.Reset(); + + TInt i = KErrNotFound; + while( KPslnSoundItems[++i] != KAknsIIDNone ) + { + CAknsStringItemData* data = + static_cast( + skin->CreateUncachedItemDataL( + KPslnSoundItems[i], + EAknsITString ) ); + if ( data ) + { + CleanupStack::PushL( data ); + + PSLN_TRACE_DEBUG("CPslnSoundActivator::CollectSoundsL skin item found"); + HBufC* fullName = HBufC::NewLC( KMaxFileName ); + TPtr fullNamePtr = fullName->Des(); + + if ( aSkinPath.Length() > 0 ) + { + FindSoundFile( fullNamePtr, data->String(), aSkinPath ); + } + else + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::CollectSoundsL empty path" ); + // @todo - start going through all the drives available. + } + + if( fullNamePtr.Length() > 0 ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::CollectSoundsL file found"); + TPslnSoundActivatorEntry entry; + entry.iFullName = fullNamePtr; + entry.iID = KPslnSoundItems[i]; + iSoundArray.AppendL( entry ); + } + + CleanupStack::PopAndDestroy( 2, data ); // data, fullName + } + } + aCount = iSoundArray.Count(); + PSLN_TRACE_DEBUG("CPslnSoundActivator::CollectSoundsL END"); + } + +// ----------------------------------------------------------------------------- +// CPslnSoundActivator::ActivateToProfilesL +// ----------------------------------------------------------------------------- +// +void CPslnSoundActivator::ActivateToProfilesL() + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::ActivateToProfilesL BEGIN"); + + // Profiles tone setter dll loading. + if( !iProfilesDllLoaded ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::ActivateToProfilesL about load"); + if( iProfilesDll.Load( KPslnProfilesSettingsLoaderName ) == KErrNone ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::ActivateToProfilesL loaded"); + iProfilesDllLoaded = ETrue; + // Request the entry function + NewProfilesSetterL profilesSetter = + (NewProfilesSetterL) iProfilesDll.Lookup( KPslnDllEntryPoint ); + if( profilesSetter ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::ActivateToProfilesL create"); + // Create the class + iProfilesSetter = + (CPslnProfileSettingsLoader*) (*profilesSetter)(); + } + } + } + // The wrapper failed to load. + if ( !iProfilesSetter ) + { + User::Leave( KErrNotFound ); + } + + MoveSoundFilesL(); + + // Activate all tones to all profiles. + for( TInt i = 0; i < iSoundArray.Count(); i++ ) + { + TPslnSoundActivatorEntry entry = iSoundArray[i]; + PSLN_TRACE_DEBUG1("CPslnSoundActivator::ActivateToProfilesL tone %d", i); + PSLN_TRACE_DEBUG1("CPslnSoundActivator::ActivateToProfilesL minor ID %d", entry.iID.iMinor); + PSLN_TRACE_DEBUG1("CPslnSoundActivator::ActivateToProfilesL name lenght %d ", iSoundArray[i].iFullName.Length() ); + iProfilesSetter->SetToneForProfilesL( + entry.iID.iMinor, + entry.iFullName ); + } + } + +// ----------------------------------------------------------------------------- +// CPslnSoundActivator::FindSoundFile +// ----------------------------------------------------------------------------- +// +void CPslnSoundActivator::FindSoundFile( + TDes& aFullName, const TDesC& aSoundFile, const TDesC& aSkinPath ) + { + aFullName.Copy( aSkinPath ); + aFullName.Append( aSoundFile ); + } + +// ----------------------------------------------------------------------------- +// CPslnSoundActivator::MoveSoundFilesL +// ----------------------------------------------------------------------------- +// +void CPslnSoundActivator::MoveSoundFilesL() + { + RAknsSrvSession skinsrv; + User::LeaveIfError( skinsrv.Connect() ); + CleanupClosePushL( skinsrv ); + + RFs& fs = CEikonEnv::Static()->FsSession(); + + for( TInt i = 0; i < iSoundArray.Count(); i++ ) + { + TPslnSoundActivatorEntry entry = iSoundArray[i]; + + HBufC* targetPath = NULL; + TFileName filename; + + // Sort out path to which store the sound file. + TInt driveId; + User::LeaveIfError( + RFs::CharToDrive( entry.iFullName[0], driveId ) ); + + TUint driveStatus; + User::LeaveIfError( + DriveInfo::GetDriveStatus( fs, driveId, driveStatus ) ); + + if ( driveStatus & DriveInfo::EDriveReadOnly ) + { + // If ROM, then let's store to phone memory. + User::LeaveIfError( + DriveInfo::GetDefaultDrive( + DriveInfo::EDefaultPhoneMemory, + driveId ) ); + } + + User::LeaveIfError( + PathInfo::GetRootPath( filename, driveId ) ); + filename.Append( PathInfo::SoundsPath() ); + targetPath = filename.AllocLC(); + + TParsePtrC parse( entry.iFullName ); + TFileName* targetFile = new (ELeave) TFileName; + CleanupStack::PushL( targetFile ); + targetFile->Copy( *targetPath ); + targetFile->Append( parse.NameAndExt() ); + + skinsrv.CopySoundFile( entry.iFullName, *targetFile ); + if ( iProfilesSetter ) + { + PSLN_TRACE_DEBUG("CPslnSoundActivator::MoveSoundFilesL indicate to mgx"); + PSLN_TRACE_DEBUG1("CPslnSoundActivator: Move to \"%S\" ", targetFile ); + + iProfilesSetter->IndicateFileUpdationL( *targetFile ); + } + iSoundArray[i].iFullName = *targetFile; + PSLN_TRACE_DEBUG1("CPslnSoundActivator: Move2 lenght %d ", iSoundArray[i].iFullName.Length() ); + CleanupStack::PopAndDestroy( 2, targetPath ); + } + CleanupStack::PopAndDestroy(); //skinsrv + } + +// End of File