os/mm/mmplugins/lib3gp/impl/src/metadatafilewriter.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
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
sl@0
    17
// INCLUDE FILES
sl@0
    18
#include <e32base.h>
sl@0
    19
#include <f32file.h>
sl@0
    20
#include "mp4atom.h"
sl@0
    21
#include "metadatafilewriter.h"
sl@0
    22
sl@0
    23
// MACROS
sl@0
    24
// Debug print macro
sl@0
    25
#ifdef _DEBUG
sl@0
    26
#include <e32svr.h>
sl@0
    27
#define PRINT(x)
sl@0
    28
#else
sl@0
    29
#define PRINT(x)
sl@0
    30
#endif
sl@0
    31
sl@0
    32
const TInt KMetaDataWriterBufferSize        = (4*4096);
sl@0
    33
const TInt KMetaDataWriterInputBufCount     = 10;
sl@0
    34
const TInt KMetaDataWriterOutputBufCount    = 4;
sl@0
    35
sl@0
    36
// ============================ MEMBER FUNCTIONS ===============================
sl@0
    37
sl@0
    38
CMetaDataWriterBuffer::~CMetaDataWriterBuffer()
sl@0
    39
    {
sl@0
    40
    delete iData;
sl@0
    41
    }
sl@0
    42
sl@0
    43
// -----------------------------------------------------------------------------
sl@0
    44
// CMetaDataFileWriter::CMetaDataFileWriter
sl@0
    45
// C++ default constructor can NOT contain any code, that
sl@0
    46
// might leave.
sl@0
    47
// -----------------------------------------------------------------------------
sl@0
    48
//
sl@0
    49
CMetaDataFileWriter::CMetaDataFileWriter() : CActive( EPriorityHigh ) 
sl@0
    50
    {
sl@0
    51
    }
sl@0
    52
sl@0
    53
// -----------------------------------------------------------------------------
sl@0
    54
// CMetaDataFileWriter::ConstructL
sl@0
    55
// Symbian 2nd phase constructor can leave.
sl@0
    56
// -----------------------------------------------------------------------------
sl@0
    57
//
sl@0
    58
void CMetaDataFileWriter::ConstructL( )
sl@0
    59
    {
sl@0
    60
    PRINT(_L("CMetaDataFileWriter::ConstructL() in"));
sl@0
    61
sl@0
    62
    iError = KErrNone;
sl@0
    63
    iAsyncWritingOngoing = EFalse;
sl@0
    64
    iFlush = EFalse;
sl@0
    65
    iFlushDone = EFalse;
sl@0
    66
sl@0
    67
    for (TInt i=0; i<KMetaDataWriterInputBufCount; i++)
sl@0
    68
        {
sl@0
    69
        iOutputFile.AppendL(NULL);
sl@0
    70
sl@0
    71
        CMetaDataWriterBuffer* emptyInputBuffer = new (ELeave) CMetaDataWriterBuffer;
sl@0
    72
        CleanupStack::PushL(emptyInputBuffer);
sl@0
    73
        
sl@0
    74
        emptyInputBuffer->iData = HBufC8::NewL(KMetaDataWriterBufferSize);
sl@0
    75
        emptyInputBuffer->iOutputFileNum = i;
sl@0
    76
        iInputBufferArray.AppendL(emptyInputBuffer);
sl@0
    77
        
sl@0
    78
        CleanupStack::Pop(emptyInputBuffer);
sl@0
    79
        
sl@0
    80
        iInputBufferArrayDelivered[i] = 0;
sl@0
    81
        }
sl@0
    82
sl@0
    83
    for (TInt j=0; j<KMetaDataWriterOutputBufCount; j++)
sl@0
    84
        {
sl@0
    85
        CMetaDataWriterBuffer* emptyOutputBuffer = new (ELeave) CMetaDataWriterBuffer;
sl@0
    86
        CleanupStack::PushL(emptyOutputBuffer);
sl@0
    87
        
sl@0
    88
        emptyOutputBuffer->iData = HBufC8::NewL(KMetaDataWriterBufferSize);
sl@0
    89
        emptyOutputBuffer->iOutputFileNum = -1;
sl@0
    90
        iEmptyBufferQueue.AppendL(emptyOutputBuffer);
sl@0
    91
        
sl@0
    92
        CleanupStack::Pop(emptyOutputBuffer);
sl@0
    93
        }
sl@0
    94
sl@0
    95
    CActiveScheduler::Add(this);
sl@0
    96
sl@0
    97
    PRINT(_L("CMetaDataFileWriter::ConstructL() out"));
sl@0
    98
    }
