mmplugins/lib3gp/impl/src/filewriter.cpp
branchRCL_3
changeset 49 735348f59235
parent 40 f429a0a2075b
child 50 948c7f65f6d4
equal deleted inserted replaced
40:f429a0a2075b 49:735348f59235
    36 // CFileWriter::CFileWriter
    36 // CFileWriter::CFileWriter
    37 // C++ default constructor can NOT contain any code, that
    37 // C++ default constructor can NOT contain any code, that
    38 // might leave.
    38 // might leave.
    39 // -----------------------------------------------------------------------------
    39 // -----------------------------------------------------------------------------
    40 //
    40 //
    41 CFileWriter::CFileWriter( TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge ):
    41 CFileWriter::CFileWriter() : CActive( EPriorityHigh ) 
    42 	CActive( EPriorityHigh ),
       
    43 	iSetSize( aInitSetSize ),
       
    44 	iOutputBufferSizeSmall( aOutputBufferSizeSmall ),
       
    45 	iOutputBufferSizeLarge( aOutputBufferSizeLarge )
       
    46     {
    42     {
    47     }
    43     }
    48 
    44 
    49 // -----------------------------------------------------------------------------
    45 // -----------------------------------------------------------------------------
    50 // CFileWriter::ConstructL
    46 // CFileWriter::ConstructL
    54 void CFileWriter::ConstructL( RFile64& aFile )
    50 void CFileWriter::ConstructL( RFile64& aFile )
    55     {
    51     {
    56     PRINT((_L("CFileWriter::ConstructL() in")));         
    52     PRINT((_L("CFileWriter::ConstructL() in")));         
    57     iFlush = EFalse;
    53     iFlush = EFalse;
    58     iError = KErrNone;
    54     iError = KErrNone;
    59 
       
    60     iOutputFile = &aFile;
    55     iOutputFile = &aFile;
    61     iWritingStarted = EFalse;
    56     iWritingStarted = EFalse;
    62     iOutputBufferSize = KFileWriterBufferSizeSmall;
    57     iOutputBufferSize = KFileWriterBufferSizeSmall;
    63     iMaxOutputBufHardLimit = KFileWriterHardBufLimit;
    58     iMaxOutputBufHardLimit = KFileWriterHardBufLimit;
    64     iMaxOutputBufSoftLimit = KFileWriterSoftBufLimit;
    59     iMaxOutputBufSoftLimit = KFileWriterSoftBufLimit;
    76 // -----------------------------------------------------------------------------
    71 // -----------------------------------------------------------------------------
    77 // CFileWriter::NewL
    72 // CFileWriter::NewL
    78 // Two-phased constructor.
    73 // Two-phased constructor.
    79 // -----------------------------------------------------------------------------
    74 // -----------------------------------------------------------------------------
    80 //
    75 //
    81 CFileWriter* CFileWriter::NewL( RFile64& aFile, TInt aInitSetSize, TInt aOutputBufferSizeSmall, TInt aOutputBufferSizeLarge )
    76 CFileWriter* CFileWriter::NewL( RFile64& aFile )
    82     {
    77     {
    83     CFileWriter* self = new(ELeave) CFileWriter( aInitSetSize, aOutputBufferSizeSmall, aOutputBufferSizeLarge );
    78     CFileWriter* self = new(ELeave) CFileWriter;
    84     CleanupStack::PushL(self);
    79     CleanupStack::PushL(self);
    85     self->ConstructL( aFile );
    80     self->ConstructL( aFile );
    86     CleanupStack::Pop(self);
    81     CleanupStack::Pop(self);
    87     return self;
    82     return self;
    88     }
    83     }
   114     iEmptyBufferQueue.ResetAndDestroy();
   109     iEmptyBufferQueue.ResetAndDestroy();
   115     iFullBufferQueue.ResetAndDestroy();
   110     iFullBufferQueue.ResetAndDestroy();
   116     PRINT((_L("CFileWriter::~CFileWriter() out")));         
   111     PRINT((_L("CFileWriter::~CFileWriter() out")));         
   117     }
   112     }
   118 
   113 
   119 // -----------------------------------------------------------------------------
       
   120 // CFileWriter::UpdateOutputFileSize()
       
   121 // Updates output file size and reserves extra space for following writing 
       
   122 // if iSetSize is set.  
       
   123 // Takes into account if the position in the file was changed.
       
   124 // -----------------------------------------------------------------------------
       
   125 //
       
   126 void CFileWriter::UpdateOutputFileSize()
       
   127     {
       
   128     TInt64 pos = 0;
       
   129     PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 1")));
       
   130     iOutputFile->Seek(ESeekCurrent, pos);
       
   131     PRINT((_L("e_cfilewriter_write_updateoutputfilesize_seek 0")));
       
   132     
       
   133     PRINT((_L("CFileWriter::UpdateOutputFileSize() pos: %Ld"), pos));
       
   134     PRINT((_L("CFileWriter::UpdateOutputFileSize() iOutputFileSize: %Ld"), iOutputFileSize));
       
   135     PRINT((_L("CFileWriter::UpdateOutputFileSize() iSetSize: %Ld"), iSetSize));
       
   136     
       
   137     if (pos > iOutputFileSize) 
       
   138         {
       
   139         iOutputFileSize = pos;
       
   140         }
       
   141     
       
   142     while (iOutputFileSize >= iSetSize) 
       
   143         {
       
   144         iSetSize += static_cast<TInt64>(iOutputBufferSize) * (static_cast<TInt64>(iMaxOutputBufHardLimit) >> 1); 
       
   145         PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 1")));                     
       
   146         iOutputFile->SetSize( iSetSize );
       
   147         PRINT((_L("e_cfilewriter_updateoutputfilesize_setsize 0")));                     
       
   148         }
       
   149     }
       
   150 
   114 
   151 // -----------------------------------------------------------------------------
   115 // -----------------------------------------------------------------------------
   152 // CFileWriter::Write( const TDesC8& aBuf )
   116 // CFileWriter::Write( const TDesC8& aBuf )
   153 // Writes incoming buffer data to internal buffers for writing to disk.
   117 // Writes incoming buffer data to internal buffers for writing to disk.
   154 // (other items were commented in a header).
   118 // (other items were commented in a header).
   267         error = iOutputFile->Write( *iFullBufferQueue[0] );
   231         error = iOutputFile->Write( *iFullBufferQueue[0] );
   268         PRINT((_L("e_cfilewriter_flush_writequeue_sync 0")));
   232         PRINT((_L("e_cfilewriter_flush_writequeue_sync 0")));
   269         PRINT((_L("e_cfilewriter_flush_remove_buf 1")));
   233         PRINT((_L("e_cfilewriter_flush_remove_buf 1")));
   270         if ( error == KErrNone )
   234         if ( error == KErrNone )
   271             {
   235             {
   272             UpdateOutputFileSize();
       
   273             iFullBufferQueue[0]->Des().Zero();
   236             iFullBufferQueue[0]->Des().Zero();
   274             if ( iEmptyBufferQueue.Append( iFullBufferQueue[0] ) )
   237             if ( iEmptyBufferQueue.Append( iFullBufferQueue[0] ) )
   275                 {
   238                 {
   276                 PRINT(_L("CFileWriter::Flush() Append failed"));
   239                 PRINT(_L("CFileWriter::Flush() Append failed"));
   277                 delete ( iFullBufferQueue[0] ); 
   240                 delete ( iFullBufferQueue[0] ); 
   292         PRINT((_L("e_cfilewriter_flush_writeinput_sync 1")));
   255         PRINT((_L("e_cfilewriter_flush_writeinput_sync 1")));
   293         error = iOutputFile->Write( *iInputBuf );
   256         error = iOutputFile->Write( *iInputBuf );
   294         PRINT((_L("e_cfilewriter_flush_writeinput_sync 0")));
   257         PRINT((_L("e_cfilewriter_flush_writeinput_sync 0")));
   295         if ( error == KErrNone )
   258         if ( error == KErrNone )
   296             {
   259             {
   297             UpdateOutputFileSize();
       
   298             iInputBuf->Des().Zero();
   260             iInputBuf->Des().Zero();
   299             }
   261             }
   300         else
   262         else
   301             {
   263             {
   302             PRINT((_L("CFileWriter::Flush() inputbuf write failed, error: %d"), error));
   264             PRINT((_L("CFileWriter::Flush() inputbuf write failed, error: %d"), error));
   329         return KErrNotReady;
   291         return KErrNotReady;
   330         }
   292         }
   331 
   293 
   332     if ( aBufferSize == EBufferSizeSmall ) 
   294     if ( aBufferSize == EBufferSizeSmall ) 
   333         {
   295         {
   334         size = iOutputBufferSizeSmall;
   296         size = KFileWriterBufferSizeSmall;
   335         }
   297         }
   336     else if ( aBufferSize == EBufferSizeLarge ) 
   298     else if ( aBufferSize == EBufferSizeLarge ) 
   337         {
   299         {
   338         size = iOutputBufferSizeLarge;
   300         size = KFileWriterBufferSizeLarge;
   339         }
   301         }
   340     else if ( aBufferSize == EBufferSizeCustom )
   302     else if ( aBufferSize == EBufferSizeCustom )
   341         {
   303         {
   342         size = handle->mediaWriteBufferSize;
   304         size = handle->mediaWriteBufferSize;
   343         }
   305         }
   409     	return KErrNoMemory;
   371     	return KErrNoMemory;
   410     	}
   372     	}
   411 
   373 
   412     while (byteswritten < aBuf.Length() )
   374     while (byteswritten < aBuf.Length() )
   413         {
   375         {
   414         available = iOutputBufferSize - iInputBuf->Length();
   376         available = (iInputBuf->Des()).MaxLength() - iInputBuf->Length();
   415 
   377 
   416         if (available > 0)
   378         if (available > 0)
   417             {
   379             {
   418             numbytes = aBuf.Length() - byteswritten;
   380             numbytes = aBuf.Length() - byteswritten;
   419             if (numbytes > available)
   381             if (numbytes > available)
   504 	PRINT((_L("e_cfilewriter_runl 1")));    
   466 	PRINT((_L("e_cfilewriter_runl 1")));    
   505     iAsyncWritingOngoing = EFalse;
   467     iAsyncWritingOngoing = EFalse;
   506 
   468 
   507     if ( iStatus == KErrNone )
   469     if ( iStatus == KErrNone )
   508         {
   470         {
   509         UpdateOutputFileSize();                    
   471         iOutputFileSize += iFullBufferQueue[0]->Des().Length();
   510         iFullBufferQueue[0]->Des().Zero();
   472         iFullBufferQueue[0]->Des().Zero();
   511         iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   473         iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   512         if ( iError )
   474         if ( iError )
   513             {
   475             {
   514             PRINT((_L("CFileWriter::RunL() Append failed 1 %d"), iError ));
   476             PRINT((_L("CFileWriter::RunL() Append failed 1 %d"), iError ));
   523         PRINT((_L("CFileWriter::RunL() Write error in previous async: %d "), iStatus.Int() ));
   485         PRINT((_L("CFileWriter::RunL() Write error in previous async: %d "), iStatus.Int() ));
   524         iError = iStatus.Int();
   486         iError = iStatus.Int();
   525         return;
   487         return;
   526         }
   488         }
   527 
   489 
   528     PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   490     PRINT((_L("CFileWriter::RunL() Buffer written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   529     
   491     
   530     if ( iFlush )
   492     if ( iFlush )
   531         {
   493         {
   532         PRINT(_L("CFileWriter::RunL() out, flushing"));
   494         PRINT(_L("CFileWriter::RunL() out, flushing"));
   533         PRINT((_L("e_cfilewriter_runl 0")));  
   495         PRINT((_L("e_cfilewriter_runl 0")));  
   541             PRINT((_L("e_cfilewriter_runl_write 1")));                     
   503             PRINT((_L("e_cfilewriter_runl_write 1")));                     
   542             iError = iOutputFile->Write( *iFullBufferQueue[0]);
   504             iError = iOutputFile->Write( *iFullBufferQueue[0]);
   543             PRINT((_L("e_cfilewriter_runl_write 0")));                     
   505             PRINT((_L("e_cfilewriter_runl_write 0")));                     
   544             if ( iError == KErrNone )
   506             if ( iError == KErrNone )
   545                 {
   507                 {
   546                 UpdateOutputFileSize();
   508                 iOutputFileSize += iFullBufferQueue[0]->Des().Length();
   547                 iFullBufferQueue[0]->Des().Zero();
   509                 iFullBufferQueue[0]->Des().Zero();
   548                 iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   510                 iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   549                 if ( iError )
   511                 if ( iError )
   550                     {
   512                     {
   551                     PRINT((_L("CFileWriter::RunL() Append failed 2 %d"), iError));
   513                     PRINT((_L("CFileWriter::RunL() Append failed 2 %d"), iError));
   552                     delete ( iFullBufferQueue[0] );
   514                     delete ( iFullBufferQueue[0] );
   553                     iFullBufferQueue.Remove( 0 );
   515                     iFullBufferQueue.Remove( 0 );
   554                     return;
   516                     return;
   555                     }
   517                     }
   556                 iFullBufferQueue.Remove( 0 );
   518                 iFullBufferQueue.Remove( 0 );
   557     			PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   519     			PRINT((_L("CFileWriter::RunL() Hardlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   558                 }   
   520                 }   
   559             else
   521             else
   560                 {
   522                 {
   561                 PRINT((_L("CFileWriter::RunL() Write error: %d "), iError));
   523                 PRINT((_L("CFileWriter::RunL() Write error: %d "), iError));
   562                 return;
   524                 return;
   569         PRINT((_L("e_cfilewriter_runl_outfile_write 1")));                     
   531         PRINT((_L("e_cfilewriter_runl_outfile_write 1")));                     
   570         iError = iOutputFile->Write( *iFullBufferQueue[0]);
   532         iError = iOutputFile->Write( *iFullBufferQueue[0]);
   571         PRINT((_L("e_cfilewriter_runl_outfile_write 0")));                     
   533         PRINT((_L("e_cfilewriter_runl_outfile_write 0")));                     
   572         if ( iError == KErrNone )
   534         if ( iError == KErrNone )
   573             {
   535             {
   574             UpdateOutputFileSize();
   536             iOutputFileSize += iFullBufferQueue[0]->Des().Length();
   575             iFullBufferQueue[0]->Des().Zero();
   537             iFullBufferQueue[0]->Des().Zero();
   576             iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   538             iError = iEmptyBufferQueue.Append( iFullBufferQueue[0] );
   577             if ( iError )
   539             if ( iError )
   578                 {
   540                 {
   579                 PRINT((_L("CFileWriter::RunL() Append failed 3 %d"), iError));
   541                 PRINT((_L("CFileWriter::RunL() Append failed 3 %d"), iError));
   580                 delete ( iFullBufferQueue[0] );
   542                 delete ( iFullBufferQueue[0] );
   581                 iFullBufferQueue.Remove( 0 );
   543                 iFullBufferQueue.Remove( 0 );
   582                 return;
   544                 return;
   583                 }
   545                 }
   584             iFullBufferQueue.Remove( 0 );
   546             iFullBufferQueue.Remove( 0 );
   585     		PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%Ld"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   547     		PRINT((_L("CFileWriter::RunL() Softlimit : Buffer sync written, Status: Full:%d Empty:%d Filesize:%d"), iFullBufferQueue.Count(), iEmptyBufferQueue.Count(), iOutputFileSize ));
   586             }   
   548             }   
   587         else
   549         else
   588             {
   550             {
   589             PRINT((_L("CFileWriter::RunL() Write error: %d "), iError));
   551             PRINT((_L("CFileWriter::RunL() Write error: %d "), iError));
   590             return;
   552             return;