diff --git a/gio-qt/CMakeLists.txt b/gio-qt/CMakeLists.txt index bec0fca..d0f4d2f 100644 --- a/gio-qt/CMakeLists.txt +++ b/gio-qt/CMakeLists.txt @@ -11,6 +11,7 @@ set (QGIO_PUBLIC_HEADER_FILES dgiofile.h dgiofileinfo.h dgioutils.h + dgiofileiterator.h ) set (QGIO_PRIVATE_CPP_FILES @@ -21,6 +22,7 @@ set (QGIO_PRIVATE_CPP_FILES dgiofile.cpp dgiofileinfo.cpp dgioutils.cpp + dgiofileiterator.cpp ) # Library diff --git a/gio-qt/dgiofile.cpp b/gio-qt/dgiofile.cpp index 3daa72f..31ea5f6 100644 --- a/gio-qt/dgiofile.cpp +++ b/gio-qt/dgiofile.cpp @@ -1,10 +1,12 @@ #include "dgiofile.h" #include "dgiofileinfo.h" +#include "dgiofileiterator.h" #include #include #include +#include #include @@ -122,6 +124,13 @@ QString DGioFile::uri() const return d->uri(); } +/*! + * \brief Obtains information about the filesystem the file is on. + * + * Wrapper of Gio::File::query_filesystem_info("filesystem::*"). + * + * \return the created file system info object, or nullptr if create failed. + */ QExplicitlySharedDataPointer DGioFile::createFileSystemInfo() { Q_D(DGioFile); @@ -138,3 +147,37 @@ QExplicitlySharedDataPointer DGioFile::createFileSystemInfo() return QExplicitlySharedDataPointer(nullptr); } + +/*! + * \brief Gets the requested information about the files in a directory. + * + * Wrapper of Gio::File::enumerate_children() + * + * The attribute value is a string that specifies the file attributes that should be gathered. + * It is not an error if its not possible to read a particular requested attribute from a file, + * it just won't be set. attribute should be a comma-separated list of attribute or attribute + * wildcards. The wildcard "*" means all attributes, and a wildcard like "standard::*" means all + * attributes in the standard namespace. An example attribute query be "standard::*,owner::user". + * The standard attributes are available as defines, like FILE_ATTRIBUTE_STANDARD_NAME. + * + * \param attr An attribute query string. + * \param queryInfoFlags + * \return the created DGioFileIterator object, or nullptr if failed. + */ +QExplicitlySharedDataPointer DGioFile::createFileIterator(QString attr, DGioFileQueryInfoFlags queryInfoFlags) +{ + Q_D(DGioFile); + + try { + unsigned int flagValue = queryInfoFlags; + FileQueryInfoFlags flags = static_cast(flagValue); + Glib::RefPtr gmmFileEnumerator = d->getGmmFileInstance()->enumerate_children(attr.toStdString(), flags); + QExplicitlySharedDataPointer fileIterPtr(new DGioFileIterator(gmmFileEnumerator.release())); + + return fileIterPtr; + } catch (const Glib::Error &error) { + qDebug() << QString::fromStdString(error.what().raw()); + } + + return QExplicitlySharedDataPointer(nullptr); +} diff --git a/gio-qt/dgiofile.h b/gio-qt/dgiofile.h index 60b4c63..71ef3e8 100644 --- a/gio-qt/dgiofile.h +++ b/gio-qt/dgiofile.h @@ -8,7 +8,16 @@ namespace Gio { class File; } +enum DGioFileQueryInfoFlag +{ + FILE_QUERY_INFO_NONE = 0x0, + FILE_QUERY_INFO_NOFOLLOW_SYMLINKS = (1 << 0) +}; + +Q_DECLARE_FLAGS(DGioFileQueryInfoFlags, DGioFileQueryInfoFlag) + class DGioFileInfo; +class DGioFileIterator; class DGioFilePrivate; class DGioFile : public QObject, public QSharedData { @@ -24,6 +33,7 @@ public: QString path() const; QString uri() const; QExplicitlySharedDataPointer createFileSystemInfo(); + QExplicitlySharedDataPointer createFileIterator(QString attr, DGioFileQueryInfoFlags queryInfoFlags = FILE_QUERY_INFO_NONE); private: QScopedPointer d_ptr; diff --git a/gio-qt/dgiofileinfo.cpp b/gio-qt/dgiofileinfo.cpp index 98f1268..254be93 100644 --- a/gio-qt/dgiofileinfo.cpp +++ b/gio-qt/dgiofileinfo.cpp @@ -13,6 +13,7 @@ public: bool getAttributeBoolean(const std::string &attribute) const; quint64 getAttributeUint64(const std::string &attribute) const; + QString getAttributeString(const std::string &attribute) const; private: Glib::RefPtr m_gmmFileInfoPtr; @@ -46,6 +47,11 @@ quint64 DGioFileInfoPrivate::getAttributeUint64(const std::string &attribute) co return m_gmmFileInfoPtr->get_attribute_uint64(attribute); } +QString DGioFileInfoPrivate::getAttributeString(const std::string &attribute) const +{ + return QString::fromStdString(m_gmmFileInfoPtr->get_attribute_string(attribute)); +} + // ------------------------------------------------------------- DGioFileInfo::DGioFileInfo(FileInfo *gmmFileInfoInfoPtr, QObject *parent) diff --git a/gio-qt/dgiofileiterator.cpp b/gio-qt/dgiofileiterator.cpp new file mode 100644 index 0000000..17ff1da --- /dev/null +++ b/gio-qt/dgiofileiterator.cpp @@ -0,0 +1,72 @@ +#include "dgiofileiterator.h" +#include "dgiofileinfo.h" + +#include + +#include +#include + +#include + +using namespace Gio; + +class DGioFileIteratorPrivate +{ +public: + DGioFileIteratorPrivate(DGioFileIterator *qq, FileEnumerator *gmmFileEnumeratorPtr); + + Glib::RefPtr getGmmFileEnumeratorInstance() const; + +private: + Glib::RefPtr m_gmmFileEnumeratorPtr; + + DGioFileIterator *q_ptr; + + Q_DECLARE_PUBLIC(DGioFileIterator) +}; + +DGioFileIteratorPrivate::DGioFileIteratorPrivate(DGioFileIterator *qq, FileEnumerator *gmmFileEnumeratorPtr) + : m_gmmFileEnumeratorPtr(gmmFileEnumeratorPtr) + , q_ptr(qq) +{ + +} + +Glib::RefPtr DGioFileIteratorPrivate::getGmmFileEnumeratorInstance() const +{ + return m_gmmFileEnumeratorPtr; +} + + +// ------------------------------------------------------------- + +DGioFileIterator::DGioFileIterator(FileEnumerator* gmmFileEnumeratorPtr, QObject *parent) + : QObject(parent) + , d_ptr(new DGioFileIteratorPrivate(this, gmmFileEnumeratorPtr)) +{ + // gmmFileEnumeratorPtr must be valid; + Q_CHECK_PTR(gmmFileEnumeratorPtr); +} + +DGioFileIterator::~DGioFileIterator() +{ + +} + +QExplicitlySharedDataPointer DGioFileIterator::next() +{ + Q_D(DGioFileIterator); + + try { + // can return nullptr if there is no file left. + Glib::RefPtr gmmFileInfoPtr = d->getGmmFileEnumeratorInstance()->next_file(); + if (gmmFileInfoPtr) { + QExplicitlySharedDataPointer fileInfo(new DGioFileInfo(gmmFileInfoPtr.release())); + return fileInfo; + } + } catch (const Glib::Error &error) { + qDebug() << QString::fromStdString(error.what().raw()); + } + + return QExplicitlySharedDataPointer(nullptr); +} diff --git a/gio-qt/dgiofileiterator.h b/gio-qt/dgiofileiterator.h new file mode 100644 index 0000000..28fedbb --- /dev/null +++ b/gio-qt/dgiofileiterator.h @@ -0,0 +1,28 @@ +#ifndef DGIOFILEITERATOR_H +#define DGIOFILEITERATOR_H + +#include +#include + +namespace Gio { +class FileEnumerator; +} + +class DGioFileInfo; +class DGioFileIteratorPrivate; +class DGioFileIterator : public QObject, public QSharedData +{ + Q_OBJECT +public: + explicit DGioFileIterator(Gio::FileEnumerator *gmmFileEnumeratorPtr, QObject *parent = nullptr); + ~DGioFileIterator(); + + QExplicitlySharedDataPointer next(); + +private: + QScopedPointer d_ptr; + + Q_DECLARE_PRIVATE(DGioFileIterator) +}; + +#endif // DGIOFILEITERATOR_H diff --git a/gio-qt/dgiomount.cpp b/gio-qt/dgiomount.cpp index 5a7e6e2..db67b4e 100644 --- a/gio-qt/dgiomount.cpp +++ b/gio-qt/dgiomount.cpp @@ -192,6 +192,31 @@ QStringList DGioMount::themedIconNames() const return iconNames; } +QStringList DGioMount::themedSymbolicIconNames() const +{ + Q_D(const DGioMount); + + QStringList iconNames; + + Glib::RefPtr icon = d->getGmmMountInstance()->get_symbolic_icon(); + Glib::RefPtr themedIcon = Glib::RefPtr::cast_dynamic(icon); + + if (themedIcon) { + QStringList iconNames; + char **names; + char **iter; + names = NULL; + g_object_get(G_THEMED_ICON(themedIcon->gobj()), "names", &names, NULL); + for (iter = names; *iter; iter++) { + iconNames.append(QString(*iter)); + } + g_strfreev(names); + return iconNames; + } + + return iconNames; +} + void DGioMount::unmount(bool forceUnmount) { Q_D(const DGioMount); diff --git a/gio-qt/dgiomount.h b/gio-qt/dgiomount.h index 12873d4..09d2bc1 100644 --- a/gio-qt/dgiomount.h +++ b/gio-qt/dgiomount.h @@ -26,6 +26,7 @@ public: bool canUnmount() const; bool canEject() const; QStringList themedIconNames() const; + QStringList themedSymbolicIconNames() const; void unmount(bool forceUnmount = false); diff --git a/gio-qt/dgiomountoperation.cpp b/gio-qt/dgiomountoperation.cpp index 9526eea..505deaf 100644 --- a/gio-qt/dgiomountoperation.cpp +++ b/gio-qt/dgiomountoperation.cpp @@ -51,7 +51,7 @@ void DGioMountOperationPrivate::slot_askPassword(const Glib::ustring &message, c QString msg = QString::fromStdString(message.raw()); QString defaultUser = QString::fromStdString(default_user.raw()); QString defaultDomain = QString::fromStdString(default_domain.raw()); - DGioAskPasswordFlags askPasswordFlags = static_cast(flags); + DGioAskPasswordFlags askPasswordFlags(static_cast(flags)); Q_EMIT q->askPassword(msg, defaultUser, defaultDomain, askPasswordFlags); } diff --git a/gio-qt/dgioutils.cpp b/gio-qt/dgioutils.cpp index 09e0c76..f31601e 100644 --- a/gio-qt/dgioutils.cpp +++ b/gio-qt/dgioutils.cpp @@ -54,3 +54,19 @@ QString DGioUtils::userDataDir() { return QString::fromStdString(Glib::get_user_data_dir()); } + +/*! + * \brief Gets the directory to use for temporary files. + * + * Wrapper of Glib::get_user_data_dir(), behavior similar (but not the same) to QDir::temp() or + * QStandardPaths::writableLocation(QStandardPaths::TempLocation). + * + * This is found from inspecting the environment variables TMPDIR, TMP, and TEMP in that order. If none of those are defined + * "/tmp" is returned on UNIX and "C:\\" on Windows. + * + * \return The directory to use for temporary files. + */ +QString DGioUtils::tmpDir() +{ + return QString::fromStdString(Glib::get_tmp_dir()); +} diff --git a/gio-qt/dgioutils.h b/gio-qt/dgioutils.h index 2b37920..6981527 100644 --- a/gio-qt/dgioutils.h +++ b/gio-qt/dgioutils.h @@ -23,6 +23,7 @@ public: static QString userSpecialDir(DGioUserDirectory userDirectory); static QStringList systemDataDirs(); static QString userDataDir(); + static QString tmpDir(); }; #endif // DGIOUTILS_H diff --git a/qgio-tools/main.cpp b/qgio-tools/main.cpp index 7f315c6..4c1ce54 100644 --- a/qgio-tools/main.cpp +++ b/qgio-tools/main.cpp @@ -8,6 +8,7 @@ #include #include #include +#include int main(int argc, char * argv[]) { @@ -15,19 +16,33 @@ int main(int argc, char * argv[]) qDebug() << "----------------------"; - DGioFile * f = DGioFile::createFromPath("/media/wzc/aaaaaaaaaaaaaaaa"); + DGioFile *networkFile = DGioFile::createFromUri("network:///"); + if (networkFile) { + QExplicitlySharedDataPointer iter = networkFile->createFileIterator("standard::*,mountable::can-mount"); + if (iter) { + while (QExplicitlySharedDataPointer fi = iter->next()) { + if (fi) { + qDebug() << fi->displayName() << fi->fileType(); + } + } + } + } + + qDebug() << "----------------------"; + + DGioFile * f = DGioFile::createFromPath("/media/wzc/_dde_data"); if (f) { qDebug() << f->basename() << f->path() << f->uri(); QExplicitlySharedDataPointer fi = f->createFileSystemInfo(); if (fi) { - qDebug() << fi->fsFreeBytes() << fi->fsUsedBytes() << fi->fsTotalBytes(); + qDebug() << fi->fsFreeBytes() << fi->fsUsedBytes() << fi->fsTotalBytes() << fi->displayName() << fi->displayName(); } delete f; } qDebug() << "----------------------"; - DGioMount * m = DGioMount::createFromPath("/media/wzc/aaaaaaaaaaaaaaaa"); + DGioMount * m = DGioMount::createFromPath("/media/wzc/_dde_data"); if (m) { QExplicitlySharedDataPointer f = m->getRootFile(); QExplicitlySharedDataPointer f2 = m->getDefaultLocationFile();