diff -r f50f14318409 -r 3f0ddfac3ede mmplugins/lib3gp/impl/src/file.cpp --- 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; } }