2025-08-10 01:34:16 +02:00

142 lines
3.9 KiB
C

#ifndef FSDIRINFO_H_
#define FSDIRINFO_H_
#include <common/storage/StorageDefinitions.h>
#include <common/toolkit/vector/Int64CpyVec.h>
#include <common/toolkit/vector/StrCpyVec.h>
#include <common/toolkit/vector/UInt8Vec.h>
#include <common/Common.h>
#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_len)
bool endOfDir; // true if server reached end of dir entries during last query
};
void FsDirInfo_init(FsDirInfo* this, App* app)
{
FsObjectInfo_init( (FsObjectInfo*)this, app, FsObjectType_DIRECTORY);
StrCpyVec_init(&this->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_*/