williamr@2: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@4: williamr@2: #ifndef _ZIP_FILE_H_ williamr@2: #define _ZIP_FILE_H_ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@4: #include williamr@4: #include williamr@4: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // Forward Class Declaration(s) williamr@2: williamr@2: class CFileInputStream; williamr@2: class CZipFileMemberIterator; williamr@2: class CZipFileMember; williamr@2: namespace ContentAccess williamr@2: { williamr@2: class CData; williamr@2: } williamr@2: williamr@2: // End of Forward Class Declaration(s) williamr@2: williamr@2: williamr@2: /** williamr@2: A CZipFile represents a ZIP archive contained in a single file. williamr@2: Multi file zip archives are not supported. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: class CZipFile : public CZipArchive williamr@2: { williamr@2: friend class RZipFileMemberReaderStream; williamr@2: friend class CZipFileMemberIterator; williamr@2: williamr@2: public: williamr@2: /** ZipFile error enumeration. williamr@2: */ williamr@2: enum williamr@2: { williamr@2: /** Cannot read file directory in the archive file*/ williamr@2: KZipFileError = KZipArchiveMinError - 1, williamr@2: williamr@2: /** File not found error. It is not used in current implemenation*/ williamr@2: KZipFileNotFound = KZipFileError - 1, williamr@2: williamr@2: /** File IO error.Any error occurs during a archive file is readed. williamr@2: For examples, any error about reading number of disk, williamr@2: an offset of signature, or the content of file is non-readable. williamr@2: */ williamr@2: KZipFileIOError = KZipFileError - 2 williamr@2: }; williamr@2: williamr@2: public: williamr@2: IMPORT_C static CZipFile* NewL(RFs& aFs, RFile& aFile); williamr@2: IMPORT_C static CZipFile* NewL(RFs& aFs, const TDesC& aFileName); williamr@2: IMPORT_C CZipFile(RFs& aFs, const TDesC& aFileName); williamr@2: IMPORT_C TInt OpenL(void); williamr@2: IMPORT_C void Close(void); williamr@2: IMPORT_C virtual ~CZipFile(); williamr@2: williamr@2: protected: williamr@2: IMPORT_C void ConstructL(const TDesC& aFileName); williamr@2: williamr@2: IMPORT_C void ConstructL(RFile& aFile); williamr@2: williamr@2: public: williamr@2: IMPORT_C TInt Size(TInt& aSize) const; williamr@2: williamr@2: IMPORT_C CZipFileMember* MemberL(const TDesC& aName); williamr@2: IMPORT_C CZipFileMember* CaseInsensitiveMemberL(const TDesC& aName); williamr@2: IMPORT_C CZipFileMember* CaseSensitiveOrCaseInsensitiveMemberL(const TDesC& aName); williamr@2: IMPORT_C TInt GetInputStreamL(const CZipFileMember* aMember, RZipFileMemberReaderStream*& aStream); williamr@2: williamr@2: IMPORT_C CZipFileMemberIterator* GetMembersL(void); williamr@2: williamr@2: williamr@2: protected: williamr@2: williamr@2: /** williamr@2: Internal representation of a compressed file in a zipfile williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: struct TMemberPointer williamr@2: { williamr@2: /** the name of a compressed file*/ williamr@2: TFileName* iName; williamr@2: williamr@2: /** Not used in current implementation*/ williamr@2: TUint32 iCentralHeaderOffset; williamr@2: williamr@2: /** The local offset of header in a compressed file*/ williamr@2: TUint32 iLocalHeaderOffset; williamr@2: williamr@2: /** CRC with 32 bits length in a compressed file*/ williamr@2: TUint32 iCRC32; williamr@2: williamr@2: /** The size of compressed file */ williamr@2: TUint32 iCompressedSize; williamr@2: williamr@2: /** The size of file without compressed*/ williamr@2: TUint32 iUncompressedSize; williamr@2: }; williamr@2: williamr@2: protected: williamr@2: TInt FindCentralDirectoryTrailer(TUint32& offset); williamr@2: TInt ReadCentralDirectoryTrailer(TUint32 offset, TCentralDirectoryTrailer&); williamr@2: TInt ReadCentralDirectoryHeaderL(TCentralDirectoryHeader&, TMemberPointer&, williamr@2: CCnvCharacterSetConverter* aConverter, TInt aConverterState); williamr@2: williamr@2: TInt ReadLocalHeader(TUint32, TLocalHeader&); williamr@2: williamr@2: const TMemberPointer* FindMemberPointer(const TDesC&, TBool); williamr@2: williamr@2: TInt LoadMemberPointersL(void); williamr@2: williamr@2: RZipFileMemberReaderStream* MakeInputStreamL(TUint32, TUint32, TUint32, TUint32); williamr@2: CZipFileMember* MakeMemberL(TInt); williamr@2: CZipFileMember* MakeMemberL(const TMemberPointer&, const TLocalHeader&); williamr@2: williamr@2: // File I/O Support williamr@2: void OpenFileL(const TDesC& aFileName); williamr@2: williamr@2: TInt Read(TByte*, TUint32); williamr@2: TInt Read(TUint16&); williamr@2: TInt Read(TUint32&); williamr@2: williamr@2: TInt Seek(TInt); williamr@2: williamr@2: // Misc williamr@2: void DeleteMemberPointers(void); williamr@2: williamr@2: private: williamr@2: const TDesC& iFileName; williamr@2: TUint32 iFileLength; williamr@2: williamr@2: /** The central directory of ZIP File Trailer*/ williamr@2: TCentralDirectoryTrailer iTrailer; williamr@2: williamr@2: /** The pointer to a a compressed file in a zipfile*/ williamr@2: TMemberPointer* iMemberPointers; williamr@2: williamr@2: RFs& iFs; williamr@2: williamr@2: /** The pointer to CData object created from a zip file*/ williamr@2: ContentAccess::CData* iData; williamr@2: }; williamr@2: williamr@2: #endif /* !_ZIP_FILE_H_ */