sl@0
    99
sl@0
   100
// -----------------------------------------------------------------------------
sl@0
   101
// CMetaDataFileWriter::NewL
sl@0
   102
// Two-phased constructor.
sl@0
   103
// -----------------------------------------------------------------------------
sl@0
   104
//
sl@0
   105
CMetaDataFileWriter* CMetaDataFileWriter::NewL()
sl@0
   106
    {
sl@0
   107
    PRINT(_L("CMetaDataFileWriter::NewL() in"));
sl@0
   108
    
sl@0
   109
    CMetaDataFileWriter* self = new(ELeave) CMetaDataFileWriter;
sl@0
   110
    CleanupStack::PushL(self);
sl@0
   111
    self->ConstructL( );
sl@0
   112
    CleanupStack::Pop(self);
sl@0
   113
sl@0
   114
    PRINT(_L("CMetaDataFileWriter::NewL() out"));
sl@0
   115
    return self;
sl@0
   116
    }
sl@0
   117
sl@0
   118
sl@0
   119
// Destructor
sl@0
   120
CMetaDataFileWriter::~CMetaDataFileWriter()
sl@0
   121
    {
sl@0
   122
    PRINT(_L("CMetaDataFileWriter::~CMetaDataFileWriter() in"));
sl@0
   123
sl@0
   124
sl@0
   125
    if ( IsActive() )
sl@0
   126
        {
sl@0
   127
        if ( iAsyncWritingOngoing )
sl@0
   128
            {
sl@0
   129
            Cancel();    
sl@0
   130
            }
sl@0
   131
        else
sl@0
   132
            {
sl@0
   133
            TRequestStatus* status = &iStatus;
sl@0
   134
            User::RequestComplete( status, KErrNone );
sl@0
   135
            Cancel();
sl@0
   136
            }
sl@0
   137
        }
sl@0
   138
sl@0
   139
    iOutputFile.Reset();
sl@0
   140
    iInputBufferArray.ResetAndDestroy();
sl@0
   141
    iOutputBufferQueue.ResetAndDestroy();
sl@0
   142
    iEmptyBufferQueue.ResetAndDestroy();
sl@0
   143
    PRINT(_L("CMetaDataFileWriter::~CMetaDataFileWriter() out"));
sl@0
   144
    }
sl@0
   145
sl@0
   146
// -----------------------------------------------------------------------------
sl@0
   147
// CMetaDataFileWriter::Write( const TDesC8& aBuf )
sl@0
   148
// Writes incoming buffer data to internal buffers for writing to disk.
sl@0
   149
// (other items were commented in a header).
sl@0
   150
// -----------------------------------------------------------------------------
sl@0
   151
//
sl@0
   152
