// This class is responsible for // - maintaining a list of shared file hierarchies for each known friends // - talking to the GUI // - providing handles for the directory tree listing GUI // - providing search handles for FT // - keeping these lists up to date // - sending our own file list to friends depending on the defined access rights // - serving file search requests from other services such as file transfer // // p3FileList does the following micro-tasks: // - tick the watchers // - get incoming info from the service layer, which can be: // - directory content request => the directory content is shared to the friend // - directory content => the directory watcher is notified // - keep two queues of update requests: // - fast queue that is handled in highest priority. This one is used for e.g. updating while browsing. // - slow queue that is handled slowly. Used in background update of shared directories. // // The file lists are not directry updated. A FileListWatcher class is responsible for this // in every case. // #pragma once #include "ft/ftsearch.h" #include "retroshare/rsfiles.h" #include "services/p3service.h" #include "file_sharing/hash_cache.h" #include "pqi/p3cfgmgr.h" #include "pqi/p3linkmgr.h" class RemoteDirectoryUpdater ; class LocalDirectoryUpdater ; class RemoteDirectoryStorage ; class LocalDirectoryStorage ; class HashStorage ; class p3FileDatabase: public p3Service, public p3Config, public ftSearch //, public RsSharedFileService { public: typedef uint64_t EntryIndex ; // this should probably be defined elsewhere virtual RsServiceInfo getServiceInfo(); struct RsFileListSyncRequest { RsPeerId peerId ; EntryIndex index ; // [...] more to add here }; p3FileDatabase(p3ServiceControl *mpeers) ; ~p3FileDatabase(); /*! * \brief forceSyncWithPeers * * Forces the synchronisation of the database with connected peers. This is triggered when e.g. a new gorup of friend is created, or when * a friend was added/removed from a group. */ void forceSyncWithPeers(); // derived from p3Service // virtual int tick() ; // access to own/remote shared files // virtual bool findLocalFile(const RsFileHash& hash,FileSearchFlags flags,const RsPeerId& peer_id, std::string &fullpath, uint64_t &size,FileStorageFlags& storage_flags,std::list& parent_groups) const; virtual int SearchKeywords(const std::list& keywords, std::list& results,FileSearchFlags flags,const RsPeerId& peer_id) ; virtual int SearchBoolExp(Expression *exp, std::list& results,FileSearchFlags flags,const RsPeerId& peer_id) const ; // ftSearch virtual bool search(const RsFileHash &hash, FileSearchFlags hintflags, FileInfo &info) const; // Interface for browsing dir hierarchy // void stopThreads() ; void startThreads() ; int RequestDirDetails(const RsPeerId& uid, const std::string& path, DirDetails &details); int RequestDirDetails(const std::string& path, DirDetails &details) const ; // void * here is the type expected by the abstract model index from Qt. It gets turned into a DirectoryStorage::EntryIndex internally. int RequestDirDetails(void *, DirDetails&, FileSearchFlags) const ; uint32_t getType(void *) const ; // set/update shared directories void setSharedDirectories(const std::list& dirs); void getSharedDirectories(std::list& dirs); void updateShareFlags(const SharedDirInfo& info) ; bool convertSharedFilePath(const std::string& path,std::string& fullpath); // interface for hash caching void setWatchPeriod(uint32_t seconds); uint32_t watchPeriod() ; void setRememberHashCacheDuration(uint32_t days) ; uint32_t rememberHashCacheDuration() ; void clearHashCache() ; bool rememberHashCache() ; void setRememberHashCache(bool) ; // interfact for directory parsing void forceDirectoryCheck(); // Force re-sweep the directories and see what's changed bool inDirectoryCheck(); // debug void full_print(); protected: // Derived from p3Config // virtual bool loadList(std::list& items); virtual bool saveList(bool &cleanup, std::list&); virtual RsSerialiser *setupSerialiser() ; void cleanup(); void tickRecv(); void tickSend(); void tickWatchers(); private: p3ServiceControl *mServCtrl ; // File sync request queues. The fast one is used for online browsing when friends are connected. // The slow one is used for background update of file lists. // std::list mFastRequestQueue ; std::list mSlowRequestQueue ; // Directory storage hierarchies // std::map mRemoteDirectories ; LocalDirectoryStorage *mLocalSharedDirs ; RemoteDirectoryUpdater *mRemoteDirWatcher ; LocalDirectoryUpdater *mLocalDirWatcher ; // We use a shared file cache as well, to avoid re-hashing files with known modification TS and equal name. // HashStorage *mHashCache ; // Local flags and mutexes RsMutex mFLSMtx ; uint32_t mUpdateFlags ; };