X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=src%2Fplugins%2Fxdxf%2FXdxfDictDownloader.cpp;h=57227b1ddd6c2a095f45b2ee4ebd510b86140fe1;hb=0920a54ebc21e26ea44fab232832f45b7882da19;hp=3a916cf6bfa02ede0a7b4ea964beaad689599050;hpb=7cc6f08b87edcecf8e404094baded4917b10bb9d;p=mdictionary diff --git a/src/plugins/xdxf/XdxfDictDownloader.cpp b/src/plugins/xdxf/XdxfDictDownloader.cpp index 3a916cf..57227b1 100644 --- a/src/plugins/xdxf/XdxfDictDownloader.cpp +++ b/src/plugins/xdxf/XdxfDictDownloader.cpp @@ -18,39 +18,50 @@ Copyright 2010 Comarch S.A. *******************************************************************************/ +/*! + \file XdxfDictDownloader.cpp + \brief XdxfDictDownloader is responsible for getting dict list from XDXF website + and other actions necessary to download and add dictionary -//Created by Mateusz Półrola + \author Mateusz Półrola +*/ #include "XdxfDictDownloader.h" #include "XdxfDictDownloadProgressDialog.h" #include +#include +#include +#include +#include +#ifndef Q_WS_MAEMO_5 + #include +#endif -XdxfDictDownloader::XdxfDictDownloader(QObject *parent) : - QObject(parent) { - parentDialog = 0; - process = new QProcess(this); +typedef void BZFILE; - connect(process, SIGNAL(finished(int)), - this, SLOT(processFinished(int))); +XdxfDictDownloader::XdxfDictDownloader(QObject *parent) : + QObject(parent) { + parentDialog = 0; progressDialog = 0; -} - -XdxfDictDownloader::~XdxfDictDownloader() { + manager = new QNetworkAccessManager(this); + connect(manager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(dictListReceived(QNetworkReply*))); + connect(&http, SIGNAL(finished()), + this, SLOT(processFinished())); + connect(&http, SIGNAL(error(QString)), + this, SLOT(downloadingError(QString))); + connect(&http, SIGNAL(progress(qint64,qint64)), + this, SLOT(updateDownloadProgress(qint64,qint64))); } - void XdxfDictDownloader::download(QWidget *parent) { parentDialog = parent; aborted = false; - QNetworkAccessManager *manager = new QNetworkAccessManager(this); - - connect(manager, SIGNAL(finished(QNetworkReply*)), - this, SLOT(dictListReceived(QNetworkReply*))); manager->get(QNetworkRequest(QUrl("http://xdxf.revdanica.com/down/"))); @@ -58,48 +69,65 @@ void XdxfDictDownloader::download(QWidget *parent) { connect(progressDialog, SIGNAL(cancelDownloading()), this, SLOT(breakDownloading())); + connect(this, SIGNAL(downloadProgress(float)), + progressDialog, SLOT(updateProgress(float))); progressDialog->setText(tr("Downloading dictionaries list")); progressDialog->show(); } + QString XdxfDictDownloader::downloadedFile() { return _downloadedFile; } +void XdxfDictDownloader::updateDownloadProgress(qint64 downloaded, + qint64 total) { + Q_EMIT downloadProgress(float(downloaded) / float(total)); +} + + +void XdxfDictDownloader::downloadingError(QString error) { + breakDownloading(); + Q_EMIT notify(Notify::Error, error); +} + + void XdxfDictDownloader::breakDownloading() { + //if user cancel downloading we kill all running processes, hide progress dialog and set flag that user cancel downloading. aborted = true; - if(process->state() != QProcess::NotRunning) { - process->kill(); - } - + http.kill(); if(progressDialog && progressDialog->isVisible()) { progressDialog->accept(); } - - Q_EMIT notify(Notify::Info, tr("Downloading canceled")); } -void XdxfDictDownloader::processFinished(int exitcode) { + +void XdxfDictDownloader::processFinished() { + //first check if user cancel downloading if(aborted) return; - if(exitcode != 0) { - Q_EMIT notify(Notify::Error, tr("Error while downloading or processing dictionary")); - } - if(++currentCommandstart(commands[currentCommand]); - } - else { - downloadComplete(); + + if(!extract("/tmp/" + _fileName)) { + Q_EMIT notify(Notify::Error, + "Error while extracting dictionary archive"); + return; } + downloadComplete(); } + void XdxfDictDownloader::downloadComplete() { if(aborted) return; + // Downloaded tar file name is different than extracted folder so we need + // some clean directory to identify extracted files QDir dir("/tmp/mdict"); QString dictDirName = dir.entryList().at(2); + + // Dict is in /tmp/mdict//dict.xdxf 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"; @@ -110,27 +138,31 @@ void XdxfDictDownloader::downloadComplete() { emit fileDownloaded(_downloadedFile); } -void XdxfDictDownloader::dictListReceived(QNetworkReply *reply) { - if(aborted) return; +void XdxfDictDownloader::dictListReceived(QNetworkReply *reply) { progressDialog->accept(); - + if(aborted) + return; if(reply->error() != QNetworkReply::NoError) { Q_EMIT notify(Notify::Error, reply->errorString()); return; } QString page(QString::fromUtf8(reply->readAll())); + + // You can look at http://xdxf.revdanica.com/down/, we need to get table + // with dictionaries entries following regexp match its begining QRegExp regOuter("IconNameArchive filenameArchive file sizeDict file sizeNumber of articlesFromToSubmitted bySubmition date(.*)"); regOuter.setMinimal(true); if(!regOuter.indexIn(page)) return; + // Cutting each entry and creating coresponded DownloadDict object page = regOuter.capturedTexts().at(1); QRegExp regInner(".*"); regInner.setMinimal(true); int pos = 0; - + dicts.clear(); while ((pos = regInner.indexIn(page, pos)) != -1) { DownloadDict temp = DownloadDict(regInner.cap(0)); if(!temp.fromLang().isEmpty()) @@ -141,20 +173,72 @@ void XdxfDictDownloader::dictListReceived(QNetworkReply *reply) { XdxfDictSelectDialog selectDialog(dicts, parentDialog); if(selectDialog.exec()==QDialog::Accepted) { - progressDialog->setText(tr("Downloading dictionary")); progressDialog->show(); QString url = selectDialog.link(); - _fileName = url.split('/').last(); - commands.clear(); - commands.push_back("rm -rf /tmp/mdict"); - commands.push_back("mkdir /tmp/mdict"); - commands.push_back("wget --quiet -P /tmp/ " + url); - commands.push_back(QString("tar -xjvf /tmp/") + _fileName + QString(" -C /tmp/mdict")); + QProcess clean; + clean.start("rm -rf /tmp/mdict"); + clean.waitForFinished(-1); + clean.start("mkdir /tmp/mdict"); + clean.waitForFinished(-1); + + http.download(QUrl(url), "/tmp/" + _fileName); + } +} + +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"); - process->start(commands[0]); + int bufflen = 100; + char buff[bufflen]; + while(err == BZ_OK) { + unsigned 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 + #ifndef Q_WS_MAEMO_5 + 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; + + char text[]={"/tmp/mdict/"}; + err = tar_extract_all(t,text); + if(err == -1) { + return false; } + tar_close(t); + #else + QProcess tar; + tar.start("tar -xvf " + file.replace(QRegExp(".bz2%"), "") + " -C /tmp/mdict"); + tar.waitForFinished(-1); + #endif + + return true; } + + +