TInt CMetaDataFileWriter:: Write( RFile64& aFile, const TInt aFileNumber, const TDesC8& aBuf )
sl@0
   153
    {
sl@0
   154
    PRINT(_L("CMetaDataFileWriter::Write() in"));
sl@0
   155
    PRINT((_L("e_cmetadatawriter_write 1")));
sl@0
   156
sl@0
   157
    iOutputFile[aFileNumber] = &aFile;
sl@0
   158
sl@0
   159
	PRINT((_L("e_cmetadatawriter_write_adddatatobuffer 1")));
sl@0
   160
    TInt error = AddDataToBuffer( aFileNumber, aBuf );
sl@0
   161
    if ( error != KErrNone )
sl@0
   162
        {
sl@0
   163
        PRINT((_L("CMetaDataFileWriter::Write() buffer write error: %d"), error));         
sl@0
   164
        return error;
sl@0
   165
        }
sl@0
   166
	PRINT((_L("e_cmetadatawriter_write_adddatatobuffer 0")));
sl@0
   167
sl@0
   168
    PRINT((_L("CMetaDataFileWriter::Write() Write Buffer, Status: Full:%d Empty:%d "), 
sl@0
   169
                    iOutputBufferQueue.Count(), iEmptyBufferQueue.Count() ));
sl@0
   170
sl@0
   171
    if ( iAsyncWritingOngoing )
sl@0
   172
        {
sl@0
   173
        if ( iOutputBufferQueue.Count() >= KFileWriterHardBufLimit )
sl@0
   174
            {
sl@0
   175
            PRINT((_L("CMetaDataFileWriter::Write() Waiting async write to complete")));
sl@0
   176
			PRINT((_L("e_cmetadatawriter_write_waitasync 1")));            
sl@0
   177
            User::WaitForRequest( iStatus );
sl@0
   178
			PRINT((_L("e_cmetadatawriter_write_waitasync 0")));            
sl@0
   179
            PRINT((_L("CMetaDataFileWriter::Write() Async write done")));
sl@0
   180
            TRAP(error, RunL());
sl@0
   181
            if (error != KErrNone)
sl@0
   182
            	{
sl@0
   183
            	PRINT((_L("CMetaDataFileWriter::Write() runL leave, error: %d"), error));         
sl@0
   184
                return error;
sl@0
   185
            	}
sl@0
   186
            }
sl@0
   187
        }
sl@0
   188
    else
sl@0
   189
        {
sl@0
   190
        if ( iOutputBufferQueue.Count() )
sl@0
   191
            {
sl@0
   192
            PRINT(_L("CMetaDataFileWriter::Write() writing async"));       
sl@0
   193
sl@0
   194
			PRINT((_L("e_cmetadatawriter_write_startwrite 1")));
sl@0
   195
			
sl@0
   196
            iOutputFile[iOutputBufferQueue[0]->iOutputFileNum]->Write( *(iOutputBufferQueue[0]->iData), iStatus );
sl@0
   197
			PRINT((_L("e_cmetadatawriter_write_startwrite 0")));            
sl@0
   198
            iAsyncWritingOngoing = ETrue;
sl@0
   199
            if ( !IsActive() )
sl@0
   200
                {
sl@0
   201
                SetActive();
sl@0
   202
                }
sl@0
   203
            }
sl@0
   204
        }
sl@0
   205
sl@0
   206
    PRINT(_L("CMetaDataFileWriter::Write() out"));
sl@0
   207
    PRINT((_L("e_cmetadatawriter_write 0")));    
sl@0
   208
    return error;
sl@0
   209
    }
sl@0
   210
sl@0
   211
// -----------------------------------------------------------------------------
sl@0
   212
// CMetaDataFileWriter::Flush( )
sl@0
   213
// Flush internal buffers to disk.
sl@0
   214
// (other items were commented in a header).
sl@0
   215
// -----------------------------------------------------------------------------
sl@0
   216
//
sl@0
   217
