Blame src/LsCache.h

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