diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/client/src/ncdnodeactivateimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/client/src/ncdnodeactivateimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,214 @@ +/* +* Copyright (c) 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: Contains CNcdNodeActivate class implementation +* +*/ + + +#include + +#include "ncdnodeactivateimpl.h" +#include "ncdnodemetadataproxy.h" +#include "ncdnodeinstallproxy.h" +#include "ncdnodeidentifier.h" +#include "catalogsinterfaceidentifier.h" +#include "ncddeviceinteractionfactory.h" +#include "ncddeviceservice.h" +#include "catalogsutils.h" +#include "catalogsdebug.h" +#include "ncdinstalledtheme.h" +#include "ncdinstalledfile.h" +#include "ncdinstalledcontent.h" + + +CNcdNodeActivate::CNcdNodeActivate( CNcdNodeMetadataProxy& aMetadata ) +: CCatalogsInterfaceBase( &aMetadata ), + iMetadata( aMetadata ) + { + } + + +void CNcdNodeActivate::ConstructL() + { + // Register the interface + MNcdNodeActivate* interface( this ); + AddInterfaceL( + CCatalogsInterfaceIdentifier::NewL( interface, this, MNcdNodeActivate::KInterfaceUid ) ); + } + + +CNcdNodeActivate* CNcdNodeActivate::NewL( CNcdNodeMetadataProxy& aMetadata ) + { + CNcdNodeActivate* self = + CNcdNodeActivate::NewLC( aMetadata ); + CleanupStack::Pop( self ); + return self; + } + +CNcdNodeActivate* CNcdNodeActivate::NewLC( CNcdNodeMetadataProxy& aMetadata ) + { + CNcdNodeActivate* self = + new( ELeave ) CNcdNodeActivate( aMetadata ); + // Using PushL because the object does not have any references yet + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +CNcdNodeActivate::~CNcdNodeActivate() + { + DLTRACEIN(("this-ptr: %x", this)); + // Remove interfaces implemented by this class from the interface list. + // So, the interface list is up to date when this class object is deleted. + RemoveInterface( MNcdNodeActivate::KInterfaceUid ); + + + // Delete member variables here + // Do not delete node and operation manager because + // this object does not own them. + DLTRACEOUT(("this-ptr: %x", this)); + } + + +CNcdNodeMetadataProxy& CNcdNodeActivate::Metadata() const + { + return iMetadata; + } + + +// MNcdNodeActivate functions + +void CNcdNodeActivate::ActivateL() + { + DLTRACEIN(("")); + + // Note that ownership is not transferred here. + // So, do not add to the cleanup stack. + // When the items have been installed, they may be activated. + // Install proxy contains theme name and file information that + // can be used to activate items. + CNcdNodeInstallProxy* install( Metadata().Install() ); + + if ( install != NULL && install->IsInstalledL() ) + { + // Create the service that can handle activations + MNcdDeviceService* service( + NcdDeviceInteractionFactory::CreateDeviceServiceLC() ); + + if ( service == NULL ) + { + DLERROR(("Could not create service for active interface")); + + // For debugging purposes + DASSERT( EFalse ); + + User::Leave( KErrNotFound ); + } + + // Now we have the install interface to use and to check if some + // of its material could be activated. Activation may be done + // after the item has been installed. + + + // NOTICE: If you add or remove functionality here, + // then remember to update the CNcdNodeProxy::InternalizeActivateL() + // function accordingly. So, the MNcdNodeActivate interface can be + // provided from the API in correct situations. + + RCatalogsArray content( install->InstalledContentL() ); + CleanupResetAndDestroyPushL( content ); + + TBool setSomething = EFalse; + for ( TInt i = 0; i < content.Count(); ++i ) + { + MNcdInstalledTheme* theme = content[i]->QueryInterfaceLC(); + if ( theme ) + { + SetThemeL( *theme, *service ); + setSomething = ETrue; + CleanupStack::PopAndDestroy( theme ); + break; + } + + MNcdInstalledFile* file = content[i]->QueryInterfaceLC(); + if ( file ) + { + SetContentFileL( *file, *install, *service ); + setSomething = ETrue; + CleanupStack::PopAndDestroy( file ); + break; + } + } + + CleanupStack::PopAndDestroy( &content ); + + if ( !setSomething ) + { + User::Leave( KErrNotFound ); + } + + + CleanupStack::PopAndDestroy( service ); + } + + DLTRACEOUT(("")); + } + + +// Other functions + +void CNcdNodeActivate::SetThemeL( MNcdInstalledTheme& aTheme, + MNcdDeviceService& aService ) + { + DLTRACEIN(("")); + aService.SetAsThemeL( aTheme.Theme() ); + } + + +void CNcdNodeActivate::SetContentFileL( MNcdInstalledFile& aFile, + CNcdNodeInstallProxy& aInstall, + MNcdDeviceService& aService ) + { + DLTRACEIN(("")); + RBuf fileName; + fileName.CreateL( KMaxFileName ); + CleanupClosePushL( fileName ); + + // Get the file handle to the file that will be activated. + RFile file = aFile.OpenFileL(); + CleanupClosePushL( file ); + + // Get the filename from the handle. + // The name will be used for the activation + file.FullName( fileName ); + CleanupStack::PopAndDestroy( &file ); + + if ( aInstall.IsPurpose( ENcdItemPurposeRingtone ) ) + { + aService.SetAsRingingToneL( fileName ); + } + else if( aInstall.IsPurpose( ENcdItemPurposeWallpaper ) ) + { + aService.SetAsWallpaperL( fileName ); + } + else + { + User::Leave( KErrNotSupported ); + } + CleanupStack::PopAndDestroy ( &fileName ); + DLTRACEOUT(("All is well")); + } + +