ncdengine/provider/client/src/ncdnodeactivateimpl.cpp
changeset 0 ba25891c3a9e
--- /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 <bamdesca.h>
+
+#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<MNcdInstalledContent> content( install->InstalledContentL() );
+        CleanupResetAndDestroyPushL( content );
+
+        TBool setSomething = EFalse;
+        for ( TInt i = 0; i < content.Count(); ++i )
+            {
+            MNcdInstalledTheme* theme = content[i]->QueryInterfaceLC<MNcdInstalledTheme>();
+            if ( theme ) 
+                {
+                SetThemeL( *theme, *service );
+                setSomething = ETrue;
+                CleanupStack::PopAndDestroy( theme );
+                break;
+                }
+                        
+            MNcdInstalledFile* file = content[i]->QueryInterfaceLC<MNcdInstalledFile>();
+            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"));
+    }
+    
+