From 6933653f2eed98e2dd29f139a62adc90b3fadc9b Mon Sep 17 00:00:00 2001 From: Bartosz Szatkowski Date: Mon, 4 Oct 2010 11:36:31 +0200 Subject: [PATCH] Added library based archive extracting --- src/plugins/xdxf/XdxfDialog.cpp | 3 +- src/plugins/xdxf/XdxfDictDownloader.cpp | 59 ++++++++++++++++++++++++++++++- src/plugins/xdxf/XdxfDictDownloader.h | 3 ++ src/plugins/xdxf/xdxf.pro | 2 ++ 4 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/plugins/xdxf/XdxfDialog.cpp b/src/plugins/xdxf/XdxfDialog.cpp index e660d8b..1972f03 100644 --- a/src/plugins/xdxf/XdxfDialog.cpp +++ b/src/plugins/xdxf/XdxfDialog.cpp @@ -243,7 +243,8 @@ void XdxfDialog::selectFile() { } void XdxfDialog::downloadFile() { - XdxfPlugin::dictDownloader.download(this); + qDebug()<<"a"; + XdxfPlugin::dictDownloader.download(this); } void XdxfDialog::saveSettings() { diff --git a/src/plugins/xdxf/XdxfDictDownloader.cpp b/src/plugins/xdxf/XdxfDictDownloader.cpp index 2b62ff6..677be7f 100644 --- a/src/plugins/xdxf/XdxfDictDownloader.cpp +++ b/src/plugins/xdxf/XdxfDictDownloader.cpp @@ -28,6 +28,14 @@ #include "XdxfDictDownloadProgressDialog.h" #include +#include +#include +#include +#include + +typedef void BZFILE; + + XdxfDictDownloader::XdxfDictDownloader(QObject *parent) : QObject(parent) { @@ -91,6 +99,7 @@ void XdxfDictDownloader::processFinished(int exitcode) { process->start(commands[currentCommand]); } else { + qDebug() << "EXTRACT" << extract("/tmp/" + _fileName); downloadComplete(); } } @@ -106,6 +115,7 @@ void XdxfDictDownloader::downloadComplete() { QFile dictFile("/tmp/mdict/" + dictDirName + "/dict.xdxf"); dictFile.copy(QDir::homePath() + "/.mdictionary/" + dictDirName + ".xdxf"); QFile::remove("/tmp/" + _fileName); + QFile::remove("/tmp/" + _fileName.replace(QRegExp(".bz2$"), "")); _downloadedFile = QDir::homePath() + "/.mdictionary/" + dictDirName + ".xdxf"; @@ -175,8 +185,55 @@ void XdxfDictDownloader::dictListReceived(QNetworkReply *reply) { // page and js scripts and thats all // Maybe calling wget is not pretty one but its working! commands.push_back("wget --quiet -P /tmp/ " + url); - commands.push_back(QString("tar -xjvf /tmp/") + _fileName + QString(" -C /tmp/mdict")); + + //commands.push_back(QString("tar -xjvf /tmp/") + _fileName + QString(" -C /tmp/mdict")); process->start(commands[0]); } } + +bool XdxfDictDownloader::extract(QString file) { + // Extracting bz2 + FILE * archive = fopen(file.toStdString().c_str(), "rb"); + if (archive == 0) + return false; + int err; + BZFILE * afterbzFile = BZ2_bzReadOpen(&err, archive, 0, 0, 0, 0); + if(err != BZ_OK) { + BZ2_bzReadClose(&err, afterbzFile); + return false; + } + + FILE * tarfile = fopen(file.replace(QRegExp(".bz2$"), ""). + toStdString().c_str(), "w"); + + int bufflen = 100; + char buff[bufflen]; + while(err == BZ_OK) { + int len = BZ2_bzRead(&err, afterbzFile, buff, bufflen); + if(fwrite(buff, 1, len, tarfile) != len) + return false; + } + BZ2_bzReadClose(&err, afterbzFile); + fclose(tarfile); + fclose(archive); + + // Extracting tar + TAR *t; + char * tarfname = new char[file.replace(QRegExp(".bz2%"), "").size()+1]; + strcpy(tarfname, file.replace(QRegExp(".bz2%"), "").toStdString().c_str()); + + err = tar_open(&t, tarfname, 0, O_RDONLY, 0, 0); + if(err == -1) + return false; + + err = tar_extract_all(t, "/tmp/mdict/"); + if(err == -1) { + return false; + } + tar_close(t); + + return true; +} + + diff --git a/src/plugins/xdxf/XdxfDictDownloader.h b/src/plugins/xdxf/XdxfDictDownloader.h index 3a74b20..5b7aec9 100644 --- a/src/plugins/xdxf/XdxfDictDownloader.h +++ b/src/plugins/xdxf/XdxfDictDownloader.h @@ -35,6 +35,8 @@ #include #include "XdxfDictDownloadProgressDialog.h" #include "../../include/Notify.h" +#include +#include /** XdxfDictDownloader is responsible for getting dict list from XDXF website and other actions necessary to download and add dictionary @@ -85,6 +87,7 @@ private: bool downloadError; bool aborted; QNetworkAccessManager *manager; + bool extract(QString file); }; #endif // XDXFDICTDOWNLOADER_H diff --git a/src/plugins/xdxf/xdxf.pro b/src/plugins/xdxf/xdxf.pro index 982fd5b..be2f482 100644 --- a/src/plugins/xdxf/xdxf.pro +++ b/src/plugins/xdxf/xdxf.pro @@ -6,6 +6,8 @@ QT = core \ sql \ network +LIBS += -ltar -lbz2 + maemo5:QT += maemo5 SOURCES += xdxfplugin.cpp \ TranslationXdxf.cpp \ -- 1.7.9.5