Пример #1
0
void ZipRW::CpFileText(QString source, QString dest, QString File, QString Text)
{
    QuaZip qz2(dest);
    qz2.open(QuaZip::mdCreate);

    QuaZipFile qzf(&qz2);
    qzf.open(QFile::WriteOnly, QuaZipNewInfo(File));
    qzf.write(Text.toUtf8().data());
    qzf.close();

    QuaZip qz(source);
    qz.open(QuaZip::mdUnzip);
    QList<QuaZipFileInfo> lst = qz.getFileInfoList();
    foreach (QuaZipFileInfo itm, lst) {
        if (itm.name != File) {
            qz.setCurrentFile(itm.name, QuaZip::csInsensitive);
            QuaZipFile qf(&qz);
            qf.open(QFile::ReadOnly);
            QByteArray ba = qf.readAll();
            qf.close();

            QuaZipFile qzf2(&qz2);
            qzf2.open(QFile::WriteOnly, QuaZipNewInfo(itm.name));
            qzf2.write(ba);
            qzf2.close();
        }
    }

    qz.close();
    qz2.close();
}
Пример #2
0
void ZipRW::SetFileText(QString ZipFile, QString File, QString Text)
{
    QFile(ZipFile).rename(ZipFile + ".old");

    QuaZip qz2(ZipFile);
    qz2.open(QuaZip::mdCreate);

    QuaZipFile qzf(&qz2);
    qzf.open(QFile::WriteOnly, QuaZipNewInfo(File));
    qzf.write(Text.toLatin1());
    qzf.close();

    QuaZip qz(ZipFile + ".old");
    qz.open(QuaZip::mdUnzip);
    QList<QuaZipFileInfo> lst = qz.getFileInfoList();
    foreach (QuaZipFileInfo itm, lst) {
        if (itm.name != File) {
            qz.setCurrentFile(itm.name, QuaZip::csInsensitive);
            QuaZipFile qf(&qz);
            qf.open(QFile::ReadOnly);
            QByteArray ba = qf.readAll();
            qf.close();

            QuaZipFile qzf2(&qz2);
            qzf2.open(QFile::WriteOnly, QuaZipNewInfo(itm.name));
            qzf2.write(ba);
            qzf2.close();
        }
    }

    qz.close();
    qz2.close();
    QFile(ZipFile + ".old").remove();
}
Пример #3
0
/**
 * @brief Exports the portfolios to the archive.
 * The portfolios must have been sets before with addPortfolios.
 */
void ExportManager::exportArchive() {
	QuaZip zip(this->archivePath);
	if(!zip.open(QuaZip::mdCreate)) {
		throw ExportException("Cannot create archive "+this->archivePath+".");
	}

	QuaZipFile archivedFile(&zip);

	// Adds the descriptor file in the archive:
	QByteArray data = writeDescriptor();
	if(!archivedFile.open(QIODevice::WriteOnly, QuaZipNewInfo("portfolios.json"))) {
		throw ExportException("Cannot create descriptor file in archive.");
	}
	archivedFile.write(data);
	archivedFile.close();

	// Adds the reports and assets' files to the archive:
	QDir resourcesFolder(SQLiteManager::getSessionFolder() + QDir::separator() + "Resources");
	addToArchive(resourcesFolder, "Reports", archivedFile);
	addToArchive(resourcesFolder, "Assets", archivedFile);

	zip.close();
	if(zip.getZipError() != 0) {
		throw ExportException("Error while archiving ("+QString::number(zip.getZipError())+").");
	}
}
Пример #4
0
    foreach(QFileInfo fileInfo, files) {

        if (!fileInfo.isFile()) {
            continue;
        }

        QString fileNameWithRelativePath (fileInfo.filePath().remove(0, dir.absolutePath().length() + 1));

        inFile.setFileName(fileInfo.filePath());
        //KeyProvider kp;
        if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileNameWithRelativePath, fileInfo.filePath())/*, kp.GetKey().toAscii()*/)) {
          return false;
        }

        if (!inFile.open(QIODevice::ReadOnly)) {
            return false;
        }

        while (inFile.getChar(&c) && outFile.putChar(c));

        if (outFile.getZipError() != UNZ_OK) {
            return false;
        }

        outFile.close();

        if (outFile.getZipError() != UNZ_OK) {
            return false;
        }

        inFile.close();
    }
