From c238fc88b17c1ae1a66afe85d4c977b08a314f8a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 9 May 2019 16:35:25 +0200 Subject: [PATCH] Utils: Make FileName hold an QUrl optionally This is meant to be helpful to piggy-back device information in situations where the file resides on a remote file system. The approach taken effectively duplicates the path data of the url if the url constructor is actually used, but does not rely on lossless path/fromPath conversions as it leaves the non-url code paths unaffected in all situations. The total overhead is deemed acceptable as the common use case only default-constructs the m_url member which only sets a pimpl nullptr. Change-Id: Ie441cb1355ce086507333c31c7356ae5e6d10b96 Reviewed-by: Eike Ziller --- src/libs/utils/fileutils.cpp | 36 +++++++++++++++++++++++++++++++++++- src/libs/utils/fileutils.h | 11 +++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 7ce631b259c..9c7481b8fa6 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -648,17 +648,32 @@ QFileInfo FileName::toFileInfo() const return QFileInfo(m_data); } +FileName FileName::fromUrl(const QUrl &url) +{ + FileName fn; + fn.m_url = url; + fn.m_data = url.path(); + return fn; +} + /// \returns a QString for passing on to QString based APIs const QString &FileName::toString() const { return m_data; } +QUrl FileName::toUrl() const +{ + return m_url; +} + /// \returns a QString to display to the user /// Converts the separators to the native format QString FileName::toUserOutput() const { - return QDir::toNativeSeparators(toString()); + if (m_url.isEmpty()) + return QDir::toNativeSeparators(toString()); + return m_url.toString(); } QString FileName::fileName(int pathComponents) const @@ -769,6 +784,20 @@ FileName FileName::fromUtf8(const char *filename, int filenameSize) return FileName::fromString(QString::fromUtf8(filename, filenameSize)); } +FileName FileName::fromVariant(const QVariant &variant) +{ + if (variant.type() == QVariant::Url) + return FileName::fromUrl(variant.toUrl()); + return FileName::fromString(variant.toString()); +} + +QVariant FileName::toVariant() const +{ + if (!m_url.isEmpty()) + return m_url; + return m_data; +} + bool FileName::operator==(const FileName &other) const { return QString::compare(m_data, other.m_data, HostOsInfo::fileNameCaseSensitivity()) == 0; @@ -832,6 +861,11 @@ bool FileName::endsWith(const QString &s) const return m_data.endsWith(s, HostOsInfo::fileNameCaseSensitivity()); } +bool FileName::isLocal() const +{ + return m_url.isEmpty() || m_url.isLocalFile(); +} + /// \returns the relativeChildPath of FileName to parent if FileName is a child of parent /// \note returns a empty FileName if FileName is not a child of parent /// That is, this never returns a path starting with "../" diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 3180ef25baa..0991d4ae688 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -33,6 +33,7 @@ #include // Mac. #include #include +#include #include #include @@ -71,9 +72,12 @@ public: static FileName fromLatin1(const QByteArray &filename); static FileName fromUserInput(const QString &filename); static FileName fromUtf8(const char *filename, int filenameSize = -1); + static FileName fromVariant(const QVariant &variant); const QString &toString() const; QFileInfo toFileInfo() const; + QVariant toVariant() const; + QString toUserOutput() const; QString fileName(int pathComponents = 0) const; bool exists() const; @@ -91,6 +95,7 @@ public: bool isChildOf(const FileName &s) const; bool isChildOf(const QDir &dir) const; bool endsWith(const QString &s) const; + bool isLocal() const; FileName relativeChildPath(const FileName &parent) const; FileName &appendPath(const QString &s); @@ -102,8 +107,14 @@ public: uint hash(uint seed) const; + // NOTE: FileName operations on FileName created from URL currenly + // do not work except for .toVariant() and .toUrl(). + static FileName fromUrl(const QUrl &url); + QUrl toUrl() const; + private: QString m_data; + QUrl m_url; }; QTCREATOR_UTILS_EXPORT QTextStream &operator<<(QTextStream &s, const FileName &fn);