TInt CMetaDataFileWriter::Flush( )
sl@0
   218
    {
sl@0
   219
    PRINT(_L("CMetaDataFileWriter::Flush() in"));
sl@0
   220
    PRINT((_L("e_cmetadatawriter_flush 1")));
sl@0
   221
    PRINT((_L("CMetaDataFileWriter::Flush() FullCount: %d "), iOutputBufferQueue.Count()));
sl@0
   222
sl@0
   223
    TInt error = KErrNone;
sl@0
   224
    iFlush = ETrue;
sl@0
   225
sl@0
   226
    if ( iAsyncWritingOngoing )
sl@0
   227
        {
sl@0
   228
        PRINT((_L("CMetaDataFileWriter::Flush() Waiting async write to complete")));
sl@0
   229
        PRINT((_L("e_cmetadatawriter_flush_waitasyncstop 1")));
sl@0
   230
        User::WaitForRequest( iStatus );
sl@0
   231
		PRINT((_L("e_cmetadatawriter_flush_waitasyncstop 0")));        
sl@0
   232
        PRINT((_L("CMetaDataFileWriter::Flush() Async write done, flushing")));
sl@0
   233
        TRAP(error, RunL());
sl@0
   234
        if (error != KErrNone)
sl@0
   235
        	{
sl@0
   236
        	PRINT((_L("CMetaDataFileWriter::Flush() call runL leave, error: %d"), error));         
sl@0
   237
            return error;
sl@0
   238
        	}
sl@0
   239
        }
sl@0
   240
sl@0
   241
    while ( iOutputBufferQueue.Count() )
sl@0
   242
        {
sl@0
   243
        PRINT((_L("e_cmetadatawriter_flush_writesync 1")));
sl@0
   244
        
sl@0
   245
        error = iOutputFile[iOutputBufferQueue[0]->iOutputFileNum]->Write( *(iOutputBufferQueue[0]->iData) );
sl@0
   246
        if ( error == KErrNone )
sl@0
   247
            {
sl@0
   248
            error = iEmptyBufferQueue.Append(iOutputBufferQueue[0]);
sl@0
   249
            if (error == KErrNone)
sl@0
   250
            	{                   
sl@0
   251
            	iOutputBufferQueue[0]->iData->Des().Zero();
sl@0
   252
            	iOutputBufferQueue[0]->iOutputFileNum = -1;
sl@0
   253
            	iOutputBufferQueue.Remove(0);
sl@0
   254
            	}
sl@0
   255
            else
sl@0
   256
            	{
sl@0
   257
            	PRINT((_L("CMetaDataFileWriter::Flush() iEmptyBufferQueue.Append failed, error: %d"), error));
sl@0
   258
            	return error;
sl@0
   259
            	}
sl@0
   260
            }
sl@0
   261
        else
sl@0
   262
            {
sl@0
   263
            PRINT((_L("CMetaDataFileWriter::Flush() fullBufQueue write failed, error: %d"), error));
sl@0
   264
            iFlush = EFalse;
sl@0
   265
            return error;
sl@0
   266
            }
sl@0
   267
		PRINT((_L("e_cmetadatawriter_flush_writesync 0")));            
sl@0
   268
        }
sl@0
   269
sl@0
   270
    if ( !iFlushDone ) // Flush only once
sl@0
   271
        {
sl@0
   272
        iFlushDone = ETrue;
sl@0
   273
        for ( TInt i=0; i < KMetaDataWriterInputBufCount; i++ )
sl@0
   274
            {
sl@0
   275
            if ( iOutputFile[i] )
sl@0
   276
                {
sl@0
   277
		    	PRINT((_L("e_cmetadatawriter_flush_write_tempfiles 1")));
sl@0
   278
                error = iOutputFile[i]->Flush();
sl@0
   279
    			PRINT((_L("e_cmetadatawriter_flush_write_tempfiles 0")));
sl@0
   280
                PRINT((_L("CMetaDataFileWriter::Flush() inputbuf[%d] flush return code: %d"), i, error));
sl@0
   281
                }
sl@0
   282
	        }
sl@0
   283
        }
sl@0
   284
sl@0
   285
    iFlush = EFalse;
sl@0
   286
    PRINT((_L("CMetaDataFileWriter::Flush() FullCount: %d <= Should be 0"), iOutputBufferQueue.Count()));
sl@0
   287
    PRINT(_L("CMetaDataFileWriter::Flush() out"));
sl@0
   288
    PRINT((_L("e_cmetadatawriter_flush 0")));
sl@0
   289
    return KErrNone;
sl@0
   290
    }
sl@0
   291
sl@0
   292
// -----------------------------------------------------------------------------
sl@0
   293
// CMetaDataFileWriter::AddDataToBuffer( const TDesC8& aBuf )
sl@0
   294
