codhandler/codeng/src/FotaSaver.cpp
changeset 0 dd21522fd290
child 16 a359256acfc6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/codeng/src/FotaSaver.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,271 @@
+/*
+* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 class CFotaSaver.   
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "FotaSaver.h"
+#include "CodLogger.h"
+#include "CodError.h"
+#include "CodPanic.h"
+#include "CodData.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CFotaSaver::NewL()
+// ---------------------------------------------------------
+//
+CFotaSaver* CFotaSaver::NewL( const TDesC8& aType, TInt aPkgId )
+    {
+    CFotaSaver* saver = new (ELeave) CFotaSaver( aType, aPkgId );
+    CleanupStack::PushL( saver );
+    saver->ConstructL();
+    CleanupStack::Pop( saver );
+    return saver;
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::~CFotaSaver()
+// ---------------------------------------------------------
+//
+CFotaSaver::~CFotaSaver()
+    {
+    CLOG(( ECodEng, 2, _L("-> CFotaSaver::~CFotaSaver") ));
+
+    iEng.Close();
+    // iStore not closed (owned by the Engine).
+    CLOG(( ECodEng, 2, _L("<- CFotaSaver::~CFotaSaver") ));
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::OpenStoreL()
+// ---------------------------------------------------------
+//
+void CFotaSaver::OpenStoreL()
+    {
+    CLOG(( ECodEng, 2, _L("-> CFotaSaver::OpenStoreL") ));
+    __ASSERT_DEBUG( iState == EInit, CodPanic( ECodInternal ) );
+    
+	TInt err(KErrNone);
+	
+    if (!iEng.Handle() )
+        {
+        TRAP( err, iEng.OpenL() );
+        }
+    if ( !err && !iStore )
+        {
+        err = iEng.OpenUpdatePackageStore( iPkgId, iStore );
+        }
+
+    iSize = 0;
+    iState = EStoreOpen;
+    CLOG(( ECodEng, 2, _L("<- CFotaSaver::OpenStoreL") ));
+    }
+    
+// ---------------------------------------------------------
+// CFotaSaver::AppendData()
+// ---------------------------------------------------------
+//
+TInt CFotaSaver::AppendData( const TDesC8& aData )
+    {
+    CLOG(( EHttpLoad, 2, \
+        _L("-> CFotaSaver::AppendData (%d) bytes"), aData.Length() ));
+    __ASSERT_DEBUG( iState == EStoreOpen, CodPanic( ECodInternal ) );
+    TInt err = CheckMaxSize( aData.Size() );
+    if ( !err && iStore )
+        {
+        TRAP( err, iStore->WriteL( aData ) );
+        }
+    if ( !err )
+        {
+        iSize += aData.Length();
+        }
+    CLOG(( EHttpLoad, 2, _L("<- CFotaSaver::AppendData returns (%d)"), err ));
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::CloseStore()
+// ---------------------------------------------------------
+//
+void CFotaSaver::CloseStore()
+    {
+    CLOG(( ECodEng, 2, _L("CFotaSaver::CloseStore") ));
+    // Nothing to do, iStore is owned by FOTA Engine.
+    iState = EStoreClosed;
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::CheckResponseAttributesL()
+// ---------------------------------------------------------
+//
+void CFotaSaver::CheckResponseAttributesL( const CCodData& aData )
+    {
+    CLOG(( ECodEng, 2, _L("-> CFotaSaver::CheckResponseAttributesL") ));
+    __ASSERT_DEBUG( iState == EStoreClosed, CodPanic( ECodInternal ) );
+#ifdef __TEST_COD_LOG
+    TPtrC8 mime( iType.Des8() );
+    CLOG(( ECodEng, 4, _L8("  MIME==<%S>, size(%d)"), &mime, iSize ));
+#endif /* def __TEST_COD_LOG */
+
+    if ( !iSize )
+        {
+        CLOG(( ECodEng, 4, _L("  0 bytes data") ));
+        User::Leave( KErrCodAttributeMismatch );
+        }
+
+    // Compare content MIME type against descriptor.
+
+    // Size is not checked, no exact match is required. Quote form spec:
+    // "The storage size and the execution size are dependent on the
+    // environment and may be different from the value of the size attribute.
+    // The transport size may also be different, if compression or some
+    // packaging format is used."
+    //
+    // There is a safety upper bound on the transaction size, that is already
+    // applied. See SetMaxSize().
+    
+    if( iType != TDataType( (*aData[aData.ActiveDownload()]).Type()  ) )
+        {
+        CLOG(( ECodEng, 4, _L(" content-type mismatch") ));
+        User::Leave( KErrCodAttributeMismatch );
+        }
+
+    iState = ERespChecked;
+    CLOG(( ECodEng, 2, _L("<- CFotaSaver::CheckResponseAttributesL (match)") ));
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::InstallL()
+// ---------------------------------------------------------
+//
+void CFotaSaver::InstallL( TRequestStatus* aStatus, const TDesC& /*aName*/, const TBool /*aAttached*/ )
+    {
+    CLOG(( ECodEng, 2, _L("CFotaSaver::InstallL") ));
+    __ASSERT_DEBUG( iState == ERespChecked, CodPanic( ECodInternal ) );
+    // Do nothing. Update package is already in place.
+    *aStatus = KRequestPending;
+    User::RequestComplete( aStatus, KErrNone );
+
+    iState = EInstalled;
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::CancelInstall()
+// ---------------------------------------------------------
+//
+void CFotaSaver::CancelInstall()
+    {
+    CLOG(( ECodEng, 2, _L("CFotaSaver::CancelInstall") ));
+    // Do nothing, saving is completed already (not async).
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::ReleaseContent()
+// ---------------------------------------------------------
+//
+void CFotaSaver::ReleaseContent( TFileName& aFname, TUid& aHandler )
+    {
+    CLOG(( ECodEng, 2, _L("-> CFotaSaver::ReleaseContent") ));
+    __ASSERT_DEBUG( iState == EInstalled, CodPanic( ECodInternal ) );
+    if ( iStore )
+        {
+        iEng.UpdatePackageDownloadComplete( iPkgId );
+        }
+    aFname = KNullDesC;
+    aHandler = KNullUid; // TODO get UID of handler app (DeviceManager)?
+    iEng.Close();
+    iStore = NULL;  // Store not closed (owned by the Engine).
+    iState = EInit;
+    CLOG(( ECodEng, 2, _L("<- CFotaSaver::ReleaseContent") ));
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::ReleaseFileName()
+// ---------------------------------------------------------
+//
+void CFotaSaver::ReleaseFileName( TFileName& /*aFname*/)
+{
+}
+    
+// ---------------------------------------------------------
+// CFotaSaver::Cleanup()
+// ---------------------------------------------------------
+//
+void CFotaSaver::Cleanup( TBool aDeleteFile)
+    {
+    CLOG(( ECodEng, 2, _L("-> CFotaSaver::Cleanup") ));
+
+    if( iEng.Handle() )
+    	{
+        iEng.UpdatePackageDownloadComplete( iPkgId );
+		if( aDeleteFile )
+		    {
+			iEng.DeleteUpdatePackage( iPkgId );
+		    }
+		iEng.Close();   // Close without committing to clean up.
+    	}
+    iStore = NULL;  // Store not closed (owned by the Engine).
+    iState = EInit;
+    CLOG(( ECodEng, 2, _L("<- CFotaSaver::Cleanup") ));
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::CFotaSaver()
+// ---------------------------------------------------------
+//
+CFotaSaver::CFotaSaver( const TDesC8& aType, TInt aPkgId )
+: CCodSaver( aType ),
+  iPkgId( aPkgId )
+    {
+    CLOG(( ECodEng, 2, _L("*** CFotaSaver::CFotaSaver") ));
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::DownloadedFileSize()
+// ---------------------------------------------------------
+//
+TInt CFotaSaver::DownloadedFileSize()
+    {
+    // check how many bytes are already persisted
+    TInt DownloadedSize(0);
+    TInt completeSize (0);
+
+    //Get the downloaded size from Fota Server
+    TInt err = iEng.GetDownloadUpdatePackageSize( iPkgId, DownloadedSize, completeSize );
+
+    if(err != KErrNone)
+        return err;
+    
+    return DownloadedSize;
+    }
+
+// ---------------------------------------------------------
+// CFotaSaver::ResetL()
+// ---------------------------------------------------------
+//
+void CFotaSaver::ResetL()
+    {
+    iEng.UpdatePackageDownloadComplete( iPkgId );
+    
+    TInt error = iEng.DeleteUpdatePackage( iPkgId );
+    User::LeaveIfError(error);
+    
+	error = iEng.OpenUpdatePackageStore( iPkgId, iStore );
+	User::LeaveIfError(error);
+    }