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