// Writes incoming data to internal buffers and buffer queues..
sl@0
   295
// (other items were commented in a header).
sl@0
   296
// -----------------------------------------------------------------------------
sl@0
   297
//
sl@0
   298
TInt CMetaDataFileWriter::AddDataToBuffer(const TInt aFileNumber, const TDesC8& aBuf )
sl@0
   299
    {
sl@0
   300
    PRINT(_L("CMetaDataFileWriter::AddDataToBuffer() in"));
sl@0
   301
sl@0
   302
    TInt byteswritten = 0;
sl@0
   303
    TInt numbytes = 0;
sl@0
   304
    TInt available = 0; // Available bytes in write buffer
sl@0
   305
    TInt error = KErrNone;
sl@0
   306
    
sl@0
   307
    HBufC8* inputBuf = iInputBufferArray[aFileNumber]->iData;
sl@0
   308
sl@0
   309
    if ( iError != KErrNone )
sl@0
   310
        {
sl@0
   311
        PRINT((_L("CMetaDataFileWriter::AddDataToBuffer() out, RunL iError: %d"), iError));
sl@0
   312
        return iError;
sl@0
   313
        }
sl@0
   314
sl@0
   315
    PRINT((_L("CMetaDataFileWriter::AddDataToBuffer() Save Buffer, Size: %d "),  aBuf.Length() ));
sl@0
   316
sl@0
   317
    while (byteswritten < aBuf.Length() )
sl@0
   318
        {
sl@0
   319
        available = (inputBuf->Des()).MaxLength() - inputBuf->Length();
sl@0
   320
sl@0
   321
        if (available > 0)
sl@0
   322
            {
sl@0
   323
            numbytes = aBuf.Length() - byteswritten;
sl@0
   324
            if (numbytes > available)
sl@0
   325
                {
sl@0
   326
                numbytes = available;
sl@0
   327
                }
sl@0
   328
            inputBuf->Des().Append( aBuf.Mid( byteswritten, numbytes ) );
sl@0
   329
            byteswritten += numbytes;
sl@0
   330
            }
sl@0
   331
        else // Buffer is full, move it to outputqueue and use empty/new buf as input.
sl@0
   332
            {
sl@0
   333
            if ( iEmptyBufferQueue.Count() == 0 )
sl@0
   334
                {
sl@0
   335
                CMetaDataWriterBuffer* emptyInputBuffer = 0;
sl@0
   336
sl@0
   337
                emptyInputBuffer = new CMetaDataWriterBuffer;
sl@0
   338
                if ( !emptyInputBuffer )
sl@0
   339
                    {
sl@0
   340
                    PRINT((_L("CMetaDataFileWriter::AddDataToBuffer(), memory alloc failed")));
sl@0
   341
                    iError = KErrNoMemory;
sl@0
   342
                    break;
sl@0
   343
                    }
sl@0
   344
sl@0
   345
                TRAP(error, emptyInputBuffer->iData = HBufC8::NewL( KMetaDataWriterBufferSize ));
sl@0
   346
                if ( error != KErrNone )
sl@0
   347
                    {
sl@0
   348
                    PRINT((_L("CMetaDataFileWriter::AddDataToBuffer(), memory alloc failed: %d"), error));
sl@0
   349
                    delete emptyInputBuffer;
sl@0
   350
                    emptyInputBuffer = NULL;
sl@0
   351
                    iError = error;
sl@0
   352
                    break;
sl@0
   353
                    }
sl@0
   354
                else
sl@0
   355
                    {                    
sl@0
   356
                    error = iOutputBufferQueue.Append(iInputBufferArray[aFileNumber]);
sl@0
   357
                    if (error != KErrNone)
sl@0
   358
                    	{
sl@0
   359
                        PRINT((_L("CMetaDataFileWriter::AddDataToBuffer(), memory alloc failed: %d"), error));
sl@0
   360
                        delete emptyInputBuffer;
sl@0
   361
                        emptyInputBuffer = NULL;
sl@0
   362
                        iError = error;
sl@0
   363
                        break;
sl@0
   364
                    	}
sl@0
   365
                    
sl@0
   366
                	// old full buffer to output queue.
sl@0
   367
                    emptyInputBuffer->iOutputFileNum = aFileNumber;
sl@0
   368
                    
sl@0
   369
                    // new buffer to input.
sl@0
   370
                    iInputBufferArray[aFileNumber] = emptyInputBuffer;
sl@0
   371
                    }
sl@0
   372
                }
sl@0
   373
            else
sl@0
   374
                {
sl@0
   375
                // old full buffer to output queue.
sl@0
   376
                TInt err = iOutputBufferQueue.Append( iInputBufferArray[aFileNumber] );
sl@0
   377
                if (err != KErrNone)
sl@0
   378
                	{
sl@0
   379
                	PRINT((_L("CMetaDataFileWriter::AddDataToBuffer(), iOutputBufferQueue.Append failed: %d"), err));
sl@0
   380
                	iError = err;
sl@0
   381
                	break;
sl@0
   382
                	}
sl@0
   383
                
sl@0
   384
                // empty buffer from empty queue to input.
sl@0
   385
                iInputBufferArray[aFileNumber] = iEmptyBufferQueue[0];
sl@0
   386
                iInputBufferArray[aFileNumber]->iData->Des().Zero();
sl@0
   387
                iInputBufferArray[aFileNumber]->iOutputFileNum = aFileNumber;
sl@0
   388
                iEmptyBufferQueue.Remove(0);                
sl@0
   389
                }
sl@0
   390
sl@0
   391
            inputBuf = iInputBufferArray[aFileNumber]->iData;
sl@0
   392
            }
sl@0
   393
        }
sl@0
   394
sl@0
   395
    PRINT((_L("CMetaDataFileWriter::AddDataToBuffer() out, error: %d"), error));
sl@0
   396
    return error;
sl@0
   397
    }
