mmplugins/lib3gp/impl/inc/filewriter.h
changeset 0 40261b775718
child 23 545d349d14da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmplugins/lib3gp/impl/inc/filewriter.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,168 @@
+// 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 __FILEWRITER_H
+#define __FILEWRITER_H
+
+//  INCLUDES
+#include <e32base.h>
+#include "mp4atom.h"
+
+// CONSTANTS
+const TInt KFileWriterBufferSizeSmall = 2048;
+const TInt KFileWriterBufferSizeLarge = (2*65536);  
+const TInt KFileWriterSoftBufLimit = 10;
+const TInt KFileWriterHardBufLimit = 15;
+const TInt KFileWriterMinBufferCount = 4; // shouldn't be less than 4
+
+// FORWARD DECLARATIONS
+class RFile64;
+
+// CLASS DECLARATION
+
+/**
+*  Async buffering file writer.
+*/
+NONSHARABLE_CLASS(CFileWriter) : public CActive
+    {
+    public:
+        enum TOutputBufferSize
+            {   
+                EBufferSizeSmall = 0,
+                EBufferSizeLarge, 
+                EBufferSizeCustom
+            };
+
+    public: // Constructors and destructor
+
+        /**
+        * Two-phased constructor.
+        */
+        static CFileWriter* NewL( RFile64& aFile );
+
+        /**
+        * Destructor.
+        */
+        ~CFileWriter();
+    
+    public: // New functions
+
+        /**
+        * Writes incoming buffer data to internal buffers for writing to disk.
+        * @since 2.1
+        * @param aBuf Data to be written
+        * @return Error code, KErrNone if no errors, otherwise one of the system wide error codes.
+        */
+        TInt Write( const TDesC8& aBuf );
+
+        /**
+        * Flush internal buffers to disk.
+        * @since 2.1
+        * @param aBuf Additional data to be written before flush.
+        * @return Error code, KErrNone if no errors, otherwise one of the system wide error codes.
+        */
+        TInt Flush( const TDesC8& aBuf );
+
+        /**
+        * Set file output buffer size
+        * @since 2.6
+        * @param aBufferSize Size of buffer.
+        * @param aHandle MP4Handle.
+        * @return Error code, KErrNone if no errors, otherwise one of the system wide error codes.
+        */
+        TInt SetOutputBufferSize( TOutputBufferSize aBufferSize, MP4Handle aHandle );
+        
+        /**
+        * Set file output buffer count
+        * @since 3.0
+        * @param aHandle MP4Handle.
+        */
+        void SetOutputBufferCount( MP4Handle aHandle );        
+
+    protected: // Functions from base classes
+        
+        /**
+        * From CActive Cancels async request.
+        */
+        void DoCancel();
+
+        /**
+        * From CActive Called when async request completes.
+        */
+	    void RunL();
+
+private:
+
+        /**
+        * C++ default constructor.
+        */
+        CFileWriter();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL( RFile64& aFile );
+
+        /**
+        * Writes incoming data to internal buffers and buffer queues..
+        * @since 2.1
+        * @param aBuf Data to be added to buffers..
+        * @return Error code, KErrNone if no errors, otherwise one of the system wide error codes.
+        */
+        TInt AddDataToBuffer( const TDesC8& aBuf );
+
+        /**
+        * Allocates input and output buffers.
+        * @since 2.6
+        */
+        void AllocateBuffersL();
+
+private:
+        // Whether we are flushing after async write.
+    	TBool iFlush;
+		// Flag whether there is async writing going.
+	    TBool iAsyncWritingOngoing;
+		// Flag whether we have received any data.
+        TBool iWritingStarted;
+        // Flag whether init has been done
+        TBool iMemReadyForWriting;
+
+		// Write error code.
+	    TInt iError;
+        // Output buffer size.
+        TInt iOutputBufferSize;
+        // Hard limit for max output buffers
+        TInt iMaxOutputBufHardLimit;
+        // Soft limit for max output buffers
+        TInt iMaxOutputBufSoftLimit;
+        // Current output file size
+		TInt64 iOutputFileSize;
+		// Output file setsize cooldown 
+		//(setsize is done only after previously added size has been written to)
+		TInt64 iOutputFileSetSizeCooldown;
+
+        // Output file for writes.
+        RFile64* iOutputFile;
+        // Queue of empty write buffers.
+        RPointerArray<HBufC8> iEmptyBufferQueue;
+        // Queue of full write buffers.
+        RPointerArray<HBufC8> iFullBufferQueue;
+
+        // Current input buffers for incoming data.
+        HBufC8* iInputBuf;
+};
+
+#endif  //__FILEWRITER_H
+// End of File