+void ArchiveWidget::createArchive()
+{
+ QFileInfo dirInfo(archive_url->url().path());
+ QString user = dirInfo.owner();
+ QString group = dirInfo.group();
+ KTar archive(archive_url->url().path(KUrl::AddTrailingSlash) + m_name + ".tar.gz", "application/x-gzip");
+ archive.open( QIODevice::WriteOnly );
+
+ // Create folders
+ foreach(const QString &path, m_foldersList) {
+ archive.writeDir(path, user, group);
+ }
+
+ // Add files
+ int ix = 0;
+ QMapIterator<QString, QString> i(m_filesList);
+ while (i.hasNext()) {
+ i.next();
+ archive.addLocalFile(i.key(), i.value());
+ emit archiveProgress((int) 100 * ix / m_filesList.count());
+ ix++;
+ }
+
+ // Add project file
+ archive.addLocalFile(m_temp->fileName(), m_name + ".kdenlive");
+ bool result = archive.close();
+ delete m_temp;
+ emit archivingFinished(result);
+}
+
+void ArchiveWidget::slotArchivingFinished(bool result)
+{
+ if (result) {
+ slotDisplayMessage("dialog-ok", i18n("Project was successfully archived."));
+ }
+ else {
+ slotDisplayMessage("dialog-close", i18n("There was an error processing project file"));
+ }
+ progressBar->setValue(100);
+ buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Archive"));
+ archive_url->setEnabled(true);
+ compressed_archive->setEnabled(true);
+ for (int i = 0; i < files_list->topLevelItemCount(); i++) {
+ files_list->topLevelItem(i)->setDisabled(false);
+ for (int j = 0; j < files_list->topLevelItem(i)->childCount(); j++)
+ files_list->topLevelItem(i)->child(j)->setDisabled(false);
+ }
+}
+
+void ArchiveWidget::slotArchivingProgress(int p)
+{
+ progressBar->setValue(p);
+}
+
+void ArchiveWidget::slotStartExtracting()
+{
+ if (m_archiveThread.isRunning()) {
+ //TODO: abort extracting
+ return;
+ }
+ QFileInfo f(m_extractUrl.path());
+ m_requestedSize = f.size();
+ KIO::NetAccess::mkdir(archive_url->url().path(KUrl::RemoveTrailingSlash), this);
+ slotDisplayMessage("system-run", i18n("Extracting..."));
+ buttonBox->button(QDialogButtonBox::Apply)->setText(i18n("Abort"));
+ m_progressTimer = new QTimer;
+ m_progressTimer->setInterval(800);
+ m_progressTimer->setSingleShot(false);
+ connect(m_progressTimer, SIGNAL(timeout()), this, SLOT(slotExtractProgress()));
+ m_archiveThread = QtConcurrent::run(this, &ArchiveWidget::doExtracting);
+ m_progressTimer->start();
+}
+
+void ArchiveWidget::slotExtractProgress()
+{
+ KIO::DirectorySizeJob *job = KIO::directorySize(archive_url->url());
+ connect(job, SIGNAL(result(KJob*)), this, SLOT(slotGotProgress(KJob*)));
+}
+
+void ArchiveWidget::slotGotProgress(KJob* job)
+{
+ if (!job->error()) {
+ KIO::DirectorySizeJob *j = static_cast <KIO::DirectorySizeJob *>(job);
+ progressBar->setValue((int) 100 * j->totalSize() / m_requestedSize);
+ }
+ job->deleteLater();
+}
+
+void ArchiveWidget::doExtracting()
+{
+ m_extractArchive->directory()->copyTo(archive_url->url().path(KUrl::AddTrailingSlash));
+ m_extractArchive->close();
+ emit extractingFinished();
+}
+
+QString ArchiveWidget::extractedProjectFile()
+{
+ return archive_url->url().path(KUrl::AddTrailingSlash) + m_projectName;
+}
+
+void ArchiveWidget::slotExtractingFinished()
+{
+ m_progressTimer->stop();
+ delete m_progressTimer;
+ // Process project file
+ QFile file(extractedProjectFile());
+ bool error = false;
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ error = true;
+ }
+ else {
+ QString playList = file.readAll();
+ file.close();
+ if (playList.isEmpty()) {
+ error = true;
+ }
+ else {
+ playList.replace("$CURRENTPATH", archive_url->url().path(KUrl::RemoveTrailingSlash));
+ if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+ kWarning() << "////// ERROR writing to file: ";
+ error = true;
+ }
+ else {
+ file.write(playList.toUtf8());
+ if (file.error() != QFile::NoError) {
+ error = true;
+ }
+ file.close();
+ }
+ }
+ }
+ if (error) {
+ KMessageBox::sorry(kapp->activeWindow(), i18n("Cannot open project file %1", extractedProjectFile()), i18n("Cannot open file"));
+ reject();
+ }
+ else accept();
+}