/**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. ** Contact: http://www.qt.io/licensing ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms and ** conditions see http://www.qt.io/terms-conditions. For further information ** use the contact form at http://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 or version 3 as published by the Free ** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** following information to ensure the GNU Lesser General Public License ** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, The Qt Company gives you certain additional ** rights. These rights are described in The Qt Company LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ****************************************************************************/ #ifndef FILEUTILS_H #define FILEUTILS_H #include "utils_global.h" #include #include // Mac. #include #include #include #include namespace Utils {class FileName; } QT_BEGIN_NAMESPACE class QDataStream; class QDateTime; class QDir; class QDropEvent; class QFile; class QFileInfo; class QTemporaryFile; class QTextStream; class QWidget; QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug dbg, const Utils::FileName &c); QT_END_NAMESPACE namespace Utils { class QTCREATOR_UTILS_EXPORT FileName : private QString { public: FileName(); explicit FileName(const QFileInfo &info); QFileInfo toFileInfo() const; static FileName fromString(const QString &filename); static FileName fromString(const QString &filename, const QString &defaultExtension); static FileName fromLatin1(const QByteArray &filename); static FileName fromUserInput(const QString &filename); static FileName fromUtf8(const char *filename, int filenameSize = -1); QString toString() const; QString toUserOutput() const; QString fileName(int pathComponents = 0) const; bool exists() const; FileName parentDir() const; bool operator==(const FileName &other) const; bool operator!=(const FileName &other) const; bool operator<(const FileName &other) const; bool operator<=(const FileName &other) const; bool operator>(const FileName &other) const; bool operator>=(const FileName &other) const; bool isChildOf(const FileName &s) const; bool isChildOf(const QDir &dir) const; bool endsWith(const QString &s) const; FileName relativeChildPath(const FileName &parent) const; FileName &appendPath(const QString &s); FileName &appendString(const QString &str); FileName &appendString(QChar str); using QString::size; using QString::count; using QString::length; using QString::isEmpty; using QString::isNull; using QString::clear; private: FileName(const QString &string); }; QTCREATOR_UTILS_EXPORT QTextStream &operator<<(QTextStream &s, const FileName &fn); class QTCREATOR_UTILS_EXPORT FileNameList : public QList { public: inline FileNameList() { } inline explicit FileNameList(const FileName &i) { append(i); } inline FileNameList(const FileNameList &l) : QList(l) { } inline FileNameList(const QList &l) : QList(l) { } int removeDuplicates(); }; class QTCREATOR_UTILS_EXPORT FileUtils { public: static bool removeRecursively(const FileName &filePath, QString *error = 0); static bool copyRecursively(const FileName &srcFilePath, const FileName &tgtFilePath, QString *error = 0, const std::function ©Helper = std::function()); static bool isFileNewerThan(const FileName &filePath, const QDateTime &timeStamp); static FileName resolveSymlinks(const FileName &path); static QString shortNativePath(const FileName &path); static QString fileSystemFriendlyName(const QString &name); static int indexOfQmakeUnfriendly(const QString &name, int startpos = 0); static QString qmakeFriendlyName(const QString &name); static bool makeWritable(const FileName &path); static QString normalizePathName(const QString &name); static bool isRelativePath(const QString &fileName); static bool isAbsolutePath(const QString &fileName) { return !isRelativePath(fileName); } static QString resolvePath(const QString &baseDir, const QString &fileName); }; class QTCREATOR_UTILS_EXPORT FileReader { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! public: static QByteArray fetchQrc(const QString &fileName); // Only for internal resources bool fetch(const QString &fileName, QIODevice::OpenMode mode = QIODevice::NotOpen); // QIODevice::ReadOnly is implicit bool fetch(const QString &fileName, QIODevice::OpenMode mode, QString *errorString); bool fetch(const QString &fileName, QString *errorString) { return fetch(fileName, QIODevice::NotOpen, errorString); } bool fetch(const QString &fileName, QIODevice::OpenMode mode, QWidget *parent); bool fetch(const QString &fileName, QWidget *parent) { return fetch(fileName, QIODevice::NotOpen, parent); } const QByteArray &data() const { return m_data; } const QString &errorString() const { return m_errorString; } private: QByteArray m_data; QString m_errorString; }; class QTCREATOR_UTILS_EXPORT FileSaverBase { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! public: FileSaverBase(); virtual ~FileSaverBase(); QString fileName() const { return m_fileName; } bool hasError() const { return m_hasError; } QString errorString() const { return m_errorString; } virtual bool finalize(); bool finalize(QString *errStr); bool finalize(QWidget *parent); bool write(const char *data, int len); bool write(const QByteArray &bytes); bool setResult(QTextStream *stream); bool setResult(QDataStream *stream); bool setResult(QXmlStreamWriter *stream); bool setResult(bool ok); protected: QFile *m_file; QString m_fileName; QString m_errorString; bool m_hasError; private: Q_DISABLE_COPY(FileSaverBase) }; class QTCREATOR_UTILS_EXPORT FileSaver : public FileSaverBase { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! public: explicit FileSaver(const QString &filename, QIODevice::OpenMode mode = QIODevice::NotOpen); // QIODevice::WriteOnly is implicit virtual bool finalize(); using FileSaverBase::finalize; QFile *file() { return m_file; } private: bool m_isSafe; }; class QTCREATOR_UTILS_EXPORT TempFileSaver : public FileSaverBase { Q_DECLARE_TR_FUNCTIONS(Utils::FileUtils) // sic! public: explicit TempFileSaver(const QString &templ = QString()); ~TempFileSaver(); QTemporaryFile *file() { return reinterpret_cast(m_file); } void setAutoRemove(bool on) { m_autoRemove = on; } private: bool m_autoRemove; }; class QTCREATOR_UTILS_EXPORT FileDropSupport : public QObject { Q_OBJECT public: struct FileSpec { FileSpec(const QString &path, int r = -1, int c = -1) : filePath(path), line(r), column(c) {} QString filePath; int line; int column; }; // returns true if the event should be accepted typedef std::function DropFilterFunction; FileDropSupport(QWidget *parentWidget, const DropFilterFunction &filterFunction = DropFilterFunction()); static QStringList mimeTypesForFilePaths(); signals: void filesDropped(const QList &files); protected: bool eventFilter(QObject *obj, QEvent *event); private slots: void emitFilesDropped(); private: DropFilterFunction m_filterFunction; QList m_files; }; class QTCREATOR_UTILS_EXPORT FileDropMimeData : public QMimeData { Q_OBJECT public: FileDropMimeData(); void setOverrideFileDropAction(Qt::DropAction action); Qt::DropAction overrideFileDropAction() const; bool isOverridingFileDropAction() const; void addFile(const QString &filePath, int line = -1, int column = -1); QList files() const; private: QList m_files; Qt::DropAction m_overrideDropAction; bool m_isOverridingDropAction; }; } // namespace Utils QT_BEGIN_NAMESPACE QTCREATOR_UTILS_EXPORT uint qHash(const Utils::FileName &a); QT_END_NAMESPACE Q_DECLARE_METATYPE(Utils::FileName) #endif // FILEUTILS_H