From 1203a0f839d29d57cbb229372484d08779fe1242 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Wed, 9 Oct 2019 13:25:23 +0800 Subject: [PATCH] feat: optional timeout parameter for DGioFile::createFileInfo. --- gio-qt/include/dgiofile.h | 2 +- gio-qt/source/dgiofile.cpp | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gio-qt/include/dgiofile.h b/gio-qt/include/dgiofile.h index 2b6a8d8..9654c07 100644 --- a/gio-qt/include/dgiofile.h +++ b/gio-qt/include/dgiofile.h @@ -55,7 +55,7 @@ public: QString path() const; QString uri() const; - QExplicitlySharedDataPointer createFileInfo(QString attr = "*", DGioFileQueryInfoFlags queryInfoFlags = FILE_QUERY_INFO_NONE); + QExplicitlySharedDataPointer createFileInfo(QString attr = "*", DGioFileQueryInfoFlags queryInfoFlags = FILE_QUERY_INFO_NONE, unsigned long timeout_msec = ULONG_MAX); QExplicitlySharedDataPointer createFileSystemInfo(QString attr = "*"); QExplicitlySharedDataPointer createFileIterator(QString attr = "*", DGioFileQueryInfoFlags queryInfoFlags = FILE_QUERY_INFO_NONE); void createFileIteratorAsync(QString attr = "*", DGioFileQueryInfoFlags queryInfoFlags = FILE_QUERY_INFO_NONE); diff --git a/gio-qt/source/dgiofile.cpp b/gio-qt/source/dgiofile.cpp index f2ffa81..491ce1c 100644 --- a/gio-qt/source/dgiofile.cpp +++ b/gio-qt/source/dgiofile.cpp @@ -29,6 +29,10 @@ #include #include +#include +#include +#include +#include #include using namespace Gio; @@ -223,15 +227,28 @@ QString DGioFile::uri() const * * \return the created file info object, or nullptr if create failed. */ -QExplicitlySharedDataPointer DGioFile::createFileInfo(QString attr, DGioFileQueryInfoFlags queryInfoFlags) +QExplicitlySharedDataPointer DGioFile::createFileInfo(QString attr, DGioFileQueryInfoFlags queryInfoFlags, unsigned long timeout_msec) { Q_D(DGioFile); try { unsigned int flagValue = queryInfoFlags; FileQueryInfoFlags flags = static_cast(flagValue); - Glib::RefPtr gmmFileInfo = d->getGmmFileInstance()->query_info(attr.toStdString(), flags); - if (gmmFileInfo) { + Glib::RefPtr gmmFileInfo; + QWaitCondition cond; + QtConcurrent::run([&] { + QTime t; + t.start(); + gmmFileInfo = d->getGmmFileInstance()->query_info(attr.toStdString(), flags); + if (t.elapsed() < timeout_msec) { + cond.wakeAll(); + } + }); + QMutex m; + m.lock(); + bool finished = cond.wait(&m, timeout_msec); + m.unlock(); + if (finished && gmmFileInfo) { QExplicitlySharedDataPointer fileInfoPtr(new DGioFileInfo(gmmFileInfo.release())); return fileInfoPtr; }