sl@0
   398
sl@0
   399
// -----------------------------------------------------------------------------
sl@0
   400
// CMetaDataFileWriter::DoCancel()
sl@0
   401
// From CActive Cancels async request.
sl@0
   402
// -----------------------------------------------------------------------------
sl@0
   403
//
sl@0
   404
void CMetaDataFileWriter::DoCancel()
sl@0
   405
    {
sl@0
   406
    }
sl@0
   407
sl@0
   408
// -----------------------------------------------------------------------------
sl@0
   409
// CMetaDataFileWriter::RunL()
sl@0
   410
// From CActive Called when async request completes.
sl@0
   411
// -----------------------------------------------------------------------------
sl@0
   412
//
sl@0
   413
void CMetaDataFileWriter::RunL()
sl@0
   414
    {
sl@0
   415
    PRINT(_L("CMetaDataFileWriter::RunL() in"));
sl@0
   416
	PRINT((_L("e_cmetadatawriter_runl 1")));
sl@0
   417
    iAsyncWritingOngoing = EFalse;
sl@0
   418
sl@0
   419
    if ( iStatus == KErrNone )
sl@0
   420
        {
sl@0
   421
        iEmptyBufferQueue.AppendL( iOutputBufferQueue[0] );        
sl@0
   422
        iOutputBufferQueue[0]->iData->Des().Zero();
sl@0
   423
        iOutputBufferQueue[0]->iOutputFileNum = -1;
sl@0
   424
        iOutputBufferQueue.Remove( 0 );
sl@0
   425
        }
sl@0
   426
    else
sl@0
   427
        {
sl@0
   428
        PRINT((_L("CMetaDataFileWriter::RunL() Write error in previous async: %d "), iStatus.Int() ));
sl@0
   429
        iError = iStatus.Int();
sl@0
   430
        return;
sl@0
   431
        }
sl@0
   432
sl@0
   433
    PRINT((_L("CMetaDataFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d "), iOutputBufferQueue.Count(), iEmptyBufferQueue.Count() ));
sl@0
   434
    
sl@0
   435
    if ( iFlush )
sl@0
   436
        {
sl@0
   437
        PRINT(_L("CMetaDataFileWriter::RunL() out, flushing"));
sl@0
   438
        PRINT((_L("e_cmetadatawriter_runl 0")));
sl@0
   439
        return;
sl@0
   440
        }
sl@0
   441
sl@0
   442
    if ( iOutputBufferQueue.Count() >= KFileWriterHardBufLimit )
sl@0
   443
        {
sl@0
   444
        while ( iOutputBufferQueue.Count() > KFileWriterSoftBufLimit )
sl@0
   445
            {
sl@0
   446
        	PRINT((_L("e_cmetadatawriter_runl1_write 1")));
sl@0
   447
            iError = iOutputFile[iOutputBufferQueue[0]->iOutputFileNum]->Write( *(iOutputBufferQueue[0]->iData));
sl@0
   448
        	PRINT((_L("e_cmetadatawriter_runl1_write 0")));
sl@0
   449
            if ( iError == KErrNone )
sl@0
   450
                {
sl@0
   451
                iEmptyBufferQueue.AppendL( iOutputBufferQueue[0] );
sl@0
   452
                iOutputBufferQueue[0]->iData->Des().Zero();
sl@0
   453
                iOutputBufferQueue[0]->iOutputFileNum = -1;                
sl@0
   454
                iOutputBufferQueue.Remove( 0 );
sl@0
   455
                }   
sl@0
   456
            else
sl@0
   457
                {
sl@0
   458
                PRINT((_L("CMetaDataFileWriter::RunL() Write error: %d "), iError));
sl@0
   459
                return;
sl@0
   460
                }   
sl@0
   461
            }
sl@0
   462
        }
sl@0
   463
sl@0
   464
    if ( iOutputBufferQueue.Count() >= KFileWriterSoftBufLimit )
sl@0
   465
        {
sl@0
   466
      	PRINT((_L("e_cmetadatawriter_runl2_write 1")));
sl@0
   467
        iError = iOutputFile[iOutputBufferQueue[0]->iOutputFileNum]->Write(  *(iOutputBufferQueue[0]->iData));
sl@0
   468
      	PRINT((_L("e_cmetadatawriter_runl2_write 0")));
sl@0
   469
        if ( iError == KErrNone )
sl@0
   470
            {
sl@0
   471
            iEmptyBufferQueue.AppendL( iOutputBufferQueue[0] );            
sl@0
   472
            iOutputBufferQueue[0]->iData->Des().Zero();
sl@0
   473
            iOutputBufferQueue[0]->iOutputFileNum = -1;
sl@0
   474
            iOutputBufferQueue.Remove( 0 );
sl@0
   475
            }   
sl@0
   476
        else
sl@0
   477
            {
sl@0
   478
            PRINT((_L("CMetaDataFileWriter::RunL() Write error: %d "), iError));
sl@0
   479
            return;
sl@0
   480
            }
sl@0
   481
        }
sl@0
   482
sl@0
   483
    if ( iOutputBufferQueue.Count() )
sl@0
   484
        {
sl@0
   485
      	PRINT((_L("e_cmetadatawriter_runl3_write 1")));
sl@0
   486
        iOutputFile[iOutputBufferQueue[0]->iOutputFileNum]->Write( *(iOutputBufferQueue[0]->iData), iStatus );
sl@0
   487
      	PRINT((_L("e_cmetadatawriter_runl3_write 0")));
sl@0
   488
        iAsyncWritingOngoing = ETrue;
sl@0
   489
        if ( !IsActive() )
sl@0
   490
            {
sl@0
   491
            SetActive();
sl@0
   492
            }
sl@0
   493
        }
sl@0
   494
sl@0
   495
	PRINT((_L("e_cmetadatawriter_runl 0")));
sl@0
   496
    PRINT(_L("CMetaDataFileWriter::RunL() out"));
sl@0
   497
    }
