commands/fzip/fzipup.h
author Tom Sutcliffe <thomas.sutcliffe@accenture.com>
Thu, 26 Aug 2010 00:49:35 +0100
changeset 37 534b01198c2d
parent 0 7f656887cf89
permissions -rw-r--r--
Added ENotifyKeypresses and ECaptureCtrlC flags to CCommandBase. Commands can now get keypresses and handle ctrl-C via callbacks instead of having to implement custom active objects. As part of this extended the CCommandBase extension interface to MCommandExtensionsV2 for the new virtual functions KeyPressed(TUint aKeyCode, TUint aModifiers) and CtrlCPressed(). sudo now cleans up correctly by using ECaptureCtrlC.

// 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__