Browse Source

some work on qt

pull/1491/head
user 5 years ago
parent
commit
ee73ee365f
  1. 4
      .gitignore
  2. 3
      qt/i2pd_qt/DelayedSaveManager.cpp
  3. 24
      qt/i2pd_qt/DelayedSaveManager.h
  4. 140
      qt/i2pd_qt/DelayedSaveManagerImpl.cpp
  5. 82
      qt/i2pd_qt/DelayedSaveManagerImpl.h
  6. 6
      qt/i2pd_qt/Saver.cpp
  7. 22
      qt/i2pd_qt/Saver.h
  8. 79
      qt/i2pd_qt/SaverImpl.cpp
  9. 33
      qt/i2pd_qt/SaverImpl.h
  10. 2
      qt/i2pd_qt/TunnelPane.cpp
  11. 14
      qt/i2pd_qt/i2pd_qt.pro
  12. 103
      qt/i2pd_qt/mainwindow.cpp
  13. 29
      qt/i2pd_qt/mainwindow.h

4
.gitignore vendored

@ -264,3 +264,7 @@ qt/i2pd_qt/*.ui_*
#unknown android stuff #unknown android stuff
android/libs/ android/libs/
#various logs
*LOGS/

3
qt/i2pd_qt/DelayedSaveManager.cpp

@ -0,0 +1,3 @@
#include "DelayedSaveManager.h"
DelayedSaveManager::DelayedSaveManager(){}

24
qt/i2pd_qt/DelayedSaveManager.h

@ -0,0 +1,24 @@
#ifndef DELAYEDSAVEMANAGER_H
#define DELAYEDSAVEMANAGER_H
#include "Saver.h"
class DelayedSaveManager
{
public:
DelayedSaveManager();
virtual void setSaver(Saver* saver)=0;
typedef unsigned int DATA_SERIAL_TYPE;
virtual void delayedSave(DATA_SERIAL_TYPE dataSerial, bool needsTunnelFocus, std::string tunnelNameToFocus)=0;
//returns false iff save failed
virtual bool appExiting()=0;
virtual bool needsFocusOnTunnel()=0;
virtual std::string getTunnelNameToFocus()=0;
};
#endif // DELAYEDSAVEMANAGER_H

140
qt/i2pd_qt/DelayedSaveManagerImpl.cpp

@ -0,0 +1,140 @@
#include "DelayedSaveManagerImpl.h"
DelayedSaveManagerImpl::DelayedSaveManagerImpl() :
saver(nullptr),
lastDataSerialSeen(DelayedSaveManagerImpl::INITIAL_DATA_SERIAL),
lastSaveStartedTimestamp(A_VERY_OBSOLETE_TIMESTAMP),
exiting(false),
thread(new DelayedSaveThread(this))
{
}
void DelayedSaveManagerImpl::setSaver(Saver* saver) {
this->saver = saver;
}
void DelayedSaveManagerImpl::start() {
thread->start();
}
bool DelayedSaveManagerImpl::isSaverValid() {
return saver != nullptr;
}
void DelayedSaveManagerImpl::delayedSave(DATA_SERIAL_TYPE dataSerial, bool focusOnTunnel, std::string tunnelNameToFocus) {
if(lastDataSerialSeen==dataSerial)return;
this->focusOnTunnel = focusOnTunnel;
this->tunnelNameToFocus = tunnelNameToFocus;
lastDataSerialSeen=dataSerial;
assert(isSaverValid());
TIMESTAMP_TYPE now = getTime();
TIMESTAMP_TYPE wakeTime = lastSaveStartedTimestamp + DelayedSaveThread::WAIT_TIME_MILLIS;
if(now < wakeTime) {
//defer save until lastSaveStartedTimestamp + DelayedSaveThread::WAIT_TIME_MILLIS
thread->deferSaveUntil(wakeTime);
return;
}
lastSaveStartedTimestamp = now;
thread->startSavingNow();
}
bool DelayedSaveManagerImpl::appExiting() {
exiting=true;
thread->wakeThreadAndJoinThread();
assert(isSaverValid());
saver->save(false, "");
return true;
}
DelayedSaveThread::DelayedSaveThread(DelayedSaveManagerImpl* delayedSaveManagerImpl_):
delayedSaveManagerImpl(delayedSaveManagerImpl_),
mutex(new QMutex()),
waitCondition(new QWaitCondition()),
saveNow(false),
defer(false)
{
mutex->lock();
}
DelayedSaveThread::~DelayedSaveThread(){
mutex->unlock();
delete mutex;
delete waitCondition;
}
void DelayedSaveThread::run() {
forever {
if(delayedSaveManagerImpl->isExiting())return;
waitCondition->wait(mutex, WAIT_TIME_MILLIS);
if(delayedSaveManagerImpl->isExiting())return;
Saver* saver = delayedSaveManagerImpl->getSaver();
assert(saver!=nullptr);
if(saveNow) {
saveNow = false;
const bool focusOnTunnel = delayedSaveManagerImpl->needsFocusOnTunnel();
const std::string tunnelNameToFocus = delayedSaveManagerImpl->getTunnelNameToFocus();
saver->save(focusOnTunnel, tunnelNameToFocus);
continue;
}
if(defer) {
defer=false;
#define max(a,b) (((a)>(b))?(a):(b))
forever {
TIMESTAMP_TYPE now = DelayedSaveManagerImpl::getTime();
TIMESTAMP_TYPE millisToWait = max(wakeTime-now, 0);
if(millisToWait>0) {
waitCondition->wait(mutex, millisToWait);
if(delayedSaveManagerImpl->isExiting())return;
continue;
}
const bool focusOnTunnel = delayedSaveManagerImpl->needsFocusOnTunnel();
const std::string tunnelNameToFocus = delayedSaveManagerImpl->getTunnelNameToFocus();
saver->save(focusOnTunnel, tunnelNameToFocus);
break; //break inner loop
}
}
}
}
void DelayedSaveThread::wakeThreadAndJoinThread() {
waitCondition->wakeAll();
quit();
wait();//join //"similar to the POSIX pthread_join()"
}
DelayedSaveManagerImpl::TIMESTAMP_TYPE DelayedSaveManagerImpl::getTime() {
return QDateTime::currentMSecsSinceEpoch();
}
void DelayedSaveThread::deferSaveUntil(TIMESTAMP_TYPE wakeTime_) {
wakeTime = wakeTime_;
defer = true;
waitCondition->wakeAll();
}
void DelayedSaveThread::startSavingNow() {
//mutex->lock();
saveNow=true;
waitCondition->wakeAll();
//mutex->unlock();
}
DelayedSaveManagerImpl::~DelayedSaveManagerImpl() {
thread->wakeThreadAndJoinThread();
delete thread;
}
bool DelayedSaveManagerImpl::isExiting() {
return exiting;
}
Saver* DelayedSaveManagerImpl::getSaver() {
return saver;
}
bool DelayedSaveManagerImpl::needsFocusOnTunnel() {
return focusOnTunnel;
}
std::string DelayedSaveManagerImpl::getTunnelNameToFocus() {
return tunnelNameToFocus;
}

82
qt/i2pd_qt/DelayedSaveManagerImpl.h

@ -0,0 +1,82 @@
#ifndef DELAYEDSAVEMANAGERIMPL_H
#define DELAYEDSAVEMANAGERIMPL_H
#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
#include <QDateTime>
#include "mainwindow.h"
#include "DelayedSaveManager.h"
#include "Saver.h"
class DelayedSaveManagerImpl;
class DelayedSaveThread : public QThread
{
Q_OBJECT
public:
static constexpr unsigned long WAIT_TIME_MILLIS = 1000L;
typedef qint64 TIMESTAMP_TYPE;
static constexpr TIMESTAMP_TYPE A_VERY_OBSOLETE_TIMESTAMP=0;
DelayedSaveThread(DelayedSaveManagerImpl* delayedSaveManagerImpl);
virtual ~DelayedSaveThread();
void run() override;
void deferSaveUntil(TIMESTAMP_TYPE wakeTime);
void startSavingNow();
void wakeThreadAndJoinThread();
private:
DelayedSaveManagerImpl* delayedSaveManagerImpl;
QMutex* mutex;
QWaitCondition* waitCondition;
volatile bool saveNow;
volatile bool defer;
volatile TIMESTAMP_TYPE wakeTime;
};
class DelayedSaveManagerImpl : public DelayedSaveManager
{
public:
DelayedSaveManagerImpl();
virtual ~DelayedSaveManagerImpl();
virtual void setSaver(Saver* saver);
virtual void start();
virtual void delayedSave(DATA_SERIAL_TYPE dataSerial, bool focusOnTunnel, std::string tunnelNameToFocus);
virtual bool appExiting();
typedef DelayedSaveThread::TIMESTAMP_TYPE TIMESTAMP_TYPE;
static constexpr DATA_SERIAL_TYPE INITIAL_DATA_SERIAL=0;
bool isExiting();
Saver* getSaver();
static TIMESTAMP_TYPE getTime();
bool needsFocusOnTunnel();
std::string getTunnelNameToFocus();
private:
Saver* saver;
bool isSaverValid();
volatile DATA_SERIAL_TYPE lastDataSerialSeen;
static constexpr TIMESTAMP_TYPE A_VERY_OBSOLETE_TIMESTAMP=DelayedSaveThread::A_VERY_OBSOLETE_TIMESTAMP;
TIMESTAMP_TYPE lastSaveStartedTimestamp;
volatile bool exiting;
DelayedSaveThread* thread;
void wakeThreadAndJoinThread();
volatile bool focusOnTunnel;
std::string tunnelNameToFocus;
};
#endif // DELAYEDSAVEMANAGERIMPL_H

6
qt/i2pd_qt/Saver.cpp

@ -0,0 +1,6 @@
#include "Saver.h"
Saver::Saver()
{
}

22
qt/i2pd_qt/Saver.h

@ -0,0 +1,22 @@
#ifndef SAVER_H
#define SAVER_H
#include <string>
#include <QObject>
#include <QString>
class Saver : public QObject
{
Q_OBJECT
public:
Saver();
//false iff failures
virtual bool save(const bool focusOnTunnel, const std::string& tunnelNameToFocus)=0;
signals:
void reloadTunnelsConfigAndUISignal(const QString);
};
#endif // SAVER_H

79
qt/i2pd_qt/SaverImpl.cpp

@ -0,0 +1,79 @@
#include "SaverImpl.h"
#include <fstream>
#include <assert.h>
#include <sstream>
#include "QList"
#include "QString"
#include "mainwindow.h"
SaverImpl::SaverImpl(MainWindow *mainWindowPtr_, QList<MainWindowItem*> * configItems_, std::map<std::string,TunnelConfig*>* tunnelConfigs_) :
configItems(configItems_), tunnelConfigs(tunnelConfigs_), confpath(), tunconfpath(), mainWindowPtr(mainWindowPtr_)
{}
SaverImpl::~SaverImpl() {}
bool SaverImpl::save(const bool focusOnTunnel, const std::string& tunnelNameToFocus) {
//save main config
{
std::stringstream out;
for(QList<MainWindowItem*>::iterator it = configItems->begin(); it!= configItems->end(); ++it) {
MainWindowItem* item = *it;
item->saveToStringStream(out);
}
using namespace std;
QString backup=confpath+"~";
if(QFile::exists(backup)) QFile::remove(backup);//TODO handle errors
if(QFile::exists(confpath)) QFile::rename(confpath, backup);//TODO handle errors
ofstream outfile;
outfile.open(confpath.toStdString());//TODO handle errors
outfile << out.str().c_str();
outfile.close();
}
//save tunnels config
{
std::stringstream out;
for (std::map<std::string,TunnelConfig*>::iterator it=tunnelConfigs->begin(); it!=tunnelConfigs->end(); ++it) {
//const std::string& name = it->first;
TunnelConfig* tunconf = it->second;
tunconf->saveHeaderToStringStream(out);
tunconf->saveToStringStream(out);
tunconf->saveI2CPParametersToStringStream(out);
}
using namespace std;
QString backup=tunconfpath+"~";
if(QFile::exists(backup)) QFile::remove(backup);//TODO handle errors
if(QFile::exists(tunconfpath)) QFile::rename(tunconfpath, backup);//TODO handle errors
ofstream outfile;
outfile.open(tunconfpath.toStdString());//TODO handle errors
outfile << out.str().c_str();
outfile.close();
}
//reload saved configs
#if 0
i2p::client::context.ReloadConfig();
#endif
if(focusOnTunnel) emit reloadTunnelsConfigAndUISignal(QString::fromStdString(tunnelNameToFocus));
return true;
}
void SaverImpl::setConfPath(QString& confpath_) { confpath = confpath_; }
void SaverImpl::setTunnelsConfPath(QString& tunconfpath_) { tunconfpath = tunconfpath_; }
/*void SaverImpl::setTunnelFocus(bool focusOnTunnel, std::string tunnelNameToFocus) {
this->focusOnTunnel=focusOnTunnel;
this->tunnelNameToFocus=tunnelNameToFocus;
}*/

