1/*
2 * Copyright 2017-2020, Andrew Lindesay <apl@lindesay.co.nz>.
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef TAR_ARCHIVE_SERVICE_H
6#define TAR_ARCHIVE_SERVICE_H
7
8#include "Stoppable.h"
9#include "TarArchiveHeader.h"
10
11#include <String.h>
12#include <Path.h>
13
14
15class TarEntryListener {
16public:
17	virtual status_t			Handle(
18									const TarArchiveHeader& header,
19									size_t offset,
20									BDataIO* data) = 0;
21};
22
23
24class TarArchiveService {
25public:
26	static	status_t			ForEachEntry(BPositionIO& tarIo,
27									TarEntryListener* listener);
28	static	status_t			GetEntry(BPositionIO& tarIo,
29									TarArchiveHeader& header);
30
31private:
32	static	status_t			_ValidatePathComponent(
33									const BString& component);
34
35	static	off_t				_BytesRoundedToBlocks(off_t value);
36	static	uint32				_CalculateBlockChecksum(
37									const unsigned char* data);
38
39	static	status_t			_ReadHeader(const uint8* data,
40										TarArchiveHeader& header);
41	static	int32				_ReadHeaderStringLength(const uint8* data,
42									size_t maxStringLength);
43	static	void				_ReadHeaderString(const uint8* data,
44									size_t dataLength, BString& result);
45	static uint32				_ReadHeaderNumeric(const uint8* data,
46									size_t dataLength);
47	static tar_file_type		_ReadHeaderFileType(uint8 data);
48
49};
50
51#endif // TAR_ARCHIVE_SERVICE_H
52