codhandler/codeng/src/CodSaver.cpp
changeset 0 dd21522fd290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/codeng/src/CodSaver.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,233 @@
+/*
+* 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 CCodSaver.   
+*      
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "CodSaver.h"
+#include "CodPanic.h"
+#include "CodLogger.h"
+#include "CodError.h"
+#include "FileExt.h"
+#include "bautils.h"
+
+
+// ================= CONSTANTS =======================
+
+/// Response size upper bound multiplier. Used in SetMaxSize().
+LOCAL_D const TReal KCodOversizeFactor = 1.4;
+/// Response upper bound of response size (10k). Used in SetMaxSize().
+LOCAL_D const TInt KCodMinUpperBound = 10240;
+
+const TInt KMaxIndexStringLength = 16;   // max size of index string "(4294967296)"
+_LIT( KIndexString, "(%d)" );
+const TInt KDownloadNameMaxSize = 120;
+#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CCodSaver::ConstructL()
+// ---------------------------------------------------------
+//
+void CCodSaver::ConstructL()
+    {
+    iSourceUri = HBufC8::NewL( 0 );
+    }
+
+// ---------------------------------------------------------
+// CCodSaver::~CCodSaver()
+// ---------------------------------------------------------
+//
+CCodSaver::~CCodSaver()
+    {
+    delete iSourceUri;
+    }
+
+// ---------------------------------------------------------
+// CCodSaver::SetObserver()
+// ---------------------------------------------------------
+//
+void CCodSaver::SetObserver( MCodLoadObserver* aObserver )
+    {
+    CLOG(( ECodEng, 2, _L("CCodSaver::SetObserver(0x%x)"), aObserver ));
+//TODO:    __ASSERT_ALWAYS( !(aObserver && iObserver), \
+//        CodPanic( ECodObserverAlreadySet ) );
+    iObserver = aObserver;
+    }
+
+// ---------------------------------------------------------
+// CCodSaver::CheckMaxSize()
+// ---------------------------------------------------------
+//
+TInt CCodSaver::CheckMaxSize( TInt aDataChunkSize )
+    {
+    __ASSERT_DEBUG( aDataChunkSize >= 0, CodPanic( ECodInternal ) );
+    TInt err( KErrNone );
+    if ( iMaxSize && iSize + aDataChunkSize > iMaxSize )
+        {
+        err = KErrCodAttributeMismatch;
+        CLOG(( ECodEng, 2, _L("CCodSaver::CheckMaxSize %d+%d>%d, fail"), \
+            iSize, aDataChunkSize, iMaxSize ));
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CCodSaver::SetMaxSize()
+// ---------------------------------------------------------
+//
+void CCodSaver::SetMaxSize( TInt aSize )
+    {
+    __ASSERT_DEBUG( aSize >= 0, CodPanic( ECodInternal ) );
+    // Max size is set with allowance, to compensate transport encodings,
+    // packaging, and packaging headers.
+    iMaxSize = Max( (TInt)(KCodOversizeFactor * aSize), KCodMinUpperBound );
+    }
+
+
+void CCodSaver::AppendStorageInfoL(TPtr8& aBuf)const
+    {
+    AppendBufL(aBuf,iSourceUri);
+    APPEND_BUF_INT(aBuf,iFname);
+    APPEND_BUF_INT(aBuf,iSize);
+    APPEND_BUF_INT(aBuf,iState);
+    APPEND_BUF_INT(aBuf,iHandler);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCodSaver::ConvertDownloadNameUniqueL
+// -----------------------------------------------------------------------------
+//
+void CCodSaver::ConvertDownloadNameUniqueL( HBufC*& filePath,
+                                            HBufC*& fileName,
+                                            HBufC*& fileExtn)
+    {
+    TBool bFound( EFalse );
+    TInt index( 0 );
+    HBufC* uniqueName = NULL;
+    HBufC* fullNameTemp = HBufC::NewLC(KMaxFileName);
+    TPtr fullNameTempPtr( fullNameTemp->Des() );
+
+    RFs rFs;
+  	User::LeaveIfError( rFs.Connect() );
+  	CleanupClosePushL(rFs);
+
+    do
+        {
+        bFound = EFalse;
+        //Generate Unique name.
+        CreateIndexedNameL( uniqueName, *fileName, index );
+
+        //Name in \\system\\temp.
+        fullNameTempPtr.Copy( *filePath );
+        fullNameTempPtr.Append( *uniqueName );
+        fullNameTempPtr.Append( *fileExtn );
+
+        if( BaflUtils::FileExists( rFs , fullNameTempPtr ) )
+            //Check if file name exist in Destination path.
+            {
+            bFound =ETrue;
+            }
+
+        }while( bFound );
+
+    CleanupStack::PopAndDestroy(&rFs);
+    CleanupStack::PopAndDestroy(fullNameTemp);
+    
+    // This is the unique name that we were looking for.
+    CleanupStack::PopAndDestroy(fileName);
+    fileName = uniqueName;
+    CleanupStack::PushL(fileName);
+    }
+
+// -----------------------------------------------------------------------------
+// CCodSaver::CreateIndexedNameL
+// -----------------------------------------------------------------------------
+//
+void CCodSaver::CreateIndexedNameL( HBufC*& aUniqueName, 
+                                        TDesC& aOrgName, 
+                                        TInt& aIndex )
+    {
+    TPtrC left;
+    TBuf<KMaxIndexStringLength> indexStr;
+
+    delete aUniqueName; aUniqueName = NULL;
+
+    if( aIndex )
+        {
+        indexStr.Format( KIndexString, aIndex );
+        }
+
+    TInt fullLength = aOrgName.Length() + indexStr.Length();
+    if( fullLength > KMaxPath )
+        // name is longer than KMaxPath.
+        {
+        User::Leave( KErrGeneral );
+        }
+
+    left.Set( aOrgName.Left( KDownloadNameMaxSize - indexStr.Length() ));
+
+    aUniqueName = HBufC::NewL( fullLength );
+    aUniqueName->Des().Format( _L("%S%S"), &left, 
+                                           &indexStr );
+
+    ++aIndex;
+    }
+    
+// -----------------------------------------------------------------------------
+// CCodSaver::FindUniqueDestinationFileNameL
+// -----------------------------------------------------------------------------
+//
+void CCodSaver::FindUniqueDestinationFileNameL( TDesC& srcFile, HBufC*& destPath )
+    {
+        HBufC* fileExtention = HBufC::NewLC(KMaxFileName);
+        HBufC* fileName = HBufC::NewLC(KMaxFileName);
+        TPtr fileNamePtr( fileName->Des() );
+
+        fileNamePtr = srcFile;
+        // Retrieve the file extention.
+        TInt dotInd = srcFile.LocateReverse( '.' );
+        if( dotInd != KErrNotFound )
+            // Filename extension found.
+            {
+            fileExtention->Des().Copy( srcFile.Right( srcFile.Length() - dotInd ) );
+            fileNamePtr.Copy( srcFile.Left( dotInd ) );
+            }
+
+        // Retrieve the file name (excluding file extention).
+        TInt lastSlashPos = fileNamePtr.LocateReverse( '\\' );
+        if( lastSlashPos != KErrNotFound )
+            // Filename found.
+            {
+            fileNamePtr.Copy( fileNamePtr.Right( fileNamePtr.Length() - lastSlashPos - 1 ) );
+            }
+
+        // Find a unique file name.
+        ConvertDownloadNameUniqueL( destPath, fileName, fileExtention );
+
+        // Found. Append file name and extention to destination path.
+        destPath->Des().Append( *fileName );
+        destPath->Des().Append( *fileExtention );
+
+        CleanupStack::PopAndDestroy( fileName );
+        CleanupStack::PopAndDestroy( fileExtention );
+    }