Пример #5
0
/**
 * @brief Adds the content of a folder to the archive.
 * @param resourcesFolder Resources' folder.
 * @param folderName Folder to add to the archive.
 * @param archivedFile The archive file opened with QuaZip.
 */
void ExportManager::addToArchive(QDir resourcesFolder, QString folderName, QuaZipFile& archivedFile) {
	QDir folder = resourcesFolder.absolutePath() + QDir::separator() + folderName;
	QDirIterator it(folder.absolutePath());
	while(it.hasNext()) {
		QString filePath = it.next();
		QString filename = filePath;
		filename.remove(0, folder.absolutePath().size()+1);
		if(filename=="." || filename=="..") {
			continue;
		}
		QFile file(filePath);
		if(!file.open(QIODevice::ReadOnly)) {
			throw ExportException("Cannot open file "+filePath+".");
		}

		// Creates the file in the archive:
		QString filePathInArchive = filePath;
		filePathInArchive.remove(0, resourcesFolder.absolutePath().size()+1); // Removes '[..]/Resources/'.
		if(!archivedFile.open(QIODevice::WriteOnly, QuaZipNewInfo(filePathInArchive))) {
			throw ExportException("Cannot create file "+filePathInArchive+" in archive.");
		}

		// Writes the file's content:
		char c;
		while(file.getChar(&c) && archivedFile.putChar(c));
		archivedFile.close();
		file.close();
	}
}
Пример #6
0
//! @brief append a single file to current archive
//!
bool ZipUtil::appendFileToArchive(QString& file, QString& basedir)
{
    bool result = true;
    if(!m_zip || !m_zip->isOpen()) {
        qDebug() << "[ZipUtil] Zip file not open!";
        return false;
    }
    // skip folders, we can't add them.
    QFileInfo fileinfo(file);
    if(fileinfo.isDir()) {
        return false;
    }
    QString infile = fileinfo.canonicalFilePath();
    QString newfile = infile;
    newfile.remove(QDir(basedir).canonicalPath() + "/");

    QuaZipFile fout(m_zip);
    QFile fin(file);

    if(!fin.open(QFile::ReadOnly)) {
        qDebug() << "[ZipUtil] Could not open file for reading:" << file;
        return false;
    }
    if(!fout.open(QIODevice::WriteOnly, QuaZipNewInfo(newfile, infile))) {
        fin.close();
        qDebug() << "[ZipUtil] Could not open file for writing:" << newfile;
        return false;
    }

    result = (fout.write(fin.readAll()) < 0) ? false : true;
    fin.close();
    fout.close();
    return result;
}
Пример #7
0
int main()
{
    QString zipName("test.zip");
    char c;
    QFile file("quazip.pro"); 

    QuaZip zip(zipName);	
    if (!zip.open(QuaZip::mdCreate)) 
        return false;

    QuaZipFile outFile(&zip);
    if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(file.fileName())))
        return false;

    if (!file.open(QIODevice::ReadOnly))
        return false;

    while (file.getChar(&c) && outFile.putChar(c)) {};

    outFile.close();
    file.close();
    zip.close();

    if (zip.getZipError() != 0) {
        return false;
    }

    return 0;
}
Пример #8
0
/**OK
 * Comprime il file fileName, nell'oggetto zip, con il nome fileDest.
 *
 * La funzione fallisce se:
 * * zip==NULL;
 * * l'oggetto zip e stato aperto in una modalita non compatibile con l'aggiunta di file;
 * * non e possibile aprire il file d'origine;
 * * non e possibile creare il file all'interno dell'oggetto zip;
 * * si e rilevato un errore nella copia dei dati;
 * * non e 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
    if (!copyData(inFile, outFile) || outFile.getZipError()!=UNZ_OK) {
        return false;
    }

    // Chiudo i file
    outFile.close();
    if (outFile.getZipError()!=UNZ_OK) return false;
    inFile.close();

    return true;
}
Пример #9
0
bool EasyZip::Zip(QString fileToZip, QString zipFileName){
    QuaZip zip(zipFileName);
    if(!zip.open(QuaZip::mdCreate)) {
        qWarning("testCreate(): zip.open(): %d", zip.getZipError());
        return false;
    }
    zip.setFileNameCodec("UTF-8");
    /* Pour lire le fichier par blocs de 64Ko */
    QByteArray buffer(65536, Qt::Uninitialized);
    QDir dir(fileToZip);
    QDirIterator iter(fileToZip, QDir::Files, QDirIterator::Subdirectories);
    while(iter.hasNext())
    {
        iter.next();

        if(iter.fileInfo() == QFileInfo(zipFileName))
            continue;

        QString sourceFilename = iter.fileInfo().absoluteFilePath();
        /* Le nom de fichier qui sera stocké dans le .zip */
        QString zipFilename = dir.relativeFilePath(sourceFilename);

        QFile inFile(iter.filePath());
        if(!inFile.open(QIODevice::ReadOnly)) {
            qWarning("testCreate(): inFile.open(): %s", inFile.errorString().toLocal8Bit().constData());
            return false;
        }

        QuaZipFile outFile(&zip);
        if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(zipFilename, sourceFilename))) {
            qWarning("testCreate(): outFile.open(): %d", outFile.getZipError());
            return false;
        }
        while(!inFile.atEnd())
        {
            qint64 nbRead = inFile.read(buffer.data(), buffer.size());
            outFile.write(buffer.data(), nbRead);
        }
        if(outFile.getZipError()!=UNZ_OK) {
            qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
            return false;
        }
        outFile.close();
        if(outFile.getZipError()!=UNZ_OK) {
            qWarning("testCreate(): outFile.close(): %d", outFile.getZipError());
            return false;
        }
        inFile.close();
    }
    zip.close();
    if(zip.getZipError()!=0) {
        qWarning("testCreate(): zip.close(): %d", zip.getZipError());
        return false;
    }
    return true;
}
Пример #10
0
bool Project::save()
{
    saveOpenTexts();
    serializeConfigurationXml();

    // indebted to: http://stackoverflow.com/questions/2598117/zipping-a-folder-file-using-qt
    QuaZip zip(mProjectPath);
    QuaZipFile outFile(&zip);

    if (!zip.open(QuaZip::mdCreate))
    {
        qWarning() << "zip.open()" << zip.getZipError();
        return false;
    }
    char c;
    QFile inFile;
    QDir tempDir = getTempDir();
    tempDir.setNameFilters(QStringList("*"));
    QStringList files = tempDir.entryList(QDir::Files,QDir::Name);
    for(int i=0; i<files.count(); i++)
    {
        inFile.setFileName( tempDir.absoluteFilePath(files.at(i)) );
        if( !inFile.open(QIODevice::ReadOnly))
        {
            qWarning() << inFile.errorString();
            return false;
        }
        if( !outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(files.at(i) , tempDir.absoluteFilePath(files.at(i)) )))
        {
            qWarning() << outFile.errorString();
            return false;
        }
        while (inFile.getChar(&c) && outFile.putChar(c));

        if (outFile.getZipError() != UNZ_OK)
        {
            qWarning() << outFile.getZipError();
            return false;
        }

        outFile.close();

        if (outFile.getZipError() != UNZ_OK)
        {
            qWarning() << outFile.getZipError();
            return false;
        }

        inFile.close();
    }

    mChanged = false;

    return true;
}
Пример #11
0
bool CZipper::zip_directory (const QString &archpath, const QString &dir2pack)
{
  QString archname = qstring_get_last_after (dir2pack, "/");
 
  QString zipname (archpath); //zip name has a full path ending with .zip
  zipname.append ("/").append (archname).append (".zip");
 
  QuaZip zip (zipname, settings->value ("zip_charset_out", "UTF-8").toString().trimmed());

  if (! zip.open (QuaZip::mdCreate))
     return false;

  QDir dir (dir2pack);

  QFileInfoList files = dir.entryInfoList();
  QFile inFile;
  QuaZipFile outFile(&zip);

  foreach (QFileInfo file, files)
          {
           if (! file.isFile())
              continue;

           inFile.setFileName (file.absoluteFilePath());

           if (! inFile.open (QIODevice::ReadOnly))
              return false;

           QString outfname (archname);
           outfname.append ("/").append (file.fileName());

           if (! outFile.open (QIODevice::WriteOnly, QuaZipNewInfo (outfname, inFile.fileName())))
               return false;

           QByteArray ba = inFile.readAll();
           outFile.write (ba);

           outFile.close();
          
           if (outFile.getZipError() != UNZ_OK)
              return false;

           inFile.close();
          
           emit new_iteration (file);
          }
  
  zip.close();

  if (zip.getZipError() != 0) 
     return false;
  
  return true;
}
Пример #12
0
/**OK
 * Comprime la cartella dir nel file fileCompressed, se recursive e 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 e tentato
 * di creare.
 *
 * La funzione fallisce se:
 * * zip==NULL;
 * * l'oggetto zip e stato aperto in una modalita 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, const int LEVEL, 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;

    QDir origDirectory(origDir);
	if (dir != origDir) {
		QuaZipFile dirZipFile(zip);
        const int METHOD = LEVEL != 0 ? Z_DEFLATED : Z_BINARY;
        if (!dirZipFile.open(QIODevice::WriteOnly,
            QuaZipNewInfo(origDirectory.relativeFilePath(dir) + "/", dir), NULL, 0, METHOD, LEVEL)) {
				return false;
		}
		dirZipFile.close();
	}


    // Se comprimo anche le sotto cartelle
    if (recursive) {
        // Per ogni sotto cartella
        QFileInfoList files = directory.entryInfoList(QDir::AllDirs|QDir::NoDotAndDotDot);
        Q_FOREACH (QFileInfo file, files) {
            // Comprimo la sotto cartella
            if(!compressSubDir(zip,file.absoluteFilePath(),origDir,LEVEL,recursive)) return false;
        }
    }

    // Per ogni file nella cartella
    QFileInfoList files = directory.entryInfoList(QDir::Files);
    Q_FOREACH (QFileInfo file, files) {
        // Se non e un file o e 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,LEVEL)) return false;
    }

    return true;
}
Пример #13
0
void TestQuaZipFile::zipUnzip()
{
    QFETCH(QString, zipName);
    QFETCH(QStringList, fileNames);
    QFETCH(QByteArray, fileNameCodec);
    QFETCH(QByteArray, password);
    QFETCH(bool, zip64);
    QFile testFile(zipName);
    if (testFile.exists()) {
        if (!testFile.remove()) {
            QFAIL("Couldn't remove existing archive to create a new one");
        }
    }
    if (!createTestFiles(fileNames)) {
        QFAIL("Couldn't create test files for zipping");
    }
    QuaZip testZip(&testFile);
    testZip.setZip64Enabled(zip64);
    if (!fileNameCodec.isEmpty())
        testZip.setFileNameCodec(fileNameCodec);
    QVERIFY(testZip.open(QuaZip::mdCreate));
    QString comment = "Test comment";
    testZip.setComment(comment);
    foreach (QString fileName, fileNames) {
        QFile inFile("tmp/" + fileName);
        if (!inFile.open(QIODevice::ReadOnly)) {
            qDebug("File name: %s", fileName.toUtf8().constData());
            QFAIL("Couldn't open input file");
        }
        QuaZipFile outFile(&testZip);
        QVERIFY(outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(fileName,
                        inFile.fileName()),
                password.isEmpty() ? NULL : password.constData()));
        for (qint64 pos = 0, len = inFile.size(); pos < len; ) {
            char buf[4096];
            qint64 readSize = qMin(static_cast<qint64>(4096), len - pos);
            qint64 l;
            if ((l = inFile.read(buf, readSize)) != readSize) {
                qDebug("Reading %ld bytes from %s at %ld returned %ld",
                        static_cast<long>(readSize),
                        fileName.toUtf8().constData(),
                        static_cast<long>(pos),
                        static_cast<long>(l));
                QFAIL("Read failure");
            }
            QVERIFY(outFile.write(buf, readSize));
            pos += readSize;
        }
        inFile.close();
        outFile.close();
        QCOMPARE(outFile.getZipError(), ZIP_OK);
    }
bool KTPackageHandler::compress(QuaZip *zip, const QString &path)
{
	QFile inFile;
	QuaZipFile outFile(zip);
	char c;
	
	QFileInfoList files= QDir(path).entryInfoList();
	
	foreach(QFileInfo file, files)
	{
		QString filePath = path+"/"+file.fileName();
		
		
		if ( file.fileName().startsWith(".") ) continue;
		
		if ( file.isDir() )
		{
			compress(zip, file.path()+"/"+file.fileName());
			continue;
		}
		
		inFile.setFileName(filePath);
		if(!inFile.open(QIODevice::ReadOnly)) 
		{
			dError() << "Error opening file " << inFile.fileName() << " : " << inFile.errorString();
			return false;
		}
		
		if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(stripRepositoryFromPath(filePath), stripRepositoryFromPath(filePath) ))) 
		{
			return false;
		}
		while(inFile.getChar(&c) && outFile.putChar(c));
		
		if(outFile.getZipError()!=UNZ_OK)
		{
			return false;
		}
		outFile.close();
		if(outFile.getZipError()!=UNZ_OK)
		{
			return false;
		}
		inFile.close();
	}
Пример #15
0
bool CZipper::pack_prepared()
{
  if (archive_fullpath.isEmpty())
     return false;
  
  QString zipname (archive_fullpath);
  QuaZip zip (zipname, settings->value ("zip_charset_out", "UTF-8").toString().trimmed());

  if (! zip.open (QuaZip::mdCreate))
      return false;

  QFile inFile;
  QuaZipFile outFile (&zip);

  foreach (QString fi, files_list)
          {
           QFileInfo file (fi);
           
           if (! file.isFile())
              continue;

           inFile.setFileName (file.absoluteFilePath());

           if (! inFile.open (QIODevice::ReadOnly))
               return false;

           QString outfname (archive_name);
           outfname.append ("/").append (file.fileName());

           if (! outFile.open (QIODevice::WriteOnly, QuaZipNewInfo (outfname, inFile.fileName())))
               return false;

           QByteArray ba = inFile.readAll();
           outFile.write (ba);

           outFile.close();
           
           if (outFile.getZipError() != UNZ_OK)
               return false;

           inFile.close();

           emit new_iteration (file);
         }
void ProjectExporter::writeZip(QString path, QString base)
{
    if(base == "")
        base = path;
    if(path == "")
    {
        addError(tr("Couldn't locate project directory"));
        return;
    }

    QDir dir(path);

    /* First adding any files in the directory */
    QFileInfoList files = dir.entryInfoList(QDir::Files);
    for(int i = 0; i < files.count(); i++)
    {
        QFileInfo current = files[i];

        QString newPath = current.absoluteFilePath().replace(base, "/.rockbox");

        QuaZipFile fout(&zipFile);
        QFile fin(current.absoluteFilePath());

        fin.open(QFile::ReadOnly | QFile::Text);
        fout.open(QIODevice::WriteOnly,
                  QuaZipNewInfo(newPath, current.absoluteFilePath()));

        fout.write(fin.readAll());

        fin.close();
        fout.close();
    }

    /* Then recursively adding any directories */
    QFileInfoList dirs = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
    for(int i = 0; i < dirs.count(); i++)
    {
        QFileInfo current = dirs[i];
        writeZip(current.absoluteFilePath(), base);
    }
}
Пример #17
0
void QZip::zipDir(QuaZipFile &outFile,const QString &zipPath,const QString &zipTPath){
    QDir dir(zipPath);
    dir.setCurrent(zipPath);
    QFileInfoList files=dir.entryInfoList();

    QFile inFile;
    char c;
    foreach(QFileInfo file, files) {
        if(file.isDir()){
            if(!file.absoluteFilePath().endsWith(".")){
                QString zipDirecName = zipTPath==""?file.fileName():zipTPath+"\\"+file.fileName();
                zipDir(outFile,file.absoluteFilePath(),zipDirecName);
                dir.setCurrent(zipPath);
            }
            continue;//
        }
        inFile.setFileName(file.fileName());
        if(!inFile.open(QIODevice::ReadOnly)) {
            qWarning("testCreate(): inFile.open(): %s", inFile.errorString().toLocal8Bit().constData());
            return;
        }
        QString zipDirName = zipTPath==""?inFile.fileName():zipTPath+"\\"+inFile.fileName();
        if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(zipDirName, inFile.fileName()))) {
            qWarning("testCreate(): outFile.open(): %d", outFile.getZipError());
            return;
        }
        while(inFile.getChar(&c)&&outFile.putChar(c));
        if(outFile.getZipError()!=UNZ_OK) {
            qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
            return;
        }
        outFile.close();
        if(outFile.getZipError()!=UNZ_OK) {
            qWarning("testCreate(): outFile.close(): %d", outFile.getZipError());
            return;
        }
        inFile.close();
    }
}
Пример #18
0
bool compressDir(const QString& sourceDir, const QString& subDir, const QString& targetFile, bool isUtf8)
{
	QStringList compressFileList;
	compressFileList.push_back(subDir);
	QString sourceFolderPath = sourceDir;
	if (!sourceFolderPath.endsWith("/"))
		sourceFolderPath.append("/");
	QStringList findFilesList;
	QDir wDir(sourceFolderPath + subDir);
	findFoldersAndFiles(wDir, findFilesList);
	wDir.setPath(sourceDir);
	for (int i = 0; i < findFilesList.size(); ++i)
	{
		QString rPath = wDir.relativeFilePath(findFilesList.at(i));
		compressFileList.push_back(rPath);
	}
	if (!isUtf8)
		QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
	QuaZip zip(targetFile);
	//zip.setFileNameCodec("GBK");
	if (!zip.open(QuaZip::mdCreate))
	{
		QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
		return false;
	}
	QuaZipFile outFile(&zip);
	for (int i = 0; i < compressFileList.size(); i++)
	{
		QString sourceFolderPath = compressFileList.at(i);
		QFileInfo fileInfo(wDir.absoluteFilePath(compressFileList.at(i)));
		if (fileInfo.isDir())
		{
			if (!sourceFolderPath.endsWith("/"))
				sourceFolderPath.append("/");
			if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(sourceFolderPath, fileInfo.absoluteFilePath())))
			{
				QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
				return false;
			}
			outFile.close();
		}
		else if (fileInfo.isFile())
		{
			QFile inFile(fileInfo.absoluteFilePath());
			if (!inFile.open(QIODevice::ReadOnly))
			{
				zip.close();
				QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
				return false;
			}
			if (!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(sourceFolderPath, fileInfo.absoluteFilePath())))
			{
				inFile.close();
				zip.close();
				QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
				return false;
			}
			QByteArray buffer;
			int chunksize = 1024;
			buffer = inFile.read(chunksize);
			while (!buffer.isEmpty())
			{
				outFile.write(buffer);
				buffer = inFile.read(chunksize);
			}
			outFile.close();
			inFile.close();
		}
	}
	zip.close();
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
	if (zip.getZipError())
		return false;
	return true;
}
Пример #19
0
void Parse::postPML( QString type, QString title, QString description, QByteArray pml_file, QString keywords )
{
    qWarning()<<"postPML, ready:"<<isReady();
    while (!isReady()) { }

    setEndPoint("classes/Pml");

    QJsonObject obj;

    QJsonObject owner{
                {"__type","Pointer"},
                {"className","_User"},
                {"objectId",userId}
            };

    obj.insert("owner",owner);
    obj.insert("type",type);

    QByteArray zipdata;

    if (type=="pml") {
        QBuffer buf(&zipdata);
        QuaZip zip(&buf);

        zip.open(QuaZip::mdCreate);
        QuaZipFile file(&zip);
        file.open(QIODevice::WriteOnly, QuaZipNewInfo("session.pml"));

        file.write(pml_file);

        file.close();
        zip.close();
    }

    if (type=="psk") {
        zipdata = pml_file;

        QBuffer buf(&zipdata);
        QuaZip zip(&buf);
        zip.open(QuaZip::mdUnzip);

        // check Package.json exist
        if (!zip.setCurrentFile("package.json")) {
            // ERROR
            qWarning()<<"ERROR - package.json missing";
            ask(mainwindow,"Invalid skin package.\n'package.json' file missing",1);
            return;
        }

        // open Package.json
        QuaZipFile file(&zip);
        file.open(QIODevice::ReadOnly);
        QByteArray _ba =   file.readAll();
        QJsonDocument json = QJsonDocument::fromJson(_ba);


        if (json.object().value("model").isUndefined()) {
            // ERROR
            qWarning()<<"ERROR model empty";
            ask(mainwindow,"Invalid skin package.\nModel not defined in package.json file",1);
            return;
        }

        QString _model = json.object().value("model").toString();
        QString _title = json.object().value("title").toString();
        QString _description = json.object().value("description").toString();
        QString _author = json.object().value("author").toString();
        QString _email = json.object().value("email").toString();
        QString _url = json.object().value("url").toString();

        title = _title;
        description = _description + "\r\n" +
                "Author : "+_author + "\r\n" +
                "Email : "+_email + "\r\n" +
                "Url : "+_url;
//                "Email :<a href=\"mailto://"+_email +"\">"+_email+"</a>\r\n" +
//                "Url :<a href=\""+_url +"\">"+_url+"</a>";
        file.close();
    }

    obj.insert("data",QString(zipdata.toBase64()));


    QJsonObject acl{
        { userId,  QJsonObject{
                    {"read", true},
                    {"write", true}
                }
        }
    };
    obj.insert("ACL",acl);

    obj.insert("title",title);
    obj.insert("description",description);
    obj.insert("keywords",keywords);

    // parse pml to generate objetcs list
    // This should be moved to parse.Cloud
    // DONE

//    QDomDocument document;
//    document.setContent( pml_file );
//    QDomElement documentElement = document.documentElement();
//    QDomNodeList elements = documentElement.elementsByTagName( "object" );
//    QString keywords = "|";
//    for (int i=0; i<elements.size();i++ )
//    {
//        QDomElement object = elements.at(i).toElement();
//        QString name = object.attribute("name");
//        keywords.append( name + QString("|") );
//        qWarning()<<keywords;
//    }
//    obj.insert("keywords",keywords);

    m_conn = connect(this, &BaaS::replyFinished, [=]( QJsonDocument json){
//        qWarning()<<"disconnect"<<m_conn;
        disconnect(m_conn);
        if ( getHttpCode() == 201 ){
            qWarning()<<"postPML Result:"<<json.object();

            emit pmlUploaded();
        }

    } );

    qWarning()<<"connect"<<m_conn;
    initHeaders();
    request( BaaS::POST, QJsonDocument(obj).toJson());


}
Пример #20
0
bool LocalZipTask::zip()
{
    const QString source = get_source(), destination = get_destination();

    // 在临时文件区新建zip文件
    QTemporaryFile tmp("XXXXXX.zip");
    tmp.open();
    QuaZip zip(tmp.fileName());
    zip.setFileNameCodec("UTF8");
    zip.open(QuaZip::mdCreate);

    // 添加注释
    zip.setComment("Create automatically by organic/syncer.");

    // 添加文件
    IgnoreList ignore_list;
    stack<QString> relatives;
    relatives.push("");
    while (!relatives.empty())
    {
        const QString r = relatives.top();
        relatives.pop();

        // 执行栈里的特殊操作
        if (r == SPECIAL_ID)
        {
            ignore_list.pop_config();
            continue;
        }


        update_state(r + " ...");

        // 处理中断操作
        if (RUNNING != get_state())
        {
            set_msg("Cancled.");
            return false;
        }

        // 处理忽略列表
        const QString p = path_join(source, r);
        if (ignore_list.is_ignored(r))
        {
            _compressed_files += count_files(p);
            continue;
        }

        if (!QFileInfo(p).isDir())
        {
            QFile in(p);
            if (!in.open(QIODevice::ReadOnly))
            {
                set_msg("Failed to open file: " + p);
                set_has_error(true);
                return false;
            }

            QuaZipFile out(&zip);
            const QString rr = (r.isEmpty() ? QFileInfo(source).fileName() : r);
            out.open(QIODevice::WriteOnly, QuaZipNewInfo(rr, p));
            const qint64 BUF_LEN = 64 * 1024;
            char buf[BUF_LEN];
            for (qint64 pos = 0, len = in.size(); pos < len; )
            {
                qint64 readSize = qMin(BUF_LEN, len - pos);
                if (in.read(buf, readSize) != readSize)
                {
                    set_msg("Failed to read file: " + rr);
                    set_has_error(true);
                    return false;
                }

                out.write(buf, readSize);
                pos += readSize;
            }
            in.close();
            out.close();
            ++_compressed_files;
        }
        else
        {
            // 处理忽略列表
            if (QFileInfo(path_join(p, IGNORE_FILE1)).exists())
            {
                ignore_list.push_config(r, path_join(p, IGNORE_FILE1));
                relatives.push(SPECIAL_ID);
            }
            else if (QFileInfo(path_join(p, IGNORE_FILE2)).exists())
            {
                ignore_list.push_config(r, path_join(p, IGNORE_FILE2));
                relatives.push(SPECIAL_ID);
            }
            else if (QFileInfo(path_join(p, IGNORE_FILE3)).exists())
            {
                ignore_list.push_config(r, path_join(p, IGNORE_FILE3));
                relatives.push(SPECIAL_ID);
            }

            // 遍历文件夹
            QStringList children = QDir(p).entryList(QDir::Files | QDir::Dirs | QDir::AccessMask | QDir::NoDotAndDotDot);
            for (size_t i = 0, size = children.size(); i < size; ++i)
            {
                const QString& e = children.at(i);
                relatives.push(path_join(r, e));
            }
        }
    }
    zip.close();
    tmp.close();

    // 拷贝临时文件到目标地址
    if (QFileInfo(destination).exists() && !remove_file(destination))
    {
        set_msg("Failed to remove old destination ZIP file.");
        set_has_error(true);
        return false;
    }
    if (!copy_file(tmp.fileName(), destination))
    {
        set_msg("Failed to copy tmp file to destination ZIP file.");
        set_has_error(true);
        return false;
    }
    tmp.remove();
    return true;
}