From 7127f648ae4292e6642b63650e022589d470b6cf Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Fri, 5 Dec 2014 11:59:31 -0800 Subject: [PATCH] New QTemporaryFile replacement --- src/QGCTemporaryFile.cc | 69 +++++++++++++++++++++++++++++++++++++++++ src/QGCTemporaryFile.h | 55 ++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/QGCTemporaryFile.cc create mode 100644 src/QGCTemporaryFile.h diff --git a/src/QGCTemporaryFile.cc b/src/QGCTemporaryFile.cc new file mode 100644 index 000000000..2bbc4a656 --- /dev/null +++ b/src/QGCTemporaryFile.cc @@ -0,0 +1,69 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +/// @file +/// @brief This class mimics QTemporaryFile. We have our own implementation due to the fact that +/// QTemporaryFile implemenation differs cross platform making it unusable for our use-case. +/// Look for bug reports on QTemporaryFile keeping the file locked for details. +/// +/// @author Don Gagne + +#include "QGCTemporaryFile.h" + +#include +#include + +QGCTemporaryFile::QGCTemporaryFile(const QString& fileTemplate, QObject* parent) : + QFile(parent), + _template(fileTemplate) +{ + +} + +bool QGCTemporaryFile::open(QFile::OpenMode openMode) +{ + QDir tempDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + + // Generate unique, non-existing filename + + static const char rgDigits[] = "0123456789"; + + QString tempFilename; + + do { + QString uniqueStr; + for (int i=0; i<6; i++) { + uniqueStr += rgDigits[qrand() % 10]; + } + + if (_template.contains("XXXXXX")) { + tempFilename = _template.replace("XXXXXX", uniqueStr, Qt::CaseSensitive); + } else { + tempFilename = _template + uniqueStr; + } + } while (tempDir.exists(tempFilename)); + + setFileName(tempDir.filePath(tempFilename)); + + return QFile::open(openMode); +} diff --git a/src/QGCTemporaryFile.h b/src/QGCTemporaryFile.h new file mode 100644 index 000000000..0dfae4147 --- /dev/null +++ b/src/QGCTemporaryFile.h @@ -0,0 +1,55 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + This file is part of the QGROUNDCONTROL project + + QGROUNDCONTROL is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + QGROUNDCONTROL is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QGROUNDCONTROL. If not, see . + + ======================================================================*/ + +#ifndef QGCTemporaryFile_H +#define QGCTemporaryFile_H + +#include + +/// @file +/// @brief This class mimics QTemporaryFile. We have our own implementation due to the fact that +/// QTemporaryFile implemenation differs cross platform making it unusable for our use-case. +/// Look for bug reports on QTemporaryFile keeping the file locked for details. +/// +/// @author Don Gagne + +class QGCTemporaryFile : public QFile { + Q_OBJECT + +public: + /// @brief Creates a new temp file object. QGC temp files are always created in the + // QStandardPaths::TempLocation directory. + // @param template Template for file name following QTemporaryFile rules. Template should NOT include + // directory path, only file name. + QGCTemporaryFile(const QString& fileTemplate, QObject* parent = NULL); + + /// @brief Opens the file in ReadWrite mode. + /// @returns false - open failed + bool open(OpenMode openMode = ReadWrite); + +private: + QString _template; +}; + + +#endif -- 2.22.0