diff -r 81da3301b632 -r f85613f12947 mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp --- a/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp Wed Jun 09 10:36:33 2010 +0300 +++ b/mtpfws/mtpfw/datatypes/src/cmtptypefile.cpp Mon Jun 21 16:36:59 2010 +0300 @@ -234,16 +234,8 @@ iRemainingDataSize = (TInt64)aSize;//Current implemenation does not support file size with 2 x64 - if(iRemainingDataSize> KMTPFileChunkSizeForLargeFile) //512K - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForLargeFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForLargeFile); - } - else - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForSmallFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForSmallFile); - } + CreateDoubleBufferL(iRemainingDataSize); + if(iRemainingDataSize> KMTPFileSetSizeChunk) { //split the setSize to multiple calling of 512M @@ -599,16 +591,7 @@ iRemainingDataSize = size; //For File reading, NO "SetSizeL()" will be called, therefore, create the buffer here. - if (iRemainingDataSize > KMTPFileChunkSizeForLargeFile) //512K - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForLargeFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForLargeFile); - } - else - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForSmallFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForSmallFile); - } + CreateDoubleBufferL(iRemainingDataSize); } } @@ -647,16 +630,7 @@ iRemainingDataSize = iTargetFileSize; //For File reading, NO "SetSizeL()" will be called, therefore, create the buffer here. - if (iRemainingDataSize > KMTPFileChunkSizeForLargeFile) //512K - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForLargeFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForLargeFile); - } - else - { - iBuffer1.CreateMaxL(KMTPFileChunkSizeForSmallFile); - iBuffer2.CreateMaxL(KMTPFileChunkSizeForSmallFile); - } + CreateDoubleBufferL(iRemainingDataSize); } } @@ -743,3 +717,46 @@ iBuffer1AvailForWrite = !iBuffer1AvailForWrite;//toggle the flag. } + +/** + * Allocate double buffers to write to/read from file + * @param aFileSize: the size of the file to be written to or read from + * @return void + * leave code: KErrNoMemory if there is insufficient memory + */ +void CMTPTypeFile::CreateDoubleBufferL(TInt64 aFileSize) + { + if(aFileSize > KMTPFileChunkSizeForLargeFile) //512KB + { + TInt err = iBuffer1.CreateMax(KMTPFileChunkSizeForLargeFile); + TInt err2 = iBuffer2.CreateMax(KMTPFileChunkSizeForLargeFile); + TInt bufferSize = KMTPFileChunkSizeForLargeFile; + + //if one of buffer allocation fails, decrease the buffer size by + //a half of it until : + //we finally succeed in the allocation Or + //the smallest acceptable buffer size KMTPFileChunkSizeForSmallFile(64KB) reaches. + while ((err != KErrNone || err2 != KErrNone) && bufferSize != KMTPFileChunkSizeForSmallFile) + { + iBuffer1.Close(); + iBuffer2.Close(); + + bufferSize /= 2; + err = iBuffer1.CreateMax(bufferSize); + err2 = iBuffer2.CreateMax(bufferSize); + } + + if ( err != KErrNone || err2 != KErrNone) + { + //We still can not allocate 2*64KB buffer, just leave under this case + iBuffer1.Close(); + iBuffer2.Close(); + User::Leave(KErrNoMemory); + } + } + else + { + iBuffer1.CreateMaxL(KMTPFileChunkSizeForSmallFile); + iBuffer2.CreateMaxL(KMTPFileChunkSizeForSmallFile); + } + }