commands/fzip/fzipup.h
changeset 0 7f656887cf89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/fzip/fzipup.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,136 @@
+// fzipup.h
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#ifndef __FZIP_UP_H__
+#define __FZIP_UP_H__
+
+#include <zipfile.h>
+#include <ezbufman.h>
+#include <fshell/ioutils.h>
+
+using namespace IoUtils;
+
+const TUint32 KDefaultZipBufferLength = 0x8000; // 32 Kbytes
+
+//
+// class CBufferManager
+// manage the i/o buffers for compression, wrapper over the MEZBufferManager mix-in
+// takes input data from one file stream & writes the compressed output to another file stream
+//
+class CBufferManager : public CBase, public MEZBufferManager
+	{
+public:
+	static CBufferManager *NewLC(RFileReadStream& aInput, RFileWriteStream& aOutput, TInt aInputStreamBytes, TInt aBufferSize);
+	~CBufferManager();
+	inline TInt TotalBytesOut(){ return iBytesWritten; }
+	
+	// from MEzBufferManager
+	void InitializeL(CEZZStream &aZStream);
+	void NeedInputL(CEZZStream &aZStream);
+	void NeedOutputL(CEZZStream &aZStream);
+	void FinalizeL(CEZZStream &aZStream);
+private:
+	CBufferManager(RFileReadStream& aInput, RFileWriteStream& aOutput, TInt aInputStreamBytes, TInt aBufferSize);
+	void ConstructL();
+	void ReadInputL();
+	void WriteOutputL(CEZZStream& aZStream);
+private:
+	RFileReadStream& iInput;
+	RFileWriteStream& iOutput;
+	TInt iInputStreamBytes; // size of the input stream in bytes
+	TInt iReadLength;
+	TInt iBufferSize;
+	TInt iBytesWritten;
+	TUint8* iInputBuffer;
+	TUint8* iOutputBuffer;
+	TPtr8 iInputDescriptor;
+	TPtr8 iOutputDescriptor;
+	};
+
+//
+// class CZipEntry
+// defines attributes associated with a file contained within a zip archive
+// note these are taken from PKWARE'S APPNOTE.TXT zip-file format specification
+//
+class CZipItUp;
+class CZipEntry : public CZipArchive
+{
+public:
+	friend class CZipItUp;
+	static CZipEntry* NewLC(RFs& aFs, const TDesC& aFilename, const TInt aUid);
+        virtual ~CZipEntry();
+
+	void SetOffset(TUint32 aOffset);
+	TUint32 ReturnOffset();
+	TUint32 FileHeaderSize();
+private:
+	CZipEntry(RFs& aFs, const TInt aUid);
+	void ConstructL(const TDesC& aFilename);
+	void CalcCRCL();
+private:
+        static const TInt iOffset;
+        TLocalHeader iLFH;					// Local File Header
+        HBufC8* iFileData;					// File Data
+        TCentralDirectoryHeader iFH;		// File Header
+        RFs& iFs;							// f32 hook
+        TBuf8<KMaxFileName>	iAsciiName;	// Ascii file name
+        RFile iInput;						// input data from file
+        const TInt iUid;					// uid id'ing this particular zip entry
+        TSglQueLink iLink;
+	};
+	
+//
+// class CZipItUp
+// create a zip archive
+//
+typedef TSglQue<CZipEntry> CZipMemberLinkedList;
+typedef TSglQueIter<CZipEntry> CZipMemberLinkedListIter;
+	
+class CZipItUp : public CBase
+	{
+public:
+	static CZipItUp* NewLC(RFs& aFs, TDesC& aArchive);
+	virtual ~CZipItUp();
+	void AddFileL(const TDesC& aFile);
+	void CreateZipL();
+private:
+	CZipItUp(RFs& aFs, TDesC& aArchive);
+	void ConstructL();
+	void AddEntryL(CZipEntry& aEntry);
+	TBool DuplicateEntryL(const TDesC& aFile);
+	void AppendLocalFileHeaderL(RFileWriteStream& aStream, CZipEntry& aZipEntry);
+	void AppendCompressedDataL(RFileWriteStream& aStream, CZipEntry& aZipEntry);
+	void AppendCentralDirectoryFileHeaderL(RFileWriteStream& aStream, CZipEntry& aEntry);
+	void AppendCentralDirectoryTrailerL(RFileWriteStream& aStream);
+private:
+	RFs& iFs;
+	TDesC& iFileName;
+	RFile iFile;
+	CZipMemberLinkedList iZipMemberLinkedList;
+	CZipMemberLinkedListIter iZipMemberLinkedListIter;
+	TInt iEntryUid;
+
+  struct TCdt 
+		{
+        TUint32 iSignature;
+		TUint16 iDiskNumber;
+		TUint16 iStartDiskNumber;
+		TUint16 iLocalEntryCount;
+		TUint16 iTotalEntryCount;
+		TUint32 iSize;
+		TUint32 iOffset;
+		TUint16 iCommentLength;
+		};
+	TCdt iCDT;		// Central Directory Trailer
+	};
+
+#endif // __FZIP_UP_H__