diff -r 000000000000 -r 5752a19fdefe imaging/imagingfws/src/asyncfilewriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imaging/imagingfws/src/asyncfilewriter.h Wed Aug 25 12:29:52 2010 +0300 @@ -0,0 +1,123 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef ASYNCFILEWRITER_H + +#include + +#define ASYNCFILEWRITER_H +/** + @file + @internalComponent +*/ + +#if defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES) + +/** + Callback interface which is used to notify a client that a buffer has been + written +*/ +class MBufferWrittenObserver + { +public: + virtual void BufferWritten(const TPtrC8& aWritten, TInt aErrorCode)=0; + }; + +class CBufferPool; +class RFile; + +// can be used to emulate slow media on emulator +// for debugging/unittest purpose +#if ( defined(__WINS__) || defined(_DEBUG) ) +# define WRITER_EMULATE_SLOW_MEDIA +#endif + +#ifdef WRITER_EMULATE_SLOW_MEDIA +const TUid KUidIclTestEmulateSlowMedia = { 0x10273823 }; +class CCallbackTimer; +#endif + +/** + Asynchronous file writer which manages memory buffers and provides with + asynchronous file writing service, which gives performance increase + in case of writing large files (> 64K) onto slow/high latency media +*/ +class CAsyncFileWriter; //declared here +NONSHARABLE_CLASS( CAsyncFileWriter ): public CActive + { +private: + enum + { + // defines maximum number of pending buffers which can be held in the Q, must be power of 2 + KMaxNumOfBuffers = 4, + }; +public: + + static CAsyncFileWriter* NewL(MBufferWrittenObserver& aObserver, RFile& aFile, TInt aBufferSize); + + ~CAsyncFileWriter(); + + /** + To check a buffer out of the buffer pool, + @return buffer pointer + */ + void CheckBufferOut(TPtr8& aBuffer); + /** + To return a buffer back to the buffer pool, + @param buffer pointer + */ + void CheckBufferIn(const TPtrC8& aBuffer); + + /** + To put a buffer into file writing Q + */ + void WriteBufferL(const TDesC8& aBuf, TInt aFilePos); + /** + To write all the pending buffers synchronously + */ + TInt FlushBuffers(); + +private: + CAsyncFileWriter(MBufferWrittenObserver& aObserver, RFile& aFile); + + void ConstructL(TInt aBufferSize); + + void RunL(); + void DoCancel(); + TInt WriteNextBuffer(); + TInt WaitForCurrentBuffer(); + void HandleBufferCompletion(TInt aError); + + TPtrC8 iBufPtr[KMaxNumOfBuffers]; // array of pending buffer pointers + TInt iFilePos[KMaxNumOfBuffers]; // array of positions within the destination file + TInt iCurrentBuf; // index of the current buffer being written + TInt iNumOfPendingBuffs; // number of buffer pointer in the Q + MBufferWrittenObserver& iObserver; // observer interface pointer + RFile* const iFile; // destination file handle + CBufferPool* iBufferPool; // memory buffer manager + +#ifdef WRITER_EMULATE_SLOW_MEDIA // can be used to emulate slow media (for testing) + static TInt TimerGate(TAny* aPtr); + CCallbackTimer* iCallbackTimer; + TBool iDelayOff; +public: + TBool iEmulateSlowMedia; +#endif + }; + +#endif // defined(SYMBIAN_ENABLE_ENCODER_ASYNC_WRITES) + +#endif // ndef ASYNCFILEWRITER_H +