[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 |