diff --git a/src/file_sharing/dir_hierarchy.cc b/src/file_sharing/dir_hierarchy.cc index 6504da96f0..eec298cad1 100644 --- a/src/file_sharing/dir_hierarchy.cc +++ b/src/file_sharing/dir_hierarchy.cc @@ -675,15 +675,21 @@ uint64_t InternalFileHierarchyStorage::recursUpdateCumulatedSize(const Directory DirEntry& d(*static_cast(mNodes[dir_index])) ; uint64_t local_cumulative_size = 0; + uint32_t local_cumulative_files = 0; for(uint32_t i=0;i(mNodes[d.subfiles[i]])->file_size; + local_cumulative_files++; + } - for(uint32_t i=0;i(mNodes[d.subdirs[i]])->dir_cumulated_files; + } d.dir_cumulated_size = local_cumulative_size; + d.dir_cumulated_files = local_cumulative_files; return local_cumulative_size; } // Do a complete recursive sweep over sub-directories and files, and update the lst modf TS. This could be also performed by a cleanup method. diff --git a/src/file_sharing/dir_hierarchy.h b/src/file_sharing/dir_hierarchy.h index c6a28650bd..991e21e6c1 100644 --- a/src/file_sharing/dir_hierarchy.h +++ b/src/file_sharing/dir_hierarchy.h @@ -63,7 +63,7 @@ class InternalFileHierarchyStorage class DirEntry: public FileStorageNode { public: - explicit DirEntry(const std::string& name) : dir_name(name), dir_cumulated_size(0), dir_modtime(0),dir_most_recent_time(0),dir_update_time(0) {} + explicit DirEntry(const std::string& name) : dir_name(name), dir_cumulated_size(0), dir_cumulated_files(0), dir_modtime(0),dir_most_recent_time(0),dir_update_time(0) {} virtual ~DirEntry() {} virtual uint32_t type() const { return FileStorageNode::TYPE_DIR ; } @@ -73,6 +73,7 @@ class InternalFileHierarchyStorage std::string dir_parent_path ; RsFileHash dir_hash ; uint64_t dir_cumulated_size; + uint32_t dir_cumulated_files; std::vector subdirs ; std::vector subfiles ; diff --git a/src/file_sharing/directory_storage.cc b/src/file_sharing/directory_storage.cc index 583ac58825..5dca75b26d 100644 --- a/src/file_sharing/directory_storage.cc +++ b/src/file_sharing/directory_storage.cc @@ -244,6 +244,7 @@ bool DirectoryStorage::extractData(const EntryIndex& indx,DirDetails& d) d.type = DIR_TYPE_DIR; d.hash.clear() ; d.size = dir_entry->dir_cumulated_size;//dir_entry->subdirs.size() + dir_entry->subfiles.size(); + d.count = dir_entry->dir_cumulated_files; d.max_mtime = dir_entry->dir_most_recent_time ; d.mtime = dir_entry->dir_modtime ; d.name = dir_entry->dir_name; diff --git a/src/retroshare/rstypes.h b/src/retroshare/rstypes.h index e7118f286e..2d03f6f6d0 100644 --- a/src/retroshare/rstypes.h +++ b/src/retroshare/rstypes.h @@ -281,7 +281,7 @@ struct DirStub : RsSerializable struct DirDetails : RsSerializable { DirDetails() : parent(nullptr), prow(0), ref(nullptr), - type(DIR_TYPE_UNKNOWN), size(0), mtime(0), max_mtime(0) {} + type(DIR_TYPE_UNKNOWN), size(0), mtime(0), max_mtime(0), count(0) {} /* G10h4ck do we still need to keep this as void* instead of uint64_t for @@ -303,6 +303,7 @@ struct DirDetails : RsSerializable uint32_t mtime; // file/directory modification time, according to what the system reports FileStorageFlags flags; uint32_t max_mtime ; // maximum modification time of the whole hierarchy below. + uint32_t count; // cumulative number of files in the directory hierarchy. std::vector children; std::list parent_groups; // parent groups for the shared directory @@ -332,6 +333,7 @@ struct DirDetails : RsSerializable RS_SERIAL_PROCESS(mtime); RS_SERIAL_PROCESS(flags); RS_SERIAL_PROCESS(max_mtime); + RS_SERIAL_PROCESS(count); RS_SERIAL_PROCESS(children); RS_SERIAL_PROCESS(parent_groups); }