1/*
2 * Copyright 2009, Stephan A��mus <superstippi@gmx.de>
3 *  All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef UNZIP_ENGINE_H
6#define UNZIP_ENGINE_H
7
8
9#include <stdio.h>
10
11#include <Messenger.h>
12#include <String.h>
13
14#include "CommandPipe.h"
15#include "HashMap.h"
16#include "HashString.h"
17
18class ProgressReporter;
19
20
21class UnzipEngine : private BCommandPipe::LineReader {
22public:
23								UnzipEngine(ProgressReporter* reporter,
24									sem_id cancelSemaphore = -1);
25	virtual						~UnzipEngine();
26
27			status_t			SetTo(const char* pathToPackage,
28									const char* destinationFolder);
29
30	inline	off_t				BytesToUncompress() const
31									{ return fBytesToUncompress; }
32	inline	uint64				ItemsToUncompress() const
33									{ return fItemsToUncompress; }
34
35			status_t			UnzipPackage();
36
37private:
38	// BCommandPipe::LineReader
39			friend class BCommandPipe;
40
41	virtual	bool				IsCanceled();
42	virtual	status_t			ReadLine(const BString& line);
43
44			status_t			_ReadLineListing(const BString& line);
45			status_t			_ReadLineExtract(const BString& line);
46
47			void				_UpdateProgress(const char* item,
48									const char* targetFolder);
49
50private:
51			BString				fPackage;
52			BString				fDestinationFolder;
53			bool				fRetrievingListing;
54
55			typedef HashMap<HashString, off_t> EntrySizeMap;
56			EntrySizeMap		fEntrySizeMap;
57
58			off_t				fBytesToUncompress;
59			off_t				fBytesUncompressed;
60			off_t				fLastBytesUncompressed;
61			uint64				fItemsToUncompress;
62			uint64				fItemsUncompressed;
63			uint64				fLastItemsUncompressed;
64
65			ProgressReporter*	fProgressReporter;
66			sem_id				fCancelSemaphore;
67};
68
69
70#endif // UNZIP_ENGINE_H
71