sl@0
   498
sl@0
   499
// -----------------------------------------------------------------------------
sl@0
   500
// CMetaDataFileWriter::RunError
sl@0
   501
// -----------------------------------------------------------------------------
sl@0
   502
//
sl@0
   503
 TInt CMetaDataFileWriter::RunError(TInt aError)
sl@0
   504
	 {
sl@0
   505
	 //RunL can leave.
sl@0
   506
	 iError = aError;
sl@0
   507
	 return KErrNone ;
sl@0
   508
	 }
sl@0
   509
 
sl@0
   510
// -----------------------------------------------------------------------------
sl@0
   511
// CMetaDataFileWriter::ReadBuffer
sl@0
   512
// -----------------------------------------------------------------------------
sl@0
   513
//
sl@0
   514
TInt CMetaDataFileWriter::ReadBuffer( const TInt aFileNumber, TDes8& aBuf, TInt bytestoread )
sl@0
   515
    {
sl@0
   516
    PRINT(_L("CMetaDataFileWriter::ReadBuffer() in"));
sl@0
   517
	PRINT((_L("e_cmetadatawriter_readbuffer 1")));
sl@0
   518
    TInt bytesread;
sl@0
   519
    
sl@0
   520
    PRINT((_L("CMetaDataFileWriter::ReadBuffer() iInputBufferArray[%d]->iData->Length(): %d, requested %d"), aFileNumber, iInputBufferArray[aFileNumber]->iData->Length(), bytestoread));
sl@0
   521
    if ( !iInputBufferArray[aFileNumber]->iData->Length() )
sl@0
   522
        {
sl@0
   523
        bytesread = 0;
sl@0
   524
        }
sl@0
   525
    else if ( (iInputBufferArray[aFileNumber]->iData->Length() -
sl@0
   526
        iInputBufferArrayDelivered[aFileNumber]) >= bytestoread )
sl@0
   527
        {
sl@0
   528
        bytesread = bytestoread;
sl@0
   529
        aBuf.Append( iInputBufferArray[aFileNumber]->iData->Mid( iInputBufferArrayDelivered[aFileNumber], bytesread ) );
sl@0
   530
        iInputBufferArrayDelivered[aFileNumber] += bytesread;
sl@0
   531
        
sl@0
   532
        // If the buffer is read empty, release it
sl@0
   533
        if ( iInputBufferArray[aFileNumber]->iData->Length() == iInputBufferArrayDelivered[aFileNumber] )
sl@0
   534
            {
sl@0
   535
            PRINT((_L("CMetaDataFileWriter::ReadBuffer() iInputBufferArray[%d] %d delivered"), aFileNumber, iInputBufferArray[aFileNumber]->iData->Length()));
sl@0
   536
            iInputBufferArray[aFileNumber]->iData->Des().Zero();
sl@0
   537
            }
sl@0
   538
        }
sl@0
   539
    else
sl@0
   540
        {
sl@0
   541
        bytesread = iInputBufferArray[aFileNumber]->iData->Length() - iInputBufferArrayDelivered[aFileNumber];
sl@0
   542
        aBuf.Append( iInputBufferArray[aFileNumber]->iData->Mid( iInputBufferArrayDelivered[aFileNumber], bytesread ) );
sl@0
   543
        iInputBufferArrayDelivered[aFileNumber] += bytesread;
sl@0
   544
sl@0
   545
        PRINT((_L("CMetaDataFileWriter::ReadBuffer() iInputBufferArray[%d] %d bytes delivered"), aFileNumber, iInputBufferArray[aFileNumber]->iData->Length()));
sl@0
   546
        iInputBufferArray[aFileNumber]->iData->Des().Zero();
sl@0
   547
        }
sl@0
   548
        
sl@0
   549
	PRINT((_L("e_cmetadatawriter_readbuffer 0")));
sl@0
   550
    PRINT(_L("CMetaDataFileWriter::ReadBuffer() out"));
sl@0
   551
sl@0
   552
    return ( bytesread );
sl@0
   553
    }
sl@0
   554
sl@0
   555
//  End of File