SVG5/dialogexportusb.cpp
2025-10-12 13:55:56 +09:00

573 lines
14 KiB
C++

#include "dialogexportusb.h"
#include "ui_dialogexportusb.h"
#include <QStorageInfo>
#include <QDebug>
#include <QThread>
#include <QProcess>
#include "mainwindow.h"
DialogExportUSB::DialogExportUSB(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogExportUSB)
{
//setAttribute(Qt::WA_TranslucentBackground);
//setWindowFlags(Qt::CustomizeWindowHint);
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::Popup);
//setWindowFlags(Qt::FramelessWindowHint);
ui->setupUi(this);
ui->label_InfoUSB->setGeometry(90, 60, 430, 190);
ui->label_InfoFile->hide();
ui->label_InfoProgress->hide();
ui->progressBar_File->hide();
ui->progressBar_Progress->hide();
m_nSyncCheckCount = 0;
//done(QDialog::Accepted);
ui->progressBar_Progress->setRange(0, 100);
ui->progressBar_File->setRange(0, 100);
ui->progressBar_File->setValue(0);
ui->progressBar_Progress->setValue(0);
ui->progressBar_Progress->setTextVisible(true);
ui->progressBar_File->setTextVisible(true);
ui->progressBar_File->setFormat("%v / %m File Exports");
m_nTypeExport = 0;
/*
QString strInfo;
CommonData* pCommonData = MainWindow::GetCommonData();
QString* pStrExternalDiskPath = pCommonData->GetExternalDiskPath();
pStrExternalDiskPath->clear();
Mount();
foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
qDebug() << storage.rootPath();
if (storage.isReadOnly())
qDebug() << "isReadOnly:" << storage.isReadOnly();
QString strName = storage.name();
QString strDevice = storage.device();
if(strDevice.contains("/dev/sd")==true)
{
QStringList strList;
*pStrExternalDiskPath = storage.rootPath();
//strList << "name:" << storage.name();
//strList << "fileSystemType:" << storage.fileSystemType();
//strList << "size:" << storage.bytesTotal()/1000/1000 << "MB";
//strList << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";
strInfo = QString("name: %1\r\nFieSystemType: %2\r\nFull Size: %3 MBytes\r\nAvailable Size: %4 MBytes\r\nSystem Path: %5").arg(storage.name()).arg((QString)storage.fileSystemType()).arg(storage.bytesTotal()/1000/1000).arg(storage.bytesAvailable()/1000/1000).arg(storage.rootPath());
m_nStorageFreeSize = storage.bytesAvailable()/1000/1000;
m_nStorageSize = storage.bytesTotal()/1000/1000;
}
}
ui->label_InfoUSB->setText(strInfo);
if(m_nStorageFreeSize>100)
{
ui->pushButton_Export->setEnabled(true);
ui->pushButton_Cancel->setEnabled(true);
}
else
{
ui->pushButton_Export->setEnabled(false);
ui->pushButton_Cancel->setEnabled(true);
}
*/
SThreadImageSave* pThread = MainWindow::GetCommonData()->GetThreadCaptureImage();
connect(pThread, SIGNAL(SetProgressExportFile(int, int)), this, SLOT(SetProgressExportFile(int, int)));
connect(pThread, SIGNAL(SetProgressExportPercent(quint64, quint64)), this, SLOT(SetProgressExportPercent(quint64, quint64)));
connect(pThread, SIGNAL(SetProgressSync(bool)), this, SLOT(SetProgressSync(bool)));
connect(pThread, SIGNAL(SetExportInit()), this, SLOT(SetExportInit()));
connect(pThread, SIGNAL(SetExportComplete()), this, SLOT(SetExportComplete()));
connect(this, SIGNAL(StartExport(int)), pThread, SLOT(StartExport(int)));
connect(this, SIGNAL(StopExport()), pThread, SLOT(StopExport()));
connect(&m_TimerSync, SIGNAL(timeout()), this, SLOT(SyncUpdate()));
connect(&m_TimerDeferred, SIGNAL(timeout()), this, SLOT(OnDeferredInit()));
connect(&m_Process, SIGNAL(finished(int)), this, SLOT(ProcessFinish(int)));
connect(&m_Process, SIGNAL(readyReadStandardOutput()), this, SLOT(ProcessReadyReadStandardOutput()));
connect(&m_Process, SIGNAL(readyReadStandardError()), this, SLOT(ProcessReadyReadStandardError()));
m_TimerDeferred.setSingleShot(true);
m_TimerDeferred.setInterval(100);
m_TimerDeferred.start(100);
}
DialogExportUSB::~DialogExportUSB()
{
SThreadImageSave* pThread = MainWindow::GetCommonData()->GetThreadCaptureImage();
disconnect(pThread, SIGNAL(SetProgressExportFile(int, int)), this, SLOT(SetProgressExportFile(int, int)));
disconnect(pThread, SIGNAL(SetProgressExportPercent(quint64, quint64)), this, SLOT(SetProgressExportPercent(quint64, quint64)));
disconnect(pThread, SIGNAL(SetProgressSync(bool)), this, SLOT(SetProgressSync(bool)));
disconnect(this, SIGNAL(StartExport(int)), pThread, SLOT(StartExport(int)));
disconnect(this, SIGNAL(StopExport()), pThread, SLOT(StopExport()));
disconnect(&m_TimerSync, SIGNAL(timeout()), this, SLOT(SyncUpdate()));
delete ui;
}
void DialogExportUSB::on_pushButton_Cancel_clicked()
{
StopExport();
if(m_TimerSync.isActive()==true)
{
m_TimerSync.stop();
}
Umount();
done(QDialog::Rejected);
}
void DialogExportUSB::on_pushButton_Export_clicked()
{
m_nSyncCheckCount = 0;
//done(QDialog::Accepted);
ui->label_InfoUSB->hide();
ui->label_InfoFile->show();
ui->label_InfoProgress->show();
ui->progressBar_File->show();
ui->progressBar_Progress->show();
ui->progressBar_Progress->setRange(0, 100);
ui->progressBar_Progress->setTextVisible(true);
ui->progressBar_File->setTextVisible(true);
ui->progressBar_File->setFormat("%v / %m File Exports");
update();
StartExport(m_nTypeExport);
return;
int i=0;
for(i=1 ; i<101 ; i++)
{
ui->progressBar_Progress->setValue(i);
QThread::usleep(100*1000);
update();
}
}
void DialogExportUSB::SetProgressExportFile(int nProgress, int nTotal)
{
ui->progressBar_File->setRange(1, nTotal);
ui->progressBar_File->setValue(nProgress);
QString strInfo;
strInfo = QString("%1 / %2 File Exports").arg(nProgress).arg(nTotal);
ui->progressBar_File->setFormat(strInfo);
}
void DialogExportUSB::SetProgressExportPercent(quint64 nProgress, quint64 nTotal)
{
int nPercentage = (float)(100.0f*(float)nProgress/(float)nTotal);
if(nPercentage>100)
{
nPercentage = 100;
}
ui->progressBar_Progress->setRange(1, 100);
ui->progressBar_Progress->setValue(nPercentage);
//ui->progressBar_Progress->setRange(1, nTotal);
//ui->progressBar_Progress->setValue(nProgress);
ui->progressBar_Progress->resetFormat();
}
void DialogExportUSB::SetProgressSync(bool bComplete)
{
if(bComplete==false)
{
m_TimerSync.setInterval(300);
m_TimerSync.start();
//ui->label_InfoProgress->hide();
//ui->progressBar_Progress->hide();
//ui->label_InfoFile->setText("Export Sync");
ui->label_InfoProgress->setText("Export Sync");
ui->pushButton_Export->setDisabled(true);
ui->pushButton_Export->hide();
ui->pushButton_Cancel->setDisabled(true);
ui->pushButton_Cancel->setGeometry(240, 310, 130, 40);
}
else
{
if(m_TimerSync.isActive()==true)
{
m_TimerSync.stop();
//ui->progressBar_File->setFormat("Export Complete");
//ui->progressBar_Progress->setFormat("Export Complete");
}
}
}
void DialogExportUSB::SyncUpdate()
{
m_nSyncCheckCount++;
m_nSyncCheckCount = m_nSyncCheckCount%10;
QString strInfo;
strInfo = " Export File Sync ";
int i=0;
for(i=0 ; i<m_nSyncCheckCount ; i++)
{
strInfo += ". ";
}
//ui->progressBar_File->setFormat(strInfo);
ui->progressBar_Progress->setFormat(strInfo);
}
void DialogExportUSB::Mount()
{
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("echo 1");
#ifdef _PC
process2.start("sudo -S mount -o uid=1000,gid=1000 /dev/sdb1 /home/birdhead/test");
#else
process2.start("sudo -S mount -o uid=1000,gid=1000 /dev/sda1 /home/birdhead/test");
#endif
process2.setProcessChannelMode(QProcess::ForwardedChannels);
// Wait for it to start
if(!process1.waitForStarted())
return;
bool retval = false;
QByteArray buffer;
// To be fair: you only need to wait here for a bit with shutdown,
// but I will still leave the rest here for a generic solution
while ((retval = process2.waitForFinished()))
{
buffer.append(process2.readAll());
}
process1.terminate();
process2.terminate();
process1.waitForFinished(100);
process2.waitForFinished(100);
process1.deleteLater();
process2.deleteLater();
buffer.clear();
QString strInfo;
CommonData* pCommonData = MainWindow::GetCommonData();
QString* pStrExternalDiskPath = pCommonData->GetExternalDiskPath();
pStrExternalDiskPath->clear();
foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
qDebug() << storage.rootPath();
if (storage.isReadOnly())
qDebug() << "isReadOnly:" << storage.isReadOnly();
QString strName = storage.name();
QString strDevice = storage.device();
if(strDevice.contains("/dev/sd")==true)
{
QStringList strList;
*pStrExternalDiskPath = storage.rootPath();
//strList << "name:" << storage.name();
//strList << "fileSystemType:" << storage.fileSystemType();
//strList << "size:" << storage.bytesTotal()/1000/1000 << "MB";
//strList << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";
strInfo = QString("name: %1\r\nFieSystemType: %2\r\nFull Size: %3 MBytes\r\nAvailable Size: %4 MBytes\r\nSystem Path: %5").arg(storage.name()).arg((QString)storage.fileSystemType()).arg(storage.bytesTotal()/1000/1000).arg(storage.bytesAvailable()/1000/1000).arg(storage.rootPath());
m_nStorageFreeSize = storage.bytesAvailable()/1000/1000;
m_nStorageSize = storage.bytesTotal()/1000/1000;
}
}
SetInfoString(strInfo);
if(m_nStorageFreeSize>100)
{
SetExportEnable(true);
}
else
{
SetExportEnable(false);
}
/*
ui->label_InfoUSB->setText(strInfo);
if(m_nStorageFreeSize>100)
{
ui->pushButton_Export->setEnabled(true);
ui->pushButton_Cancel->setEnabled(true);
}
else
{
ui->pushButton_Export->setEnabled(false);
ui->pushButton_Cancel->setEnabled(true);
}
*/
}
void DialogExportUSB::Umount()
{
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2);
process1.start("echo 1");
process2.start("sudo -S umount /home/birdhead/test");
process2.setProcessChannelMode(QProcess::ForwardedChannels);
// Wait for it to start
if(!process1.waitForStarted())
return;
bool retval = false;
QByteArray buffer;
// To be fair: you only need to wait here for a bit with shutdown,
// but I will still leave the rest here for a generic solution
while ((retval = process2.waitForFinished()))
{
buffer.append(process2.readAll());
}
process1.terminate();
process2.terminate();
process1.waitForFinished(100);
process2.waitForFinished(100);
process1.deleteLater();
process2.deleteLater();
buffer.clear();
}
void DialogExportUSB::SetExportComplete()
{
ui->progressBar_File->setFormat("Export Complete");
//ui->progressBar_Progress->setFormat("Export Complete");
ui->label_InfoProgress->hide();
ui->progressBar_Progress->hide();
ui->pushButton_Cancel->setDisabled(false);
Umount();
}
void DialogExportUSB::SetExportInit()
{
ui->progressBar_File->setFormat("");
//ui->progressBar_Progress->setFormat("Export Complete");
ui->label_InfoProgress->show();
ui->progressBar_Progress->show();
ui->pushButton_Cancel->setDisabled(false);
}
void DialogExportUSB::OnDeferredInit()
{
QString strInfo;
CommonData* pCommonData = MainWindow::GetCommonData();
QString* pStrExternalDiskPath = pCommonData->GetExternalDiskPath();
pStrExternalDiskPath->clear();
Mount();
/*
foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
qDebug() << storage.rootPath();
if (storage.isReadOnly())
qDebug() << "isReadOnly:" << storage.isReadOnly();
QString strName = storage.name();
QString strDevice = storage.device();
if(strDevice.contains("/dev/sd")==true)
{
QStringList strList;
*pStrExternalDiskPath = storage.rootPath();
//strList << "name:" << storage.name();
//strList << "fileSystemType:" << storage.fileSystemType();
//strList << "size:" << storage.bytesTotal()/1000/1000 << "MB";
//strList << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";
strInfo = QString("name: %1\r\nFieSystemType: %2\r\nFull Size: %3 MBytes\r\nAvailable Size: %4 MBytes\r\nSystem Path: %5").arg(storage.name()).arg((QString)storage.fileSystemType()).arg(storage.bytesTotal()/1000/1000).arg(storage.bytesAvailable()/1000/1000).arg(storage.rootPath());
m_nStorageFreeSize = storage.bytesAvailable()/1000/1000;
m_nStorageSize = storage.bytesTotal()/1000/1000;
}
}
SetInfoString(strInfo);
if(m_nStorageFreeSize>100)
{
SetExportEnable(true);
}
else
{
SetExportEnable(false);
}
*/
}
void DialogExportUSB::ProcessFinish(int nRet)
{
}
void DialogExportUSB::ProcessReadyReadStandardOutput()
{
}
void DialogExportUSB::ProcessReadyReadStandardError()
{
}
void DialogExportUSB::SetInfoString(QString strInfo)
{
ui->label_InfoUSB->setText(strInfo);
}
void DialogExportUSB::SetExportEnable(bool bEnable)
{
if(bEnable==true)
{
ui->pushButton_Export->setEnabled(true);
ui->pushButton_Cancel->setEnabled(true);
}
else
{
//ui->pushButton_Export->setEnabled(false);
//ui->pushButton_Cancel->setEnabled(true);
ui->pushButton_Export->setDisabled(true);
ui->pushButton_Export->hide();
ui->pushButton_Cancel->setEnabled(true);
ui->pushButton_Cancel->setGeometry(240, 310, 130, 40);
}
}
void DialogExportUSB::reject()
{
return;
}