Blame src/FindJob.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 FINDJOB_H
Packit Service a2489d
#define FINDJOB_H
Packit Service a2489d
Packit Service a2489d
#include "Job.h"
Packit Service a2489d
#include "buffer.h"
Packit Service a2489d
#include "ArgV.h"
Packit Service a2489d
#include "GetFileInfo.h"
Packit Service a2489d
#include "PatternSet.h"
Packit Service a2489d
Packit Service a2489d
class FinderJob : public SessionJob
Packit Service a2489d
{
Packit Service a2489d
   FileAccessRef my_session;
Packit Service a2489d
   FileAccess::Path orig_init_dir;
Packit Service a2489d
Packit Service a2489d
   xstring_c dir;
Packit Service a2489d
   int errors;
Packit Service a2489d
   SMTaskRef<GetFileInfo> li;
Packit Service a2489d
Packit Service a2489d
   class place
Packit Service a2489d
      {
Packit Service a2489d
	 friend class FinderJob;
Packit Service a2489d
Packit Service a2489d
	 xstring_c path;
Packit Service a2489d
	 Ref<FileSet> fset;
Packit Service a2489d
Packit Service a2489d
	 place(const char *p,FileSet *f) : path(p), fset(f) {}
Packit Service a2489d
      };
Packit Service a2489d
Packit Service a2489d
   RefArray<place> stack;
Packit Service a2489d
Packit Service a2489d
   void Up();
Packit Service a2489d
   void Down(const char *d);
Packit Service a2489d
   void Push(FileSet *f);
Packit Service a2489d
Packit Service a2489d
   virtual void Enter(const char *d) { }
Packit Service a2489d
   virtual void Exit() { }
Packit Service a2489d
Packit Service a2489d
   bool depth_done;
Packit Service a2489d
   unsigned file_info_need;
Packit Service a2489d
   /* In certain circumstances, we can skip a LIST altogether and just
Packit Service a2489d
    * pass argument names on: we don't need anything other than the name
Packit Service a2489d
    * (no other file_info_needs) and we're not recursing (which would imply
Packit Service a2489d
    * needing the type.)  This means arguments that don't actually exist
Packit Service a2489d
    * get passed on; if this is inappropriate (ie for a simple Find),
Packit Service a2489d
    * call ValidateArgs(). */
Packit Service a2489d
   bool validate_args;
Packit Service a2489d
Packit Service a2489d
   Ref<PatternSet> exclude;
Packit Service a2489d
Packit Service a2489d
protected:
Packit Service a2489d
   enum state_t { START_INFO, INFO, LOOP, PROCESSING, WAIT, DONE };
Packit Service a2489d
   state_t state;
Packit Service a2489d
Packit Service a2489d
   const char *op;
Packit Service a2489d
   FileAccessRefC session;
Packit Service a2489d
   FileAccess::Path init_dir;
Packit Service a2489d
Packit Service a2489d
   enum prf_res { PRF_FATAL, PRF_ERR, PRF_OK, PRF_WAIT, PRF_LATER };
Packit Service a2489d
   virtual prf_res ProcessFile(const char *d,const FileInfo *fi);
Packit Service a2489d
   virtual void ProcessList(FileSet *f) { }
Packit Service a2489d
   virtual void Finish() {};
Packit Service a2489d
Packit Service a2489d
   bool show_sl;
Packit Service a2489d
Packit Service a2489d
   bool depth_first;
Packit Service a2489d
   bool use_cache;
Packit Service a2489d
   bool quiet;
Packit Service a2489d
   int maxdepth;
Packit Service a2489d
Packit Service a2489d
   void NextDir(const char *d);
Packit Service a2489d
   const char *GetCur() const { return dir; }
Packit Service a2489d
   void Need(unsigned need) { file_info_need=need; }
Packit Service a2489d
   void ValidateArgs() { validate_args=true; }
Packit Service a2489d
Packit Service a2489d
   bool ProcessingURL() { return session!=SessionJob::session; }
Packit Service a2489d
Packit Service a2489d
public:
Packit Service a2489d
   int Do();
Packit Service a2489d
   int Done() { return state==DONE; }
Packit Service a2489d
   int ExitCode() { return state!=DONE || (errors && !quiet); }
Packit Service a2489d
Packit Service a2489d
   void Init();
Packit Service a2489d
   FinderJob(FileAccess *s);
Packit Service a2489d
   void PrepareToDie() { session->Close(); SessionJob::PrepareToDie(); }
Packit Service a2489d
   ~FinderJob();
Packit Service a2489d
Packit Service a2489d
   void ShowRunStatus(const SMTaskRef<StatusLine>&);
Packit Service a2489d
   xstring& FormatStatus(xstring&,int,const char *);
Packit Service a2489d
Packit Service a2489d
   void BeQuiet() { quiet=true; }
Packit Service a2489d
   void SetExclude(PatternSet *p) { exclude = p; }
Packit Service a2489d
   void set_maxdepth(int _maxdepth) { maxdepth = _maxdepth; }
Packit Service a2489d
Packit Service a2489d
   void Fg();
Packit Service a2489d
   void Bg();
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
class FinderJob_List : public FinderJob
Packit Service a2489d
{
Packit Service a2489d
   SMTaskRef<IOBuffer> buf;
Packit Service a2489d
   Ref<ArgV> args;
Packit Service a2489d
   bool long_listing;
Packit Service a2489d
protected:
Packit Service a2489d
   prf_res ProcessFile(const char *d,const FileInfo *fi);
Packit Service a2489d
   void Finish();
Packit Service a2489d
Packit Service a2489d
public:
Packit Service a2489d
   FinderJob_List(FileAccess *s,ArgV *a,FDStream *o);
Packit Service a2489d
   void DoLongListing(bool yes=true) { long_listing=yes; }
Packit Service a2489d
Packit Service a2489d
   int Done() { return FinderJob::Done() && buf->Done(); }
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
#endif //FINDJOB_H