diff options
Diffstat (limited to 'tdeioslave/xz')
-rw-r--r-- | tdeioslave/xz/CMakeLists.txt | 42 | ||||
-rw-r--r-- | tdeioslave/xz/kxzfilter.cpp | 189 | ||||
-rw-r--r-- | tdeioslave/xz/kxzfilter.desktop | 86 | ||||
-rw-r--r-- | tdeioslave/xz/kxzfilter.h | 60 |
4 files changed, 377 insertions, 0 deletions
diff --git a/tdeioslave/xz/CMakeLists.txt b/tdeioslave/xz/CMakeLists.txt new file mode 100644 index 000000000..17677593f --- /dev/null +++ b/tdeioslave/xz/CMakeLists.txt @@ -0,0 +1,42 @@ +################################################# +# +# (C) 2010 Serghei Amelian +# serghei (DOT) amelian (AT) gmail.com +# +# Improvements and feedback are welcome +# +# This file is released under GPL >= 2 +# +################################################# + +include_directories( + ${TQT_INCLUDE_DIRS} + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/tdecore + ${CMAKE_SOURCE_DIR}/tdecore + ${CMAKE_SOURCE_DIR}/tdeio/tdeio +) + +link_directories( + ${TQT_LIBRARY_DIRS} +) + + +##### other data ################################ + +install( FILES kxzfilter.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) + + +##### kxzfilter ############################### + +set( target kxzfilter ) + +set( ${target}_SRCS + kxzfilter.cpp +) + +tde_add_kpart( ${target} AUTOMOC + SOURCES ${${target}_SRCS} + LINK tdeio-shared ${LZMA_LIBRARIES} + DESTINATION ${PLUGIN_INSTALL_DIR} +) diff --git a/tdeioslave/xz/kxzfilter.cpp b/tdeioslave/xz/kxzfilter.cpp new file mode 100644 index 000000000..2172ce2c8 --- /dev/null +++ b/tdeioslave/xz/kxzfilter.cpp @@ -0,0 +1,189 @@ +/* This file is part of the KDE libraries + Copyright (C) 2007-2008 Per Øyvind Karlsen <peroyvind@mandriva.org> + + Based on kbzip2filter: + Copyright (C) 2000-2005 David Faure <faure@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kxzfilter.h" +#include <klibloader.h> + +#include <config.h> +#if HAVE_XZ_SUPPORT +extern "C" { + #include <lzma.h> +} + +#include <kdebug.h> + +#include <tqiodevice.h> + +// #define DEBUG_XZ + +class KXzFilterFactory : public KLibFactory +{ +public: + KXzFilterFactory() : KLibFactory() {} + virtual ~KXzFilterFactory(){} + TQObject *createObject( TQObject *, const char *, const char*, const TQStringList & ) + { + return new KXzFilter; + } +}; + +K_EXPORT_COMPONENT_FACTORY( kxzfilter, KXzFilterFactory ) + + +class KXzFilter::Private +{ +public: + Private() + : isInitialized(false) + { + memset(&zStream, 0, sizeof(zStream)); + mode = 0; + } + + lzma_stream zStream; + int mode; + bool isInitialized; +}; + +KXzFilter::KXzFilter() + :d(new Private) +{ +} + + +KXzFilter::~KXzFilter() +{ + delete d; +} + +void KXzFilter::init( int mode ) +{ + if (d->isInitialized) { + terminate(); + } + + lzma_ret result; + d->zStream.next_in = 0; + d->zStream.avail_in = 0; + if ( mode == IO_ReadOnly ) + { + /* We set the memlimit for decompression to 100MiB which should be + * more than enough to be sufficient for level 9 which requires 65 MiB. + */ + result = lzma_auto_decoder(&d->zStream, 100<<20, 0); + //kdDebug(7131) << "lzma_auto_decoder returned " << result; + } else if ( mode == IO_WriteOnly ) { + result = lzma_easy_encoder(&d->zStream, LZMA_PRESET_DEFAULT, LZMA_CHECK_CRC32); + //kdDebug(7131) << "lzma_easy_encoder returned " << result; + } else + kdWarning(7131) << "Unsupported mode " << mode << ". Only IO_ReadOnly and IO_WriteOnly supported"; + d->mode = mode; + d->isInitialized = true; +} + +int KXzFilter::mode() const +{ + return d->mode; +} + +void KXzFilter::terminate() +{ + if (d->mode == IO_ReadOnly || d->mode == IO_WriteOnly) { + lzma_end(&d->zStream); + } else { + kdWarning(7131) << "Unsupported mode " << d->mode << ". Only IO_ReadOnly and IO_WriteOnly supported"; + } + d->isInitialized = false; +} + + +void KXzFilter::reset() +{ + //kdDebug(7131) << "KXzFilter::reset"; + // liblzma doesn't have a reset call... + terminate(); + init( d->mode ); +} + +void KXzFilter::setOutBuffer( char * data, uint maxlen ) +{ + d->zStream.avail_out = maxlen; + d->zStream.next_out = (uint8_t *)data; +} + +void KXzFilter::setInBuffer( const char *data, unsigned int size ) +{ + d->zStream.avail_in = size; + d->zStream.next_in = (uint8_t *)const_cast<char *>(data); +} + +int KXzFilter::inBufferAvailable() const +{ + return d->zStream.avail_in; +} + +int KXzFilter::outBufferAvailable() const +{ + return d->zStream.avail_out; +} + +KXzFilter::Result KXzFilter::uncompress() +{ + //kdDebug(7131) << "Calling lzma_code with avail_in=" << inBufferAvailable() << " avail_out =" << outBufferAvailable(); + lzma_ret result = lzma_code(&d->zStream, LZMA_RUN); + if ( result != LZMA_OK ) + { + kdDebug(7131) << "lzma_code returned " << result; + kdDebug(7131) << "KXzFilter::uncompress " << ( result == LZMA_STREAM_END ? END : ERROR ); + } + + switch (result) { + case LZMA_OK: + return OK; + case LZMA_STREAM_END: + return END; + default: + return ERROR; + } +} + +KXzFilter::Result KXzFilter::compress( bool finish ) +{ + //kdDebug(7131) << "Calling lzma_code with avail_in=" << inBufferAvailable() << " avail_out=" << outBufferAvailable(); + lzma_ret result = lzma_code(&d->zStream, finish ? LZMA_FINISH : LZMA_RUN ); + + switch (result) { + case LZMA_OK: + return OK; + break; + case LZMA_STREAM_END: + kdDebug(7131) << " lzma_code returned " << result; + return END; + break; + default: + kdDebug(7131) << " lzma_code returned " << result; + return ERROR; + break; + } +} + +#endif /* HAVE_XZ_SUPPORT */ diff --git a/tdeioslave/xz/kxzfilter.desktop b/tdeioslave/xz/kxzfilter.desktop new file mode 100644 index 000000000..7d6f4a649 --- /dev/null +++ b/tdeioslave/xz/kxzfilter.desktop @@ -0,0 +1,86 @@ +[Desktop Entry] +Type=Service +Name=XZ Filter +Name[af]=XZ Filter +Name[ar]=فلتر XZ +Name[az]=XZ Filtri +Name[be]=Фільтр XZ +Name[bg]=Филтър XZ +Name[bn]=জি-জিপ (XZ) ফিল্টার +Name[br]=Sil XZ +Name[ca]=Filtre XZ +Name[cs]=Filtr XZ +Name[csb]=Filter XZ +Name[cy]=Hidl XZ +Name[da]=XZ-filter +Name[de]=XZ-Filter +Name[el]=Φίλτρο XZ +Name[eo]=XZ-filtrilo +Name[es]=Filtro XZ +Name[et]=XZ filter +Name[eu]=XZ iragazkia +Name[fa]=پالایۀ XZ +Name[fi]=XZ-suodin +Name[fr]=Filtre XZ +Name[fy]=XZ-filter +Name[ga]=Scagaire XZ +Name[gl]=Filtro XZ +Name[he]=מסנן XZ +Name[hi]=XZ फ़िल्टर +Name[hr]=XZ filtar +Name[hu]=XZ szűrő +Name[id]=Filter XZ +Name[is]=XZ sía +Name[it]=Filtro XZ +Name[ja]=XZ フィルタ +Name[ka]=XZ ფილტრი +Name[kk]=XZ сүзгісі +Name[km]=តម្រង XZ +Name[ko]=XZ 거르개 +Name[lb]=XZ-Filter +Name[lt]=XZ filtras +Name[lv]=XZ Filtrs +Name[mk]=XZ филтер +Name[mn]=XZ-Filter +Name[ms]=Penapis XZ +Name[mt]=Filtru XZ +Name[nb]=XZ-filter +Name[nds]=XZ-Filter +Name[ne]=XZ फिल्टर +Name[nl]=XZ-filter +Name[nn]=XZ-filter +Name[nso]=Sesekodi sa XZ +Name[pa]=XZ ਫਿਲਟਰ +Name[pl]=Filtr XZ +Name[pt]=Filtro XZ +Name[pt_BR]=Filtro XZ +Name[ro]=Filtru XZ +Name[ru]=Фильтр XZ +Name[rw]=Muyunguruzi XZ +Name[se]=XZ-filter +Name[sk]=XZ filter +Name[sl]=Filter za XZ +Name[sq]=Filteri XZ +Name[sr]=XZ филтер +Name[sr@Latn]=XZ filter +Name[ss]=Sisefo se XZ +Name[sv]=XZ-filter +Name[ta]=XZ வடிகட்டி +Name[te]=జిజిప్ గలని +Name[tg]=Таровиши XZ +Name[th]=ตัวกรอง XZ +Name[tr]=XZ Filtresi +Name[tt]=XZ Sözgeçe +Name[uk]=Фільтр XZ +Name[uz]=XZ-filter +Name[uz@cyrillic]=XZ-филтер +Name[ven]=Filithara ya XZ +Name[vi]=Bộ lọc XZ +Name[wa]=Passete XZ +Name[xh]=Isihluzi se XZ +Name[zh_CN]=XZ 过滤程序 +Name[zh_HK]=XZ 過濾器 +Name[zh_TW]=XZ 過濾器 +Name[zu]=Ihluzo le-XZ +X-TDE-Library=kxzfilter +ServiceTypes=TDECompressionFilter,application/x-xz,application/x-txz,application/x-lzma diff --git a/tdeioslave/xz/kxzfilter.h b/tdeioslave/xz/kxzfilter.h new file mode 100644 index 000000000..b2ef164ae --- /dev/null +++ b/tdeioslave/xz/kxzfilter.h @@ -0,0 +1,60 @@ +/* This file is part of the KDE libraries + Copyright (C) 2007-2008 Per Øyvind Karlsen <peroyvind@mandriva.org> + + Based on kbzip2filter: + Copyright (C) 2000 David Faure <faure@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KXZFILTER_H +#define KXZFILTER_H + +#include <config.h> +#if HAVE_XZ_SUPPORT + +#include "kfilterbase.h" + +/** + * Internal class used by KFilterDev + * @internal + */ +class KXzFilter : public KFilterBase +{ +public: + KXzFilter(); + virtual ~KXzFilter(); + + virtual void init( int ); + virtual int mode() const; + virtual void terminate(); + virtual void reset(); + virtual bool readHeader() { return true; } // lzma handles it by itself ! Cool ! + virtual bool writeHeader( const TQCString & ) { return true; } + virtual void setOutBuffer( char * data, uint maxlen ); + virtual void setInBuffer( const char * data, uint size ); + virtual int inBufferAvailable() const; + virtual int outBufferAvailable() const; + virtual Result uncompress(); + virtual Result compress( bool finish ); +private: + class Private; + Private* const d; +}; + +#endif + +#endif // KXZFILTER_H |