33
qt/i2pd_qt/SaverImpl.h

@ -0,0 +1,33 @@
#ifndef SAVERIMPL_H
#define SAVERIMPL_H
#include <map>
#include <string>
#include <QObject>
#include "QList"
#include "mainwindow.h"
#include "TunnelConfig.h"
#include "Saver.h"
class MainWindowItem;
class TunnelConfig;
class SaverImpl : public Saver
{
public:
SaverImpl(MainWindow *mainWindowPtr_, QList<MainWindowItem*> * configItems_, std::map<std::string,TunnelConfig*>* tunnelConfigs_);
virtual ~SaverImpl();
virtual bool save(const bool focusOnTunnel, const std::string& tunnelNameToFocus);
void setConfPath(QString& confpath_);
void setTunnelsConfPath(QString& tunconfpath_);
private:
QList<MainWindowItem*> * configItems;
std::map<std::string,TunnelConfig*>* tunnelConfigs;
QString confpath;
QString tunconfpath;
MainWindow* mainWindowPtr;
};
#endif // SAVERIMPL_H

2
qt/i2pd_qt/TunnelPane.cpp

@ -64,7 +64,7 @@ void TunnelPane::setupTunnelPane(
//type //type
{ {
const QString& type = tunnelConfig->getType(); //const QString& type = tunnelConfig->getType();
QHBoxLayout * horizontalLayout_ = new QHBoxLayout(); QHBoxLayout * horizontalLayout_ = new QHBoxLayout();
horizontalLayout_->setObjectName(QStringLiteral("horizontalLayout_")); horizontalLayout_->setObjectName(QStringLiteral("horizontalLayout_"));
typeLabel = new QLabel(gridLayoutWidget_2); typeLabel = new QLabel(gridLayoutWidget_2);

14
qt/i2pd_qt/i2pd_qt.pro

@ -62,6 +62,7 @@ SOURCES += DaemonQT.cpp mainwindow.cpp \
../../libi2pd/TunnelGateway.cpp \ ../../libi2pd/TunnelGateway.cpp \
../../libi2pd/TunnelPool.cpp \ ../../libi2pd/TunnelPool.cpp \
../../libi2pd/util.cpp \ ../../libi2pd/util.cpp \
../../libi2pd/Elligator.cpp \
../../libi2pd_client/AddressBook.cpp \ ../../libi2pd_client/AddressBook.cpp \
../../libi2pd_client/BOB.cpp \ ../../libi2pd_client/BOB.cpp \
../../libi2pd_client/ClientContext.cpp \ ../../libi2pd_client/ClientContext.cpp \
@ -89,7 +90,11 @@ SOURCES += DaemonQT.cpp mainwindow.cpp \
pagewithbackbutton.cpp \ pagewithbackbutton.cpp \
widgetlock.cpp \ widgetlock.cpp \
widgetlockregistry.cpp \ widgetlockregistry.cpp \
logviewermanager.cpp logviewermanager.cpp \
DelayedSaveManager.cpp \
Saver.cpp \
DelayedSaveManagerImpl.cpp \
SaverImpl.cpp
HEADERS += DaemonQT.h mainwindow.h \ HEADERS += DaemonQT.h mainwindow.h \
../../libi2pd/api.h \ ../../libi2pd/api.h \
@ -147,6 +152,7 @@ HEADERS += DaemonQT.h mainwindow.h \
../../libi2pd/TunnelPool.h \ ../../libi2pd/TunnelPool.h \
../../libi2pd/util.h \ ../../libi2pd/util.h \
../../libi2pd/version.h \ ../../libi2pd/version.h \
../../libi2pd/Elligator.h \
../../libi2pd_client/AddressBook.h \ ../../libi2pd_client/AddressBook.h \
../../libi2pd_client/BOB.h \ ../../libi2pd_client/BOB.h \
../../libi2pd_client/ClientContext.h \ ../../libi2pd_client/ClientContext.h \
@ -175,7 +181,11 @@ HEADERS += DaemonQT.h mainwindow.h \
widgetlock.h \ widgetlock.h \
widgetlockregistry.h \ widgetlockregistry.h \
i2pd.rc \ i2pd.rc \
logviewermanager.h logviewermanager.h \
DelayedSaveManager.h \
Saver.h \
DelayedSaveManagerImpl.h \
SaverImpl.h
INCLUDEPATH += ../../libi2pd INCLUDEPATH += ../../libi2pd
INCLUDEPATH += ../../libi2pd_client INCLUDEPATH += ../../libi2pd_client

103
qt/i2pd_qt/mainwindow.cpp

@ -1,11 +1,8 @@
#include <fstream>
#include <assert.h>
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_mainwindow.h" #include "ui_mainwindow.h"
#include "ui_statusbuttons.h" #include "ui_statusbuttons.h"
#include "ui_routercommandswidget.h" #include "ui_routercommandswidget.h"
#include "ui_generalsettingswidget.h" #include "ui_generalsettingswidget.h"
#include <sstream>
#include <QScrollBar> #include <QScrollBar>
#include <QMessageBox> #include <QMessageBox>
#include <QTimer> #include <QTimer>
@ -29,17 +26,22 @@
#include "logviewermanager.h" #include "logviewermanager.h"
#include "DelayedSaveManagerImpl.h"
#include "SaverImpl.h"
std::string programOptionsWriterCurrentSection; std::string programOptionsWriterCurrentSection;
MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *parent) : MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *parent) :
QMainWindow(parent) QMainWindow(parent)
,logStream(logStream_) ,logStream(logStream_)
#ifndef ANDROID ,delayedSaveManagerPtr(new DelayedSaveManagerImpl())
,quitting(false) ,dataSerial(DelayedSaveManagerImpl::INITIAL_DATA_SERIAL)
#endif
,wasSelectingAtStatusMainPage(false) ,wasSelectingAtStatusMainPage(false)
,showHiddenInfoStatusMainPage(false) ,showHiddenInfoStatusMainPage(false)
,logViewerManagerPtr(nullptr) ,logViewerManagerPtr(nullptr)
#ifndef ANDROID
,quitting(false)
#endif
,ui(new Ui::MainWindow) ,ui(new Ui::MainWindow)
,statusButtonsUI(new Ui::StatusButtonsForm) ,statusButtonsUI(new Ui::StatusButtonsForm)
,routerCommandsUI(new Ui::routerCommandsWidget) ,routerCommandsUI(new Ui::routerCommandsWidget)
@ -51,9 +53,14 @@ MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *paren
,datadir() ,datadir()
,confpath() ,confpath()
,tunconfpath() ,tunconfpath()
,tunnelConfigs()
,tunnelsPageUpdateListener(this) ,tunnelsPageUpdateListener(this)
,saverPtr(new SaverImpl(this, &configItems, &tunnelConfigs))
{ {
assert(delayedSaveManagerPtr!=nullptr);
assert(saverPtr!=nullptr);
ui->setupUi(this); ui->setupUi(this);
statusButtonsUI->setupUi(ui->statusButtonsPane); statusButtonsUI->setupUi(ui->statusButtonsPane);
routerCommandsUI->setupUi(routerCommandsParent); routerCommandsUI->setupUi(routerCommandsParent);
@ -75,7 +82,7 @@ MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *paren
ui->stackedWidget->setCurrentIndex(0); ui->stackedWidget->setCurrentIndex(0);
ui->settingsScrollArea->resize(uiSettings->settingsContentsGridLayout->sizeHint().width()+10,380); ui->settingsScrollArea->resize(uiSettings->settingsContentsGridLayout->sizeHint().width()+10,380);
QScrollBar* const barSett = ui->settingsScrollArea->verticalScrollBar(); //QScrollBar* const barSett = ui->settingsScrollArea->verticalScrollBar();
int w = 683; int w = 683;
int h = 3060; int h = 3060;
ui->settingsContents->setFixedSize(w, h); ui->settingsContents->setFixedSize(w, h);
@ -270,7 +277,13 @@ MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *paren
widgetlocks.add(new widgetlock(uiSettings->comboBox_httpPorxySignatureType,uiSettings->httpProxySignTypeComboEditPushButton)); widgetlocks.add(new widgetlock(uiSettings->comboBox_httpPorxySignatureType,uiSettings->httpProxySignTypeComboEditPushButton));
widgetlocks.add(new widgetlock(uiSettings->comboBox_socksProxySignatureType,uiSettings->socksProxySignTypeComboEditPushButton)); widgetlocks.add(new widgetlock(uiSettings->comboBox_socksProxySignatureType,uiSettings->socksProxySignTypeComboEditPushButton));
loadAllConfigs(); loadAllConfigs(saverPtr);
QObject::connect(saverPtr, SIGNAL(reloadTunnelsConfigAndUISignal(const QString)),
this, SLOT(reloadTunnelsConfigAndUI_QString(const QString)));
delayedSaveManagerPtr->setSaver(saverPtr);
delayedSaveManagerPtr->start();
QObject::connect(uiSettings->logDestinationComboBox, SIGNAL(currentIndexChanged(const QString &)), QObject::connect(uiSettings->logDestinationComboBox, SIGNAL(currentIndexChanged(const QString &)),
this, SLOT(logDestinationComboBoxValueChanged(const QString &))); this, SLOT(logDestinationComboBoxValueChanged(const QString &)));
@ -292,7 +305,6 @@ MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *paren
QObject::connect(uiSettings->tunnelsConfigFileLineEdit, SIGNAL(textChanged(const QString &)), QObject::connect(uiSettings->tunnelsConfigFileLineEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(reloadTunnelsConfigAndUI())); this, SLOT(reloadTunnelsConfigAndUI()));
QObject::connect(ui->addServerTunnelPushButton, SIGNAL(released()), this, SLOT(addServerTunnelPushButtonReleased())); QObject::connect(ui->addServerTunnelPushButton, SIGNAL(released()), this, SLOT(addServerTunnelPushButtonReleased()));
QObject::connect(ui->addClientTunnelPushButton, SIGNAL(released()), this, SLOT(addClientTunnelPushButtonReleased())); QObject::connect(ui->addClientTunnelPushButton, SIGNAL(released()), this, SLOT(addClientTunnelPushButtonReleased()));
@ -307,7 +319,7 @@ MainWindow::MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *paren
logViewerManagerPtr=new LogViewerManager(logStream_,ui->logViewerTextEdit,this); logViewerManagerPtr=new LogViewerManager(logStream_,ui->logViewerTextEdit,this);
assert(logViewerManagerPtr!=nullptr); assert(logViewerManagerPtr!=nullptr);
onLoggingOptionsChange(); //onLoggingOptionsChange();
//QMetaObject::connectSlotsByName(this); //QMetaObject::connectSlotsByName(this);
} }
@ -500,6 +512,8 @@ void MainWindow::handleQuitButton() {
quitting=true; quitting=true;
#endif #endif
close(); close();
delayedSaveManagerPtr->appExiting();
qDebug("Performing quit");
QApplication::instance()->quit(); QApplication::instance()->quit();
} }
@ -526,6 +540,7 @@ void MainWindow::handleGracefulQuitTimerEvent() {
quitting=true; quitting=true;
#endif #endif
close(); close();
delayedSaveManagerPtr->appExiting();
qDebug("Performing quit"); qDebug("Performing quit");
QApplication::instance()->quit(); QApplication::instance()->quit();
} }
@ -534,6 +549,8 @@ MainWindow::~MainWindow()
{ {
qDebug("Destroying main window"); qDebug("Destroying main window");
delete statusPageUpdateTimer; delete statusPageUpdateTimer;
delete delayedSaveManagerPtr;
delete saverPtr;
for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) { for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) {
MainWindowItem* item = *it; MainWindowItem* item = *it;
item->deleteLater(); item->deleteLater();
@ -594,7 +611,7 @@ NonGUIOptionItem* MainWindow::initNonGUIOption(ConfigOption option) {
return retValue; return retValue;
} }
void MainWindow::loadAllConfigs(){ void MainWindow::loadAllConfigs(SaverImpl* saverPtr){
//BORROWED FROM ??? //TODO move this code into single location //BORROWED FROM ??? //TODO move this code into single location
std::string config; i2p::config::GetOption("conf", config); std::string config; i2p::config::GetOption("conf", config);
@ -635,6 +652,9 @@ void MainWindow::loadAllConfigs(){
this->datadir = datadir.c_str(); this->datadir = datadir.c_str();
this->tunconfpath = tunConf.c_str(); this->tunconfpath = tunConf.c_str();
saverPtr->setConfPath(this->confpath);
saverPtr->setTunnelsConfPath(this->tunconfpath);
for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) { for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) {
MainWindowItem* item = *it; MainWindowItem* item = *it;
item->loadFromConfigOption(); item->loadFromConfigOption();
@ -642,10 +662,10 @@ void MainWindow::loadAllConfigs(){
ReadTunnelsConfig(); ReadTunnelsConfig();
onLoggingOptionsChange(); //onLoggingOptionsChange();
} }
/** returns false iff not valid items present and save was aborted */ /** returns false iff not valid items present and save was aborted */
bool MainWindow::saveAllConfigs(){ bool MainWindow::saveAllConfigs(bool focusOnTunnel, std::string tunnelNameToFocus){
QString cannotSaveSettings = QApplication::tr("Cannot save settings."); QString cannotSaveSettings = QApplication::tr("Cannot save settings.");
programOptionsWriterCurrentSection=""; programOptionsWriterCurrentSection="";
/*if(!logFileNameOption->lineEdit->text().trimmed().isEmpty())logOption->optionValue=boost::any(std::string("file")); /*if(!logFileNameOption->lineEdit->text().trimmed().isEmpty())logOption->optionValue=boost::any(std::string("file"));
@ -653,7 +673,6 @@ bool MainWindow::saveAllConfigs(){
daemonOption->optionValue=boost::any(false); daemonOption->optionValue=boost::any(false);
serviceOption->optionValue=boost::any(false); serviceOption->optionValue=boost::any(false);
std::stringstream out;
for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) { for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) {
MainWindowItem* item = *it; MainWindowItem* item = *it;
if(!item->isValid()){ if(!item->isValid()){
@ -661,27 +680,8 @@ bool MainWindow::saveAllConfigs(){
return false; return false;
} }
} }
delayedSaveManagerPtr->delayedSave(++dataSerial, focusOnTunnel, tunnelNameToFocus);
for(QList<MainWindowItem*>::iterator it = configItems.begin(); it!= configItems.end(); ++it) { //onLoggingOptionsChange();
MainWindowItem* item = *it;
item->saveToStringStream(out);
}
using namespace std;
QString backup=confpath+"~";
if(QFile::exists(backup)) QFile::remove(backup);//TODO handle errors
if(QFile::exists(confpath)) QFile::rename(confpath, backup);//TODO handle errors
ofstream outfile;
outfile.open(confpath.toStdString());//TODO handle errors
outfile << out.str().c_str();
outfile.close();
SaveTunnelsConfig();
onLoggingOptionsChange();
return true; return true;
} }
@ -711,7 +711,7 @@ void MainWindow::updated() {
adjustSizesAccordingToWrongLabel(); adjustSizesAccordingToWrongLabel();
applyTunnelsUiToConfigs(); applyTunnelsUiToConfigs();
saveAllConfigs(); saveAllConfigs(false);
} }
void MainWindowItem::installListeners(MainWindow *mainWindow) {} void MainWindowItem::installListeners(MainWindow *mainWindow) {}
@ -784,6 +784,10 @@ bool MainWindow::applyTunnelsUiToConfigs() {
return true; return true;
} }
void MainWindow::reloadTunnelsConfigAndUI_QString(const QString tunnelNameToFocus) {
reloadTunnelsConfigAndUI(tunnelNameToFocus.toStdString());
}
void MainWindow::reloadTunnelsConfigAndUI(std::string tunnelNameToFocus) { void MainWindow::reloadTunnelsConfigAndUI(std::string tunnelNameToFocus) {
deleteTunnelForms(); deleteTunnelForms();
for (std::map<std::string,TunnelConfig*>::iterator it=tunnelConfigs.begin(); it!=tunnelConfigs.end(); ++it) { for (std::map<std::string,TunnelConfig*>::iterator it=tunnelConfigs.begin(); it!=tunnelConfigs.end(); ++it) {
@ -795,31 +799,6 @@ void MainWindow::reloadTunnelsConfigAndUI(std::string tunnelNameToFocus) {
appendTunnelForms(tunnelNameToFocus); appendTunnelForms(tunnelNameToFocus);
} }
void MainWindow::SaveTunnelsConfig() {
std::stringstream out;
for (std::map<std::string,TunnelConfig*>::iterator it=tunnelConfigs.begin(); it!=tunnelConfigs.end(); ++it) {
const std::string& name = it->first;
TunnelConfig* tunconf = it->second;
tunconf->saveHeaderToStringStream(out);
tunconf->saveToStringStream(out);
tunconf->saveI2CPParametersToStringStream(out);
}
using namespace std;
QString backup=tunconfpath+"~";
if(QFile::exists(backup)) QFile::remove(backup);//TODO handle errors
if(QFile::exists(tunconfpath)) QFile::rename(tunconfpath, backup);//TODO handle errors
ofstream outfile;
outfile.open(tunconfpath.toStdString());//TODO handle errors
outfile << out.str().c_str();
outfile.close();
i2p::client::context.ReloadConfig();
}
void MainWindow::TunnelsPageUpdateListenerMainWindowImpl::updated(std::string oldName, TunnelConfig* tunConf) { void MainWindow::TunnelsPageUpdateListenerMainWindowImpl::updated(std::string oldName, TunnelConfig* tunConf) {
if(oldName!=tunConf->getName()) { if(oldName!=tunConf->getName()) {
//name has changed //name has changed
@ -827,7 +806,7 @@ void MainWindow::TunnelsPageUpdateListenerMainWindowImpl::updated(std::string ol
if(it!=mainWindow->tunnelConfigs.end())mainWindow->tunnelConfigs.erase(it); if(it!=mainWindow->tunnelConfigs.end())mainWindow->tunnelConfigs.erase(it);
mainWindow->tunnelConfigs[tunConf->getName()]=tunConf; mainWindow->tunnelConfigs[tunConf->getName()]=tunConf;
} }
mainWindow->saveAllConfigs(); mainWindow->saveAllConfigs(true, tunConf->getName());
} }
void MainWindow::TunnelsPageUpdateListenerMainWindowImpl::needsDeleting(std::string oldName){ void MainWindow::TunnelsPageUpdateListenerMainWindowImpl::needsDeleting(std::string oldName){

29
qt/i2pd_qt/mainwindow.h

@ -62,6 +62,12 @@
#include "widgetlockregistry.h" #include "widgetlockregistry.h"
#include "widgetlock.h" #include "widgetlock.h"
#include "DelayedSaveManager.h"
#include "DelayedSaveManagerImpl.h"
#include "SaverImpl.h"
class SaverImpl;
class LogViewerManager; class LogViewerManager;
template<typename ValueType> template<typename ValueType>
@ -373,10 +379,14 @@ using namespace i2p::qt;
class Controller; class Controller;
class DelayedSaveManagerImpl;
class MainWindow : public QMainWindow { class MainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
private: private:
std::shared_ptr<std::iostream> logStream; std::shared_ptr<std::iostream> logStream;
DelayedSaveManagerImpl* delayedSaveManagerPtr;
DelayedSaveManager::DATA_SERIAL_TYPE dataSerial;
public: public:
explicit MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *parent=nullptr); explicit MainWindow(std::shared_ptr<std::iostream> logStream_, QWidget *parent=nullptr);
~MainWindow(); ~MainWindow();
@ -502,16 +512,16 @@ protected:
void initStringBox(ConfigOption option, QLineEdit* lineEdit); void initStringBox(ConfigOption option, QLineEdit* lineEdit);
NonGUIOptionItem* initNonGUIOption(ConfigOption option); NonGUIOptionItem* initNonGUIOption(ConfigOption option);
void loadAllConfigs(); void loadAllConfigs(SaverImpl* saverPtr);
public slots: public slots:
/** returns false iff not valid items present and save was aborted */ /** returns false iff not valid items present and save was aborted */
bool saveAllConfigs(); bool saveAllConfigs(bool focusOnTunnel, std::string tunnelNameToFocus="");
void SaveTunnelsConfig();
void reloadTunnelsConfigAndUI(std::string tunnelNameToFocus); void reloadTunnelsConfigAndUI(std::string tunnelNameToFocus);
//focus none //focus none
void reloadTunnelsConfigAndUI() { reloadTunnelsConfigAndUI(""); } void reloadTunnelsConfigAndUI() { reloadTunnelsConfigAndUI(""); }
void reloadTunnelsConfigAndUI_QString(const QString tunnelNameToFocus);
void addServerTunnelPushButtonReleased(); void addServerTunnelPushButtonReleased();
void addClientTunnelPushButtonReleased(); void addClientTunnelPushButtonReleased();
@ -578,8 +588,7 @@ private:
tunnelConfigs.erase(it); tunnelConfigs.erase(it);
delete tc; delete tc;
} }
saveAllConfigs(); saveAllConfigs(false);
reloadTunnelsConfigAndUI("");
} }
std::string GenerateNewTunnelName() { std::string GenerateNewTunnelName() {
@ -614,8 +623,7 @@ private:
destinationPort, destinationPort,
sigType); sigType);
saveAllConfigs(); saveAllConfigs(true, name);
reloadTunnelsConfigAndUI(name);
} }
void CreateDefaultServerTunnel() {//TODO dedup default values with ReadTunnelsConfig() and with ClientContext.cpp::ReadTunnels () void CreateDefaultServerTunnel() {//TODO dedup default values with ReadTunnelsConfig() and with ClientContext.cpp::ReadTunnels ()
@ -651,8 +659,7 @@ private:
isUniqueLocal); isUniqueLocal);
saveAllConfigs(); saveAllConfigs(true, name);
reloadTunnelsConfigAndUI(name);
} }
void ReadTunnelsConfig() //TODO deduplicate the code with ClientContext.cpp::ReadTunnels () void ReadTunnelsConfig() //TODO deduplicate the code with ClientContext.cpp::ReadTunnels ()
@ -793,7 +800,9 @@ private:
TunnelsPageUpdateListenerMainWindowImpl tunnelsPageUpdateListener; TunnelsPageUpdateListenerMainWindowImpl tunnelsPageUpdateListener;
void onLoggingOptionsChange() {} //void onLoggingOptionsChange() {}
SaverImpl* saverPtr;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

Loading…
Cancel
Save