/* * lftp - file transfer program * * Copyright (c) 1996-2012 by Alexander V. Lukyanov (lav@yars.free.net) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef LSCACHE_H #define LSCACHE_H #include #include "Cache.h" #include "FileAccess.h" class Buffer; class FileAccess; class LsCacheEntryLoc { friend class LsCache; xstring_c arg; SMTaskRef loc; // no FileAccessRef -> no reuse here int mode; public: bool Matches(const FileAccess *p_loc,const char *a,int m); LsCacheEntryLoc(const FileAccess *p_loc,const char *a,int m); int EstimateSize() const { return xstrlen(arg)+(arg!=0); } const char *GetClosure() const; }; class LsCacheEntryData { int err_code; xstring data; Ref afset; // associated file set public: LsCacheEntryData(int e,const char *d,int l,const FileSet *fs); void SetData(int e,const char *d,int l,const FileSet *fs); void GetData(int *e,const char **d,int *l,const FileSet **fs); const FileSet *GetFileSet(const FileAccess *parser); void UpdateFileSet(const FileSet *fs) { if(afset) afset->Merge(fs); } int EstimateSize() const { return data.length()+(afset?afset->EstimateMemory():0); } }; class LsCacheEntry : public CacheEntry, public LsCacheEntryLoc, public LsCacheEntryData { public: int EstimateSize() const; LsCacheEntry(const FileAccess *p_loc,const char *a,int m,int e,const char *d,int l,const FileSet *fs); }; class LsCache : public Cache { LsCacheEntry *Find(const FileAccess *p_loc,const char *a,int m); LsCacheEntry *IterateFirst() { return (LsCacheEntry*)Cache::IterateFirst(); } LsCacheEntry *IterateNext() { return (LsCacheEntry*)Cache::IterateNext(); } LsCacheEntry *IterateDelete(){ return (LsCacheEntry*)Cache::IterateDelete(); } public: LsCache(); void Add(const FileAccess *p_loc,const char *a,int m,int err,const char *d,int l,const FileSet *f=0); void Add(const FileAccess *p_loc,const char *a,int m,int err,const Buffer *ubuf,const FileSet *f=0); bool Find(const FileAccess *p_loc,const char *a,int m,int *err,const char **d, int *l,const FileSet **f=0); const FileSet *FindFileSet(const FileAccess *p_loc,const char *a,int m); void UpdateFileSet(const FileAccess *p_loc,const char *a,int m,const FileSet *fs); int IsDirectory(const FileAccess *p_loc,const char *dir); void SetDirectory(const FileAccess *p_loc, const char *path, bool dir); enum change_mode { FILE_CHANGED, DIR_CHANGED, TREE_CHANGED }; void Changed(change_mode m,const FileAccess *f,const char *what); void FileChanged(const FileAccess *f,const char *file) { Changed(FILE_CHANGED,f,file); } void DirectoryChanged(const FileAccess *f,const char *dir) { Changed(DIR_CHANGED,f,dir); } void TreeChanged(const FileAccess *f,const char *dir) { Changed(TREE_CHANGED,f,dir); } void List(); }; #endif//LSCACHE_H