mmplugins/lib3gp/impl/src/file.cpp
changeset 0 40261b775718
child 7 94dbab0a2133
equal deleted inserted replaced
-1:000000000000 0:40261b775718
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "mp4file.h"
       
    17 #include "mp4memwrap.h"
       
    18 #include "mp4atom.h"
       
    19 #include <stdio.h>
       
    20 #include <string.h>
       
    21 #include <sys/unistd.h>
       
    22 #include <sys/reent.h>
       
    23 #include <f32file.h>
       
    24 #include <f32file64.h>
       
    25 #include <e32des16.h>
       
    26 #include <caf/caf.h>
       
    27 
       
    28 using namespace ContentAccess;
       
    29 
       
    30 // Debug print macro
       
    31 #ifdef _DEBUG
       
    32 #include <e32svr.h>
       
    33 #define PRINT(x)     //comment this line and uncomment the line below to enable logging for this file
       
    34 //#define PRINT(x) RDebug::Print x
       
    35 #else
       
    36 #define PRINT(x)
       
    37 #endif
       
    38 
       
    39 _LIT(KTmpDirectoryName, "\\System\\Temp\\3GPLibTmpDir\\"); // Temporary output directory name
       
    40 
       
    41 
       
    42 /*
       
    43  * Function:
       
    44  *
       
    45  *   mp4_i32 saveFileName(MP4FileName filename,
       
    46  *                        MP4HandleImp handle)
       
    47  *
       
    48  * Description:
       
    49  *
       
    50  *   Save file name for later use.
       
    51  *
       
    52  * Parameters:
       
    53  *
       
    54  *   filename   Filename
       
    55  *   handle     MP4 library handle
       
    56  *
       
    57  * Return value:
       
    58  *
       
    59  *   0          Success
       
    60  *   -1         Error
       
    61  *
       
    62  */
       
    63 mp4_i32 saveFileName(MP4FileName filename, MP4HandleImp handle)
       
    64 {
       
    65   handle->fileName = (MP4FileName)mp4malloc(2 * wcslen(filename) + 2);
       
    66   if (handle->fileName == NULL)
       
    67     return -1;
       
    68 
       
    69   wcscat(handle->fileName, filename);
       
    70 
       
    71   return 0;
       
    72 }
       
    73 
       
    74 
       
    75 /*
       
    76  * Function:
       
    77  *
       
    78  *   mp4_i32 initFileRead(MP4FileName filename,
       
    79  *                        MP4HandleImp handle)
       
    80  *
       
    81  * Description:
       
    82  *
       
    83  *   Open a file for reading.
       
    84  *
       
    85  *   Note: filename is a Unicode string in Symbian OS.
       
    86  *
       
    87  * Parameters:
       
    88  *
       
    89  *   filename   Filename
       
    90  *   handle     MP4 library handle
       
    91  *
       
    92  * Return value:
       
    93  *
       
    94  *   0          Success
       
    95  *   -1         Error
       
    96  *
       
    97  */
       
    98 mp4_i32 initFileRead(MP4FileName filename, MP4HandleImp handle)
       
    99 {
       
   100   RFs   *fs;
       
   101   RFile64 *file;
       
   102 
       
   103 
       
   104   fs = new(RFs);
       
   105   handle->fs = (void *)fs;
       
   106   if (fs == NULL)
       
   107     return -1;
       
   108 
       
   109   if (fs->Connect() != KErrNone)
       
   110     return -1;
       
   111 
       
   112   file = new(RFile64);
       
   113   handle->rfile = (void *)file;
       
   114   if (file == NULL)
       
   115     return -1;
       
   116 
       
   117   if (file->Open(*fs, TPtrC((const TUint16 *)filename), EFileRead | EFileShareAny) != KErrNone)
       
   118   {
       
   119     // for compatibility, if opening in Any mode fails try more restrictive approach.
       
   120     if (file->Open(*fs, TPtrC((const TUint16 *)filename), EFileRead | EFileShareReadersOnly) != KErrNone)
       
   121     {
       
   122         fs->Close();
       
   123         return -1;
       
   124     }
       
   125   }
       
   126   handle->file = handle->rfile;
       
   127   return 0;
       
   128 }
       
   129 
       
   130 
       
   131 /*
       
   132  * Function:
       
   133  *
       
   134  *   mp4_i32 initFileWrite(MP4FileName filename,
       
   135  *                         MP4HandleImp handle)
       
   136  *
       
   137  * Description:
       
   138  *
       
   139  *   Open a file for writing.
       
   140  *
       
   141  *   Note: filename is a Unicode string in Symbian OS.
       
   142  *
       
   143  * Parameters:
       
   144  *
       
   145  *   filename   Filename
       
   146  *   handle     MP4 library handle
       
   147  *
       
   148  * Return value:
       
   149  *
       
   150  *   0          Success
       
   151  *   -1         Error
       
   152  *
       
   153  */
       
   154 mp4_i32 initFileWrite(MP4FileName filename, MP4HandleImp handle)
       
   155 {
       
   156   RFs   *fs;
       
   157   RFile64 *file;
       
   158   TParse fp;
       
   159   TFileName path;
       
   160   TInt error;
       
   161 
       
   162 
       
   163   fs = new(RFs);
       
   164   handle->fs = (void *)fs;
       
   165   if (fs == NULL)
       
   166     return -1;
       
   167 
       
   168   if (fs->Connect() != KErrNone)
       
   169     return -1;
       
   170 
       
   171   file = new(RFile64);
       
   172   handle->rfile = (void *)file;
       
   173   if (file == NULL)
       
   174     return -1;
       
   175 
       
   176   if (((RFs *)(handle->fs))->Parse(TPtrC((const TUint16 *)filename), fp) != KErrNone)
       
   177     return -1;
       
   178 
       
   179   path.Insert(0, fp.DriveAndPath() );
       
   180   error = ((RFs *)(handle->fs))->MkDirAll(path);
       
   181   if (error != KErrNone && error != KErrAlreadyExists)
       
   182     return -1;
       
   183 
       
   184   if (file->Replace(*fs, TPtrC((const TUint16 *)filename), EFileWrite|EFileShareExclusive ) != KErrNone)
       
   185   {
       
   186     fs->Close();
       
   187     return -1;
       
   188   }
       
   189 
       
   190   handle->file = handle->rfile;
       
   191 
       
   192   TRAP(error, handle->filewriter = CFileWriter::NewL( *file ));
       
   193   if ( error != KErrNone )
       
   194   {
       
   195     return -1;    
       
   196   }
       
   197 
       
   198   return 0;
       
   199 }
       
   200 
       
   201 
       
   202 /*
       
   203  * Function:
       
   204  *
       
   205  *   mp4_i32 initTmpFileWrite(MP4FileName filename,
       
   206  *                            MP4HandleImp handle)
       
   207  *
       
   208  * Description:
       
   209  *
       
   210  *   Open a temporary file for writing.
       
   211  *
       
   212  *   Note: filename is a Unicode string in Symbian OS.
       
   213  *
       
   214  * Parameters:
       
   215  *
       
   216  *   filename   Filename
       
   217  *   handle     MP4 library handle
       
   218  *
       
   219  * Return value:
       
   220  *
       
   221  *   0          Success
       
   222  *   -1         Error
       
   223  *
       
   224  */
       
   225 mp4_i32 initTmpFileWrite(MP4FileName filename, MP4HandleImp handle)
       
   226 {
       
   227   TInt err;
       
   228   RFile64 * file = new RFile64;
       
   229   TBuf16<KMaxFileName> name(reinterpret_cast<const TUint16*>(filename));
       
   230   ASSERT(handle->fs != NULL);
       
   231   err = file->Replace(*(RFs*)(handle->fs), name, EFileStream | EFileRead | EFileWrite);
       
   232   if (err != KErrNone)
       
   233   {
       
   234 	delete file;
       
   235 	return -1;
       
   236   }
       
   237 
       
   238   handle->tmpfile = (void *)file;
       
   239   return 0;
       
   240 }
       
   241  
       
   242 
       
   243 /*
       
   244  * Function:
       
   245  *
       
   246  *   mp4_i32 closeFile(MP4HandleImp handle)
       
   247  *
       
   248  * Description:
       
   249  *
       
   250  *   Close a file.
       
   251  *
       
   252  * Parameters:
       
   253  *
       
   254  *   handle   MP4 library handle
       
   255  *
       
   256  * Return value:
       
   257  *
       
   258  *   0        Success
       
   259  *
       
   260  */
       
   261 mp4_i32 closeFile(MP4HandleImp handle)
       
   262 {
       
   263   PRINT((_L("e_closefile 1")));
       
   264   if (handle->rfile)
       
   265   {
       
   266     if (handle->filewriter)
       
   267     {
       
   268       PRINT((_L("e_closefile_flush_filewriter 1")));        
       
   269       (handle->filewriter)->Flush(KNullDesC8);
       
   270       PRINT((_L("e_closefile_flush_filewriter 0")));        
       
   271       delete handle->filewriter;
       
   272       handle->filewriter = NULL;
       
   273     }
       
   274   }
       
   275 
       
   276   if (handle->asyncReader)
       
   277   {
       
   278 	delete handle->asyncReader;
       
   279 	handle->asyncReader = NULL;
       
   280   }
       
   281 
       
   282   if (handle->rfile)
       
   283   {
       
   284     if ( !handle->FileHandleFromOutside )
       
   285         {
       
   286   		PRINT((_L("e_closefile_close_file 1")));        
       
   287         ((RFile64 *)(handle->rfile))->Close();
       
   288   		PRINT((_L("e_closefile_close_file 0"))); 
       
   289 		PRINT((_L("e_closefile_delete_fileptr 1")));  		
       
   290         delete(handle->rfile);
       
   291 		PRINT((_L("e_closefile_delete_fileptr 0")));        
       
   292         }
       
   293     handle->rfile = NULL;
       
   294   }
       
   295 
       
   296   if (handle->cfile)
       
   297   {
       
   298     if ( !handle->FileHandleFromOutside )
       
   299         {
       
   300         delete(handle->cfile);
       
   301         }
       
   302     handle->cfile = NULL;
       
   303   }
       
   304 
       
   305   PRINT((_L("e_closefile_close_rfs 1")));
       
   306   if (handle->fs)
       
   307   {
       
   308     ((RFs *)(handle->fs))->Close();
       
   309 
       
   310     delete(handle->fs);
       
   311 
       
   312     handle->fs = NULL;
       
   313   }
       
   314   PRINT((_L("e_closefile_close_rfs 0")));  
       
   315 
       
   316   handle->file = NULL;
       
   317   PRINT((_L("e_closefile 0")));
       
   318   return 0;
       
   319 }
       
   320 
       
   321 
       
   322 /*
       
   323  * Function:
       
   324  *
       
   325  *   mp4_i32 closeTmpFile(MP4HandleImp handle)
       
   326  *
       
   327  * Description:
       
   328  *
       
   329  *   Close a temporary file.
       
   330  *
       
   331  * Parameters:
       
   332  *
       
   333  *   handle   MP4 library handle
       
   334  *
       
   335  * Return value:
       
   336  *
       
   337  *   0        Success
       
   338  *
       
   339  */
       
   340 mp4_i32 closeTmpFile(MP4HandleImp handle)
       
   341 {
       
   342   if (handle->tmpfile)
       
   343 	((RFile64*)handle->tmpfile)->Close();
       
   344 
       
   345   handle->tmpfile = NULL;
       
   346 
       
   347   return 0;
       
   348 }
       
   349 
       
   350 
       
   351 /*
       
   352  * Function:
       
   353  *
       
   354  *   mp4_i32 deleteTmpFile(MP4HandleImp handle)
       
   355  *
       
   356  * Description:
       
   357  *
       
   358  *   Remove a temporary file.
       
   359  *
       
   360  * Parameters:
       
   361  *
       
   362  *   handle   MP4 library handle
       
   363  *
       
   364  * Return value:
       
   365  *
       
   366  *   0        Success
       
   367  *   -1       Error
       
   368  *
       
   369  */
       
   370 mp4_i32 deleteTmpFile(MP4HandleImp handle)
       
   371 {
       
   372   if (handle->tmpFileName)
       
   373 	{
       
   374 	  TInt err;
       
   375 	  TBuf<KMaxFileName> name(reinterpret_cast<const TUint16*>(handle->tmpFileName));
       
   376 	  ASSERT(handle->fs != NULL);
       
   377 	  err = ((RFs*)handle->fs)->Delete(name);
       
   378 	  if (err != KErrNone)
       
   379 		return -1;
       
   380 	}
       
   381 
       
   382   return 0;
       
   383 }
       
   384 
       
   385 
       
   386 /*
       
   387  * Function:
       
   388  *
       
   389  *   mp4_i32 readFile(MP4HandleImp handle,
       
   390  *                    mp4_u8 *buffer,
       
   391  *                    mp4_u32 bytestoread)
       
   392  *
       
   393  * Description:
       
   394  *
       
   395  *   Read data from a file.
       
   396  *
       
   397  * Parameters:
       
   398  *
       
   399  *   handle       MP4 library handle
       
   400  *   buffer       Buffer to read data into
       
   401  *   bytestoread  Number of bytes to read from file
       
   402  *
       
   403  * Return value:
       
   404  *
       
   405  *   0            Success
       
   406  *   -1           File has not been opened
       
   407  *   -2           Requested number of bytes could not be read
       
   408  *
       
   409  */
       
   410 mp4_i32 readFile(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
       
   411 {
       
   412   return bufferedRead(handle, buffer, bytestoread);
       
   413 }
       
   414 
       
   415 /*
       
   416  * Function:
       
   417  *
       
   418  *   mp4_i32 readTmpFile(MP4HandleImp handle,
       
   419  *                       mp4_u8 *buffer,
       
   420  *                       mp4_u32 bytestoread)
       
   421  *
       
   422  * Description:
       
   423  *
       
   424  *   Read data from a temporary file.
       
   425  *
       
   426  * Parameters:
       
   427  *
       
   428  *   handle       MP4 library handle
       
   429  *   buffer       Buffer to read data into
       
   430  *   bytestoread  Number of bytes to read from file
       
   431  *
       
   432  * Return value:
       
   433  *
       
   434  *   0            Success
       
   435  *   -1           File has not been opened
       
   436  *   -2           Requested number of bytes could not be read
       
   437  *
       
   438  */
       
   439 mp4_i32 readTmpFile(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
       
   440 {
       
   441   if (!handle->tmpfile)
       
   442     return -1;
       
   443 
       
   444   TInt err;
       
   445   TPtr8 ptrBuffer(buffer, bytestoread);
       
   446   err = ((RFile64*)handle->tmpfile)->Read(ptrBuffer, bytestoread);
       
   447   if (err != KErrNone)
       
   448 	return -2;
       
   449 
       
   450   if (ptrBuffer.Length() != bytestoread)
       
   451 	return -2;
       
   452 
       
   453   return 0;
       
   454 }
       
   455 
       
   456 
       
   457 /*
       
   458  * Function:
       
   459  *
       
   460  *   mp4_i32 peekFile(MP4HandleImp handle,
       
   461  *                    mp4_u8 *buffer,
       
   462  *                    mp4_u32 bytestoread)
       
   463  *
       
   464  * Description:
       
   465  *
       
   466  *   Read data from a file but don't move the current position in the file
       
   467  *   forward.
       
   468  *
       
   469  * Parameters:
       
   470  *
       
   471  *   handle       MP4 library handle
       
   472  *   buffer       Buffer to read data into
       
   473  *   bytestoread  Number of bytes to read from file
       
   474  *
       
   475  * Return value:
       
   476  *
       
   477  *   0            Success
       
   478  *   -1           File has not been opened
       
   479  *   -2           Requested number of bytes could not be read
       
   480  *   -3           Current position in the file could not be set to original
       
   481  *                value
       
   482  *
       
   483  */
       
   484 mp4_i32 peekFile(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
       
   485 {
       
   486   mp4_i32 ret;
       
   487   mp4_i32 amount;
       
   488 
       
   489 
       
   490   ret = bufferedRead(handle, buffer, bytestoread);
       
   491   if (ret != 0)
       
   492     return ret;
       
   493 
       
   494   amount = -(mp4_i32)bytestoread;
       
   495 
       
   496   ret = bufferedSeek(handle, amount);
       
   497   if (ret != 0)
       
   498     return ret;
       
   499 
       
   500   return 0;
       
   501 }
       
   502 
       
   503 
       
   504 /*
       
   505  * Function:
       
   506  *
       
   507  *   mp4_i32 seekFile(MP4HandleImp handle,
       
   508  *                    mp4_i32 amount)
       
   509  *
       
   510  * Description:
       
   511  *
       
   512  *   Seek in a file.
       
   513  *
       
   514  * Parameters:
       
   515  *
       
   516  *   handle   MP4 library handle
       
   517  *   amount   Amount to seek from current position
       
   518  *
       
   519  * Return value:
       
   520  *
       
   521  *   0        Success
       
   522  *   -1       File has not been opened
       
   523  *   -3       Current position in the file could not be set
       
   524  *
       
   525  */
       
   526 mp4_i32 seekFile(MP4HandleImp handle, mp4_i64 amount)
       
   527 {
       
   528   return bufferedSeek(handle, amount);
       
   529 }
       
   530 
       
   531 
       
   532 /*
       
   533  * Function:
       
   534  *
       
   535  *   mp4_i32 seekFileAbs(MP4HandleImp handle,
       
   536  *                       mp4_i32 amount)
       
   537  *
       
   538  * Description:
       
   539  *
       
   540  *   Seek from the beginning of a file.
       
   541  *
       
   542  * Parameters:
       
   543  *
       
   544  *   handle   MP4 library handle
       
   545  *   amount   Amount to seek from the beginning of the file
       
   546  *
       
   547  * Return value:
       
   548  *
       
   549  *   0        Success
       
   550  *   -1       File has not been opened
       
   551  *   -3       Current position in the file could not be set
       
   552  *
       
   553  */
       
   554 mp4_i32 seekFileAbs(MP4HandleImp handle, mp4_i64 amount)
       
   555 {
       
   556   return bufferedSeekAbs(handle, amount);
       
   557 }
       
   558 
       
   559 
       
   560 /*
       
   561  * Function:
       
   562  *
       
   563  *   mp4_i32 seekFileWrite(MP4HandleImp handle,
       
   564  *                         mp4_i64 amount)
       
   565  *
       
   566  * Description:
       
   567  *
       
   568  *   Seek in a file that has been opened for writing.
       
   569  *
       
   570  * Parameters:
       
   571  *
       
   572  *   handle   MP4 library handle
       
   573  *   amount   Amount to seek from current position
       
   574  *
       
   575  * Return value:
       
   576  *
       
   577  *   0        Success
       
   578  *   -1       File has not been opened
       
   579  *   -2       Can't write buffers to file
       
   580  *   -3       Current position in the file could not be set
       
   581  *
       
   582  */
       
   583 mp4_i32 seekFileWrite(MP4HandleImp handle, mp4_i64 amount)
       
   584 {
       
   585 
       
   586   if (!handle->rfile)
       
   587     return -1;
       
   588 
       
   589   if ( handle->filewriter )
       
   590   {
       
   591     PRINT((_L("e_seekfilewrite_flush_filewriter 1")));        
       
   592     if ( (handle->filewriter)->Flush(KNullDesC8) != KErrNone )
       
   593     {
       
   594       PRINT((_L("e_seekfilewrite_flush_filewriter 0")));        
       
   595       return -2;
       
   596     }
       
   597     PRINT((_L("e_seekfilewrite_flush_filewriter 0")));        
       
   598   }
       
   599   else
       
   600   {
       
   601     return -1;
       
   602   }
       
   603 
       
   604   PRINT((_L("e_seekfilewrite_seek_rfile 1")));        
       
   605   if (((RFile64 *)(handle->rfile))->Seek(ESeekCurrent,amount) != KErrNone)
       
   606   {
       
   607     return -3;
       
   608   }
       
   609   
       
   610   PRINT((_L("e_seekfilewrite_seek_rfile 0")));        
       
   611 
       
   612   return 0;
       
   613 }
       
   614 
       
   615 
       
   616 /*
       
   617  * Function:
       
   618  *
       
   619  *   mp4_i32 seekFileAbsWrite(MP4HandleImp handle,
       
   620  *                            mp4_i32 amount)
       
   621  *
       
   622  * Description:
       
   623  *
       
   624  *   Seek from the beginning of a file that has been opened for writing.
       
   625  *
       
   626  * Parameters:
       
   627  *
       
   628  *   handle   MP4 library handle
       
   629  *   amount   Amount to seek from the beginning of the file
       
   630  *
       
   631  * Return value:
       
   632  *
       
   633  *   0        Success
       
   634  *   -1       File has not been opened
       
   635  *   -2       Can't write buffers to file
       
   636  *   -3       Current position in the file could not be set
       
   637  *
       
   638  */
       
   639 mp4_i32 seekFileAbsWrite(MP4HandleImp handle, mp4_i64 amount)
       
   640 {
       
   641   if (!handle->rfile)
       
   642     return -1;
       
   643 
       
   644   if ( handle->filewriter )
       
   645   {
       
   646     PRINT((_L("e_seekfileabswrite_flush 1")));        
       
   647     if ( (handle->filewriter)->Flush(KNullDesC8) != KErrNone )
       
   648     {
       
   649       PRINT((_L("e_seekfileabswrite_flush 0")));        
       
   650       return -2;
       
   651     }
       
   652     PRINT((_L("e_seekfileabswrite_flush 0")));        
       
   653   }
       
   654   else
       
   655   {
       
   656     return -1;
       
   657   }
       
   658 
       
   659   PRINT((_L("e_seekfileabswrite_seek 1")));  
       
   660   if (((RFile64 *)(handle->rfile))->Seek(ESeekStart, amount) != KErrNone)
       
   661   {
       
   662     return -3;
       
   663   }
       
   664   PRINT((_L("e_seekfileabswrite_seek 0")));        
       
   665 
       
   666   return 0;
       
   667 }
       
   668 
       
   669 
       
   670 /*
       
   671  * Function:
       
   672  *
       
   673  *   mp4_i32 seekTmpFileAbs(MP4HandleImp handle,
       
   674  *                          mp4_i32 amount)
       
   675  *
       
   676  * Description:
       
   677  *
       
   678  *   Seek from the beginning of a temporary file.
       
   679  *
       
   680  * Parameters:
       
   681  *
       
   682  *   handle   MP4 library handle
       
   683  *   amount   Amount to seek from the beginning of the file
       
   684  *
       
   685  * Return value:
       
   686  *
       
   687  *   0        Success
       
   688  *   -1       File has not been opened
       
   689  *   -3       Current position in the file could not be set
       
   690  *
       
   691  */
       
   692 mp4_i32 seekTmpFileAbs(MP4HandleImp handle, mp4_i64 amount)
       
   693 {
       
   694   if (!handle->tmpfile)
       
   695     return -1;
       
   696 
       
   697   TInt err;
       
   698   TInt64 amount64 = amount;
       
   699   err = ((RFile64*)handle->tmpfile)->Seek(ESeekStart, amount64);
       
   700   if (err != KErrNone)
       
   701 	return -3;
       
   702 
       
   703   return 0;
       
   704 }
       
   705 
       
   706 
       
   707 /*
       
   708  * Function:
       
   709  *
       
   710  *   mp4_i32 writeFile(MP4HandleImp handle,
       
   711  *                     mp4_u8 *buffer,
       
   712  *                     mp4_u32 bytestowrite)
       
   713  *
       
   714  * Description:
       
   715  *
       
   716  *   Write data into a file.
       
   717  *
       
   718  * Parameters:
       
   719  *
       
   720  *   handle        MP4 library handle
       
   721  *   buffer        Buffer containing the data
       
   722  *   bytestowrite  Number of bytes to write
       
   723  *
       
   724  * Return value:
       
   725  *
       
   726  *   0             Success
       
   727  *   -1            File has not been opened
       
   728  *   -2            Number of bytes written is not equal to bytestowrite
       
   729  *
       
   730  */
       
   731 mp4_i32 writeFile(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite)
       
   732 {
       
   733   return bufferedWrite(handle, buffer, bytestowrite);
       
   734 }
       
   735 
       
   736 
       
   737 /*
       
   738  * Function:
       
   739  *
       
   740  *   mp4_i32 writeFileUnbuffered(MP4HandleImp handle,
       
   741  *                               mp4_u8 *buffer,
       
   742  *                               mp4_u32 bytestowrite)
       
   743  *
       
   744  * Description:
       
   745  *
       
   746  *   Write data into a file without buffering.
       
   747  *
       
   748  * Parameters:
       
   749  *
       
   750  *   handle        MP4 library handle
       
   751  *   buffer        Buffer containing the data
       
   752  *   bytestowrite  Number of bytes to write
       
   753  *
       
   754  * Return value:
       
   755  *
       
   756  *   0             Success
       
   757  *   -1            File has not been opened
       
   758  *   -2            Number of bytes written is not equal to bytestowrite
       
   759  *
       
   760  */
       
   761 mp4_i32 writeFileUnbuffered(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite)
       
   762 {
       
   763   if(handle->bufferWrite)
       
   764   {
       
   765 	mp4memcpy(handle->composeBuffer+FTYP_SIZE + handle->ftypdelta,buffer,bytestowrite);
       
   766 	return 0;
       
   767   }
       
   768   if (!handle->rfile)
       
   769     return -1;
       
   770 
       
   771   if ( handle->filewriter )
       
   772   {
       
   773     TPtrC8 buf = TPtrC8((TUint8 *)(buffer), bytestowrite);
       
   774     PRINT((_L("e_writefileunbuffered_flush 1")));        
       
   775     if ( (handle->filewriter)->Flush( buf ) != KErrNone )
       
   776     {
       
   777       PRINT((_L("e_writefileunbuffered_flush 0")));        
       
   778       return -2;
       
   779     }
       
   780     PRINT((_L("e_writefileunbuffered_flush 0")));        
       
   781   }
       
   782   else
       
   783   {
       
   784     return -1;
       
   785   }
       
   786 
       
   787   return 0;
       
   788 }
       
   789 
       
   790 
       
   791 /*
       
   792  * Function:
       
   793  *
       
   794  *   mp4_i32 writeTmpFile(MP4HandleImp handle,
       
   795  *                        mp4_u8 *buffer,
       
   796  *                        mp4_u32 bytestowrite)
       
   797  *
       
   798  * Description:
       
   799  *
       
   800  *   Write data into a temporary file.
       
   801  *
       
   802  * Parameters:
       
   803  *
       
   804  *   handle        MP4 library handle
       
   805  *   buffer        Buffer containing the data
       
   806  *   bytestowrite  Number of bytes to write
       
   807  *
       
   808  * Return value:
       
   809  *
       
   810  *   0             Success
       
   811  *   -1            File has not been opened
       
   812  *   -2            Number of bytes written is not equal to bytestowrite
       
   813  *
       
   814  */
       
   815 mp4_i32 writeTmpFile(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite)
       
   816 {
       
   817   if (!handle->tmpfile)
       
   818     return -1;
       
   819 
       
   820   TInt err;
       
   821   TPtrC8 ptrBuffer(buffer, bytestowrite);
       
   822   err = ((RFile64*)handle->tmpfile)->Write(ptrBuffer, bytestowrite);
       
   823   if (err != KErrNone)
       
   824 	return -2;
       
   825 
       
   826   if (ptrBuffer.Length() != bytestowrite)
       
   827 	return -2;
       
   828 
       
   829   handle->bytesInTmpFile += bytestowrite;
       
   830 
       
   831   return 0;
       
   832 }
       
   833 
       
   834 
       
   835 /*
       
   836  * Function:
       
   837  *
       
   838  *   mp4_i32 createTmpFileName(MP4FileName filename,
       
   839  *                             MP4FileName *tmpfilename)
       
   840  *
       
   841  * Description:
       
   842  *
       
   843  *   Create a temporary file name by adding .tmp to the end of a file name.
       
   844  *
       
   845  * Parameters:
       
   846  *
       
   847  *   filename     Original file name
       
   848  *   tmpfilename  Temporary file name is returned here
       
   849  *
       
   850  * Return value:
       
   851  *
       
   852  *   0            Success
       
   853  *   -1           Memory could not be allocated for the new name
       
   854  *
       
   855  */
       
   856 mp4_i32 createTmpFileName(MP4FileName filename, MP4FileName *tmpfilename)
       
   857 {
       
   858   *tmpfilename = (MP4FileName)mp4malloc(2 * wcslen(filename) + 10);
       
   859   if (*tmpfilename == NULL)
       
   860     return -1;
       
   861 
       
   862   wcscat(*tmpfilename, filename);
       
   863   wcscat(*tmpfilename, L".tmp");
       
   864 
       
   865   return 0;
       
   866 }
       
   867 
       
   868 
       
   869 /*
       
   870  * Function:
       
   871  *
       
   872  *   mp4_i32 freeTmpFileName(MP4FileName filename)
       
   873  *
       
   874  * Description:
       
   875  *
       
   876  *   Free memory allocated for the temporary file name.
       
   877  *
       
   878  * Parameters:
       
   879  *
       
   880  *   filename   Buffer containing file name
       
   881  *
       
   882  * Return value:
       
   883  *
       
   884  *   0          Success
       
   885  *
       
   886  */
       
   887 mp4_i32 freeTmpFileName(MP4FileName filename)
       
   888 {
       
   889   if (filename)
       
   890     mp4free(filename);
       
   891 
       
   892   return 0;
       
   893 }
       
   894 
       
   895 
       
   896 /*
       
   897  * Function:
       
   898  *
       
   899  *   void closeStdlib()
       
   900  *
       
   901  * Description:
       
   902  *
       
   903  *   Free memory allocated by stdlib wrapper functions (Symbian OS only).
       
   904  *
       
   905  * Parameters:
       
   906  *
       
   907  *   None
       
   908  *
       
   909  * Return value:
       
   910  *
       
   911  *   None
       
   912  *
       
   913  */
       
   914 void closeStdlib()
       
   915 	{
       
   916 	// retrieves the TLS which stores the number of currently active instances of 
       
   917 	// composer/parser
       
   918 	TInt p = (TInt) Dll::Tls();
       
   919 	
       
   920 	// decrement the counter as one instance is being closed at this point
       
   921 	p--;
       
   922 	Dll::SetTls((TAny*) p);		
       
   923 
       
   924 	if (p == 0)
       
   925 		{
       
   926 		// Since memory allocated for stdlib is shared amongst all composers and/or parsers  
       
   927 		// within a thread, stdlib close should ONLY be called for the last instance of   
       
   928 		// composer / parser.
       
   929 		//
       
   930 		// If there are no other active instances other than this,
       
   931 		// the memory allocated for stdlib for this thread can now be released.
       
   932 		Dll::FreeTls();
       
   933 		CloseSTDLIB();
       
   934 		}
       
   935 	}
       
   936 
       
   937 /*
       
   938  * Function:
       
   939  *
       
   940  *   void openStdlib()
       
   941  *
       
   942  * Description:
       
   943  *
       
   944  *   Register the use of stdlib.  
       
   945  *
       
   946  * Parameters:
       
   947  *
       
   948  *   None
       
   949  *
       
   950  * Return value:
       
   951  *
       
   952  *   0 			Success
       
   953  *
       
   954  */
       
   955 mp4_i32 openStdlib()
       
   956 	{
       
   957 	// retrieve the the value stored in TLS for this DLL 
       
   958 	TInt p = (TInt) Dll::Tls();
       
   959 	
       
   960 	// increment it.  This becomes a reference counter of 
       
   961 	// how many instances of the composer/parser is currently active 
       
   962 	p++;
       
   963 	return (Dll::SetTls((TAny*) p));		
       
   964 	}
       
   965 
       
   966 /*
       
   967  * Function:
       
   968  *
       
   969  *   mp4_i32 bufferedRead(MP4HandleImp handle,
       
   970  *                        mp4_u8 *buffer,
       
   971  *                        mp4_u32 bytestoread)
       
   972  *
       
   973  * Description:
       
   974  *
       
   975  *   Read data from a file in a buffered manner.
       
   976  *
       
   977  * Parameters:
       
   978  *
       
   979  *   handle       MP4 library handle
       
   980  *   buffer       Buffer to read data into
       
   981  *   bytestoread  Number of bytes to read from file
       
   982  *
       
   983  * Return value:
       
   984  *
       
   985  *   0            Success
       
   986  *   -1           File has not been opened
       
   987  *   -2           Requested number of bytes could not be read
       
   988  *
       
   989  */
       
   990 mp4_i32 bufferedRead(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread)
       
   991 {
       
   992   mp4_u32 bytesread = 0;
       
   993 
       
   994   if (!handle->file)
       
   995     return -1;
       
   996 
       
   997   while (bytesread < bytestoread)
       
   998   {
       
   999     mp4_u32 available;
       
  1000 
       
  1001 
       
  1002     available = handle->diskReadSize - handle->diskReadBufPos;
       
  1003     if (available > bytestoread - bytesread)
       
  1004       available = bytestoread - bytesread;
       
  1005 
       
  1006     if (available > 0) /* Copy data from memory buffer */
       
  1007     {
       
  1008       mp4memcpy(buffer + bytesread, handle->diskReadBuf + handle->diskReadBufPos, available);
       
  1009       handle->diskReadBufPos += available;
       
  1010       bytesread += available;
       
  1011     }
       
  1012     else /* Read more data from file into memory buffer */
       
  1013     {
       
  1014       TInt readBufferSize = 0;
       
  1015       if ( handle->readBufferSize == 0)
       
  1016         {
       
  1017         readBufferSize = READBUFSIZE;
       
  1018         }
       
  1019       else
       
  1020         {
       
  1021         readBufferSize = handle->readBufferSize;
       
  1022         }
       
  1023 
       
  1024       TPtr8 buf = TPtr8((TUint8 *)(handle->diskReadBuf), readBufferSize);
       
  1025 
       
  1026       switch (handle->sourceType)
       
  1027       {
       
  1028         case MP4_SOURCE_RFILE:
       
  1029           if (((RFile64 *)(handle->rfile))->Read(buf, readBufferSize) != KErrNone)
       
  1030             return -2;
       
  1031           break;
       
  1032         case MP4_SOURCE_CAF:
       
  1033           handle->cafError = handle->cfile->Read(buf, readBufferSize);
       
  1034           if ( handle->cafError != KErrNone)
       
  1035             return -2;
       
  1036           break;
       
  1037         default:
       
  1038           return -1;
       
  1039       }
       
  1040 
       
  1041       if ((mp4_u32)buf.Length() == 0) /* EOF or error */
       
  1042         return -2;
       
  1043 
       
  1044       handle->diskReadBufPos = 0;
       
  1045       handle->diskReadSize = (mp4_u32)buf.Length();
       
  1046       handle->diskReadBufStart = handle->diskReadPos;
       
  1047       handle->diskReadPos += handle->diskReadSize;
       
  1048     }
       
  1049   }
       
  1050 
       
  1051   return 0;
       
  1052 }
       
  1053 
       
  1054 /*
       
  1055  * Function:
       
  1056  *
       
  1057  *   mp4_i32 bufferedSeek(MP4HandleImp handle,
       
  1058  *                        mp4_i32 amount)
       
  1059  *
       
  1060  * Description:
       
  1061  *
       
  1062  *   Seek in a buffered file.
       
  1063  *
       
  1064  * Parameters:
       
  1065  *
       
  1066  *   handle   MP4 library handle
       
  1067  *   amount   Amount to seek from current position
       
  1068  *
       
  1069  * Return value:
       
  1070  *
       
  1071  *   0        Success
       
  1072  *   -1       File has not been opened
       
  1073  *   -3       Current position in the file could not be set
       
  1074  *
       
  1075  */
       
  1076 mp4_i32 bufferedSeek(MP4HandleImp handle, mp4_i64 amount)
       
  1077 {
       
  1078   if (!handle->file)
       
  1079     return -1;
       
  1080 
       
  1081   /* Is the new seek point inside the current memory buffer? */
       
  1082   if ((mp4_i32)handle->diskReadBufPos + amount >= 0 &&
       
  1083       handle->diskReadBufPos + amount < handle->diskReadSize)
       
  1084   {
       
  1085     /* Yes */
       
  1086 
       
  1087     handle->diskReadBufPos += amount;
       
  1088   }
       
  1089   else
       
  1090   {
       
  1091     /* No */
       
  1092 
       
  1093     TInt64 am;
       
  1094 
       
  1095 
       
  1096     am = amount - ((mp4_i32)handle->diskReadSize - (mp4_i32)handle->diskReadBufPos);
       
  1097 
       
  1098     if ( handle->rfile )
       
  1099         {
       
  1100         mp4_i64 maxsize = 0;
       
  1101         ((RFile64 *)(handle->rfile))->Size(maxsize);
       
  1102         maxsize -= (mp4_i64)handle->diskReadPos;
       
  1103         
       
  1104         if (am > maxsize)
       
  1105             {
       
  1106             return -3;
       
  1107             }
       
  1108         }
       
  1109 	// Coverity thinks that cfile can never be not NULL, which is incorrect; it can be a proper value. The comment below silences the Coverity warning
       
  1110 	//coverity[var_compare_op]
       
  1111     else if ( handle->cfile )
       
  1112         {
       
  1113         mp4_i64 maxsize = 0;
       
  1114         TRAPD(caferr, handle->cfile->DataSize64L(maxsize));
       
  1115         maxsize -= (mp4_i64)handle->diskReadPos;
       
  1116         
       
  1117         if (!caferr && am > maxsize)
       
  1118             {
       
  1119             return -3;
       
  1120             }
       
  1121         }
       
  1122 
       
  1123     switch (handle->sourceType)
       
  1124     {
       
  1125       case MP4_SOURCE_RFILE:
       
  1126 		{
       
  1127         PRINT((_L("e_bufferedseek_seek_rfile 1")));        
       
  1128         if (((RFile64 *)(handle->rfile))->Seek(ESeekCurrent, am) != KErrNone)
       
  1129 		  {
       
  1130 		    return -3;
       
  1131 		  }
       
  1132         PRINT((_L("e_bufferedseek_seek_rfile 0")));        
       
  1133         break;
       
  1134 		}
       
  1135       case MP4_SOURCE_CAF:
       
  1136         PRINT((_L("e_bufferedseek_seek_cfile 1")));        
       
  1137 		// See comment on handle->cfile dereference above on why the coverity[] comment below is needed
       
  1138 		//coverity[var_deref_model]
       
  1139       	handle->cafError = handle->cfile->Seek64(ESeekCurrent, am);
       
  1140         if ( handle->cafError != KErrNone)
       
  1141           return -3;
       
  1142         PRINT((_L("e_bufferedseek_seek_cfile 0")));        
       
  1143         break;
       
  1144       default:
       
  1145         return -1;
       
  1146     }
       
  1147 
       
  1148     handle->diskReadPos = handle->diskReadBufStart + handle->diskReadBufPos + amount;
       
  1149     handle->diskReadBufPos = 0;
       
  1150     handle->diskReadBufStart = 0;
       
  1151     handle->diskReadSize = 0;
       
  1152   }
       
  1153 
       
  1154   return 0;
       
  1155 }
       
  1156 
       
  1157 
       
  1158 /*
       
  1159  * Function:
       
  1160  *
       
  1161  *   mp4_i32 bufferedSeekAbs(MP4HandleImp handle,
       
  1162  *                           mp4_i32 amount)
       
  1163  *
       
  1164  * Description:
       
  1165  *
       
  1166  *   Seek in a buffered file from the start of the file.
       
  1167  *
       
  1168  * Parameters:
       
  1169  *
       
  1170  *   handle   MP4 library handle
       
  1171  *   amount   Amount to seek from start of the file
       
  1172  *
       
  1173  * Return value:
       
  1174  *
       
  1175  *   0        Success
       
  1176  *   -1       File has not been opened
       
  1177  *   -3       Current position in the file could not be set
       
  1178  *
       
  1179  */
       
  1180 mp4_i32 bufferedSeekAbs(MP4HandleImp handle, mp4_i64 amount)
       
  1181 {
       
  1182   if (!handle->file)
       
  1183     return -1;
       
  1184 
       
  1185   /* Is the new seek point inside the current memory buffer? */
       
  1186   if (handle->diskReadBufStart <= (mp4_u64)amount &&
       
  1187       handle->diskReadBufStart + handle->diskReadSize > (mp4_u64)amount)
       
  1188   {
       
  1189     /* Yes */
       
  1190 
       
  1191     handle->diskReadBufPos = amount - handle->diskReadBufStart;
       
  1192   }
       
  1193   else
       
  1194   {
       
  1195     /* No */
       
  1196 
       
  1197     mp4_i64 am = amount;
       
  1198 
       
  1199     switch (handle->sourceType)
       
  1200     {
       
  1201       case MP4_SOURCE_RFILE:
       
  1202 		{
       
  1203         PRINT((_L("e_bufferedseekabs_seek_rfile 1")));
       
  1204         if (((RFile64 *)(handle->rfile))->Seek(ESeekStart, am) != KErrNone)
       
  1205 		  {
       
  1206 		    return -3;
       
  1207 		  }
       
  1208         PRINT((_L("e_bufferedseekabs_seek_rfile 0")));        
       
  1209         break;
       
  1210 		}
       
  1211       case MP4_SOURCE_CAF:
       
  1212         PRINT((_L("e_bufferedseekabs_seek_cfile 1")));
       
  1213       	handle->cafError = handle->cfile->Seek64(ESeekStart, am);
       
  1214         PRINT((_L("e_bufferedseekabs_seek_cfile 0")));
       
  1215         if ( handle->cafError != KErrNone)
       
  1216           return -3;
       
  1217         break;
       
  1218       default:
       
  1219         return -1;
       
  1220     }
       
  1221 
       
  1222     handle->diskReadPos = (mp4_u64)amount;
       
  1223     handle->diskReadBufPos = 0;
       
  1224     handle->diskReadBufStart = 0;
       
  1225     handle->diskReadSize = 0;
       
  1226   }
       
  1227 
       
  1228   return 0;
       
  1229 }
       
  1230 
       
  1231 
       
  1232 /*
       
  1233  * Function:
       
  1234  *
       
  1235  *   mp4_i32 bufferedWrite(MP4HandleImp handle,
       
  1236  *                         mp4_u8 *buffer,
       
  1237  *                         mp4_u32 bytestowrite)
       
  1238  *
       
  1239  * Description:
       
  1240  *
       
  1241  *   Write data into a file in a buffered manner.
       
  1242  *
       
  1243  * Parameters:
       
  1244  *
       
  1245  *   handle        MP4 library handle
       
  1246  *   buffer        Buffer containing the data
       
  1247  *   bytestowrite  Number of bytes to write
       
  1248  *
       
  1249  * Return value:
       
  1250  *
       
  1251  *   0             Success
       
  1252  *   -1            File has not been opened
       
  1253  *   -2            Number of bytes written is not equal to bytestowrite
       
  1254  *
       
  1255  */
       
  1256 mp4_i32 bufferedWrite(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite)
       
  1257 {
       
  1258 	if(handle->bufferWrite)
       
  1259 	{
       
  1260 		if(handle->bytesProgressed+bytestowrite > *(handle->composedSize))
       
  1261 		{
       
  1262 			return MP4_OUTPUT_BUFFER_TOO_SMALL; //-1;
       
  1263 		}
       
  1264 		else
       
  1265 		{
       
  1266 			mp4memcpy(handle->composeBuffer+handle->bytesProgressed,buffer,bytestowrite);
       
  1267 			handle->bytesProgressed+=bytestowrite;
       
  1268 			return 0;
       
  1269 		}
       
  1270 	}
       
  1271 
       
  1272   if (!handle->rfile)
       
  1273     return -1;
       
  1274 
       
  1275   if ( handle->filewriter )
       
  1276   {
       
  1277     TPtrC8 buf = TPtrC8((TUint8 *)(buffer), bytestowrite);
       
  1278     PRINT((_L("e_file_bufferedwrite_write 1")));
       
  1279     if ( (handle->filewriter)->Write( buf ) != KErrNone )
       
  1280     {
       
  1281       return -2;
       
  1282     }
       
  1283     PRINT((_L("e_file_bufferedwrite_write 0")));
       
  1284   }
       
  1285   else
       
  1286   {
       
  1287     return -1;    
       
  1288   }
       
  1289 
       
  1290   return 0;
       
  1291 }
       
  1292 
       
  1293 
       
  1294 /*
       
  1295  * Function:
       
  1296  *
       
  1297  *   mp4_i32 initMetaDataFiles(MP4HandleImp handle)
       
  1298  *
       
  1299  * Description:
       
  1300  *
       
  1301  *   Open temporary files for writing.
       
  1302  *
       
  1303  * Parameters:
       
  1304  *
       
  1305  *   handle     MP4 library handle
       
  1306  *
       
  1307  * Return value:
       
  1308  *
       
  1309  *   0          		Success
       
  1310  *   -1         		General Error
       
  1311  *	 MP4_OUT_OF_MEMORY	Out of memory
       
  1312  *
       
  1313  */
       
  1314 mp4_i32 initMetaDataFiles(MP4HandleImp handle)
       
  1315 {
       
  1316   PRINT(_L("3GPLib::initMetaDataFiles() in"));
       
  1317   TFileName filename;
       
  1318   TFileName path;
       
  1319   TInt error;
       
  1320 
       
  1321   // Create a directory for the files
       
  1322   if ( handle->fileName )
       
  1323     {
       
  1324     filename = (TText *)handle->fileName;
       
  1325     
       
  1326     TParse fp;
       
  1327     path = KTmpDirectoryName;
       
  1328     if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone)
       
  1329         return -1;
       
  1330     path.Insert(0, fp.Drive());
       
  1331     }
       
  1332   else
       
  1333     {
       
  1334     TChar drive;
       
  1335     if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone )
       
  1336         return -1;
       
  1337     path.Append( drive );
       
  1338     path.Append( _L(":") );
       
  1339     path.Append( KTmpDirectoryName );
       
  1340     }
       
  1341     
       
  1342   // Try to delete the temp folder from leftovers
       
  1343   // If other instance is using it then delete will just fail
       
  1344   PRINT((_L("e_initmetadatafiles_newl_fileman 1")));
       
  1345   CFileMan* fileMan = 0;
       
  1346   TRAP( error, fileMan = CFileMan::NewL(*(RFs *)(handle->fs)));
       
  1347   if ( error )
       
  1348     {
       
  1349         return -1;
       
  1350     }
       
  1351   PRINT((_L("e_initmetadatafiles_newl_fileman 0")));
       
  1352 
       
  1353   PRINT((_L("e_initmetadatafiles_deletedirectory 1")));  
       
  1354   error = fileMan->RmDir( path ); // Delete directory + all files
       
  1355   delete( fileMan );
       
  1356   PRINT((_L("e_initmetadatafiles_deletedirectory 0")));  
       
  1357 
       
  1358   error = ((RFs *)(handle->fs))->MkDirAll(path);
       
  1359   if (error != KErrNone && error != KErrAlreadyExists)
       
  1360     return -1;
       
  1361 
       
  1362   ((RFs *)(handle->fs))->SetEntry(path, TTime(0), KEntryAttHidden, NULL);
       
  1363 
       
  1364   // Create files
       
  1365   TFileName metadatafilename;
       
  1366 
       
  1367   for (TUint i = 0; i < NUM_MDF; i++)
       
  1368   {
       
  1369     handle->metaDataFile[i] = (void *)new(RFile64);
       
  1370     if (handle->metaDataFile[i] == NULL)
       
  1371       return MP4_OUT_OF_MEMORY;
       
  1372 
       
  1373     if (((RFile64 *)(handle->metaDataFile[i]))->Temp(*((RFs *)(handle->fs)), path, metadatafilename, EFileWrite | EFileShareExclusive) != KErrNone)
       
  1374       return -1;
       
  1375 
       
  1376     handle->metaDataFileEmpty[i] = EFalse;
       
  1377     
       
  1378     // save file name, used later for deleting
       
  1379     handle->metaDataFileName[i] = (MP4FileName)mp4malloc(2 * wcslen((MP4FileName)metadatafilename.Ptr()) + 2);
       
  1380     if (handle->metaDataFileName[i] == NULL)
       
  1381       return -1;
       
  1382     
       
  1383     wcscat(handle->metaDataFileName[i], (MP4FileName)metadatafilename.Ptr());
       
  1384     handle->metaDataFileName[i][metadatafilename.Length()] = 0;
       
  1385     PRINT((_L("3GPLib::initMetaDataFiles() handle->metaDataFileName[%d]=%s, length=%d "),i,  handle->metaDataFileName[i], metadatafilename.Length()));
       
  1386     
       
  1387   }
       
  1388 
       
  1389   PRINT(_L("3GPLib::initMetaDataFiles() creating MetaDataWriter"));
       
  1390   TRAPD(err,   handle->metadatafilewriter = CMetaDataFileWriter::NewL());
       
  1391   if ( err != KErrNone )
       
  1392   	{
       
  1393     PRINT((_L("3GPLib::initMetaDataFiles() MetaDataWriter creation error: %d"), err));
       
  1394     if ( err == KErrNoMemory )
       
  1395     	{
       
  1396     	return MP4_OUT_OF_MEMORY;    
       
  1397     	}
       
  1398     else
       
  1399     	{
       
  1400     	return -1;    
       
  1401 	    }
       
  1402   	}
       
  1403 
       
  1404   PRINT(_L("3GPLib::initMetaDataFiles() MetaDataWriter created"));
       
  1405   PRINT(_L("3GPLib::initMetaDataFiles() out"));
       
  1406   return 0;
       
  1407 }
       
  1408 
       
  1409 
       
  1410 /*
       
  1411  * Function:
       
  1412  *
       
  1413  *   mp4_i32 writeMetaDataFileNum(MP4HandleImp handle,
       
  1414  *                                mp4_u8 *buffer,
       
  1415  *                                mp4_u32 bytestowrite,
       
  1416  *                                mp4_u32 filenumber)
       
  1417  *
       
  1418  * Description:
       
  1419  *
       
  1420  *   Write data into a numbered file.
       
  1421  *
       
  1422  * Parameters:
       
  1423  *
       
  1424  *   handle        MP4 library handle
       
  1425  *   buffer        Buffer containing the data
       
  1426  *   bytestowrite  Number of bytes to write
       
  1427  *   filenumber    Index of temporary file
       
  1428  *
       
  1429  * Return value:
       
  1430  *
       
  1431  *   0             Success
       
  1432  *   -1            File has not been opened
       
  1433  *   -2            Number of bytes written is not equal to bytestowrite
       
  1434  *
       
  1435  */
       
  1436 mp4_i32 writeMetaDataFileNum(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestowrite, mp4_u32 filenumber)
       
  1437 {
       
  1438   PRINT(_L("3GPLib::writeMetaDataFileNum() in"));
       
  1439 
       
  1440   if (!handle->metaDataFile[filenumber])
       
  1441     return -1;
       
  1442 
       
  1443   if ( handle->metadatafilewriter )
       
  1444   {
       
  1445     TPtrC8 buf = TPtrC8((TUint8 *)(buffer), bytestowrite);
       
  1446     PRINT((_L("e_file_writeMetaDataFileNum_write 1")));
       
  1447     if ( (handle->metadatafilewriter)->Write( *((RFile64 *)(handle->metaDataFile[filenumber])),
       
  1448                                               filenumber,
       
  1449                                               buf ) != KErrNone )
       
  1450     {
       
  1451       return -2;
       
  1452     }
       
  1453     PRINT((_L("e_file_writeMetaDataFileNum_write 0")));
       
  1454   }
       
  1455   else
       
  1456   {
       
  1457     return -1;
       
  1458   } 
       
  1459 
       
  1460   PRINT(_L("3GPLib::writeMetaDataFileNum() out"));
       
  1461   return 0;
       
  1462 }
       
  1463 
       
  1464 
       
  1465 /*
       
  1466  * Function:
       
  1467  *
       
  1468  *   mp4_i32 seekMetaDataFileNumAbs(MP4HandleImp handle,
       
  1469  *                                  mp4_i32 amount,
       
  1470  *                                  mp4_u32 filenumber)
       
  1471  *
       
  1472  * Description:
       
  1473  *
       
  1474  *   Seek from the beginning of a numbered file.
       
  1475  *
       
  1476  * Parameters:
       
  1477  *
       
  1478  *   handle        MP4 library handle
       
  1479  *   amount        Amount to seek from the beginning of the file
       
  1480  *   filenumber    Index of temporary file
       
  1481  *
       
  1482  * Return value:
       
  1483  *
       
  1484  *   0        Success
       
  1485  *   -1       File has not been opened
       
  1486  *   -3       Current position in the file could not be set
       
  1487  *
       
  1488  */
       
  1489 mp4_i32 seekMetaDataFileNumAbs(MP4HandleImp handle, mp4_i64 amount, mp4_u32 filenumber)
       
  1490 {
       
  1491   PRINT(_L("3GPLib::seekMetaDataFileNumAbs() in"));
       
  1492 
       
  1493   if (!handle->metaDataFile[filenumber])
       
  1494     return -1;
       
  1495 
       
  1496 
       
  1497   if ( handle->metadatafilewriter )
       
  1498   {
       
  1499     PRINT((_L("e_seekmetadatafilenumabs_flush 1")));        
       
  1500     if ( (handle->metadatafilewriter)->Flush() != KErrNone )
       
  1501     {
       
  1502       PRINT((_L("e_seekmetadatafilenumabs_flush 0")));        
       
  1503       return -2;
       
  1504     }
       
  1505     PRINT((_L("e_seekmetadatafilenumabs_flush 0")));        
       
  1506   }
       
  1507 
       
  1508   PRINT((_L("e_seekmetadatafilenumabs_seek 1")));
       
  1509   if (((RFile64 *)(handle->metaDataFile[filenumber]))->Seek(ESeekStart, amount) != KErrNone)
       
  1510   {
       
  1511     return -3;
       
  1512   }
       
  1513   PRINT((_L("e_seekmetadatafilenumabs_seek 0")));        
       
  1514 
       
  1515   PRINT(_L("3GPLib::seekMetaDataFileNumAbs() out"));
       
  1516   return 0;
       
  1517 }
       
  1518 
       
  1519 
       
  1520 /*
       
  1521  * Function:
       
  1522  *
       
  1523  *   mp4_i32 readMetaDataFileNum(MP4HandleImp handle,
       
  1524  *                               mp4_u8 *buffer,
       
  1525  *                               mp4_u32 bytestoread,
       
  1526  *                               mp4_u32 filenumber)
       
  1527  *
       
  1528  * Description:
       
  1529  *
       
  1530  *   Read data from a numbered file.
       
  1531  *
       
  1532  * Parameters:
       
  1533  *
       
  1534  *   handle       MP4 library handle
       
  1535  *   buffer       Buffer to read data into
       
  1536  *   bytestoread  Number of bytes to read from file
       
  1537  *   filenumber   Index of temporary file
       
  1538  *
       
  1539  * Return value:
       
  1540  *
       
  1541  *   0            Success
       
  1542  *   -1           File has not been opened
       
  1543  *   -2           Requested number of bytes could not be read
       
  1544  *
       
  1545  */
       
  1546 mp4_i32 readMetaDataFileNum(MP4HandleImp handle, mp4_u8 *buffer, mp4_u32 bytestoread, mp4_u32 filenumber)
       
  1547 {
       
  1548   PRINT(_L("3GPLib::readMetaDataFileNum() in"));
       
  1549   PRINT((_L("e_readmetadatafiles 1")));
       
  1550 
       
  1551   mp4_u32 bytesread = 0;
       
  1552   TPtr8 buf = TPtr8((TUint8 *)buffer, bytestoread);
       
  1553 
       
  1554   if (!handle->metaDataFile[filenumber])
       
  1555     return -1;
       
  1556 
       
  1557   if ( handle->metadatafilewriter )
       
  1558   {
       
  1559     PRINT((_L("e_readmetadatafiles_flush 1")));
       
  1560     if ( (handle->metadatafilewriter)->Flush() != KErrNone )
       
  1561     {
       
  1562       return -2;
       
  1563     }
       
  1564     PRINT((_L("e_readmetadatafiles_flush 0")));
       
  1565   }
       
  1566 
       
  1567   PRINT((_L("e_readmetadatafiles_read 1")));
       
  1568   
       
  1569   if (handle->metaDataFileEmpty[filenumber])
       
  1570     {
       
  1571     if (handle->metadatafilewriter)
       
  1572     	{	
       
  1573     	// if the file is empty, then read the data from temp buffer
       
  1574     	bytesread = (handle->metadatafilewriter)->ReadBuffer( filenumber, buf, bytestoread);    	
       
  1575     	}
       
  1576     if ( bytesread != bytestoread )
       
  1577         return -2;
       
  1578     }
       
  1579   else if (((RFile64 *)(handle->metaDataFile[filenumber]))->Read(buf, bytestoread) != KErrNone)
       
  1580     {
       
  1581     handle->metaDataFileEmpty[filenumber] = ETrue;
       
  1582     // if the file is empty, then read the data from temp buffer
       
  1583     if (handle->metadatafilewriter)
       
  1584     	{	
       
  1585     	bytesread = (handle->metadatafilewriter)->ReadBuffer( filenumber, buf, bytestoread);    	
       
  1586     	}
       
  1587     if ( bytesread != bytestoread )
       
  1588         return -2;
       
  1589     }
       
  1590   else if ( buf.Length() < bytestoread ) // Got only part of data from file, rest is in buffer
       
  1591     {
       
  1592     handle->metaDataFileEmpty[filenumber] = ETrue;
       
  1593     // if the file is empty, then read the data from temp buffer
       
  1594     if (handle->metadatafilewriter)
       
  1595     	{
       
  1596     	bytesread = (handle->metadatafilewriter)->ReadBuffer( filenumber, buf, bytestoread - buf.Length());    	
       
  1597     	}
       
  1598     if ( buf.Length() != bytestoread )
       
  1599         return -2;
       
  1600     }
       
  1601     
       
  1602   PRINT((_L("e_readmetadatafiles_read 0")));
       
  1603 
       
  1604   if ((mp4_u32)buf.Length() == 0) /* EOF or error */
       
  1605     return -2;
       
  1606 
       
  1607   PRINT(_L("3GPLib::readMetaDataFileNum() out"));
       
  1608   PRINT((_L("e_readmetadatafiles 0")));
       
  1609   return 0;
       
  1610 }
       
  1611 
       
  1612 
       
  1613 /*
       
  1614  * Function:
       
  1615  *
       
  1616  *   mp4_i32 deleteMetaDataFiles(MP4HandleImp handle)
       
  1617  *
       
  1618  * Description:
       
  1619  *
       
  1620  *   Remove a numbered temporary file.
       
  1621  *
       
  1622  * Parameters:
       
  1623  *
       
  1624  *   handle   MP4 library handle
       
  1625  *
       
  1626  * Return value:
       
  1627  *
       
  1628  *   0        Success
       
  1629  *   -1       Error
       
  1630  *
       
  1631  */
       
  1632 mp4_i32 deleteMetaDataFiles(MP4HandleImp handle)
       
  1633 {
       
  1634   PRINT(_L("3GPLib::deleteMetaDataFiles() in"));
       
  1635   PRINT((_L("e_deletemetadatafiles 1")));
       
  1636 
       
  1637   TFileName filename;
       
  1638   TFileName path;
       
  1639   TInt err;
       
  1640 
       
  1641   if ( handle->metadatafilewriter )
       
  1642   {
       
  1643     PRINT((_L("e_deletemetadatafiles_flush 1")));
       
  1644     if ( (handle->metadatafilewriter)->Flush() != KErrNone )
       
  1645     {
       
  1646       PRINT((_L("e_deletemetadatafiles_flush 0")));
       
  1647       return -2;
       
  1648     }
       
  1649     PRINT((_L("e_deletemetadatafiles_flush 0")));
       
  1650     delete handle->metadatafilewriter;
       
  1651     handle->metadatafilewriter = NULL;
       
  1652   }
       
  1653     
       
  1654   /* Determine file names */
       
  1655   PRINT((_L("e_deletemetadatafiles_determinenames 1")));
       
  1656   if ( handle->fileName )
       
  1657     {  
       
  1658      filename = (TText *)handle->fileName;
       
  1659      path = KTmpDirectoryName;
       
  1660 
       
  1661     TParse fp;
       
  1662     if (((RFs *)(handle->fs))->Parse(filename, fp) != KErrNone)
       
  1663         return -1;
       
  1664     path.Insert(0, fp.Drive());
       
  1665     }
       
  1666   else
       
  1667     {
       
  1668     TChar drive;
       
  1669     if (((RFs *)(handle->fs))->DriveToChar(handle->fileHandleDrive, drive ) != KErrNone )
       
  1670         return -1;
       
  1671     path.Append( drive );
       
  1672     path.Append( _L(":") );
       
  1673     path.Append( KTmpDirectoryName );    
       
  1674     }
       
  1675   PRINT((_L("e_deletemetadatafiles_determinenames 0")));    
       
  1676     
       
  1677   PRINT((_L("e_deletemetadatafiles_deletemetadatafilenames 1")));    
       
  1678   for (TUint i = 0; i < NUM_MDF; i++)
       
  1679   {
       
  1680     if (handle->metaDataFileName[i])
       
  1681       {
       
  1682       // check if client has defined async delete observer
       
  1683       if ( handle->tempFileRemoverObserver )
       
  1684         {
       
  1685         PRINT((_L("3GPLib::deleteMetaDataFiles() nro=%d sending %x to observer: %s"), i,handle->metaDataFileName[i], handle->metaDataFileName[i]));
       
  1686         handle->tempFileRemoverObserver->M3GPMP4LibDeleteTempFileName( handle->metaDataFileName[i] );
       
  1687         }
       
  1688       else // no observer, delete right here, ignore errors
       
  1689         {
       
  1690         PRINT((_L("3GPLib::deleteMetaDataFiles() nro=%d wremove: %s"), i, handle->metaDataFileName[i]));
       
  1691         err = wremove(handle->metaDataFileName[i]);
       
  1692         PRINT((_L("3GPLib::deleteMetaDataFiles() wremove err=%d"), err));
       
  1693         err++; // to remove compile warnings
       
  1694         mp4free(handle->metaDataFileName[i]);
       
  1695         }
       
  1696       handle->metaDataFileName[i] = 0;
       
  1697       }
       
  1698   PRINT((_L("e_deletemetadatafiles_deletemetadatafilenames 0")));    
       
  1699 
       
  1700   }
       
  1701 
       
  1702   PRINT(_L("3GPLib::deleteMetaDataFiles() out"));
       
  1703   PRINT((_L("e_deletemetadatafiles 0")));
       
  1704   return 0;
       
  1705 }
       
  1706 
       
  1707 
       
  1708 /*
       
  1709  * Function:
       
  1710  *
       
  1711  *   mp4_i32 closeMetaDataFiles(MP4HandleImp handle)
       
  1712  *
       
  1713  * Description:
       
  1714  *
       
  1715  *   Close numbered tmp files.
       
  1716  *
       
  1717  * Parameters:
       
  1718  *
       
  1719  *   handle   MP4 library handle
       
  1720  *
       
  1721  * Return value:
       
  1722  *
       
  1723  *   0        Success
       
  1724  *
       
  1725  */
       
  1726 mp4_i32 closeMetaDataFiles(MP4HandleImp handle)
       
  1727 {
       
  1728   PRINT(_L("3GPLib::closeMetaDataFiles() in"));
       
  1729   PRINT((_L("e_close_metadatafiles 1")));
       
  1730 
       
  1731   if ( handle->metadatafilewriter )
       
  1732   {
       
  1733     PRINT((_L("e_close_metadatafiles_flush 1")));
       
  1734     if ( (handle->metadatafilewriter)->Flush() != KErrNone )
       
  1735     {
       
  1736       PRINT((_L("e_close_metadatafiles_flush 0")));
       
  1737       return -2;
       
  1738     }
       
  1739     PRINT((_L("e_close_metadatafiles_flush 0")));
       
  1740   }
       
  1741 
       
  1742   for (TUint i = 0; i < NUM_MDF; i++)
       
  1743   {
       
  1744     if (handle->metaDataFile[i])
       
  1745     {
       
  1746 	  PRINT((_L("e_close_metadatafiles_closefile 1")));    
       
  1747       ((RFile64 *)(handle->metaDataFile[i]))->Close();
       
  1748       PRINT((_L("e_close_metadatafiles_closefile 0")));
       
  1749 
       
  1750       PRINT((_L("e_close_metadatafiles_delfile 1")));
       
  1751       delete((RFile64 *)(handle->metaDataFile[i]));
       
  1752       PRINT((_L("e_close_metadatafiles_delfile 0")));
       
  1753       handle->metaDataFile[i] = NULL;
       
  1754     }
       
  1755   }
       
  1756 
       
  1757   PRINT(_L("3GPLib::closeMetaDataFiles() out"));
       
  1758   PRINT((_L("e_close_metadatafiles 0")));
       
  1759   return 0;
       
  1760 }
       
  1761 
       
  1762 
       
  1763 // End of File