+
+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;
+}
+
+