mmplugins/lib3gp/impl/src/file.cpp
changeset 58 b6dbf97aba93
parent 29 eb1e5d7cc688
equal deleted inserted replaced
57:1cbb0d5bf7f2 58:b6dbf97aba93
   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 
   188   handle->file = handle->rfile;
   256   handle->file = handle->rfile;
   189 
   257 
   190   TRAP(error, handle->filewriter = CFileWriter::NewL( *file ));
   258   TRAP(error, handle->filewriter = CFileWriter::NewL( *file, initSetSize, writeBufferSizeSmall, writeBufferSizeLarge));
   191   if ( error != KErrNone )
   259   if ( error != KErrNone )
   192   {
   260   {
   193     return -1;    
   261     return -1;    
   194   }
   262   }
   195 
   263 
   264     if (handle->filewriter)
   332     if (handle->filewriter)
   265     {
   333     {
   266       PRINT((_L("e_closefile_flush_filewriter 1")));        
   334       PRINT((_L("e_closefile_flush_filewriter 1")));        
   267       (handle->filewriter)->Flush(KNullDesC8);
   335       (handle->filewriter)->Flush(KNullDesC8);
   268       PRINT((_L("e_closefile_flush_filewriter 0")));        
   336       PRINT((_L("e_closefile_flush_filewriter 0")));        
   269       delete handle->filewriter;
   337       PRINT((_L("e_SetSize 1")));  
       
   338       ((RFile64 *)(handle->file))->SetSize((handle->filewriter)->OutputFileSize());
       
   339       PRINT((_L("e_SetSize 0: iOutputFileSize = %Ld"), (handle->filewriter)->OutputFileSize()));  
       
   340 	  
       
   341 	  delete handle->filewriter;
   270       handle->filewriter = NULL;
   342       handle->filewriter = NULL;
   271     }
   343     }
   272   }
   344   }
   273 
   345 
   274   if (handle->asyncReader)
   346   if (handle->asyncReader)
  1314   PRINT(_L("3GPLib::initMetaDataFiles() in"));
  1386   PRINT(_L("3GPLib::initMetaDataFiles() in"));
  1315   TFileName filename;
  1387   TFileName filename;
  1316   TFileName path;
  1388   TFileName path;
  1317   TInt error;
  1389   TInt error;
  1318 
  1390 
  1319   // Create a directory for the files
  1391   TDriveList driveList;
  1320   if ( handle->fileName )
  1392   TBool pathSet = EFalse;
  1321     {
  1393   
  1322     filename = (TText *)handle->fileName;
  1394   // As ram drive access is faster, try to set temp file directory to available ram drive.
       
  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;
  1323     
  1422     
  1324     TParse fp;
  1423 		TParse fp;
  1325     path = KTmpDirectoryName;
  1424 		path = KTmpDirectoryName;
  1326     if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone)
  1425 		if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone)
  1327         return -1;
  1426 			return -1;
  1328     path.Insert(0, fp.Drive());
  1427 		path.Insert(0, fp.Drive());
  1329     }
  1428 		}
  1330   else
  1429 	else
  1331     {
  1430 		{
  1332     TChar drive;
  1431 		TChar drive;
  1333     if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone )
  1432 		if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone )
  1334         return -1;
  1433 			return -1;
  1335     path.Append( drive );
  1434 		path.Append( drive );
  1336     path.Append( _L(":") );
  1435 		path.Append( _L(":") );
  1337     path.Append( KTmpDirectoryName );
  1436 		path.Append( KTmpDirectoryName );
  1338     }
  1437 		}
       
  1438 	}
  1339     
  1439     
  1340   // Try to delete the temp folder from leftovers
  1440   // Try to delete the temp folder from leftovers
  1341   // If other instance is using it then delete will just fail
  1441   // If other instance is using it then delete will just fail
  1342   PRINT((_L("e_initmetadatafiles_newl_fileman 1")));
  1442   PRINT((_L("e_initmetadatafiles_newl_fileman 1")));
  1343   CFileMan* fileMan = 0;
  1443   CFileMan* fileMan = 0;