SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/QgScope/qgrunsession.cpp
2025-12-17 07:59:30 +01:00

331 lines
6.8 KiB
C++

#include "qgrunsession.h"
#include "qglogger.h"
#include <QDir>
#include <QFileInfo>
#include <QFile>
#include <QDateTime>
#include <QMessageBox>
#include <QDebug>
static QgRunSession* defSession;
class DirCx: public QDir
{
public:
};
class QgRunSession::Implementation
{
public:
QgLogger logger;
DirCx workDir;
DirCx outDir;
DirCx sessionDir;
QString sessionName;
bool outValid;
bool outEnable;
bool interactive;
Implementation():
logger("GS")
{
}
};
QgRunSession::QgRunSession(const QString & name):
p_(*new Implementation)
{
setObjectName(name);
p_.workDir.setPath(QDir::currentPath());
p_.outDir.setPath("out");
p_.sessionName="current";
p_.sessionDir.setPath("out/current");
p_.outEnable=false;
p_.outValid=false;
p_.interactive=false;
}
QgRunSession::~QgRunSession()
{
}
QgRunSession& QgRunSession::defaultSession()
{
if (!defSession)
{
defSession=new QgRunSession("qgDefaultRunSession");
}
return *defSession;
}
QString QgRunSession::currentDirPath() const
{
return QDir::currentPath();
}
const QDir& QgRunSession::workDir() const
{
return p_.workDir;
}
const QDir& QgRunSession::outDir() const
{
return p_.outDir;
}
const QDir& QgRunSession::sessionDir() const
{
return p_.sessionDir;
}
void QgRunSession::setWorkDirPath(const QString &path_)
{
QString path=QDir::cleanPath(path_);
QString oldPath=p_.workDir.absolutePath();
bool ok=QDir::setCurrent(path);
if (!ok)
{
QString msg=QString("FAIL setWorkDirPath(%1)").arg(path);
qErrnoWarning(msg.toLatin1().constData());
if (p_.interactive)
{
QMessageBox::warning(0, "RunSession: Invalid Working Directory", QString("Invalid working directory %1").arg(path));
}
}
p_.workDir.setPath(QDir::currentPath());
if (oldPath!=p_.workDir.absolutePath())
{
p_.logger.debug("Working Directory", p_.workDir.absolutePath());
emit workDirChanged();
if (p_.outDir.isRelative())
setOutDirPath(outDirPath());
}
}
QString QgRunSession::workDirPath() const
{
return p_.workDir.path();
}
void QgRunSession::setOutDirPath(const QString & path_)
{
QString path=QDir::cleanPath(path_);
QString oldPath=p_.outDir.absolutePath();
p_.outDir.setPath(path);
if (oldPath!=p_.outDir.absolutePath())
{
p_.logger.debug("Output Directory", p_.outDir.absolutePath());
emit sessionDirChanged();
if (p_.sessionDir.isRelative())
setSessionDirPath(p_.sessionName);
}
}
QString QgRunSession::outDirPath() const
{
return p_.outDir.path();
}
void QgRunSession::setSessionDirPath(const QString &path_)
{
//QString path=QDir::cleanPath(path_);
QFileInfo info(path_);
QString path=info.fileName();
if (path.contains("%1"))
{
path=QString(path).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd-hh_mm-ss"));
}
if (info.isAbsolute() || path!=path_)
{
p_.logger.warning(QString("Session path sould be relative. Only \"%1\" considered").arg(path), path_);
}
//QString oldPath=p_.sessionDir.absolutePath();
p_.sessionName=path;
p_.sessionDir=p_.outDir;
//p_.sessionDir.cd(path);
p_.sessionDir.setPath(p_.outDir.path()+"/"+path);
//if (oldPath!=p_.sessionDir.absolutePath())
{
p_.logger.debug("Session Directory", p_.sessionDir.absolutePath());
emit sessionDirChanged();
}
}
QString QgRunSession::sessionDirPath() const
{
return p_.sessionDir.path();
}
bool QgRunSession::outValid() const
{
return p_.outValid;
}
void QgRunSession::setOutValid(bool valid)
{
bool old=p_.outValid;
bool old_ena=outEnable();
p_.outValid=valid;
if (old!=valid)
emit outValidChanged(valid);
if (old_ena!=outEnable())
emit outEnableChanged(outEnable());
}
bool QgRunSession::outEnable() const
{
return p_.outEnable && p_.outValid;
}
void QgRunSession::setOutEnable(bool enable)
{
bool old=outEnable();
p_.outEnable=enable;
if (old!=outEnable())
emit outEnableChanged(outEnable());
}
//enum OutValidationFlags { OutDirNoCreate, OutDirCreate, OutDirCreateOnDemand};
bool QgRunSession::validateOutputDirectory(OutValidationFlags f)
{
int need_create=0;
//setOutValid(false);
QFileInfo info(p_.outDir.path());
if (p_.outDir.exists())
{
if (!info.isDir() || !info.isWritable())
return false;
}
else
need_create=1;
if (!need_create)
{
info.setFile(p_.sessionDir.path());
if (info.exists())
{
if (!info.isDir() || !info.isWritable())
{
setOutValid(false);
return false;
}
}
else
need_create=2;
}
if (need_create)
{
if (f==OutDirCreateOnDemand)
{
QMessageBox::StandardButton res=QMessageBox::question(0, "RunSession", QString("Create sessiondirectory %1 ?").arg(p_.sessionDir.absolutePath()), QMessageBox::Yes|QMessageBox::No);
if (res!=QMessageBox::Yes)
{
setOutValid(false);
return false;
}
}
else if (f!=OutDirCreate)
{
setOutValid(false);
return false;
}
bool ok=p_.sessionDir.mkpath(p_.sessionDir.absolutePath());
if (!ok)
{
QString msg=QString("FAIL mkpath(%1)").arg(p_.sessionDir.absolutePath());
qErrnoWarning(msg.toLatin1().constData());
if (f==OutDirCreateOnDemand) //p_.interactive)
{
QMessageBox::warning(0, "RunSession: Invalid Session Directory", QString("Cannot create directory %1").arg(p_.sessionDir.absolutePath()));
}
setOutValid(false);
return false;
}
}
setOutValid(true);
return true;
}
QString QgRunSession::checkArg(const QString& arg, const QString &prefix)
{
QString tmp;
if (arg.startsWith(prefix))
{
tmp=arg;
tmp=tmp.remove(prefix);
}
return tmp;
}
bool QgRunSession::parseStandardArguments(QStringList &lst, bool interactive)
{
QStringList purgedList;
p_.interactive=interactive;
foreach(QString arg, lst)
{
if (arg.startsWith("-cx:wd="))
{
arg.remove("-cx:wd=");
setWorkDirPath(arg);
continue;
}
if (arg.startsWith("-cx:out="))
{
arg.remove("-cx:out=");
setOutDirPath(arg);
continue;
}
purgedList.append(arg);
}
p_.interactive=false;
lst=purgedList;
return true;
}
#if 0
bool create_dirs=false;
if (!workingDirectory.isEmpty())
{
bool res=QDir::setCurrent(workingDirectory);
if (!res)
qgLogger().logError(QString("FAILED QDir::setCurrentDir(%1)").arg(workingDirectory));
}
qgLogger().logInfo(QString("Working directory: %1").arg(QDir::currentPath()));
QFileInfo outDir(outBaseDirectory);
if (outDir.exists())
{
if (!outDir.isDir())
{
QMessageBox::warning(this, "Invliad output directory", "Output directory exists and it is a file. Result storing disabled");
}
QDir tmp(outDir.filePath());
tmp.cd(outSessionDirectory);
if (tmp.exists())
}
else
{
StandardButton rs=QMessageBox::question(this, "Output Directory doesn't exit", "Create it?", QMessageBox::Yes|QMessageBox::No);
create_dir=res==QMessageBox::Yes;
}
#endif