Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,4 @@ compile_commands.json
# QtCreator local machine specific files for imported projects
*creator.user*
.DS_Store
/build
2 changes: 2 additions & 0 deletions QLog.pro
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ CONFIG += c++11 force_debug_info
CONFIG *= link_pkgconfig

SOURCES += \
core/ADIFFileMonitor.cpp \
core/AlertEvaluator.cpp \
core/AppGuard.cpp \
core/CallbookManager.cpp \
Expand Down Expand Up @@ -202,6 +203,7 @@ SOURCES += \
ui/component/SwitchButton.cpp

HEADERS += \
core/ADIFFileMonitor.h \
core/AlertEvaluator.h \
core/AppGuard.h \
core/CallbookManager.h \
Expand Down
155 changes: 155 additions & 0 deletions core/ADIFFileMonitor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
#include <QFile>
#include <QTextStream>
#include <QFileInfo>
#include <QMessageBox>
#include <QSpacerItem>
#include <QGridLayout>

#include "ADIFFileMonitor.h"
#include "core/LogParam.h"
#include "core/debug.h"
#include "data/StationProfile.h"
#include "logformat/LogFormat.h"

MODULE_IDENTIFICATION("qlog.core.adiffilemonitor");

ADIFFileMonitor::ADIFFileMonitor(QObject *parent)
: QObject(parent)
{
FCT_IDENTIFICATION;
}

ADIFFileMonitor::~ADIFFileMonitor()
{
FCT_IDENTIFICATION;
}

QList<ADIFFileMonitor::SlotConfig> ADIFFileMonitor::getEnabledSlots(ImportFrequency freq) const
{
FCT_IDENTIFICATION;

QList<SlotConfig> result;

for ( int i = 0; i < MAX_SLOTS; ++i )
{
SlotConfig cfg;
cfg.enabled = LogParam::getADIFMonitorEnabled(i);
cfg.path = LogParam::getADIFMonitorPath(i);
cfg.frequency = static_cast<ImportFrequency>(LogParam::getADIFMonitorFrequency(i));
cfg.profile = LogParam::getADIFMonitorProfile(i);

if ( cfg.enabled && cfg.frequency == freq && !cfg.path.isEmpty() )
result.append(cfg);
}

return result;
}

LogFormat::duplicateQSOBehaviour ADIFFileMonitor::skipAllDuplicates(QSqlRecord *, QSqlRecord *)
{
return LogFormat::SKIP_ALL;
}

void ADIFFileMonitor::runImportForSlot(const SlotConfig &slot)
{
FCT_IDENTIFICATION;

qCDebug(runtime) << "ADIF Monitor importing:" << slot.path;

QFile file(slot.path);

if ( !file.exists() )
{
qCWarning(runtime) << "ADIF Monitor: file not found:" << slot.path;
return;
}

if ( !file.open(QFile::ReadOnly | QFile::Text) )
{
qCWarning(runtime) << "ADIF Monitor: cannot open file:" << slot.path;
return;
}

QTextStream in(&file);

LogFormat *format = LogFormat::open("adi", in);

if ( !format )
{
qCWarning(runtime) << "ADIF Monitor: failed to open as ADIF:" << slot.path;
return;
}

format->setDuplicateQSOCallback(skipAllDuplicates);

StationProfile stationProfile;

if ( !slot.profile.isEmpty() )
stationProfile = StationProfilesManager::instance()->getProfile(slot.profile);

if ( stationProfile == StationProfile() )
stationProfile = StationProfilesManager::instance()->getCurProfile1();

const StationProfile *profile = ( stationProfile != StationProfile() ) ? &stationProfile : nullptr;

unsigned long warnings = 0;
unsigned long errors = 0;
QString logStream;
QTextStream logOut(&logStream);

int count = format->runImport(logOut, profile, &warnings, &errors);

if (count > 0)
{
QString s;
QString report = QObject::tr("<b>Import File</b>: ") + slot.path + "<br/>" +
QObject::tr("<b>Imported</b>: %n contact(s)", "", count) + "<br/>" +
QObject::tr("<b>Warning(s)</b>: %n", "", warnings) + "<br/>" +
QObject::tr("<b>Error(s)</b>: %n", "", errors);

QMessageBox msgBox;

msgBox.setWindowTitle(tr("Import Result"));
msgBox.setText(report);
msgBox.setDetailedText(s);
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);

QSpacerItem* horizontalSpacer = new QSpacerItem(500, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
QGridLayout* layout = qobject_cast<QGridLayout*>(msgBox.layout());
if ( !layout )
{
qWarning() << "Layout is null";
delete horizontalSpacer;
return;
}
layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());

msgBox.exec();

}
delete format;

qCDebug(runtime) << "ADIF Monitor import finished. Warnings:" << warnings << "Errors:" << errors;
}

void ADIFFileMonitor::runStartupImports()
{
FCT_IDENTIFICATION;

const QList<SlotConfig> fileSlots = getEnabledSlots(STARTUP);

for ( const SlotConfig &cfg : fileSlots )
runImportForSlot(cfg);
}

