@@ -171,53 +171,54 @@ CDoc1Reader::decrypt(const std::vector<uint8_t>& fmk, libcdoc::MultiDataConsumer
171171 result = finishDecryption ();
172172 return result;
173173#else
174- std::string mime;
175- std::vector<uint8_t > data;
176- if (auto result = CDoc1Reader::decryptData (fmk, mime, data); result != OK) {
177- return result;
178- }
179- libcdoc::VectorSource vsrc (data);
180- if (mime == MIME_DDOC || mime == MIME_DDOC_OLD) {
181- LOG_DBG (" Contains DDoc content {}" , mime);
182- auto result = DDOCReader::parse (&vsrc, dst);
183- if (result != libcdoc::OK) {
184- setLastError (" Failed to parse DDOC file" );
185- LOG_ERROR (" {}" , last_error);
174+ return CDoc1Reader::decryptData (fmk, [&](DataSource &src, const std::string &mime) -> result_t {
175+ if (mime == MIME_DDOC || mime == MIME_DDOC_OLD) {
176+ LOG_DBG (" Contains DDoc content {}" , mime);
177+ auto rv = DDOCReader (&src).parse (dst);
178+ if (rv != libcdoc::OK) {
179+ setLastError (" Failed to parse DDOC file" );
180+ LOG_ERROR (" {}" , last_error);
181+ }
182+ return rv;
186183 }
187- return result;
188- }
189- dst->open (d-> properties [ " Filename " ], data. size ());
190- dst-> writeAll (vsrc) ;
191- dst->close ();
192- return libcdoc::OK ;
184+ if ( auto rv = dst-> open (d-> properties [ " Filename " ], - 1 /* data.size() */ ); rv != OK)
185+ return rv;
186+ if ( auto rv = dst->writeAll (src); rv < OK)
187+ return rv ;
188+ return dst->close ();
189+ }) ;
193190#endif
194191}
195192
196193libcdoc::result_t
197194CDoc1Reader::beginDecryption (const std::vector<uint8_t >& fmk)
198195{
199- std::string mime;
200- std::vector<uint8_t > data;
201- if (auto result = CDoc1Reader::decryptData (fmk, mime, data); result != OK) {
202- return result;
203- }
204- if (mime == MIME_DDOC || mime == MIME_DDOC_OLD) {
205- LOG_DBG (" Contains DDoc content {}" , mime);
206- d->files = DDOCReader::files (data);
207- } else {
196+ setLastError ({});
197+ return CDoc1Reader::decryptData (fmk, [&](DataSource &src, const std::string &mime) -> result_t {
198+ if (mime == MIME_DDOC || mime == MIME_DDOC_OLD) {
199+ LOG_DBG (" Contains DDoc content {}" , mime);
200+ auto rv = DDOCReader (&src).files (d->files );
201+ if (rv != libcdoc::OK) {
202+ setLastError (" Failed to parse DDOC file" );
203+ LOG_ERROR (" {}" , last_error);
204+ d->files .clear ();
205+ }
206+ return rv;
207+ }
208+ std::vector<uint8_t > data;
209+ VectorConsumer vsrc (data);
210+ if (auto rv = vsrc.writeAll (src); rv < OK) {
211+ setLastError (" Cannot parse container" );
212+ LOG_ERROR (" {}" , last_error);
213+ return rv;
214+ }
208215 d->files .push_back ({
209216 d->properties [" Filename" ],
210217 " application/octet-stream" ,
211218 std::move (data)
212219 });
213- }
214- if (d->files .empty ()) {
215- setLastError (" Cannot parse container" );
216- LOG_ERROR (" {}" , last_error);
217- return libcdoc::IO_ERROR;
218- }
219- setLastError ({});
220- return libcdoc::OK;
220+ return OK;
221+ });
221222}
222223
223224libcdoc::result_t
@@ -361,10 +362,10 @@ CDoc1Reader::isCDoc1File(libcdoc::DataSource *src)
361362/*
362363 * Returns decrypted data
363364 * @param key Transport key to used for decrypt data
364- * @param mime decrypted mime type
365- * @param data decrypted data
365+ * @param f callback with DataSource and mime data
366366 */
367- result_t CDoc1Reader::decryptData (const std::vector<uint8_t >& fmk, std::string& mime, std::vector<uint8_t >& data)
367+ result_t CDoc1Reader::decryptData (const std::vector<uint8_t >& fmk,
368+ const std::function<libcdoc::result_t (libcdoc::DataSource &src, const std::string &mime)>& f)
368369{
369370 if (fmk.empty ()) {
370371 setLastError (" FMK is missing" );
@@ -413,16 +414,14 @@ result_t CDoc1Reader::decryptData(const std::vector<uint8_t>& fmk, std::string&
413414 setLastError (" Failed to decrypt data, verify if FMK is correct" );
414415 return CRYPTO_ERROR;
415416 }
416- libcdoc::VectorConsumer out (data);
417417 setLastError ({});
418+
418419 if (d->mime == MIME_ZLIB) {
419420 libcdoc::ZSource zsrc (&dec);
420- out.writeAll (zsrc);
421- mime = d->properties [" OriginalMimeType" ];
422- }
423- else {
424- mime = d->mime ;
425- out.writeAll (dec);
421+ if (auto rv = f (zsrc, d->properties [" OriginalMimeType" ]); rv < OK)
422+ return rv;
426423 }
424+ else if (auto rv = f (dec, d->mime ); rv < OK)
425+ return rv;
427426 return dec.close ();
428427}
0 commit comments