File indexing completed on 2022-10-04 17:30:12

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2008 Dominik Seichter <domseichter@web.de>
0003 
0004 #include "datetimeplugin.h"
0005 
0006 #ifndef Q_OS_WIN
0007 #include "ui_datetimepluginwidget.h"
0008 
0009 #include <QDate>
0010 #include <QTime>
0011 #include <QUrl>
0012 #include <qplatformdefs.h>
0013 
0014 // OS includes
0015 #include <cstdio>
0016 #include <ctime>
0017 #include <sys/stat.h>
0018 #include <sys/types.h>
0019 #include <unistd.h>
0020 #include <utime.h>
0021 
0022 DateTimePlugin::DateTimePlugin(PluginLoader *loader)
0023     : QObject(nullptr), Plugin(loader)
0024 {
0025     m_widget = new Ui::DateTimePluginWidget();
0026 }
0027 
0028 DateTimePlugin::~DateTimePlugin()
0029 {
0030     delete m_widget;
0031 }
0032 
0033 const QString DateTimePlugin::name() const
0034 {
0035     return i18n("Date & Time Plugin");
0036 }
0037 
0038 const QIcon DateTimePlugin::icon() const
0039 {
0040     return QIcon::fromTheme("chronometer");
0041 }
0042 
0043 QString DateTimePlugin::processFile(BatchRenamer *, int, const QString &filenameOrToken, EPluginType)
0044 {
0045     const QString &filename = filenameOrToken;
0046     bool  bModification = m_widget->checkModification->isChecked();
0047     bool  bAccess       = m_widget->checkAccess->isChecked();
0048 
0049     QDate date          = m_widget->datepicker->date();
0050     QTime time(m_widget->spinHour->value(),
0051                m_widget->spinMinute->value(),
0052                m_widget->spinSecond->value());
0053 
0054     if (!QUrl(filename).isLocalFile()) {
0055         return i18n("DateTimePlugin works only with local files. %1 is a remote file.", filename);
0056     }
0057 
0058     if (bModification || bAccess) {
0059         return changeDateTime(filename, bModification, bAccess, date, time);
0060     }
0061 
0062     return QString();
0063 }
0064 
0065 void DateTimePlugin::createUI(QWidget *parent) const
0066 {
0067     m_widget->setupUi(parent);
0068 
0069     connect(m_widget->buttonCurrent, &QPushButton::clicked,
0070             this, &DateTimePlugin::slotGetCurrentTime);
0071 }
0072 
0073 void DateTimePlugin::slotGetCurrentTime()
0074 {
0075     m_widget->spinHour->setValue(QTime::currentTime().hour());
0076     m_widget->spinMinute->setValue(QTime::currentTime().minute());
0077     m_widget->spinSecond->setValue(QTime::currentTime().second());
0078     m_widget->datepicker->setDate(QDate::currentDate());
0079 }
0080 
0081 QString DateTimePlugin::changeDateTime(const QString &filename, bool bModification, bool bAccess,
0082                                        const QDate &date, const QTime &time)
0083 {
0084     // Initialze fields
0085     struct tm tmp;
0086     tmp.tm_mday = date.day();
0087     tmp.tm_mon  = date.month() - 1;
0088     tmp.tm_year = date.year() - 1900;
0089 
0090     tmp.tm_hour = time.hour();
0091     tmp.tm_min  = time.minute();
0092     tmp.tm_sec  = time.second();
0093     tmp.tm_isdst = -1;
0094 
0095     // Create time
0096     time_t ti;
0097     ti = mktime(&tmp);
0098 
0099     if (ti == -1) {
0100         return i18n("Cannot change date of file %1. (Cannot mktime)", filename);
0101     }
0102 
0103     // Get current values
0104     QT_STATBUF st;
0105     if (QT_STAT(filename.toUtf8().data(), &st) == -1) {
0106         return i18n("Cannot change date of file %1. (Cannot stat the file)", filename);
0107     }
0108 
0109     // Fill structure;
0110     struct utimbuf buf;
0111 
0112     buf.actime  = (bAccess ? ti : st.st_atime);
0113     buf.modtime = (bModification ? ti : st.st_mtime);
0114 
0115     if (utime(filename.toUtf8().data(), &buf) != 0) {
0116         return i18n("Cannot change date of file %1. (utime failed)", filename);
0117     }
0118 
0119     return QString();
0120 }
0121 
0122 #endif // Q_OS_WIN