From e896233284f06563830bce0c06efa0219b5cb36a Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 8 Feb 2017 13:19:21 +0000 Subject: [PATCH] Fetch file size and last modified data when enumerating remote files --- renderdoc/api/replay/data_types.h | 2 ++ renderdoc/core/remote_server.cpp | 6 ++++++ renderdoc/os/os_specific.h | 4 +++- renderdoc/os/posix/posix_stringio.cpp | 7 ++++++- renderdoc/os/win32/win32_stringio.cpp | 15 ++++++++++++++- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index 063750c2c..06a8ad57f 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -38,6 +38,8 @@ struct DirectoryFile { rdctype::str filename; uint32_t flags; + uint32_t lastmod; + uint64_t size; }; struct ResourceFormat diff --git a/renderdoc/core/remote_server.cpp b/renderdoc/core/remote_server.cpp index e0103fcc2..13aca7ebc 100644 --- a/renderdoc/core/remote_server.cpp +++ b/renderdoc/core/remote_server.cpp @@ -49,6 +49,8 @@ void Serialiser::Serialise(const char *name, DirectoryFile &el) Serialise("filename", el.filename); Serialise("flags", el.flags); + Serialise("lastmod", el.lastmod); + Serialise("size", el.size); } template <> @@ -290,6 +292,8 @@ static void ActiveRemoteClientThread(void *data) { DirectoryFile df; df.filename = files[i].filename; + df.lastmod = files[i].lastmod; + df.size = files[i].size; df.flags = files[i].flags; sendSer.Serialise("", df); } @@ -844,6 +848,8 @@ public: { DirectoryFile package; package.filename = trim(tokens[1]); + package.size = 0; + package.lastmod = 0; package.flags = eFileProp_Executable; packages.push_back(package); } diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index b4ffdb775..2d5e73ce7 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -286,9 +286,11 @@ enum struct FoundFile { FoundFile() : flags(0) {} - FoundFile(string fn, uint32_t f) : filename(fn), flags(f) {} + FoundFile(string fn, uint32_t f) : filename(fn), flags(f), lastmod(0), size(0) {} string filename; uint32_t flags; + uint32_t lastmod; + uint64_t size; }; vector GetFilesInDirectory(const char *path); diff --git a/renderdoc/os/posix/posix_stringio.cpp b/renderdoc/os/posix/posix_stringio.cpp index 02d44889f..c5b1916ae 100644 --- a/renderdoc/os/posix/posix_stringio.cpp +++ b/renderdoc/os/posix/posix_stringio.cpp @@ -305,7 +305,12 @@ vector GetFilesInDirectory(const char *path) if(ent->d_name[0] == '.') flags |= eFileProp_Hidden; - ret.push_back(FoundFile(ent->d_name, flags)); + FoundFile f(ent->d_name, flags); + + f.lastmod = (uint32_t)st.st_mtime; + f.size = (uint64_t)st.st_size; + + ret.push_back(f); } // don't care if we hit an error or enumerated all files, just finish diff --git a/renderdoc/os/win32/win32_stringio.cpp b/renderdoc/os/win32/win32_stringio.cpp index a0e81da23..de0f26bee 100644 --- a/renderdoc/os/win32/win32_stringio.cpp +++ b/renderdoc/os/win32/win32_stringio.cpp @@ -432,7 +432,20 @@ vector GetFilesInDirectory(const char *path) flags |= eFileProp_Executable; } - ret.push_back(FoundFile(StringFormat::Wide2UTF8(findData.cFileName), flags)); + FoundFile f(StringFormat::Wide2UTF8(findData.cFileName), flags); + + uint64_t nanosecondsSinceWindowsEpoch = uint64_t(findData.ftLastWriteTime.dwHighDateTime) << 8 | + uint64_t(findData.ftLastWriteTime.dwLowDateTime); + + uint64_t secondsSinceWindowsEpoch = nanosecondsSinceWindowsEpoch / 10000000; + + // this constant is the number of seconds between Jan 1 1601 and Jan 1 1970 + uint64_t secondsSinceUnixEpoch = secondsSinceWindowsEpoch - 11644473600; + + f.lastmod = uint32_t(secondsSinceUnixEpoch); + f.size = uint64_t(findData.nFileSizeHigh) << 8 | uint64_t(findData.nFileSizeLow); + + ret.push_back(f); } } while(FindNextFile(find, &findData) != FALSE);