11#include "loggingcategory.h"
22class Q_DECL_HIDDEN KXzFilter::Private
26 : isInitialized(false)
28 memset(&zStream, 0,
sizeof(zStream));
43KXzFilter::~KXzFilter()
48bool KXzFilter::init(
int mode)
51 return init(mode, AUTO, props);
54static void freeFilters(lzma_filter filters[])
56 for (
int i = 0; filters[i].id != LZMA_VLI_UNKNOWN; i++) {
57 free(filters[i].options);
63 if (d->isInitialized) {
69 d->zStream.next_in =
nullptr;
70 d->zStream.avail_in = 0;
72 lzma_filter filters[5];
73 const auto filtersCleanupGuard = qScopeGuard([&filters] {
77 filters[0].id = LZMA_VLI_UNKNOWN;
84 result = lzma_auto_decoder(&d->zStream, 100 << 20, 0);
85 if (result != LZMA_OK) {
86 qCWarning(KArchiveLog) <<
"lzma_auto_decoder returned" << result;
91 filters[0].id = LZMA_FILTER_LZMA1;
92 filters[0].options =
nullptr;
93 filters[1].id = LZMA_VLI_UNKNOWN;
94 filters[1].options =
nullptr;
97 unsigned char props[5];
102 result = lzma_properties_decode(&filters[0],
nullptr, props,
sizeof(props));
103 if (result != LZMA_OK) {
104 qCWarning(KArchiveLog) <<
"lzma_properties_decode returned" << result;
110 filters[0].id = LZMA_FILTER_LZMA2;
111 filters[0].options =
nullptr;
112 filters[1].id = LZMA_VLI_UNKNOWN;
113 filters[1].options =
nullptr;
116 unsigned char props[1];
119 result = lzma_properties_decode(&filters[0],
nullptr, props,
sizeof(props));
120 if (result != LZMA_OK) {
121 qCWarning(KArchiveLog) <<
"lzma_properties_decode returned" << result;
127 filters[0].id = LZMA_FILTER_X86;
128 filters[0].options =
nullptr;
130 unsigned char props[5] = {0x5d, 0x00, 0x00, 0x08, 0x00};
131 filters[1].id = LZMA_FILTER_LZMA1;
132 filters[1].options =
nullptr;
133 result = lzma_properties_decode(&filters[1],
nullptr, props,
sizeof(props));
134 if (result != LZMA_OK) {
135 qCWarning(KArchiveLog) <<
"lzma_properties_decode1 returned" << result;
139 filters[2].id = LZMA_VLI_UNKNOWN;
140 filters[2].options =
nullptr;
154 result = lzma_raw_decoder(&d->zStream, filters);
155 if (result != LZMA_OK) {
156 qCWarning(KArchiveLog) <<
"lzma_raw_decoder returned" << result;
163 result = lzma_easy_encoder(&d->zStream, LZMA_PRESET_DEFAULT, LZMA_CHECK_CRC32);
165 lzma_filter filters[5];
167 lzma_options_lzma lzma_opt;
168 lzma_lzma_preset(&lzma_opt, LZMA_PRESET_DEFAULT);
170 filters[0].id = LZMA_FILTER_LZMA2;
171 filters[0].options = &lzma_opt;
172 filters[1].id = LZMA_VLI_UNKNOWN;
173 filters[1].options =
nullptr;
175 result = lzma_raw_encoder(&d->zStream, filters);
177 if (result != LZMA_OK) {
178 qCWarning(KArchiveLog) <<
"lzma_easy_encoder returned" << result;
186 d->isInitialized =
true;
190int KXzFilter::mode()
const
195bool KXzFilter::terminate()
198 lzma_end(&d->zStream);
203 d->isInitialized =
false;
207void KXzFilter::reset()
215void KXzFilter::setOutBuffer(
char *data, uint maxlen)
217 d->zStream.avail_out = maxlen;
218 d->zStream.next_out = (uint8_t *)data;
221void KXzFilter::setInBuffer(
const char *data,
unsigned int size)
223 d->zStream.avail_in = size;
224 d->zStream.next_in = (uint8_t *)
const_cast<char *
>(data);
227int KXzFilter::inBufferAvailable()
const
229 return d->zStream.avail_in;
232int KXzFilter::outBufferAvailable()
const
234 return d->zStream.avail_out;
237KXzFilter::Result KXzFilter::uncompress()
241 result = lzma_code(&d->zStream, LZMA_RUN);
250 return KFilterBase::Ok;
251 case LZMA_STREAM_END:
252 return KFilterBase::End;
254 return KFilterBase::Error;
258KXzFilter::Result KXzFilter::compress(
bool finish)
261 lzma_ret result = lzma_code(&d->zStream, finish ? LZMA_FINISH : LZMA_RUN);
264 return KFilterBase::Ok;
266 case LZMA_STREAM_END:
268 return KFilterBase::End;
272 return KFilterBase::Error;
void init(KXmlGuiWindow *window, KGameDifficulty *difficulty=nullptr)