xref: /haiku/headers/private/package/hpkg/PackageWriterImpl.h (revision a629567a9001547736cfe892cdf992be16868fed)
1 /*
2  * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>
4  * Distributed under the terms of the MIT License.
5  */
6 #ifndef _PACKAGE__HPKG__PRIVATE__PACKAGE_WRITER_IMPL_H_
7 #define _PACKAGE__HPKG__PRIVATE__PACKAGE_WRITER_IMPL_H_
8 
9 
10 #include <util/DoublyLinkedList.h>
11 #include <util/OpenHashTable.h>
12 
13 #include <String.h>
14 
15 #include <package/hpkg/PackageWriter.h>
16 #include <package/hpkg/Strings.h>
17 #include <package/hpkg/WriterImplBase.h>
18 
19 
20 namespace BPrivate {
21 	template<typename Value> class RangeArray;
22 }
23 
24 
25 namespace BPackageKit {
26 
27 namespace BHPKG {
28 
29 
30 class BDataReader;
31 class BErrorOutput;
32 class BPackageWriterParameters;
33 
34 
35 namespace BPrivate {
36 
37 
38 class PackageReaderImpl;
39 struct hpkg_header;
40 
41 
42 class PackageWriterImpl : public WriterImplBase {
43 	typedef	WriterImplBase		inherited;
44 
45 public:
46 								PackageWriterImpl(
47 									BPackageWriterListener* listener);
48 								~PackageWriterImpl();
49 
50 			status_t			Init(const char* fileName,
51 									const BPackageWriterParameters& parameters);
52 			status_t			SetInstallPath(const char* installPath);
53 			void				SetCheckLicenses(bool checkLicenses);
54 			status_t			AddEntry(const char* fileName, int fd = -1);
55 			status_t			Finish();
56 
57 			status_t			Recompress(PackageReaderImpl* reader);
58 									// to be called after Init(); no Finish()
59 
60 private:
61 			struct Attribute;
62 			struct PackageContentHandler;
63 			struct Entry;
64 			struct SubPathAdder;
65 			struct HeapAttributeOffsetter;
66 
67 			typedef DoublyLinkedList<Entry> EntryList;
68 
69 private:
70 			status_t			_Init(const char* fileName,
71 									const BPackageWriterParameters& parameters);
72 			status_t			_Finish();
73 
74 			status_t			_Recompress(PackageReaderImpl* reader);
75 
76 			status_t			_RegisterEntry(const char* fileName, int fd);
77 			Entry*				_RegisterEntry(Entry* parent,
78 									const char* name, size_t nameLength, int fd,
79 									bool isImplicit);
80 
81 			status_t			_CheckLicenses();
82 			bool				_IsEntryInPackage(const char* fileName);
83 
84 			void				_UpdateReadPackageInfo();
85 			void				_UpdateCheckEntryCollisions();
86 			void				_UpdateCheckEntryCollisions(
87 									Attribute* parentAttribute, int dirFD,
88 									Entry* entry, const char* fileName,
89 									char* pathBuffer);
90 			void				_CompactHeap();
91 			void				_AttributeRemoved(Attribute* attribute);
92 
93 			void				_WriteTOC(hpkg_header& header, uint64& _length);
94 			void				_WriteAttributeChildren(Attribute* attribute);
95 
96 			void				_WritePackageAttributes(hpkg_header& header,
97 									uint64& _length);
98 			uint32				_WritePackageAttributesCompressed(
99 									uint32& _stringsLengthUncompressed,
100 									uint32& _attributesLengthUncompressed);
101 
102 			void				_AddEntry(int dirFD, Entry* entry,
103 									const char* fileName, char* pathBuffer);
104 			void				_AddDirectoryChildren(Entry* entry, int fd,
105 									char* pathBuffer);
106 
107 			Attribute*			_AddAttribute(BHPKGAttributeID attributeID,
108 									const AttributeValue& value);
109 
110 	template<typename Type>
111 	inline	Attribute*			_AddAttribute(BHPKGAttributeID attributeID,
112 									Type value);
113 
114 			Attribute*			_AddStringAttribute(
115 									BHPKGAttributeID attributeID,
116 									const char* value);
117 			Attribute*			_AddDataAttribute(BHPKGAttributeID attributeID,
118 									uint64 dataSize, uint64 dataOffset);
119 			Attribute*			_AddDataAttribute(BHPKGAttributeID attributeID,
120 									uint64 dataSize, const uint8* data);
121 
122 			status_t			_AddData(BDataReader& dataReader, off_t size);
123 
124 private:
125 			BPackageWriterListener*	fListener;
126 
127 			off_t				fHeapOffset;
128 			uint16				fHeaderSize;
129 
130 			::BPrivate::RangeArray<uint64>* fHeapRangesToRemove;
131 
132 			Entry*				fRootEntry;
133 
134 			Attribute*			fRootAttribute;
135 			Attribute*			fTopAttribute;
136 
137 			StringCache			fStringCache;
138 
139 			BPackageInfo		fPackageInfo;
140 			BString				fInstallPath;
141 			bool				fCheckLicenses;
142 };
143 
144 
145 }	// namespace BPrivate
146 
147 }	// namespace BHPKG
148 
149 }	// namespace BPackageKit
150 
151 
152 #endif	// _PACKAGE__HPKG__PRIVATE__PACKAGE_WRITER_IMPL_H_
153