mmplugins/lib3gp/impl/src/filewriter.cpp
changeset 58 b6dbf97aba93
parent 29 eb1e5d7cc688
--- a/mmplugins/lib3gp/impl/src/filewriter.cpp	Thu Sep 16 18:39:58 2010 +0100
+++ b/mmplugins/lib3gp/impl/src/filewriter.cpp	Thu Sep 16 18:57:38 2010 +0100
@@ -38,7 +38,11 @@
 // might leave.
 // -----------------------------------------------------------------------------
 //
-CFileWriter::CFileWriter() : CActive( EPriorityHigh ) 
+CFileWriter::CFileWriter( TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge ):
+	CActive( EPriorityHigh ),
+	iSetSize( aInitSetSize ),
+	iOutputBufferSizeSmall( aOutputBufferSizeSmall ),
+	iOutputBufferSizeLarge( aOutputBufferSizeLarge )
     {
     }
 
@@ -52,6 +56,7 @@
     PRINT((_L("CFileWriter::ConstructL() in")));         
     iFlush = EFalse;
     iError = KErrNone;
+
     iOutputFile = &aFile;
     iWritingStarted = EFalse;
     iOutputBufferSize = KFileWriterBufferSizeSmall;
@@ -73,9 +78,9 @@
 // Two-phased constructor.
 // -----------------------------------------------------------------------------
 //
-CFileWriter* CFileWriter::NewL( RFile64& aFile )
+CFileWriter* CFileWriter::NewL( RFile64& aFile, TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge )
     {
-    CFileWriter* self = new(ELeave) CFileWriter;
+    CFileWriter* self = new(ELeave) CFileWriter( aInitSetSize, aOutputBufferSizeSmall, aOutputBufferSizeLarge );
     CleanupStack::PushL(self);
     self->ConstructL( aFile );
     CleanupStack::Pop(self);
@@ -111,6 +116,37 @@
     PRINT((_L("CFileWriter::~CFileWriter() out")));         
     }
 
+// -----------------------------------------------------------------------------
+// CFileWriter::UpdateOutputFileSize()
+// Updates output file size and reserves extra space for following writing 
+// if iSetSize is set.  
+// Takes into account if the position in the file was changed.
+// -----------------------------------------------------------------------------
+//
+void CFileWriter::UpdateOutputFileSize()
+    {
+    TInt64 pos = 0;
+    PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 1")));
+    iOutputFile->Seek(ESeekCurrent, pos);
+    PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 0")));
+    
+    PRINT((_L("CFileWriter::UpdateOutputFileSize() pos: %Ld"), pos));
+    PRINT((_L("CFileWriter::UpdateOutputFileSize() iOutputFileSize: %Ld"), iOutputFileSize));
+    PRINT((_L("CFileWriter::UpdateOutputFileSize() iSetSize: %Ld"), iSetSize));
+    
+    if (pos > iOutputFileSize) 
+        {
+        iOutputFileSize = pos;
+        }
+    
+    while (iOutputFileSize >= iSetSize) 
+        {
+        iSetSize += static_cast<TInt64>(iOutputBufferSize) * (static_cast<TInt64>(iMaxOutputBufHardLimit) >> 1); 
+        PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 1")));                     
+        iOutputFile->SetSize( iSetSize );
+        PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 0")));                     
+        }
+    }
 
 // -----------------------------------------------------------------------------
 // CFileWriter::Write( const TDesC8& aBuf )
@@ -233,6 +269,7 @@
         PRINT((_L("e_cfilewriter_flush_remove_buf 1")));
         if ( error == KErrNone )
             {
+            UpdateOutputFileSize();
             iFullBufferQueue[0]->Des().Zero();
             if ( iEmptyBufferQueue.Append( iFullBufferQueue[0] ) )
                 {
@@ -257,6 +294,7 @@
         PRINT((_L("e_cfilewriter_flush_writeinput_sync 0")));
         if ( error == KErrNone )
             {
+            UpdateOutputFileSize();
             iInputBuf->Des().Zero();
             }
         else
@@ -293,11 +331,11 @@
 
     if ( aBufferSize == EBufferSizeSmall ) 
         {
-        size = KFileWriterBufferSizeSmall;
+        size = iOutputBufferSizeSmall;
         }
     else if ( aBufferSize == EBufferSizeLarge ) 
         {
-        size = KFileWriterBufferSizeLarge;
+        size = iOutputBufferSizeLarge;
         }
     else if ( aBufferSize == EBufferSizeCustom )
         {
@@ -373,7 +411,7 @@
 
     while (byteswritten < aBuf.Length() )
         {
-        available = (iInputBuf->Des()).MaxLength() - iInputBuf->Length();
+        available = iOutputBufferSize - iInputBuf->Length();
 
         if (available > 0)
             {
@@ -468,7 +506,7 @@
 
     if ( iStatus == KErrNone )
         {
-        iOutputFileSize += iFullBufferQueue[0]->Des().Length();
+        UpdateOutputFileSize();                    
         iFullBufferQueue[0]->Des().Zero();
         iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
         if ( iError )
@@ -487,7 +525,7 @@
         return;
         }
 
-    PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
+    PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
     
     if ( iFlush )
         {
@@ -505,7 +543,7 @@
             PRINT((_L("e_cfilewriter_runl_write 0")));                     
             if ( iError == KErrNone )
                 {
-                iOutputFileSize += iFullBufferQueue[0]->Des().Length();
+                UpdateOutputFileSize();
                 iFullBufferQueue[0]->Des().Zero();
                 iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
                 if ( iError )
@@ -516,7 +554,7 @@
                     return;
                     }
                 iFullBufferQueue.Remove( 0 );
-    			PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
+    			PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
                 }   
             else
                 {
@@ -533,7 +571,7 @@
         PRINT((_L("e_cfilewriter_runl_outfile_write 0")));                     
         if ( iError == KErrNone )
             {
-            iOutputFileSize += iFullBufferQueue[0]->Des().Length();
+            UpdateOutputFileSize();
             iFullBufferQueue[0]->Des().Zero();
             iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
             if ( iError )
@@ -544,7 +582,7 @@
                 return;
                 }
             iFullBufferQueue.Remove( 0 );
-    		PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
+    		PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
             }   
         else
             {