void ADIFFileMonitor::runShutdownImports()
{
FCT_IDENTIFICATION;

const QList<SlotConfig> fileSlots = getEnabledSlots(SHUTDOWN);

for ( const SlotConfig &cfg : fileSlots )
runImportForSlot(cfg);
}
40 changes: 40 additions & 0 deletions core/ADIFFileMonitor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef QLOG_CORE_ADIFFILEMONITOR_H
#define QLOG_CORE_ADIFFILEMONITOR_H

#include <QObject>
#include <QSqlRecord>
#include "logformat/LogFormat.h"

class ADIFFileMonitor : public QObject
{
Q_OBJECT

public:
static const int MAX_SLOTS = 4;

enum ImportFrequency {
DISABLED = 0,
STARTUP = 1,
SHUTDOWN = 2
};

explicit ADIFFileMonitor(QObject *parent = nullptr);
~ADIFFileMonitor();

void runStartupImports();
void runShutdownImports();

private:
struct SlotConfig {
bool enabled = false;
QString path;
ImportFrequency frequency = DISABLED;
QString profile;
};

QList<SlotConfig> getEnabledSlots(ImportFrequency freq) const;
void runImportForSlot(const SlotConfig &slot);
static LogFormat::duplicateQSOBehaviour skipAllDuplicates(QSqlRecord *, QSqlRecord *);
};

#endif // QLOG_CORE_ADIFFILEMONITOR_H
40 changes: 40 additions & 0 deletions core/LogParam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1247,6 +1247,46 @@ void LogParam::removeMainWindowBandmapWidgets()
removeParamGroup("mainwindow/bandmapwidgets");
}

bool LogParam::getADIFMonitorEnabled(int slot)
{
return getParam(QString("adifmonitor/slot%1/enabled").arg(slot), false).toBool();
}

void LogParam::setADIFMonitorEnabled(int slot, bool enabled)
{
setParam(QString("adifmonitor/slot%1/enabled").arg(slot), enabled);
}

QString LogParam::getADIFMonitorPath(int slot)
{
return getParam(QString("adifmonitor/slot%1/path").arg(slot)).toString();
}

void LogParam::setADIFMonitorPath(int slot, const QString &path)
{
setParam(QString("adifmonitor/slot%1/path").arg(slot), path);
}

int LogParam::getADIFMonitorFrequency(int slot)
{
return getParam(QString("adifmonitor/slot%1/frequency").arg(slot), 0).toInt();
}

void LogParam::setADIFMonitorFrequency(int slot, int frequency)
{
setParam(QString("adifmonitor/slot%1/frequency").arg(slot), frequency);
}

QString LogParam::getADIFMonitorProfile(int slot)
{
return getParam(QString("adifmonitor/slot%1/profile").arg(slot)).toString();
}

void LogParam::setADIFMonitorProfile(int slot, const QString &profile)
{
setParam(QString("adifmonitor/slot%1/profile").arg(slot), profile);
}

bool LogParam::setParam(const QString &name, const QVariant &value)
{
FCT_IDENTIFICATION;
Expand Down
12 changes: 12 additions & 0 deletions core/LogParam.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,18 @@ class LogParam : public QObject
static void setSourcePlatform(const QString &platform);
static void removeSourcePlatform();

/**********************
* ADIF File Monitor
**********************/
static bool getADIFMonitorEnabled(int slot);
static void setADIFMonitorEnabled(int slot, bool enabled);
static QString getADIFMonitorPath(int slot);
static void setADIFMonitorPath(int slot, const QString &path);
static int getADIFMonitorFrequency(int slot);
static void setADIFMonitorFrequency(int slot, int frequency);
static QString getADIFMonitorProfile(int slot);
static void setADIFMonitorProfile(int slot, const QString &profile);

/**************
* Main Window
*************/
Expand Down
10 changes: 10 additions & 0 deletions ui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,11 @@ MainWindow::MainWindow(QWidget* parent) :
//restoreConnectionStates();

setupActivitiesMenu();

/************************/
/* ADIF File Monitor */
/************************/
adifMonitor.runStartupImports();
}

void MainWindow::closeEvent(QCloseEvent* event)
Expand Down Expand Up @@ -512,6 +517,11 @@ void MainWindow::closeEvent(QCloseEvent* event)
LogParam::removeBandmapWidgetGroup(orphanConfig);
}

/****************************/
/* ADIF File Monitor */
/****************************/
adifMonitor.runShutdownImports();

// Save unsaved widget states
const auto allWidgets = findChildren<QWidget *>();
for ( QWidget *w : allWidgets )
Expand Down
2 changes: 2 additions & 0 deletions ui/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <QActionGroup>
#include "ui/StatisticsWidget.h"
#include "core/NetworkNotification.h"
#include "core/ADIFFileMonitor.h"
#include "core/AlertEvaluator.h"
#include "core/PropConditions.h"
#include "service/clublog/ClubLog.h"
Expand Down Expand Up @@ -109,6 +110,7 @@ private slots:
QPushButton *themeButton;
StatisticsWidget* stats;
NetworkNotification networknotification;
ADIFFileMonitor adifMonitor;
AlertEvaluator alertEvaluator;
PropConditions *conditions;
bool isFusionStyle;
Expand Down
Loading