From 7d388c3090f1e523b40b42f8634d22738fc75314 Mon Sep 17 00:00:00 2001 From: Gioacchino Mazzurco Date: Sat, 4 Apr 2020 16:33:19 +0200 Subject: [PATCH] Solve non compatible 32/64bit file handle API --- libretroshare/src/file_sharing/file_tree.cc | 17 ++++---- libretroshare/src/ft/ftserver.cc | 8 ++-- libretroshare/src/ft/ftserver.h | 4 +- libretroshare/src/retroshare/rsfiles.h | 14 +++---- libretroshare/src/retroshare/rstypes.h | 44 ++++++++------------- 5 files changed, 39 insertions(+), 48 deletions(-) diff --git a/libretroshare/src/file_sharing/file_tree.cc b/libretroshare/src/file_sharing/file_tree.cc index ddc24c3ac..ad34501e3 100644 --- a/libretroshare/src/file_sharing/file_tree.cc +++ b/libretroshare/src/file_sharing/file_tree.cc @@ -160,20 +160,23 @@ void RsFileTree::recurs_buildFileTree( } bool RsFileTree::getDirectoryContent( - std::string& name, std::vector& subdirs, - std::vector& subfiles, std::uintptr_t index ) const + std::string& name, std::vector& subdirs, + std::vector& subfiles, uint64_t index_p ) const { - if(index >= mDirs.size()) - return false ; + // Avoid warnings on Android armv7 + using sz_t = std::vector::size_type; + sz_t index = static_cast(index_p); + + if(index >= mDirs.size()) return false; name = mDirs[index].name; subdirs = mDirs[index].subdirs ; subfiles.clear() ; - for(uint32_t i=0;i(mDirs[index].subfiles[i])]); - return true ; + return true; } std::unique_ptr RsFileTree::fromDirDetails( diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index 4c6c5b6c3..d2c2f9f0a 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -345,12 +345,12 @@ std::error_condition ftServer::requestFiles( // Track how many time a directory have been explored std::vector dirsSeenCnt(dirsCount, 0); // - using StackEntry = std::tuple; + using StackEntry = std::tuple; std::deque dStack = { std::make_tuple(0, basePath) }; const auto exploreDir = [&](const StackEntry& se)-> std::error_condition { - std::uintptr_t dirHandle; std::string parentPath; + uint64_t dirHandle; std::string parentPath; std::tie(dirHandle, parentPath) = se; const auto& dirData = collection.mDirs[dirHandle]; @@ -843,7 +843,7 @@ bool ftServer::findChildPointer(void *ref, int row, void *& result, FileSearchFl } bool ftServer::requestDirDetails( - DirDetails &details, std::uintptr_t handle, FileSearchFlags flags ) + DirDetails &details, uint64_t handle, FileSearchFlags flags ) { return RequestDirDetails(reinterpret_cast(handle), details, flags); } int ftServer::RequestDirDetails(void *ref, DirDetails &details, FileSearchFlags flags) @@ -2249,7 +2249,7 @@ std::error_condition ftServer::dirDetailsToLink( } std::error_condition ftServer::exportCollectionLink( - std::string& link, std::uintptr_t handle, bool fragSneak, + std::string& link, uint64_t handle, bool fragSneak, const std::string& baseUrl ) { DirDetails tDirDet; diff --git a/libretroshare/src/ft/ftserver.h b/libretroshare/src/ft/ftserver.h index 789bba49d..f6cc4b44c 100644 --- a/libretroshare/src/ft/ftserver.h +++ b/libretroshare/src/ft/ftserver.h @@ -225,7 +225,7 @@ public: /// @see RsFiles std::error_condition exportCollectionLink( - std::string& link, std::uintptr_t handle, bool fragSneak = false, + std::string& link, uint64_t handle, bool fragSneak = false, const std::string& baseUrl = RsFiles::DEFAULT_FILES_BASE_URL ) override; @@ -279,7 +279,7 @@ public: /// @see RsFiles::RequestDirDetails virtual bool requestDirDetails( - DirDetails &details, std::uintptr_t handle = 0, + DirDetails &details, uint64_t handle = 0, FileSearchFlags flags = RS_FILE_HINTS_LOCAL ); virtual bool findChildPointer(void *ref, int row, void *& result, FileSearchFlags flags) ; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index 78de40262..64563f621 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -324,14 +324,14 @@ public: /// Allow browsing the hierarchy bool getDirectoryContent( - std::string& name, std::vector& subdirs, - std::vector& subfiles, std::uintptr_t handle = 0 ) const; + std::string& name, std::vector& subdirs, + std::vector& subfiles, uint64_t handle = 0 ) const; struct DirData: RsSerializable { std::string name; - std::vector subdirs; - std::vector subfiles; + std::vector subdirs; + std::vector subfiles; void serial_process( RsGenericSerializer::SerializeJob j, @@ -735,7 +735,7 @@ public: * @return false if error occurred, true otherwise */ virtual bool requestDirDetails( - DirDetails &details, std::uintptr_t handle = 0, + DirDetails &details, uint64_t handle = 0, FileSearchFlags flags = RS_FILE_HINTS_LOCAL ) = 0; /*** @@ -744,7 +744,7 @@ public: /** * Kept for retrocompatibility, it was originally written for easier * interaction with Qt. As soon as you can, you should prefer to use the - * version of this methodn which take `std::uintptr_t handle` as paramether. + * version of this method which take `uint64_t handle` as paramether. */ RS_DEPRECATED_FOR(requestDirDetails) virtual int RequestDirDetails( @@ -927,7 +927,7 @@ public: * @return error information if some error occurred, 0/SUCCESS otherwise */ virtual std::error_condition exportCollectionLink( - std::string& link, std::uintptr_t handle, bool fragSneak = false, + std::string& link, uint64_t handle, bool fragSneak = false, const std::string& baseUrl = RsFiles::DEFAULT_FILES_BASE_URL ) = 0; /** diff --git a/libretroshare/src/retroshare/rstypes.h b/libretroshare/src/retroshare/rstypes.h index 60902b7ab..2daa25947 100644 --- a/libretroshare/src/retroshare/rstypes.h +++ b/libretroshare/src/retroshare/rstypes.h @@ -304,10 +304,16 @@ struct DirDetails : RsSerializable type(DIR_TYPE_UNKNOWN), count(0), mtime(0), max_mtime(0) {} + /* G10h4ck do we still need to keep this as void* instead of uint64_t for + * retroshare-gui sake? */ void* parent; + int prow; /* parent row */ + /* G10h4ck do we still need to keep this as void* instead of uint64_t for + * retroshare-gui sake? */ void* ref; + uint8_t type; RsPeerId id; std::string name; @@ -323,36 +329,18 @@ struct DirDetails : RsSerializable /// @see RsSerializable void serial_process(RsGenericSerializer::SerializeJob j, - RsGenericSerializer::SerializeContext& ctx) + RsGenericSerializer::SerializeContext& ctx) override { -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif // defined(__GNUC__) && !defined(__clang__) + /* Enforce serialization as uint64_t because void* changes size + * depending (usually 4 bytes on 32bit arch and 8 bytes on 64bit archs) + */ + uint64_t handle = reinterpret_cast(ref); + RS_SERIAL_PROCESS(handle); + ref = reinterpret_cast(handle); - // (Cyril) We have to do this because on some systems (MacOS) uintptr_t is unsigned long which is not well defined. It is always - // preferable to force type serialization to the correct size rather than letting the compiler choose for us. - // /!\ This structure cannot be sent over the network. The serialization would be inconsistent. - - if(sizeof(ref) == 4) - { - std::uint32_t& handle(reinterpret_cast(ref)); - RS_SERIAL_PROCESS(handle); - std::uint32_t& parentHandle(reinterpret_cast(parent)); - RS_SERIAL_PROCESS(parentHandle); - } - else if(sizeof(ref) == 8) - { - std::uint64_t& handle(reinterpret_cast(ref)); - RS_SERIAL_PROCESS(handle); - std::uint64_t& parentHandle(reinterpret_cast(parent)); - RS_SERIAL_PROCESS(parentHandle); - } - else - std::cerr << __PRETTY_FUNCTION__ << ": cannot serialize raw pointer of size " << sizeof(ref) << std::endl; - -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif // defined(__GNUC__) && !defined(__clang__) + uint64_t parentHandle = reinterpret_cast(parent); + RS_SERIAL_PROCESS(parentHandle); + parent = reinterpret_cast(parentHandle); RS_SERIAL_PROCESS(prow); RS_SERIAL_PROCESS(type);