--- a/fotaapplication/fotaserver/FotaStorage/src/fotaDiskStorage.cpp Tue Jul 13 09:26:23 2010 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,545 +0,0 @@
-/*
-* Copyright (c) 2005-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: stores update package to filesystem
-*
-*/
-
-
-
-// INCLUDE FILES
-#include <ecom.h>
-#include <implementationproxy.h>
-#include <centralrepository.h>
-#include <sysutil.h>
-#include "fotadiskstoragePrivateCRKeys.h"
-#include "fotaDiskStorage.h"
-#include "fotadebug.h"
-
-// CONSTANTS
-// System Critical Level (128KB) plus 5KB for fota operations.
-const TInt KSystemCriticalWorkingspace = 136192;
-
-// MACROS
-#ifdef __EABI__
-#ifndef IMPLEMENTATION_PROXY_ENTRY
-typedef TAny* TProxyNewLPtr;
-#define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) {{aUid},(TProxyNewLPtr)(aFuncPtr)}
-#endif
-#endif
-
-// ============================ MEMBER FUNCTIONS =============================
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::CFotaDiskStorage()
-// ---------------------------------------------------------------------------
-//
-CFotaDiskStorage::CFotaDiskStorage ()
- {
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::NewL()
-// ---------------------------------------------------------------------------
-//
-CFotaDiskStorage* CFotaDiskStorage::NewL()
- {
- FLOG(_L("CFotaDiskStorage::NewL()"));
- CFotaDiskStorage* self = new ( ELeave ) CFotaDiskStorage;
- FLOG(_L(" CFotaDiskStorage created at %X "), self);
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop( self );
- return self;
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::ConstructL()
-// ---------------------------------------------------------------------------
-//
-void CFotaDiskStorage::ConstructL()
- {
- FLOG(_L("CFotaDiskStorage::ConstructL() >>"));
- TInt err;
- User::LeaveIfError ( iFs.Connect() );
-
- // Ensures that fotaserver private dir exists
- err = iFs.MkDirAll(KDummyFilePath);
- if ( err!=KErrAlreadyExists && err != KErrNone )
- {
- FLOG(_L(" created priv dir err %d"),err);
- User::Leave ( err ) ;
- }
- FLOG(_L("CFotaDiskStorage::ConstructL() sessionpath to %S")
- , &KDummyFilePath,err);
- User::LeaveIfError ( iFs.SetSessionPath ( KDummyFilePath ) );
-
- // newdummy remains should not exist now. safety.
- err = iFs.Delete ( _L("newdummy") ) ;
- if ( err!=KErrNone && err!= KErrNotFound ) User::Leave (err);
-
- // Get write limit
- TInt writelimit( KFileReservationDefaultSize );
- TInt chunksize ( iChunkSize );
- CRepository* centrep( NULL);
- TRAP(err, centrep = CRepository::NewL( KCRUidFotaDiskStorage ) );
- if ( centrep )
- {
- err = centrep->Get( KFotaDiskSpaceReservationKey, writelimit );
- err = centrep->Get( KFotaDiskSpaceReservationChunkKey, chunksize );
- }
- iDummySize = writelimit;
- iChunkSize = chunksize;
- delete centrep;
-
- AdjustDummyStorageL();
- FLOG(_L("CFotaDiskStorage::ConstructL() <<"));
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::~CFotaDiskStorage ()
-// ---------------------------------------------------------------------------
-//
-CFotaDiskStorage::~CFotaDiskStorage ()
- {
- FLOG(_L("CFotaDiskStorage::~CFotaDiskStorage ()"));
- iFileWriteStream.Close();
- iFs.Close();
- }
-
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::IsPackageStoreSizeAvailableL
-// does the pkg fit to reservation or filesystem
-// ---------------------------------------------------------------------------
-//
-CFotaStorage::TFreeSpace CFotaDiskStorage::IsPackageStoreSizeAvailableL(TInt& aSize)
- {
- CFotaStorage::TFreeSpace isavailable;
- TInt swupdSize(0);
- TInt dummySize(0);
- SpaceAllocatedBySWUPDFilesL( swupdSize, dummySize);
-
- if ( aSize <= dummySize )
- {
- // fits to reservation
- isavailable = CFotaStorage::EFitsToReservation;
- }
- else
- {
- // doesnt fit to reservation, does it fit to filesystem?
- TInt sizeNeededFromFS = aSize - dummySize ;
- if ( sizeNeededFromFS < 0 ) sizeNeededFromFS = 0;
- TBool critical = SysUtil::FFSSpaceBelowCriticalLevelL( &iFs, sizeNeededFromFS );
- if ( critical )
- {
- // how much space would be needed
- TVolumeInfo vi;
- iFs.Volume(vi,EDriveC);
-
- TInt neededspace = sizeNeededFromFS - vi.iFree + KSystemCriticalWorkingspace;
- FLOG(_L("neededspace = %d vi.iFree = %d "), neededspace , vi.iFree);
- FLOG(_L(" neededspace = sizeNeededFromFS - vi.iFree + KSystemCriticalWorkingspace;") );
- //= aSize - vi.iFree;
- aSize = neededspace;
- isavailable = CFotaStorage::EDoesntFitToFileSystem;
- }
- else
- {
- isavailable = CFotaStorage::EFitsToFileSystem;
- }
- }
- TInt fitstodummy = isavailable==CFotaStorage::EFitsToReservation?1:0 ;
- TInt fitstoFS = isavailable==CFotaStorage::EFitsToFileSystem?1:0 ;
- TInt DoesntFitToFS = isavailable==CFotaStorage::EDoesntFitToFileSystem?1:0 ;
-
- FLOG(_L("CFotaDiskStorage::IsPackageStoreSizeAvailableL %d<%d (sz vs dummy) => fitstodummy:%d fitstoFS:%d DoesntFitToFS:%d")
- ,aSize,dummySize,fitstodummy,fitstoFS,DoesntFitToFS );
-
- return isavailable;
- }
-
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::AdjustDummyStorageL()
-// Ensure that total of iDummySize bytes are reserved by .swupd files and
-// dummy file.
-// ---------------------------------------------------------------------------
-//
-TInt CFotaDiskStorage::AdjustDummyStorageL ( )
- {
- FLOG(_L("CFotaDiskStorage::AdjustDummyStorageL >>"));
- // Count size reserved by .swupd files
- // CDir* list;
- TInt err;
- TInt swupdSize(0);
- TInt dummySize(0);
- RFile dummy;
-
- TRAP(err,SpaceAllocatedBySWUPDFilesL( swupdSize, dummySize));
-
- // Calculate space for dummy file
- TInt targetsize = iDummySize - swupdSize;
- if ( targetsize<0 )
- {
- targetsize=0;
- }
-
- // Reduce dummy file size
- if ( dummySize != targetsize || dummySize ==0 )
- {
- FLOG(_L(" dummy new size %d (old %d)"), targetsize,dummySize);
-
- err = dummy.Open(iFs, KDummyFileName, EFileWrite|EFileShareExclusive);
-
- if (err == KErrNotFound )
- {
- User::LeaveIfError(dummy.Replace(iFs, KDummyFileName
- , EFileWrite|EFileShareExclusive));
- }
- else
- if ( err!=KErrNone) User::LeaveIfError (err);
-
- CleanupClosePushL(dummy);
- TInt err= dummy.SetSize (targetsize);
- if (err!=KErrNone)
- {
- FLOG(_L("Error while creating reserved space: %d "),err );
- }
- CleanupStack::PopAndDestroy(1); // dummy
- }
- FLOG(_L("CFotaDiskStorage::AdjustDummyStorageL, reserved file size = %d <<"),targetsize);
- return 0;
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::OpenUpdatePackageStore
-// Open upd pkg store for writing (writes to dummy file).
-// ---------------------------------------------------------------------------
-TInt CFotaDiskStorage::OpenUpdatePackageStoreL(const TInt aPkgId,TInt aNewDummySize
- , RWriteStream*& aPkgStore)
- {
- FLOG(_L("CFotaDiskStorage::OpenUpdatePackageStore"));
- TInt err (KErrNone);
-
- // Remove reserved memory
- RFile tmp;
- err = tmp.Open(iFs, KDummyFileName, EFileWrite|EFileShareExclusive);
- CleanupClosePushL(tmp);
- if ( !err )
- {
- FLOG(_L("Removing the reserved memory as download has started"), iDummySize);
- tmp.SetSize( KErrNone );
- }
- CleanupStack::PopAndDestroy( &tmp );
- // flexible mem handling: increase dummy size to receive over sized package
- if (iDummySize < aNewDummySize)
- iDummySize = aNewDummySize;
- FLOG(_L("Newer dummy size = %d"),iDummySize);
-
- TBuf<KMaxFileName> swupd;
-
- swupd.AppendNum(aPkgId);
- swupd.Append(_L(".swupd"));
- err = iFileWriteStream.Open(iFs, swupd, EFileWrite) ;
- if (err == KErrNotFound )
- {
- User::LeaveIfError(iFileWriteStream.Replace(iFs, swupd
- , EFileWrite));
- }
- else
- if ( err!=KErrNone) User::LeaveIfError (err);
-
- //Positioning the seek if the file is already present (in case of resume)
- TEntry entry;
- TInt size (KErrNone);
- err = iFs.Entry(swupd,entry);
- if (!err)
- size = entry.iSize;
- if (size)
- {
- MStreamBuf* x = iFileWriteStream.Sink();
- TStreamPos pos(0);
- TRAPD(err2, pos = x->TellL(MStreamBuf::EWrite));
-
- pos+=size;
- TRAP(err2, x->SeekL(MStreamBuf::EWrite,pos ));
- }
- aPkgStore = &iFileWriteStream;
- return err;
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::GetDownloadedUpdatePackageSizeL
-// Gets the downloaded update package size in bytes
-// ---------------------------------------------------------------------------
-
-void CFotaDiskStorage::GetDownloadedUpdatePackageSizeL(const TInt aPkgId, TInt& aSize)
- {
- FLOG(_L("CFotaDiskStorage::GetDownloadedUpdatePackageSizeL >>"));
- aSize = 0;
-
- TBuf<KMaxFileName> swupd;
-
- swupd.AppendNum(aPkgId);
- swupd.Append(_L(".swupd"));
-
- TInt err(KErrNone);
- TEntry entry;
- err = iFs.Entry(swupd,entry);
- if (!err)
- aSize = entry.iSize;
- FLOG(_L("CFotaDiskStorage::GetDownloadedUpdatePackageSizeL,err = %d, aSize = %d <<"),err, aSize);
- }
-
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::UpdatePackageDownloadComplete
-// closes the stream and frees resources
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::UpdatePackageDownloadCompleteL(const TInt aPkgId)
- {
- FLOG(_L("CFotaDiskStorage::UpdatePackageDownloadComplete(const TInt aPkgId)"));
- RFile fswupd;
- TBuf<KMaxFileName> fn;
- TInt err;
- iFileWriteStream.Close();
- if(iBytesWritten<1)
- {
- FLOG(_L(" no bytes received!"));
-// User::Leave(KErrNotFound);
- return;
- }
- TBuf<KMaxFileName> swupd;
-
- swupd.AppendNum(aPkgId);
- swupd.Append(_L(".swupd"));
-
- // open swupd file for reading
- err = fswupd.Open(iFs, swupd, EFileWrite|EFileShareExclusive);
- FLOG(_L(" open err %d"),err);
- if (err == KErrNotFound )
- {
- FLOG(_L("swupd not found, creaeting"));
- User::LeaveIfError(fswupd.Replace(iFs, swupd
- ,EFileWrite|EFileShareExclusive));
- }
- else
- if ( err!=KErrNone) User::LeaveIfError (err);
- CleanupClosePushL(fswupd);
-
- RFile ND;
- User::LeaveIfError ( ND.Replace ( iFs, KDummyFileName, EFileWrite ) );
- CleanupClosePushL ( ND);
- CleanupStack::PopAndDestroy(2); // dummies
- AdjustDummyStorageL();
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::GetUpdatePackageLocation
-// Gets update package location, that is , path.
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::GetUpdatePackageLocationL(const TInt aPkgId
- , TDes8& aPath )
-{
- TBuf8<20> fn;
- fn.AppendNum(aPkgId);
- fn.Append(_L8(".swupd"));
- TInt pathlength = ((TDesC16)KDummyFilePath).Length();
- HBufC8* path = HBufC8::NewLC( pathlength );
- path->Des().Copy( KDummyFilePath );
-
- aPath.Append( path->Des() );
- aPath.Append(fn);
- CleanupStack::PopAndDestroy( path );
-}
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::GetUpdatePackageIds
-// getupdate package ids
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::GetUpdatePackageIdsL(TDes16& aPackageIdList)
- {
- FLOG(_L("CFotaDiskStorage::GetUpdatePackageIds"));
- // Read all .swupd files and parse pkg ids from filenames
- TInt err;
- CDir* list;
- err=iFs.GetDir (_L("*.swupd"), KEntryAttNormal ,ESortByName, list );
- for(int i=0; i<list->Count() ;++i )
- {
- TEntry t = (*list)[i];
- TParse p;
- TInt16 pkgid;
- p.Set(t.iName,NULL,NULL);
- TLex lex(p.Name());
- err = lex.Val(pkgid);
- FLOG(_L(" %S"),&t.iName);
- if(err==KErrNone)
- {
- TPtrC filename(p.Name());
- FLOG(_L(" pkig found: %d"), pkgid);
- TDateTime d = t.iModified.DateTime();
- aPackageIdList.Append (pkgid);
- }
- }
- delete list;
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::DeleteUpdatePackageL
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::DeleteUpdatePackageL (const TInt aPkgId)
- {
- FLOG(_L("CFotaDiskStorage::DeleteUpdatePackageL %d >>"),aPkgId);
- RFile dummy;
- TInt err= dummy.Open(iFs, KDummyFileName , EFileWrite|EFileShareExclusive);
- FLOG(_L("Error opening the reserved file...%d"),err);
- CleanupClosePushL ( dummy );
- TRAP(err, DoDeleteUpdatePackageL ( dummy, aPkgId, 0 ));
- CleanupStack::PopAndDestroy(1);
- AdjustDummyStorageL();
-
- FLOG(_L("CFotaDiskStorage::DeleteUpdatePackageL %d, err = %d <<"),aPkgId, err);
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::DoDeleteUpdatePackageL
-// Delete swupd by chunking data to dummy (param) file. Will grow dummy
-// independently, but takes already allocated bytes into account.
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::DoDeleteUpdatePackageL ( RFile& dummy, TInt aPkgId
- , TInt aAlreadyAllocated)
- {
- // Open swupd file
- TInt err;
- TBuf8<KMaxFileName> swupdpath;
- TBuf<KMaxFileName> swupdpath16;
- GetUpdatePackageLocationL ( aPkgId, swupdpath) ;
- swupdpath16.Copy ( swupdpath );
- RFile swupd;
- err = swupd.Open( iFs, swupdpath16, EFileWrite );
- if ( err == KErrNotFound ) return; // no need to delete
- if ( err != KErrNone ) User::Leave ( err );
- CleanupClosePushL ( swupd );
-
- // Reduce dummy size
- TInt dummytargetsize = iDummySize - aAlreadyAllocated;
- for ( TInt p=0; p<10000 ; ++p )
- {
- TInt dsize;
- TInt swupdsize(0);
- User::LeaveIfError( dummy.Size( dsize ) );
- User::LeaveIfError( swupd.Size( swupdsize) );
- TInt chunk = swupdsize > iChunkSize ? iChunkSize : swupdsize;
-
- // Ensure that dummy dosnt get oversized
- if ( dsize <= dummytargetsize && dsize + chunk >= dummytargetsize )
- chunk = dummytargetsize - dsize;
-
- // Safety
- if ( dsize >= dummytargetsize ) break;
-
- FLOG(_L(" deleting swupd: dummy %d\t swupd %d\t chunk%d"),dsize
- ,swupdsize,chunk);
- if (chunk>0)
- {
- User::LeaveIfError( dummy.SetSize( dsize + chunk ) );
- User::LeaveIfError( swupd.SetSize( swupdsize - chunk ) );
- }
- else
- break;
- }
- CleanupStack::PopAndDestroy(1); // swupd
-
- // Delete swupd (dummy file is big enough now)
- err = iFs.Delete ( swupdpath16 ) ;
- FLOG(_L("CFotaDiskStorage::DoDeleteUpdatePackageL deleted ,err %d"),err);
- if ( err != KErrNone && err != KErrNotFound )
- {
- User::Leave ( err );
- }
- }
-
-// ---------------------------------------------------------------------------
-// CFotaDiskStorage::SpaceAllocatedBySWUPDFilesL
-// Counts space allocated by swupd files
-// ---------------------------------------------------------------------------
-void CFotaDiskStorage::SpaceAllocatedBySWUPDFilesL( TInt& aSwupdSize, TInt& aDummySize )
- {
- CDir* list;
- TInt err;
- // TInt (0);
- aSwupdSize = 0;
- aDummySize = 0;
- err = iFs.GetDir (_L("*.swupd"), KEntryAttNormal ,ESortByName, list );
- User::LeaveIfError(err);
- CleanupStack::PushL ( list );
-
- // get sizes of swupd files
- for(int i=0; i<list->Count() ;++i )
- {
- TEntry t = (*list)[i];
- TParse p;
- TInt16 pkgid;
-
- p.Set(t.iName,NULL,NULL);
- TLex lex(p.Name());
- err = lex.Val(pkgid);
- if(err==KErrNone)
- {
- TPtrC filename(p.Name());
- aSwupdSize += t.iSize;
- }
- }
- CleanupStack::PopAndDestroy( list );
-
- // get size of dummyfile
- err = iFs.GetDir (KDummyFileName, KEntryAttNormal ,ESortByName, list );
- User::LeaveIfError(err);
- CleanupStack::PushL ( list );
- if ( list->Count() >0 )
- {
- TEntry t = (*list)[0];
- aDummySize = t.iSize;
- }
- CleanupStack::PopAndDestroy( list );
- FLOG(_L("CFotaDiskStorage::SpaceAllocatedBySWUPDFilesL dummy:%d swupd:%d")
- ,aDummySize,aSwupdSize);
- }
-
-// ---------------------------------------------------------------------------
-// Global implementation uid array
-// Define the Implementation UIDs for JP2K decoder.
-// (other items were commented in a header).
-// ---------------------------------------------------------------------------
-//
-const TImplementationProxy ImplementationTable[] =
-{
- // implementation_uid
- IMPLEMENTATION_PROXY_ENTRY( 0x10207385 , CFotaDiskStorage::NewL )
-};
-
-// ========================== OTHER EXPORTED FUNCTIONS =========================
-
-// ---------------------------------------------------------------------------
-// ImplementationGroupProxy Implements proxy interface for ECom
-// Exported proxy for instantiation method resolution.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy( //lint !e714 Used by ECom
- TInt& aTableCount ) // Number of tables
- {
- aTableCount = sizeof( ImplementationTable ) / sizeof(
- TImplementationProxy );
- return ImplementationTable;
- }