nemo said I was boring for removing the "hello" randomizer on room join.
That was actually an accident, fixed by this commit.
Now find an actual reason to call me boring (there are many to choose from :P) nemo!
#include "JlCompress.h"
#include <QDebug>
/**OK
* Comprime il file fileName, nell'oggetto zip, con il nome fileDest.
*
* La funzione fallisce se:
* * zip==NULL;
* * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
* * non è possibile aprire il file d'origine;
* * non è possibile creare il file all'interno dell'oggetto zip;
* * si è rilevato un errore nella copia dei dati;
* * non è stato possibile chiudere il file all'interno dell'oggetto zip;
*/
bool JlCompress::compressFile(QuaZip* zip, QString fileName, QString fileDest) {
// zip: oggetto dove aggiungere il file
// fileName: nome del file reale
// fileDest: nome del file all'interno del file compresso
// Controllo l'apertura dello zip
if (!zip) return false;
if (zip->getMode()!=QuaZip::mdCreate &&
zip->getMode()!=QuaZip::mdAppend &&
zip->getMode()!=QuaZip::mdAdd) return false;
// Apro il file originale
QFile inFile;
inFile.setFileName(fileName);
if(!inFile.open(QIODevice::ReadOnly)) return false;
// Apro il file risulato
QuaZipFile outFile(zip);
if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileDest, inFile.fileName()))) return false;
// Copio i dati
char c;
while(inFile.getChar(&c)&&outFile.putChar(c));
if(outFile.getZipError()!=UNZ_OK) return false;
// Chiudo i file
outFile.close();
if (outFile.getZipError()!=UNZ_OK) return false;
inFile.close();
return true;
}
/**OK
* Comprime la cartella dir nel file fileCompressed, se recursive è true allora
* comprime anche le sotto cartelle. I nomi dei file preceduti dal path creato
* togliendo il pat della cartella origDir al path della cartella dir.
* Se la funzione fallisce restituisce false e cancella il file che si è tentato
* di creare.
*
* La funzione fallisce se:
* * zip==NULL;
* * l'oggetto zip è stato aperto in una modalità non compatibile con l'aggiunta di file;
* * la cartella dir non esiste;
* * la compressione di una sotto cartella fallisce (1);
* * la compressione di un file fallisce;
* (1) La funzione si richiama in maniera ricorsiva per comprimere le sotto cartelle
* dunque gli errori di compressione di una sotto cartella sono gli stessi di questa
* funzione.
*/
bool JlCompress::compressSubDir(QuaZip* zip, QString dir, QString origDir, bool recursive) {
// zip: oggetto dove aggiungere il file
// dir: cartella reale corrente
// origDir: cartella reale originale
// (path(dir)-path(origDir)) = path interno all'oggetto zip
// Controllo l'apertura dello zip
if (!zip) return false;
if (zip->getMode()!=QuaZip::mdCreate &&
zip->getMode()!=QuaZip::mdAppend &&
zip->getMode()!=QuaZip::mdAdd) return false;
// Controllo la cartella
QDir directory(dir);
if (!directory.exists()) return false;
// Se comprimo anche le sotto cartelle
if (recursive) {
// Per ogni sotto cartella
QFileInfoList files = directory.entryInfoList(QDir::AllDirs|QDir::NoDotAndDotDot);
foreach (QFileInfo file, files) {
// Comprimo la sotto cartella
if(!compressSubDir(zip,file.absoluteFilePath(),origDir,recursive)) return false;
}
}
// Per ogni file nella cartella
QFileInfoList files = directory.entryInfoList(QDir::Files);
QDir origDirectory(origDir);
foreach (QFileInfo file, files) {
// Se non è un file o è il file compresso che sto creando
if(!file.isFile()||file.absoluteFilePath()==zip->getZipName()) continue;
// Creo il nome relativo da usare all'interno del file compresso
QString filename = origDirectory.relativeFilePath(file.absoluteFilePath());
// Comprimo il file
if (!compressFile(zip,file.absoluteFilePath(),filename)) return false;
}
return true;
}
/**OK
* Estrae il file fileName, contenuto nell'oggetto zip, con il nome fileDest.
* Se la funzione fallisce restituisce false e cancella il file che si è tentato di estrarre.
*
* La funzione fallisce se:
* * zip==NULL;
* * l'oggetto zip è stato aperto in una modalità non compatibile con l'estrazione di file;
* * non è possibile aprire il file all'interno dell'oggetto zip;
* * non è possibile creare il file estratto;
* * si è rilevato un errore nella copia dei dati (1);
* * non è stato possibile chiudere il file all'interno dell'oggetto zip (1);
*
* (1): prima di uscire dalla funzione cancella il file estratto.
*/
bool JlCompress::extractFile(QuaZip* zip, QString fileName, QString fileDest) {
// zip: oggetto dove aggiungere il file
// filename: nome del file reale
// fileincompress: nome del file all'interno del file compresso
// Controllo l'apertura dello zip
if (!zip) return false;
if (zip->getMode()!=QuaZip::mdUnzip) return false;
// Apro il file compresso
zip->setCurrentFile(fileName);
QuaZipFile inFile(zip);
if(!inFile.open(QIODevice::ReadOnly) || inFile.getZipError()!=UNZ_OK) return false;
// Controllo esistenza cartella file risultato
QDir().mkpath(QFileInfo(fileDest).absolutePath());
// Apro il file risultato
QFile outFile;
outFile.setFileName(fileDest);
if(!outFile.open(QIODevice::WriteOnly)) return false;
// Copio i dati
char c;
while(inFile.getChar(&c)) outFile.putChar(c);
if (inFile.getZipError()!=UNZ_OK) {
removeFile(QStringList(fileDest));
return false;
}
// Chiudo i file
inFile.close();
if (inFile.getZipError()!=UNZ_OK) {
removeFile(QStringList(fileDest));
return false;
}
outFile.close();
return true;
}
/**
* Rimuove i file il cui nome è specificato all'interno di listFile.
* Restituisce true se tutti i file sono stati cancellati correttamente, attenzione
* perchè può restituire false anche se alcuni file non esistevano e si è tentato
* di cancellarli.
*/
bool JlCompress::removeFile(QStringList listFile) {
bool ret = true;
// Per ogni file
for (int i=0; i<listFile.count(); i++) {
// Lo elimino
ret = ret && QFile::remove(listFile.at(i));
}
return ret;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/**OK
* Comprime il file fileName nel file fileCompressed.
* Se la funzione fallisce restituisce false e cancella il file che si è tentato
* di creare.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * la compressione del file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
bool JlCompress::compressFile(QString fileCompressed, QString file) {
// Creo lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
if(!zip->open(QuaZip::mdCreate)) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
// Aggiungo il file
if (!compressFile(zip,file,QFileInfo(file).fileName())) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
delete zip;
return true;
}
/**OK
* Comprime i file specificati in files nel file fileCompressed.
* Se la funzione fallisce restituisce false e cancella il file che si è tentato
* di creare.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * la compressione di un file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
bool JlCompress::compressFiles(QString fileCompressed, QStringList files) {
// Creo lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
if(!zip->open(QuaZip::mdCreate)) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
// Comprimo i file
QFileInfo info;
foreach (QString file, files) {
info.setFile(file);
if (!info.exists() || !compressFile(zip,file,info.fileName())) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
delete zip;
return true;
}
/**OK
* Comprime la cartella dir nel file fileCompressed, se recursive è true allora
* comprime anche le sotto cartelle.
* Se la funzione fallisce restituisce false e cancella il file che si è tentato
* di creare.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * la compressione di un file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
bool JlCompress::compressDir(QString fileCompressed, QString dir, bool recursive) {
// Creo lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
QDir().mkpath(QFileInfo(fileCompressed).absolutePath());
if(!zip->open(QuaZip::mdCreate)) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
// Aggiungo i file e le sotto cartelle
if (!compressSubDir(zip,dir,dir,recursive)<0) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
QFile::remove(fileCompressed);
return false;
}
delete zip;
return true;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/**OK
* Estrae il file fileName, contenuto nel file fileCompressed, con il nome fileDest.
* Se fileDest = "" allora il file viene estratto con lo stesso nome con cui è
* stato compresso.
* Se la funzione fallisce cancella il file che si è tentato di estrarre.
* Restituisce il nome assoluto del file estratto.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * l'estrazione del file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
QString JlCompress::extractFile(QString fileCompressed, QString fileName, QString fileDest) {
// Apro lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
if(!zip->open(QuaZip::mdUnzip)) {
delete zip;
return QString();
}
// Estraggo il file
if (fileDest.isEmpty()) fileDest = fileName;
if (!extractFile(zip,fileName,fileDest)) {
delete zip;
return QString();
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
removeFile(QStringList(fileDest));
return QString();
}
delete zip;
return QFileInfo(fileDest).absoluteFilePath();
}
/**OK
* Estrae i file specificati in files, contenuti nel file fileCompressed, nella
* cartella dir. La struttura a cartelle del file compresso viene rispettata.
* Se dir = "" allora il file viene estratto nella cartella corrente.
* Se la funzione fallisce cancella i file che si è tentato di estrarre.
* Restituisce i nomi assoluti dei file estratti.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * l'estrazione di un file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
QStringList JlCompress::extractFiles(QString fileCompressed, QStringList files, QString dir) {
// Creo lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
if(!zip->open(QuaZip::mdUnzip)) {
delete zip;
return QStringList();
}
// Estraggo i file
for (int i=0; i<files.count(); i++) {
if (!extractFile(zip, files.at(i), QDir(dir).absoluteFilePath(files.at(i)))) {
delete zip;
removeFile(files);
return QStringList();
}
files[i] = QDir(dir).absoluteFilePath(files.at(i));
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
removeFile(files);
return QStringList();
}
delete zip;
return files;
}
/**OK
* Estrae il file fileCompressed nella cartella dir.
* Se dir = "" allora il file viene estratto nella cartella corrente.
* Se la funzione fallisce cancella i file che si è tentato di estrarre.
* Restituisce i nomi assoluti dei file estratti.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * la compressione di un file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
QStringList JlCompress::extractDir(QString fileCompressed, QString dir) {
// Apro lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
if(!zip->open(QuaZip::mdUnzip)) {
delete zip;
return QStringList();
}
// Estraggo i file
QStringList lst = getFileList(fileCompressed);
QDir directory(dir);
for (int i=0; i<lst.count(); i++) {
QString absFilePath = directory.absoluteFilePath(lst.at(i));
if (!extractFile(zip, lst.at(i), absFilePath)) {
delete zip;
removeFile(lst);
return QStringList();
}
lst[i] = absFilePath;
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
removeFile(lst);
return QStringList();
}
delete zip;
return lst;
}
/**OK
* Restituisce la lista dei file resenti nel file compresso fileCompressed.
* Se la funzione fallisce, restituisce un elenco vuoto.
*
* La funzione fallisce se:
* * non si riesce ad aprire l'oggetto zip;
* * la richiesta di informazioni di un file fallisce;
* * non si riesce a chiudere l'oggetto zip;
*/
QStringList JlCompress::getFileList(QString fileCompressed) {
// Apro lo zip
QuaZip* zip = new QuaZip(QFileInfo(fileCompressed).absoluteFilePath());
if(!zip->open(QuaZip::mdUnzip)) {
delete zip;
return QStringList();
}
// Estraggo i nomi dei file
QStringList lst;
QuaZipFileInfo info;
for(bool more=zip->goToFirstFile(); more; more=zip->goToNextFile()) {
if(!zip->getCurrentFileInfo(&info)) {
delete zip;
return QStringList();
}
lst << info.name;
//info.name.toLocal8Bit().constData()
}
// Chiudo il file zip
zip->close();
if(zip->getZipError()!=0) {
delete zip;
return QStringList();
}
delete zip;
return lst;
}