mmplugins/lib3gp/impl/src/file.cpp
branchRCL_3
changeset 39 3f0ddfac3ede
parent 23 545d349d14da
child 40 f429a0a2075b
--- a/mmplugins/lib3gp/impl/src/file.cpp	Mon Jun 21 17:23:11 2010 +0300
+++ b/mmplugins/lib3gp/impl/src/file.cpp	Thu Jul 15 20:22:56 2010 +0300
@@ -185,9 +185,77 @@
     return -1;
   }
 
+  TBuf8<16> buf;
+  buf.Copy(fp.Drive());
+  buf.LowerCase();
+  TInt drvNum = (*buf.Ptr()) - 'a';
+  PRINT((_L("drvNum = %d"), drvNum));
+  
+  TVolumeInfo volInfo;
+  error = fs->Volume(volInfo, drvNum);
+  if (error != KErrNone) 
+      {
+      return -1;
+      }
+  
+  PRINT((_L("volInfo.iFree = %Ld"), volInfo.iFree));
+  PRINT((_L("volInfo.iSize = %Ld"), volInfo.iSize));    
+
+  TVolumeIOParamInfo ioInfo;
+  error = fs->VolumeIOParam(drvNum, ioInfo);
+  if (error != KErrNone) 
+      {
+      return -1;
+      }
+  
+  PRINT((_L("ioInfo.iBlockSize = %d"), ioInfo.iBlockSize));
+  PRINT((_L("ioInfo.iClusterSize = %d"), ioInfo.iClusterSize));
+  
+  if (ioInfo.iClusterSize <= 0 || (ioInfo.iClusterSize & 0x1)) // if for some reason we got wrong value for the cluster - ignore it 
+     {
+     PRINT(_L("Wrong cluster size, set 0x8000"));
+     ioInfo.iClusterSize = 0x8000;
+     }
+  
+  // We want to have size of writing buffer to be a multiple of cluster size. Small buffer should be 1 cluster, large buffer should be 8 clusters.
+  TInt writeBufferSizeSmall = ioInfo.iClusterSize;
+  TInt writeBufferSizeLarge = ioInfo.iClusterSize * 8;
+  
+  // Now need to make sure that writeBufferSizeLarge is not too small (<128K) or too big (>256K) whilst keeping it a multiple of cluster size
+  if (writeBufferSizeLarge < KFileWriterBufferSizeLarge/2)
+      {
+      writeBufferSizeLarge = KFileWriterBufferSizeLarge/2;
+      }
+    
+  if (writeBufferSizeLarge > KFileWriterBufferSizeLarge)
+	  {
+	  writeBufferSizeLarge = (KFileWriterBufferSizeLarge / ioInfo.iClusterSize) * ioInfo.iClusterSize;
+  	  }
+
+  if (writeBufferSizeLarge < ioInfo.iClusterSize) 
+      {
+      writeBufferSizeLarge = ioInfo.iClusterSize;
+      }
+    
+  PRINT((_L("writeBufferSizeLarge = %d"), writeBufferSizeLarge));
+
+  TInt incSetSize = writeBufferSizeLarge * (KFileWriterHardBufLimit >> 1); // 2Mb if cluster size if 32767
+  TInt initSetSize = incSetSize * 1; // set initial set size for 2Mb
+  
+  if (initSetSize > volInfo.iFree) 
+      {
+      initSetSize = (volInfo.iFree / incSetSize) * incSetSize;
+      }
+
+  PRINT((_L("initSetSize = %d"), initSetSize));
+    
+  PRINT((_L("e_SetSize 1")));  
+  file->SetSize(initSetSize);
+  PRINT((_L("e_SetSize 0")));  
+
   handle->file = handle->rfile;
 
-  TRAP(error, handle->filewriter = CFileWriter::NewL( *file ));
+  TRAP(error, handle->filewriter = CFileWriter::NewL( *file, initSetSize, writeBufferSizeSmall, writeBufferSizeLarge));
   if ( error != KErrNone )
   {
     return -1;    
@@ -266,7 +334,11 @@
       PRINT((_L("e_closefile_flush_filewriter 1")));        
       (handle->filewriter)->Flush(KNullDesC8);
       PRINT((_L("e_closefile_flush_filewriter 0")));        
-      delete handle->filewriter;
+      PRINT((_L("e_SetSize 1")));  
+      ((RFile64 *)(handle->file))->SetSize((handle->filewriter)->OutputFileSize());
+      PRINT((_L("e_SetSize 0: iOutputFileSize = %Ld"), (handle->filewriter)->OutputFileSize()));  
+	  
+	  delete handle->filewriter;
       handle->filewriter = NULL;
     }
   }