iaupdate/IAD/engine/controller/src/iaupdateselfupdaterinitializer.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iaupdate/IAD/engine/controller/src/iaupdateselfupdaterinitializer.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2009 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:   ?Description
+*
+*/
+
+
+
+
+// NCD headers:
+// Purchase history contains items
+#include <ncdpurchasehistory.h>
+// Contains CBase-class headers of the ncd purchase classes.
+#include <ncdutils.h>
+#include <ncdprovider.h>
+
+#include "iaupdateselfupdaterinitializer.h"
+#include "iaupdatenodeimpl.h"
+#include "iaupdateselfupdaterinitobserver.h"
+#include "iaupdatecontrollerimpl.h"
+#include "iaupdateselfupdaterctrl.h"
+#include "iaupdaterfilelist.h"
+#include "iaupdaterfileinfo.h"
+#include "iaupdateridentifier.h"
+#include "iaupdatedebug.h"
+
+
+CIAUpdateSelfUpdaterInitializer* CIAUpdateSelfUpdaterInitializer::NewL(
+    CIAUpdateNode& aNode,
+    MIAUpdateSelfUpdaterInitObserver& aObserver )
+    {
+    CIAUpdateSelfUpdaterInitializer* self =
+        CIAUpdateSelfUpdaterInitializer::NewLC( aNode, aObserver );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+CIAUpdateSelfUpdaterInitializer* CIAUpdateSelfUpdaterInitializer::NewLC(
+    CIAUpdateNode& aNode,
+    MIAUpdateSelfUpdaterInitObserver& aObserver )
+    {
+    CIAUpdateSelfUpdaterInitializer* self =
+        new( ELeave ) CIAUpdateSelfUpdaterInitializer( aNode, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+CIAUpdateSelfUpdaterInitializer::CIAUpdateSelfUpdaterInitializer( 
+    CIAUpdateNode& aNode,
+    MIAUpdateSelfUpdaterInitObserver& aObserver )
+: CActive( CActive::EPriorityStandard ),
+  iNode( aNode ),
+  iObserver( aObserver ) 
+    {
+
+    }
+
+
+void CIAUpdateSelfUpdaterInitializer::ConstructL()
+    {
+    User::LeaveIfError( FileServer().Connect() );
+    CActiveScheduler::Add( this );
+    }
+
+
+CIAUpdateSelfUpdaterInitializer::~CIAUpdateSelfUpdaterInitializer()
+    {
+    Cancel();
+
+    FileServer().Close();
+
+    // Notice, that file list can be also NULL if
+    // the ownership has been transferred to else where.
+    delete iFileList;
+    }
+    
+
+void CIAUpdateSelfUpdaterInitializer::StartL()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::Start() begin");
+    
+    if ( !IsActive()
+         && iState == ENotStarted )
+        {
+        // Start the active loop, which will
+        // set the content files into the file list.
+        iState = EInitialize;            
+        iStatus = KRequestPending;
+        SetActive();
+        TRequestStatus* ptrStatus = &iStatus;
+        User::RequestComplete( ptrStatus, KErrNone );        
+        }
+    else
+        {
+        User::Leave( KErrInUse );
+        }
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::Start() end");
+    }
+
+
+void CIAUpdateSelfUpdaterInitializer::DoCancel()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::DoCancel() begin");
+    
+    iState = ENotStarted;
+
+    // The ownership has not been transferred yet.
+    // So, delete filelist here.    
+    delete iFileList;
+    iFileList = NULL;
+    
+    // Also inform observer that the cancellation happened.
+    Observer().SelfUpdateInitComplete( KErrCancel );
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::DoCancel() end");
+    }
+
+
+void CIAUpdateSelfUpdaterInitializer::RunL()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::RunL() begin");
+    
+    switch( State() )
+        {
+        case EInitialize:
+            // Initialize things for the self update and set file list info.
+            // Create the file list here. If an error occurs below, RunError will
+            // delete the file list. If everything goes ok, then ownership is
+            // transferred to other object.
+            iFileList = CIAUpdaterFileList::NewL();
+            SetContentFileListL();
+            // Inform observer that setup is complete.
+            // The ownership of the file list will be transferred here.
+            InitCompleteL();
+            break;
+                
+        default:
+            // Unknown state.
+            // Let RunError handle this.
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::RunL() end");
+    }
+
+
+TInt CIAUpdateSelfUpdaterInitializer::RunError( TInt aError )
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::RunError() begin");
+    
+    iState = ENotStarted;
+    
+    // Delete file list because error occurred.
+    delete iFileList;
+    iFileList = NULL;
+
+    // Inform observer about the error.
+    Observer().SelfUpdateInitComplete( aError );
+
+    // We do not continue the operation anymore.
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::RunError() end");
+
+    return KErrNone;
+    }
+
+
+const CIAUpdateSelfUpdaterInitializer::TUpdaterState& CIAUpdateSelfUpdaterInitializer::State() const
+    {
+    return iState;
+    }
+
+
+CIAUpdateNode& CIAUpdateSelfUpdaterInitializer::Node()
+    {
+    return iNode;
+    }
+
+
+MIAUpdateSelfUpdaterInitObserver& CIAUpdateSelfUpdaterInitializer::Observer()
+    {
+    return iObserver;
+    }
+
+
+RFs& CIAUpdateSelfUpdaterInitializer::FileServer()
+    {
+    return iFs;
+    }
+
+
+void CIAUpdateSelfUpdaterInitializer::SetContentFileListL()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::SetContentFileListL() begin");
+    
+    // The file list will have one common name for all the files if the content
+    // is given as a bundle.
+    iFileList->SetBundleNameL( Node().Name() );
+    iFileList->SetHidden( Node().Hidden() );
+    CIAUpdaterIdentifier& identifier( iFileList->Identifier() );
+    identifier.SetIdL( Node().MetaId() );
+    identifier.SetNamespaceL( Node().MetaNamespace() );
+    identifier.SetUid( Node().Uid() );
+
+    MNcdProvider& provider =
+        Node().Controller().ProviderL();
+
+    MNcdPurchaseHistory* history( provider.PurchaseHistoryL() );
+    CleanupReleasePushL( *history );
+
+    // Create filter. So, we will get
+    // all the purchase history items.
+    CNcdPurchaseHistoryFilter* filter =
+        CNcdPurchaseHistoryFilter::NewLC();
+
+    // Add family uid to the filter
+    RArray< TUid > uids;
+    CleanupClosePushL( uids );
+    uids.AppendL( Node().Controller().FamilyUid() );
+    filter->SetClientUids( uids.Array() );
+    CleanupStack::PopAndDestroy( &uids );
+
+    // Add other filter values.
+    // We only want content information for this node.
+    filter->SetNamespaceL( Node().MetaNamespace() );
+    filter->SetEntityIdL(  Node().MetaId() );
+    
+    // Get the ids. So, we can next get all the corresponding
+    // details.
+    RArray< TUint > ids =
+        history->PurchaseIdsL( *filter );
+    CleanupStack::PopAndDestroy( filter );
+    CleanupClosePushL( ids );
+    
+    if ( ids.Count() > 0 )
+        {
+        IAUPDATE_TRACE("[IAUPDATE] Ids found.");
+    
+        // If there are any details, then the latest should be the first
+        // one in the array. So, use that.
+        CNcdPurchaseDetails* details( 
+            history->PurchaseDetailsL( ids[ 0 ] , EFalse ) );        
+
+        if ( details )
+            {
+            IAUPDATE_TRACE("[IAUPDATE] Details found.");
+        
+            // We got the newest details. Get its file information.
+            CleanupStack::PushL( details );
+
+            const MDesCArray& files = details->DownloadedFiles();        
+            TInt count( files.MdcaCount() );
+            IAUPDATE_TRACE_1("[IAUPDATE] Files count: %d", count);    
+            for( TInt i = 0; i < count; ++i )
+                {
+                CIAUpdaterFileInfo* info( CIAUpdaterFileInfo::NewLC() );
+                info->SetFilePathL( files.MdcaPoint( i ) );
+                iFileList->AddFileInfoL( info );
+                CleanupStack::Pop( info );
+                info = NULL;                    
+                IAUPDATE_TRACE("[IAUPDATE] Info added to file list.");
+                }
+            
+            CleanupStack::PopAndDestroy( details );
+            details = NULL;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &ids );
+    CleanupStack::PopAndDestroy( history );
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::SetContentFileListL() end");
+    }
+
+
+void CIAUpdateSelfUpdaterInitializer::InitCompleteL()
+    {
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::InitComplete() begin");
+
+    // Everything has been done.
+    // Set the state.
+    iState = ENotStarted;
+
+    if ( iFileList->FileInfos().Count() > 0 )
+        {
+        IAUPDATE_TRACE("[IAUPDATE] Add filelist into the controller list.");
+        // Insert the file list for the use.
+        // If this leaves, then let RunError handle the error situation.
+        // It will also inform observer.
+        Node().Controller().SelfUpdaterCtrl().AddFileListL( iFileList );
+        // Ownership was transferred.
+        iFileList = NULL;
+        Observer().SelfUpdateInitComplete( KErrNone );
+        }
+    else
+        {
+        IAUPDATE_TRACE("[IAUPDATE] No files found. Error?");
+        // No files to install. Think this as an error.
+        // And, do not start the self updater because there is no need for that.
+        // Let RunError handle the error situation.
+        User::Leave( KErrNotFound );
+        }
+
+    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateSelfUpdaterInitializer::InitComplete() end");
+    }