[Tuxcmd-dev-vfs] Koncepce VFS - cast 2. round II.
Status: Beta
Brought to you by:
tbzatek
|
From: Tomas B. <sou...@bz...> - 2004-03-15 21:20:39
|
Tak je tu druhe kolo s opravenyma specifikacema VFS. Predem se omlouvam
za dlouhe prodlevy mezi odpovedmi, jsem v pracovnim procesu a tudiz
nemam momentalne na nic cas :-(
Pridal jsem do kazde funkce parametr typu TVFSGlobs, ktery stejne
zustane skryty pro program, pokud si to clovek predela do objektu (treba
tak jak je to v uVFSmodule.pas).
Meli bychom bysme se domluvit hlavne na funkcich pro blokove operace s
daty, vsechen ostatni balast neni zas tak moc dulezity.
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(g:TVFSGlobs; LogFunc: TVFSLogFunc; Var iMemoryNeed:=
Integer);
// provede vnitrni inicializaci a nastavi logovaci funkci
procedure VFSDestroy(g:TVFSGlobs);
// pri zavirani uvolni sve alokovane prostredky
function VFSCaps(g:TVFSGlobs; const sExt:PChar):Integer;
// vrati pro kazdou priponu masku co plugin umi - bude stacit 32 moznosti=
? snad ano...
function VFSGetExts(g:TVFSGlobs):PChar;
// vrati seznam pripon, nejak oddeleny (asi strednik)
procedure SetProtocolLogFunc(g:TVFSGlobs; 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(g:TVFSGlobs): guint32 read GetBlockSize write SetB=
lockSize;
// Nastaveni velikosti bloku pri presunu dat - v nekterych pluginech nebu=
de pouzito (dynamicka velikost bloku)
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(g:TVFSGlobs; const sName:PChar):TVFSResult;
// otevre soubor (archiv)
function VFSLogin(g:TVFSGlobs; const user, pass:PChar):TVFSResult;
// prihlasi se na FTP, SCP nebo SMB
function VFSClose(g:TVFSGlobs):TVFSResult;
// zavre soubor; nebo taky logout
function VFSMkDir(g:TVFSGlobs; const sDirName:PChar):TVFSResult;
// vytvori adresar. Co vic?
function VFSRename(g:TVFSGlobs; const sSrcName, sDstName:PChar):TVFSR=
esult;
// prejmenuje soubor/adresar
function VFSRemove(g:TVFSGlobs; const APath: PChar):TVFSResult;
// smaze (=3Dprovede unlink) soubor/adresar (v Unixu je to jedno, v plugi=
nu nutno testovat)
function FileExists(g:TVFSGlobs; const FileName: PChar; const Use_lst=
at: LongBool =3D False): LongBool;
// zjisti jestli soubor/adresar existuje. Use_lstat =3D jestli ma delat f=
ollow symlinks
function MakeSymLink(g:TVFSGlobs; const NewFileName, PointTo: PChar):=
TVFSResult;
// vytvori symlink. NewFileName =3D cesta + jmeno souboru noveho symlinku
function Chmod(g:TVFSGlobs; const FileName: PChar; const Mode: intege=
r):TVFSResult;
// proste Chmod. Mode je v klasickym unixovym formatu (libc), takze bity,=
ne octal
function Chown(g:TVFSGlobs; const FileName: PChar; const UID, GID: in=
teger):TVFSResult;
// to samy
function ChangeTimes(g:TVFSGlobs; APath: PChar; mtime, atime: Longint=
):TVFSResult;
// zmeni casy u souboru (ctime se vetsinou nepouziva)
function ChangeDir(g:TVFSGlobs; const NewPath: PChar):TVFSResult;
// pokusi se zmenit adresar a vrati hodnotu jestli ma na to pravo (treba =
do /root to hodi hned chybu)
function GetPath(g:TVFSGlobs): PChar;
// zjistovani aktualni nastavene cesty v pluginu
function GetFileSystemSize(g:TVFSGlobs; 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(g:TVFSGlobs; const APath: PChar): Int64;
// analogicky
function GetFSID(g:TVFSGlobs; const APath: PChar): Int64;
// vrati nejake unikatni cislo FS, ktere identifikuje, ze soubor se nacha=
zi na urcitem FS
function GetFSLabel(g:TVFSGlobs; const APath: PChar): PChar;
// zase plati stejna poznamka jako u GetFileSystemSize
function GetDirSize(g:TVFSGlobs; APath: PChar): Int64;
// projde rekurzivne cely strom od zadane cesty a vrati velikost celeho s=
tromu
procedure BreakGetDirSize(g:TVFSGlobs);
// zastavi vyse uvedene zjistovani velikosti
function VFSRun(g:TVFSGlobs; const sName:String):TVFSResult;
// nainstaluje(prip. provede jinou akci) balicek rpm ci deb
Blokove operace:
!!! Sporne funkce - kopirovani:
TCallBackFunc =3D Function (iPos:Int64; iMax:Int64):Boolean;
function VFSCopyOut(g:TVFSGlobs; const sSrcName, sDstName:String; pCa=
llBackProgress: TCallBackFunc):TVFSResult;
function VFSCopyIn(g:TVFSGlobs; const sSrcName, sDstName:String; pCal=
lBackProgress: TCallBackFunc):TVFSResult;
// Kopirovani souboru - zevnitr ven a zvenku dovnitr
// - tady jsme ale porad nedoresili co delat v pripade kopirovani mezi d=
vema VFS (z archivu na SMB disk, ze SMB na FTP...) - aby se nepouzival za=
dny temp soubor
ale tohle bych precejenom implementoval:
(ikdyz zpocatku to nebude nutne, rad bych to ale chtel mit v programu
kvuli random pristupu k obsahu souboru treba na SMB disku (prohlizec) -
je jasne ze v nekterych pluginech to nepujde implementovat - v takovem
pripade bych to vracel ve funkci VFSCaps)
function OpenFile(g:TVFSGlobs; const APath: PChar; const Flags, Mode:=
integer; var Error: integer): integer;
// vrati filedescriptor
function ReadFile(g:TVFSGlobs; const FileDescriptor: integer; Buffer:=
Pointer; ABlockSize: integer; var Error: integer): integer;
// Returns number of bytes read
function WriteFile(g:TVFSGlobs; const FileDescriptor: integer; Buffer=
: Pointer; BytesCount: integer; var Error: integer): integer;
// Returns number of bytes written
function CloseFile(g:TVFSGlobs; const FileDescriptor: integer): TVFSR=
esult;
function FileSeek(g:TVFSGlobs; const FileDescriptor: integer; const A=
bsoluteOffset: Int64; var Error: integer): Int64;=20
// vrati nastavenou pozici nebo -1 pri chybe
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);
end;
function VFSList(g:TVFSGlobs; const sDir:String; iItemID:Integer; var=
VFSItem:TVFSItem):TVFSResult;
// vylistuje seznam souboru v urcite ceste
function VFSFileInfo(g:TVFSGlobs; AFileName: PChar; var VFSItem:PVFSI=
tem):TVFSResult;
// vrati strukturu s informacema jenom o tom jednom souboru
----
Tom=E1=B9 B=BEatek
|