#ifndef FSDIRINFO_H_ #define FSDIRINFO_H_ #include #include #include #include #include #include "FsObjectInfo.h" struct FsDirInfo; typedef struct FsDirInfo FsDirInfo; static inline void FsDirInfo_init(FsDirInfo* this, App* app); static inline FsDirInfo* FsDirInfo_construct(App* app); static inline void FsDirInfo_uninit(FsObjectInfo* this); // getters & setters static inline loff_t FsDirInfo_getServerOffset(FsDirInfo* this); static inline void FsDirInfo_setServerOffset(FsDirInfo* this, int64_t serverOffset); static inline size_t FsDirInfo_getCurrentContentsPos(FsDirInfo* this); static inline void FsDirInfo_setCurrentContentsPos(FsDirInfo* this, size_t currentContentsPos); static inline struct StrCpyVec* FsDirInfo_getDirContents(FsDirInfo* this); static inline struct StrCpyVec* FsDirInfo_getEntryIDs(FsDirInfo* this); static inline struct UInt8Vec* FsDirInfo_getDirContentsTypes(FsDirInfo* this); static inline struct Int64CpyVec* FsDirInfo_getServerOffsets(FsDirInfo* this); static inline void FsDirInfo_setEndOfDir(FsDirInfo* this, bool endOfDir); static inline bool FsDirInfo_getEndOfDir(FsDirInfo* this); struct FsDirInfo { FsObjectInfo fsObjectInfo; StrCpyVec dirContents; // entry names UInt8Vec dirContentsTypes; // DirEntryType elements matching dirContents vector StrCpyVec entryIDs; // entryID elements matching dirContents vector Int64CpyVec serverOffsets; // dir entry offsets for telldir() matching dirContents vector int64_t serverOffset; /* offset for the next incremental list request to the server (equals last element of serverOffsets vector) */ size_t currentContentsPos; // current local pos in dirContents (>=0 && dirContents); UInt8Vec_init(&this->dirContentsTypes); StrCpyVec_init(&this->entryIDs); Int64CpyVec_init(&this->serverOffsets); this->serverOffset = 0; this->currentContentsPos = 0; this->endOfDir = false; // assign virtual functions ( (FsObjectInfo*)this)->uninit = FsDirInfo_uninit; } struct FsDirInfo* FsDirInfo_construct(App* app) { struct FsDirInfo* this = (FsDirInfo*)os_kmalloc(sizeof(*this) ); if(likely(this) ) FsDirInfo_init(this, app); return this; } void FsDirInfo_uninit(FsObjectInfo* this) { FsDirInfo* thisCast = (FsDirInfo*)this; StrCpyVec_uninit(&thisCast->dirContents); UInt8Vec_uninit(&thisCast->dirContentsTypes); StrCpyVec_uninit(&thisCast->entryIDs); Int64CpyVec_uninit(&thisCast->serverOffsets); } loff_t FsDirInfo_getServerOffset(FsDirInfo* this) { return this->serverOffset; } void FsDirInfo_setServerOffset(FsDirInfo* this, int64_t serverOffset) { this->serverOffset = serverOffset; } size_t FsDirInfo_getCurrentContentsPos(FsDirInfo* this) { return this->currentContentsPos; } void FsDirInfo_setCurrentContentsPos(FsDirInfo* this, size_t currentContentsPos) { this->currentContentsPos = currentContentsPos; } StrCpyVec* FsDirInfo_getDirContents(FsDirInfo* this) { return &this->dirContents; } StrCpyVec* FsDirInfo_getEntryIDs(FsDirInfo* this) { return &this->entryIDs; } /** * @return vector of DirEntryType elements, matching dirContents vector */ UInt8Vec* FsDirInfo_getDirContentsTypes(FsDirInfo* this) { return &this->dirContentsTypes; } Int64CpyVec* FsDirInfo_getServerOffsets(FsDirInfo* this) { return &this->serverOffsets; } void FsDirInfo_setEndOfDir(FsDirInfo* this, bool endOfDir) { this->endOfDir = endOfDir; } bool FsDirInfo_getEndOfDir(FsDirInfo* this) { return this->endOfDir; } #endif /*FSDIRINFO_H_*/