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