aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp')
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp160
1 files changed, 160 insertions, 0 deletions
diff --git a/src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp b/src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp
new file mode 100644
index 00000000..5d97457f
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-archiver/7ZBackend.cpp
@@ -0,0 +1,160 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "7ZBackend.h"
+#include <QFile>
+#include <QDebug>
+
+ZBackend::ZBackend(QObject *parent) : QObject(parent){
+ //Setup the backend process
+ PROC.setProcessChannelMode(QProcess::MergedChannels);
+ PROC.setProgram("7z");
+ connect(&PROC, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(procFinished(int, QProcess::ExitStatus)) );
+ connect(&PROC, SIGNAL(readyReadStandardOutput()), this, SLOT(processData()) );
+ connect(&PROC, SIGNAL(started()), this, SIGNAL(ProcessStarting()) );
+ LIST = STARTING = false;
+}
+
+ZBackend::~ZBackend(){
+
+}
+
+//===============
+// PUBLIC
+//===============
+void ZBackend::loadFile(QString path, QString pass){
+ filepath = path;
+ flags.clear();
+ //contents.clear();
+ //Now determine the flags which are used for this type of file (for later use)
+ if(!pass.isEmpty()){ flags << "-p"+pass; } //add password entry
+ //Look for some special file extensions which 7z can't seem to detect itself
+ QStringList ext = path.section("/",-1).section(".",1,-1).split(".");
+ if(ext.contains("tar")){
+ flags << "-ttar";
+ }
+ flags << filepath; //add the actual archive path
+ if(QFile::exists(path)){ startList(); }
+ else{ contents.clear(); emit ProcessFinished(); }
+}
+
+QString ZBackend::currentFile(){
+ return filepath;
+}
+
+bool ZBackend::isWorking(){
+ return (PROC.state() != QProcess::Running);
+}
+
+//Listing routines
+QStringList ZBackend::heirarchy(){
+ return contents.keys();
+}
+
+double ZBackend::size(QString file){
+ if(!contents.contains(file)){ return -1; }
+ return contents.value(file)[1].toDouble();
+}
+
+double ZBackend::csize(QString file){
+ if(!contents.contains(file)){ return -1; }
+ return contents.value(file)[2].toDouble();
+}
+
+bool ZBackend::isDir(QString file){
+ if(!contents.contains(file)){ return false; }
+ return contents.value(file)[0].startsWith("D");
+}
+
+//Modification routines
+void ZBackend::startAdd(QStringList paths){
+ QStringList args;
+ args << "a" << flags << paths;
+ STARTING=true;
+ PROC.start("7z", args);
+}
+
+void ZBackend::startRemove(QStringList paths){
+ QStringList args;
+ args << "d" << flags << paths;
+ STARTING=true;
+ PROC.start("7z", args);
+}
+
+void ZBackend::startExtract(QString path, bool preservepaths){
+ QStringList args;
+ args << (preservepaths ? "x" : "e") << flags << "-o"+path;
+ STARTING=true;
+ PROC.start("7z", args);
+}
+
+//===============
+// PUBLIC SLOTS
+//===============
+
+//===============
+// PRIVATE
+//===============
+void ZBackend::parseLines(QStringList lines){
+ if(STARTING){
+ //Ignore all the p7zip header info
+ while(STARTING && !lines.isEmpty()){
+ if(lines[0]=="--"){ STARTING = false; } //found the end of the headers
+ lines.removeAt(0);
+ }
+ }
+ for(int i=0; i<lines.length(); i++){
+ if(lines[i].simplified().isEmpty() || lines[i].contains(" = ") || lines[i].contains("----") ){ continue; }
+ if(LIST){
+ if(lines[i].contains(" Attr ") || lines[i].contains(", ") ){ continue; } //headers
+ QStringList info = lines[i].split(" ",QString::SkipEmptyParts);
+ //Format: [date, time, attr, size, compressed size, name]
+ if(info.length()<6){ continue; } //invalid line
+ while(info.length()>6){ info[5] = info[5]+" "+info[6]; info.removeAt(6); } //Filename has spaces in it
+ contents.insert(info[5], QStringList() << info[2] << info[3] << info[4]); //Save the
+ }
+ }
+}
+
+void ZBackend::startList(){
+ contents.clear();
+ QStringList args;
+ args << "l"; //list (lowercase L)
+ LIST = STARTING=true;
+ PROC.start("7z", QStringList() << args << flags);
+}
+
+//===============
+// PRIVATE SLOTS
+//===============
+void ZBackend::procFinished(int retcode, QProcess::ExitStatus){
+ processData();
+ //qDebug() << "Process Finished:" << PROC.arguments() << retcode;
+ LIST = STARTING = false;
+ if(PROC.arguments().contains("l")){
+ emit ProcessFinished();
+ }else{
+ if(retcode==0){
+ QStringList args = PROC.arguments();
+ for(int i=0; i<args.length(); i++){
+ if(args[i].startsWith("-o")){ QProcess::startDetached("xdg-open \""+ args[i].section("-o",1,-1)+"\""); } //just extracted to a dir - open it now
+ }
+ }
+ startList();
+ }
+}
+
+void ZBackend::processData(){
+ //Read the process
+ static QString data;
+ QString read = data+PROC.readAllStandardOutput();
+ if(read.endsWith("\n")){ data.clear(); }
+ else{ data = read.section("\n",-1); read = read.section("\n",0,-2); }
+ QStringList lines = read.split("\n",QString::SkipEmptyParts);
+ if(LIST){ parseLines(lines); }
+ //qDebug() << lines;
+ emit ProgressUpdate(-1, "");
+}
bgstack15