imaging/imagingfws/src/asyncfilewriter.h
changeset 0 5752a19fdefe
--- /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 <e32base.h>
+
+#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
+