devencdiskutils/DevEncCommonUtils/src/DevEncDiskUtils.cpp
changeset 0 164170e6151a
child 11 9971b621ef6c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devencdiskutils/DevEncCommonUtils/src/DevEncDiskUtils.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,356 @@
+/*
+* Copyright (c) 2007 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:
+*
+*/
+
+
+#include <e32base.h>
+#include <f32file.h> // for TDriveNumber
+#include <centralrepository.h>
+#include <e32property.h>
+
+#include <UiklafInternalCRKeys.h> // for disc space
+
+#include "DevEncCommonUtils.hrh"
+#include "DevEncDiskUtils.h"
+#include "DevEncLog.h"
+
+/*static const TPtrC KDriveLetter[] = {
+    _L("A"), _L("B"), _L("C"), _L("D"), _L("E"), _L("F"), _L("G"), _L("H"),
+    _L("I"), _L("J"), _L("K"), _L("L"), _L("M"), _L("N"), _L("O"), _L("P"),
+    _L("Q"), _L("R"), _L("S"), _L("T"), _L("U"), _L("V"), _L("W"), _L("X"),
+    _L("Y"), _L("Z") };*/
+
+_LIT( KA, "A"); _LIT( KB, "B");_LIT( KC, "C"); _LIT( KD, "D");
+_LIT( KE, "E"); _LIT( KF, "F"); _LIT( KG, "G"); _LIT( KH, "H");
+_LIT( KI, "I"); _LIT( KJ, "J");_LIT( KK, "K"); _LIT( KL, "L");
+_LIT( KM, "M"); _LIT( KN, "N"); _LIT( KO, "O"); _LIT( KP, "P");
+_LIT( KQ, "Q"); _LIT( KR, "R"); _LIT( KS, "S"); _LIT( KT, "T");
+_LIT( KU, "U"); _LIT( KV, "V"); _LIT( KW, "W"); _LIT( KX, "X");
+_LIT( KY, "Y"); _LIT( KZ, "Z");
+
+_LIT( KContentTestFile, "c:\\content_test.txt" );
+static const TUint32 KTestBlockSizeBt = 1024 * sizeof( TUint32 );
+static const TUint32 KTestBlocks      = 320;
+static const TInt32  KMaxInt          = 2147483647;       
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DriveLetter()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C TInt CDevEncDiskUtils::DriveLetter( TInt aNumber,
+                                             TDes& aResult )
+    {
+    const TInt KNumOfDriveLetters( 25 );
+    const TPtrC KDriveLetter[] = {
+        KA(), KB(), KC(), KD(), KE(), KF(), KG(), KH(),
+        KI(), KJ(), KK(), KL(), KM(), KN(), KO(), KP(),
+        KQ(), KR(), KS(), KT(), KU(), KV(), KW(), KX(),
+        KY(), KZ() };
+    if ( aNumber > KNumOfDriveLetters )
+        {
+        return KErrOverflow;
+        }
+    aResult.Append( KDriveLetter[ aNumber ] );
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DrivePath()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C void CDevEncDiskUtils::DrivePath( TDes& aDes, TDriveNumber aNumber )
+    {
+    DriveLetter( aNumber, aDes );
+    aDes.Append( _L(":\\") );
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DoWriteTestFileL()
+// 
+// --------------------------------------------------------------------------
+void CDevEncDiskUtils::DoWriteTestFileL()
+    {
+    RFile file;
+    RFs fs;
+
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    User::LeaveIfError( file.Replace( fs, KContentTestFile, EFileWrite ) );
+    CleanupClosePushL( file );
+
+    HBufC8* buf = HBufC8::NewL( KTestBlockSizeBt );
+    CleanupStack::PushL( buf );
+
+    TPtr8 pbuf = buf->Des();
+    pbuf.SetLength( KTestBlockSizeBt );
+
+    for( TUint32 i=0; i < KTestBlocks; i++ )
+        {
+        for( TUint32 k=0; k < KTestBlockSizeBt; k++ )
+            pbuf[k] = 0xff;
+
+        User::LeaveIfError( file.Write( pbuf ) );
+        }
+
+    CleanupStack::PopAndDestroy(3);
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::WriteTestFile()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C void CDevEncDiskUtils::WriteTestFile()
+    {
+    if ( ! RProcess().HasCapability( ECapabilityDiskAdmin ) )
+        {
+        DFLOG( "Process does not have DiskAdmin capability" );
+        return;
+        }
+
+    DFLOG("Writing test file");
+    TRAPD( err, DoWriteTestFileL() );
+    if( err )
+        {
+        DFLOG2("...failed %d", err);
+        }
+    else
+        {
+        DFLOG( "...ok" );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DoVerifyTestFileL()
+// 
+// --------------------------------------------------------------------------
+void CDevEncDiskUtils::DoVerifyTestFileL()
+    {
+    if ( ! RProcess().HasCapability( ECapabilityDiskAdmin ) )
+        {
+        DFLOG( "Process does not have DiskAdmin capability" );
+        return;
+        }
+
+    RFile file;
+    RFs fs;
+
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    User::LeaveIfError( file.Open( fs, KContentTestFile, EFileRead ) );
+    CleanupClosePushL( file );
+
+    HBufC8* buf = HBufC8::NewL(KTestBlockSizeBt);
+    CleanupStack::PushL( buf );
+
+    TPtr8 pbuf = buf->Des();
+    pbuf.SetLength( KTestBlockSizeBt );
+
+    for( TUint32 i=0; i < KTestBlocks; i++ )
+        {
+        User::LeaveIfError( file.Read( pbuf ) );
+
+        for( TUint32 k=0; k < KTestBlockSizeBt; k++ )
+            {
+            if( pbuf[k] != 0xff )
+                DFLOG3("pos=%d val=%d", (i * KTestBlockSizeBt + k), pbuf[k]);
+            }
+        }
+
+    CleanupStack::PopAndDestroy(3);
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::VerifyTestFile()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C void CDevEncDiskUtils::VerifyTestFile()
+    {
+    DFLOG("Verifying test file");
+    TRAPD( err, DoVerifyTestFileL() );
+    if( err )
+        {
+        DFLOG2("...failed %d", err);
+        }
+    else
+        {
+        DFLOG( "..ok" );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DeleteTestFile()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C void CDevEncDiskUtils::DeleteTestFile()
+    {
+    DFLOG("Deleting test file");
+    RFs fs;
+
+    TInt err = fs.Connect();
+
+    if( !err )
+        {
+        err = fs.Delete( KContentTestFile );
+
+        if( !err || err == KErrNotFound )
+            {
+            DFLOG("...ok");
+            }
+        else
+            {
+            DFLOG2( "...failed %d", err );
+            }
+        }
+    else
+        {
+        DFLOG2( "fs.Connect() failed %d", err );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::DiskFinalize()
+// 
+// --------------------------------------------------------------------------
+EXPORT_C TInt CDevEncDiskUtils::DiskFinalize( TDriveNumber aNumber )
+    {
+    if ( ! RProcess().HasCapability( ECapabilityDiskAdmin ) )
+        {
+        DFLOG( "Process does not have DiskAdmin capability" );
+        return KErrAccessDenied;
+        }
+    
+    DFLOG("Finalizing");
+
+    RArray <TFileName> temps;
+    RArray <RFile> files;
+    RFs fs;
+
+    TInt err = fs.Connect();
+    if( err )
+        DFLOG2( "..fs.Connect fail %d", err);
+
+    TBool freeSpace = ETrue;
+
+    TVolumeInfo volumeInfo;
+    err = fs.Volume( volumeInfo, aNumber );
+    if( err )
+        DFLOG2( "..fs.Volume fail %d", err );
+
+    TInt64 size = 0;
+    TInt64 memoryCriticalSpace(0);
+    TRAP(err, memoryCriticalSpace = FindCriticalLevelTresholdL());
+    if (!err)
+        return err;
+    TInt64 memoryWarningSpace(0);
+    TRAP(err, memoryWarningSpace = FindWarningLevelTresholdL());
+    if (!err)
+        return err;
+    
+    DFLOG2( "CDevEncDiskUtils::DiskFinalize => memoryCriticalSpace = %d", (TInt) memoryCriticalSpace );
+    DFLOG2( "CDevEncDiskUtils::DiskFinalize => memoryWarningSpace = %d", (TInt) memoryWarningSpace );
+    
+    //create the number of files needed to fill the mmc free space
+    while( freeSpace )
+        {
+        /* The real warning space is a percentage of the free space */
+        TInt64 newMemoryWarningSpace = ( TInt64 ) ( volumeInfo.iSize*( 100 - memoryWarningSpace ) ) / 100;
+        DFLOG2( "CDevEncDiskUtils::DiskFinalize => newMemoryWarningSpace = %d", (TInt) newMemoryWarningSpace );
+
+        if( TInt64( volumeInfo.iFree ) > TInt64( KMaxInt ) )
+        	{
+            size = KMaxInt;
+            }
+        else
+        	{
+        	size = Max( 0LL, TInt64( volumeInfo.iFree ) - memoryCriticalSpace - newMemoryWarningSpace );
+        	}
+
+        TFileName temp;
+        RFile file;
+
+        if( !err )
+            {
+            TBuf<8> path;
+            DrivePath( path, aNumber );
+
+            err = file.Temp( fs, path, temp, EFileWrite );
+            if( err )
+                DFLOG2( "..file.Temp fail %d", err );
+            }
+
+        err = file.SetSize( ( TInt ) size );
+        if( err )
+            DFLOG2( "..file.SetSize fail %d", err );
+
+        files.Append( file );
+        temps.Append( temp );
+
+        err = fs.Volume( volumeInfo, aNumber );
+        if( err )
+            DFLOG2( "..fs.Volume fail %d", err );    
+
+        if( TInt64( volumeInfo.iFree ) <= memoryCriticalSpace + newMemoryWarningSpace )
+        	{
+            freeSpace = EFalse;
+            }
+        }
+
+    //delete the created files
+    for( TInt i=0;i < files.Count();i++ )
+    	{
+        files[i].Close();
+        fs.Delete( temps[i] ); // Error value ignored
+        }
+
+    files.Close();
+    temps.Close();
+    fs.Close();
+    return err;
+    }
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::FindValueL()
+// 
+// --------------------------------------------------------------------------
+TInt CDevEncDiskUtils::FindValueL( const TUid aRepositoryUid, const TUint aCRKey )
+	{
+	TInt val( 0 );
+    CRepository* repository = CRepository::NewLC( aRepositoryUid );
+    User::LeaveIfError( repository->Get( aCRKey, val ) );
+    CleanupStack::PopAndDestroy( repository );
+
+    return val;
+	}
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::FindCriticalLevelTresholdL()
+// 
+// --------------------------------------------------------------------------
+TInt64 CDevEncDiskUtils::FindCriticalLevelTresholdL()
+	{
+    return (TInt64) FindValueL( KCRUidUiklaf, KUikOODDiskCriticalThreshold );
+	}
+
+// --------------------------------------------------------------------------
+// CDevEncDiskUtils::FindWarningLevelTresholdL()
+// 
+// --------------------------------------------------------------------------
+TInt64 CDevEncDiskUtils::FindWarningLevelTresholdL()
+	{
+	return (TInt64) FindValueL( KCRUidUiklaf, /*KUikOODDiskWarningThreshold*/KUikOODDiskFreeSpaceWarningNoteLevel );
+	}
+
+// End of file