183 if (file->Replace(*fs, TPtrC((const TUint16 *)filename), EFileWrite|EFileShareExclusive|EFileWriteDirectIO ) != KErrNone) |
183 if (file->Replace(*fs, TPtrC((const TUint16 *)filename), EFileWrite|EFileShareExclusive|EFileWriteDirectIO ) != KErrNone) |
184 { |
184 { |
185 return -1; |
185 return -1; |
186 } |
186 } |
187 |
187 |
188 TBuf8<16> buf; |
|
189 buf.Copy(fp.Drive()); |
|
190 buf.LowerCase(); |
|
191 TInt drvNum = (*buf.Ptr()) - 'a'; |
|
192 PRINT((_L("drvNum = %d"), drvNum)); |
|
193 |
|
194 TVolumeInfo volInfo; |
|
195 error = fs->Volume(volInfo, drvNum); |
|
196 if (error != KErrNone) |
|
197 { |
|
198 return -1; |
|
199 } |
|
200 |
|
201 PRINT((_L("volInfo.iFree = %Ld"), volInfo.iFree)); |
|
202 PRINT((_L("volInfo.iSize = %Ld"), volInfo.iSize)); |
|
203 |
|
204 TVolumeIOParamInfo ioInfo; |
|
205 error = fs->VolumeIOParam(drvNum, ioInfo); |
|
206 if (error != KErrNone) |
|
207 { |
|
208 return -1; |
|
209 } |
|
210 |
|
211 PRINT((_L("ioInfo.iBlockSize = %d"), ioInfo.iBlockSize)); |
|
212 PRINT((_L("ioInfo.iClusterSize = %d"), ioInfo.iClusterSize)); |
|
213 |
|
214 if (ioInfo.iClusterSize <= 0 || (ioInfo.iClusterSize & 0x1)) // if for some reason we got wrong value for the cluster - ignore it |
|
215 { |
|
216 PRINT(_L("Wrong cluster size, set 0x8000")); |
|
217 ioInfo.iClusterSize = 0x8000; |
|
218 } |
|
219 |
|
220 // 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. |
|
221 TInt writeBufferSizeSmall = ioInfo.iClusterSize; |
|
222 TInt writeBufferSizeLarge = ioInfo.iClusterSize * 8; |
|
223 |
|
224 // Now need to make sure that writeBufferSizeLarge is not too small (<128K) or too big (>256K) whilst keeping it a multiple of cluster size |
|
225 if (writeBufferSizeLarge < KFileWriterBufferSizeLarge/2) |
|
226 { |
|
227 writeBufferSizeLarge = KFileWriterBufferSizeLarge/2; |
|
228 } |
|
229 |
|
230 if (writeBufferSizeLarge > KFileWriterBufferSizeLarge) |
|
231 { |
|
232 writeBufferSizeLarge = (KFileWriterBufferSizeLarge / ioInfo.iClusterSize) * ioInfo.iClusterSize; |
|
233 } |
|
234 |
|
235 if (writeBufferSizeLarge < ioInfo.iClusterSize) |
|
236 { |
|
237 writeBufferSizeLarge = ioInfo.iClusterSize; |
|
238 } |
|
239 |
|
240 PRINT((_L("writeBufferSizeLarge = %d"), writeBufferSizeLarge)); |
|
241 |
|
242 TInt incSetSize = writeBufferSizeLarge * (KFileWriterHardBufLimit >> 1); // 2Mb if cluster size if 32767 |
|
243 TInt initSetSize = incSetSize * 1; // set initial set size for 2Mb |
|
244 |
|
245 if (initSetSize > volInfo.iFree) |
|
246 { |
|
247 initSetSize = (volInfo.iFree / incSetSize) * incSetSize; |
|
248 } |
|
249 |
|
250 PRINT((_L("initSetSize = %d"), initSetSize)); |
|
251 |
|
252 PRINT((_L("e_SetSize 1"))); |
|
253 file->SetSize(initSetSize); |
|
254 PRINT((_L("e_SetSize 0"))); |
|
255 |
|
256 handle->file = handle->rfile; |
188 handle->file = handle->rfile; |
257 |
189 |
258 TRAP(error, handle->filewriter = CFileWriter::NewL( *file, initSetSize, writeBufferSizeSmall, writeBufferSizeLarge)); |
190 TRAP(error, handle->filewriter = CFileWriter::NewL( *file )); |
259 if ( error != KErrNone ) |
191 if ( error != KErrNone ) |
260 { |
192 { |
261 return -1; |
193 return -1; |
262 } |
194 } |
263 |
195 |
332 if (handle->filewriter) |
264 if (handle->filewriter) |
333 { |
265 { |
334 PRINT((_L("e_closefile_flush_filewriter 1"))); |
266 PRINT((_L("e_closefile_flush_filewriter 1"))); |
335 (handle->filewriter)->Flush(KNullDesC8); |
267 (handle->filewriter)->Flush(KNullDesC8); |
336 PRINT((_L("e_closefile_flush_filewriter 0"))); |
268 PRINT((_L("e_closefile_flush_filewriter 0"))); |
337 PRINT((_L("e_SetSize 1"))); |
269 delete handle->filewriter; |
338 ((RFile64 *)(handle->file))->SetSize((handle->filewriter)->OutputFileSize()); |
|
339 PRINT((_L("e_SetSize 0: iOutputFileSize = %Ld"), (handle->filewriter)->OutputFileSize())); |
|
340 |
|
341 delete handle->filewriter; |
|
342 handle->filewriter = NULL; |
270 handle->filewriter = NULL; |
343 } |
271 } |
344 } |
272 } |
345 |
273 |
346 if (handle->asyncReader) |
274 if (handle->asyncReader) |
1386 PRINT(_L("3GPLib::initMetaDataFiles() in")); |
1314 PRINT(_L("3GPLib::initMetaDataFiles() in")); |
1387 TFileName filename; |
1315 TFileName filename; |
1388 TFileName path; |
1316 TFileName path; |
1389 TInt error; |
1317 TInt error; |
1390 |
1318 |
1391 TDriveList driveList; |
1319 // Create a directory for the files |
1392 TBool pathSet = EFalse; |
1320 if ( handle->fileName ) |
1393 |
1321 { |
1394 // As ram drive access is faster, try to set temp file directory to available ram drive. |
1322 filename = (TText *)handle->fileName; |
1395 if (((RFs *)(handle->fs))->DriveList(driveList) == KErrNone) |
|
1396 { |
|
1397 for ( TInt i = 0; i < driveList.Length(); i++ ) |
|
1398 { |
|
1399 TDriveInfo driveInfo; |
|
1400 if (((RFs *)(handle->fs))->Drive(driveInfo, i) == KErrNone) |
|
1401 { |
|
1402 if (driveInfo.iType == EMediaRam) |
|
1403 { |
|
1404 TChar driveLetter; |
|
1405 ((RFs *)(handle->fs))->DriveToChar(i, driveLetter); |
|
1406 path.Append(driveLetter); |
|
1407 path.Append(_L(":")); |
|
1408 path.Append(KTmpDirectoryName); |
|
1409 pathSet = ETrue; |
|
1410 break; |
|
1411 } |
|
1412 } |
|
1413 } |
|
1414 } |
|
1415 |
|
1416 // If no ram drive was found create a directory for the files on current drive |
|
1417 if (!pathSet) |
|
1418 { |
|
1419 if ( handle->fileName ) |
|
1420 { |
|
1421 filename = (TText *)handle->fileName; |
|
1422 |
1323 |
1423 TParse fp; |
1324 TParse fp; |
1424 path = KTmpDirectoryName; |
1325 path = KTmpDirectoryName; |
1425 if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone) |
1326 if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone) |
1426 return -1; |
1327 return -1; |
1427 path.Insert(0, fp.Drive()); |
1328 path.Insert(0, fp.Drive()); |
1428 } |
1329 } |
1429 else |
1330 else |
1430 { |
1331 { |
1431 TChar drive; |
1332 TChar drive; |
1432 if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone ) |
1333 if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone ) |
1433 return -1; |
1334 return -1; |
1434 path.Append( drive ); |
1335 path.Append( drive ); |
1435 path.Append( _L(":") ); |
1336 path.Append( _L(":") ); |
1436 path.Append( KTmpDirectoryName ); |
1337 path.Append( KTmpDirectoryName ); |
1437 } |
1338 } |
1438 } |
|
1439 |
1339 |
1440 // Try to delete the temp folder from leftovers |
1340 // Try to delete the temp folder from leftovers |
1441 // If other instance is using it then delete will just fail |
1341 // If other instance is using it then delete will just fail |
1442 PRINT((_L("e_initmetadatafiles_newl_fileman 1"))); |
1342 PRINT((_L("e_initmetadatafiles_newl_fileman 1"))); |
1443 CFileMan* fileMan = 0; |
1343 CFileMan* fileMan = 0; |