[Tuxcmd-dev-vfs] Koncepce VFS - cast 2.
Status: Beta
Brought to you by:
tbzatek
|
From: Tomas B. <sou...@bz...> - 2004-02-21 14:59:43
|
Konecne, po nekolika dnech spisovani:
Tohle je jenom koncept, nacrt zhruba jak si predstavuju ze by to melo
vypadat. Na jmena funkci se nedivejte, je to jenom tak splacane,
parametry zhruba sedi, mozna by to u nekterych funkci chtelo vratit
jeste nejaky ten VFSResult navic... Mozna je ta struktura mirne
schizofrenni, kombinoval jsem zaklady VFS ze Seksi Commanderu a Tux
Commanderu.
Koukam ze jsem pri prochazeni struktury sveho VFS (teda aspon lokalni
casti) dosel na dost smeti :) (proste se to za ten rok a pul vyvoje
nahromadilo...)
K datovym typum:
ja vim ze vsichni asi budeme pouzivat Pascal, takze by to bylo
bezpredmetne, ale urcite se casem najde nekdo (treba ja), kdo si napise
plugin v Cecku nebo nejakem jinem kompatibilim jazyku. Takze doporucuju
pouzivat tyto typy: PChar, LongBool (kvuli 32bit zarovnavani), Integer
(=3Dint), Int64 (=3Dto jeste nevim, neco jako long uint?), klasicky Point=
er.
Vetsina funkci by taky mela byt oznacena jako cdecl;
Toto je seznam funkci ktery by mel obsahovat kazdy VFS modul:
Inicializacni funkce:
type TVFSLogFunc =3D procedure(S: PChar); cdecl; =20
capVFS_nil=3D0; //nothing
capVFS_List=3D1;
capVFS_CopyOut=3D2;
capVFS_CopyIn=3D4;
capVFS_MkDir=3D8;
capVFS_RmDir=3D16;
capVFS_Multiple=3D32; //support multiple files
capVFS_Delete=3D64;
capVFS_Rename=3D128;
capVFS_Execute=3D256;
.... atd, proste maska operaci co plugin umi=20
procedure VFSInit(LogFunc: TVFSLogFunc);
// provede vnitrni inicializaci a nastavi logovaci funkci
procedure VFSDestroy;
// pri zavirani uvolni sve alokovane prostredky
function VFSCaps(const sExt:PChar):Integer;
// vrati pro kazdou priponu masku co plugin umi - bude stacit 32 moznosti=
? snad ano...
function VFSGetExts:PChar;
// vrati seznam pripon, nejak oddeleny (asi strednik)
procedure SetProtocolLogFunc(ProtoLogFunc: TVFSLogFunc);
// tato druha logovaci funkce bude slouzit k vypisu hlasek vyplyvajici z =
komunikace (FTP hlavne) - chci je mit oddelene od Debug logovaci funkce
property BlockSize: guint32 read GetBlockSize write SetBlockSize;
// Nastaveni velikosti bloku pri presunu dat
Operace:
//error codes (TVFSResult)
cVFS_OK=3D0;
cVFS_Failed=3D1; // taky No such file
cVFS_Not_Supported=3D2;
cVFS_Not_More_Files=3D3;
cVFS_ReadErr=3D4;
cVFS_UnknownUserPas=3D5;
cVFS_PermissionDenied=3D6;
function VFSOpen(const sName:PChar):TVFSResult;
// otevre soubor (archiv)
function VFSLogin(const user, pass:PChar):TVFSResult;
// prihlasi se na FTP, SCP nebo SMB
function VFSClose:TVFSResult;
// zavre soubor; nebo taky logout
function VFSMkDir(const sDirName:PChar):TVFSResult;
// vytvori adresar. Co vic?
function VFSRename(const sSrcName, sDstName:PChar):TVFSResult;
// prejmenuje soubor/adresar
function VFSRemove(const APath: PChar):TVFSResult;
// smaze (=3Dprovede unlink) soubor/adresar (v Unixu je to jedno, v plugi=
nu nutno testovat)
function FileExists(const FileName: PChar; const Use_lstat: LongBool =
=3D False): LongBool;
// zjisti jestli soubor/adresar existuje. Use_lstat =3D jestli ma delat f=
ollow symlinks
function MakeSymLink(const NewFileName, PointTo: PChar):TVFSResult;
// vytvori symlink. NewFileName =3D cesta + jmeno souboru noveho symlinku
function Chmod(const FileName: PChar; const Mode: integer):TVFSResult=
;
// proste Chmod. Mode je v klasickym unixovym formatu (libc), takze bity,=
ne octal
function Chown(const FileName: PChar; const UID, GID: integer):TVFSRe=
sult;
// to samy
function ChangeTimes(APath: PChar; mtime, atime: Longint):TVFSResult;
// zmeni casy u souboru (ctime se vetsinou nepouziva)
function ChangeDir(const NewPath: PChar):TVFSResult;
// pokusi se zmenit adresar a vrati hodnotu jestli ma na to pravo (treba =
do /root to hodi hned chybu)
property Path: PChar read GetPath write SetPath;
// zjistovani aktualni nastavene cesty v pluginu
function GetFileSystemSize(const APath: PChar): Int64;
// vrati velikost FS - ta cesta je nepovinna, plati jenom pokud plugin ma=
ve svem stromu vic namountovanych FS (typicky NFS)
function GetFileSystemFree(const APath: PChar): Int64;
// analogicky
function GetFSID(const APath: PChar): Int64;
// vrati nejake unikatni cislo FS, ktere identifikuje, ze soubor se nacha=
zi na urcitem FS
function GetFSLabel(const APath: PChar): PChar;
// zase plati stejna poznamka jako u GetFileSystemSize
function GetDirSize(APath: PChar): Int64;
// projde rekurzivne cely strom od zadane cesty a vrati velikost celeho s=
tromu
procedure BreakGetDirSize;
// zastavi vyse uvedene zjistovani velikosti
Blokove operace:
toto je obdoba klasickych unixovych funkci k pristupu k souboru - muze
se pouzivat napr. i v prohlizeci (vymena misto mmap predpokladam nebude
slozita - proste se bude cist soubor po blocich.
function OpenFile(const APath: PChar; const Flags, Mode: integer; var=
Error: integer): integer;
// vrati filedescriptor
function ReadFile(const FileDescriptor: integer; Buffer: Pointer; ABl=
ockSize: integer; var Error: integer): integer;
// Returns number of bytes read
function WriteFile(const FileDescriptor: integer; Buffer: Pointer; By=
tesCount: integer; var Error: integer): integer;
// Returns number of bytes written
function CloseFile(const FileDescriptor: integer): TVFSResult;
function FileSeek(const FileDescriptor: integer; const AbsoluteOffset=
: Int64; var Error: integer): Int64;=20
// vrati nastavenou pozici nebo -1 pri chybe
function SendFile(const SrcFileDescriptor, DestFileDescriptor: intege=
r; var AbsoluteOffset: integer; const BlockSize: integer; var Error: inte=
ger): Int64;=20
// Returns number of bytes transferred - pouzivam k blokovemu presunu dat=
(kopirovani), je to rychlejsi nez read a pak write; navic je to presun n=
a urovni jadra, takze rychlejsi a mimo cache
Vypis adresare a zjistovani informaci o souboru:
TVFSItemType =3D (vRegular=3D0, vLink=3D1, vSymlink=3D2, vChardev=3D3, v=
Blockdev=3D4, vDirectory=3D5, vFifo=3D6, vSock=3D7, vOther=3D8);
PVFSItem =3D ^VFSItem; =20
TVFSItem =3D record
FileName, LinkTo :PChar;
iSize:Int64;
iMode:Integer;
iUID: Integer;
iGID: Integer;
ItemType:TVFSItemType;
// time_t representing the time in seconds since 00:00:00 UTC, January =
1, 1970) }
m_time: LongInt;
a_time: LongInt;
c_time: LongInt;
// file date
// DirRec.DateTime :=3D EncodeDate (1970, 1, 1) + (ExtractNumber (@Heade=
r.MTime, 12) / 86400.0);
=
=20
end;
function VFSListBegin(APath: PChar; var VFSItem:PVFSItem):TVFSResult;
// pretoci pozici listingu na prvni soubor - rekne se tim ze se zacina vy=
pis
function VFSList(APath: PChar; var VFSItem:PVFSItem):TVFSResult;
// vrati nejakou hodnotu az dojde na konec seznamu (to plati i pro VFSLis=
tBegin pokud je adresar prazdny)
function VFSFileInfo(AFileName: PChar; var VFSItem:PVFSItem):TVFSResu=
lt;
// vrati strukturu s informacema jenom o tom jednom souboru
Co jeste neni doresene:
(opravdu nevim co tim chtel basnik rici ;-D )
function VFSRun(const sName:String):TVFSResult;
function VFSList(const sDir:String; iItemID:Integer; var VFSItem:TVFS=
Item ):TVFSResult;
function VFSRmDir(const sDirName:PChar):TVFSResult;
function VFSCopyOut(const sSrcName, sDstName:String):TVFSResult;
function VFSCopyIn(const sSrcName, sDstName:String):TVFSResult;
noooo..... je toho dost a nebude to zase tak lehke implementovat jak se
tak divam...
--
Tom=E1=B9 B=BEatek
|