| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 | //---------------------------------------------------------------------------#ifndef FileMasksH#define FileMasksH//---------------------------------------------------------------------------#include <vector>#include <Masks.hpp>//---------------------------------------------------------------------------class EFileMasksException : public Exception{public:  __fastcall EFileMasksException(UnicodeString Message, int ErrorStart, int ErrorLen);  int ErrorStart;  int ErrorLen;};//---------------------------------------------------------------------------extern const wchar_t IncludeExcludeFileMasksDelimiter;#define MASK_INDEX(DIRECTORY, INCLUDE) ((DIRECTORY ? 2 : 0) + (INCLUDE ? 0 : 1))//---------------------------------------------------------------------------class TFileMasks{public:  struct TParams  {    TParams();    __int64 Size;    TDateTime Modification;    UnicodeString ToString() const;  };  static bool __fastcall IsMask(const UnicodeString Mask);  static UnicodeString __fastcall NormalizeMask(const UnicodeString & Mask, const UnicodeString & AnyMask = L"");  static UnicodeString __fastcall ComposeMaskStr(    TStrings * IncludeFileMasksStr, TStrings * ExcludeFileMasksStr,    TStrings * IncludeDirectoryMasksStr, TStrings * ExcludeDirectoryMasksStr);  static UnicodeString __fastcall ComposeMaskStr(TStrings * MasksStr, bool Directory);  __fastcall TFileMasks();  __fastcall TFileMasks(int ForceDirectoryMasks);  __fastcall TFileMasks(const TFileMasks & Source);  __fastcall TFileMasks(const UnicodeString & AMasks);  __fastcall ~TFileMasks();  TFileMasks & __fastcall operator =(const TFileMasks & rhm);  TFileMasks & __fastcall operator =(const UnicodeString & rhs);  bool __fastcall operator ==(const TFileMasks & rhm) const;  bool __fastcall operator ==(const UnicodeString & rhs) const;  void __fastcall SetMask(const UnicodeString & Mask);  bool __fastcall Matches(const UnicodeString FileName, bool Directory = false,    const UnicodeString Path = L"", const TParams * Params = NULL) const;  bool __fastcall Matches(const UnicodeString FileName, bool Directory,    const UnicodeString Path, const TParams * Params,    bool RecurseInclude, bool & ImplicitMatch) const;  bool __fastcall Matches(const UnicodeString FileName, bool Local, bool Directory,    const TParams * Params = NULL) const;  bool __fastcall Matches(const UnicodeString FileName, bool Local, bool Directory,    const TParams * Params, bool RecurseInclude, bool & ImplicitMatch) const;  __property UnicodeString Masks = { read = FStr, write = SetMasks };  __property TStrings * IncludeFileMasksStr = { read = GetMasksStr, index = MASK_INDEX(false, true) };  __property TStrings * ExcludeFileMasksStr = { read = GetMasksStr, index = MASK_INDEX(false, false) };  __property TStrings * IncludeDirectoryMasksStr = { read = GetMasksStr, index = MASK_INDEX(true, true) };  __property TStrings * ExcludeDirectoryMasksStr = { read = GetMasksStr, index = MASK_INDEX(true, false) };private:  int FForceDirectoryMasks;  UnicodeString FStr;  struct TMaskMask  {    enum { Any, NoExt, Regular } Kind;    TMask * Mask;  };  struct TMask  {    TMaskMask FileNameMask;    TMaskMask DirectoryMask;    enum TMaskBoundary { None, Open, Close };    TMaskBoundary HighSizeMask;    __int64 HighSize;    TMaskBoundary LowSizeMask;    __int64 LowSize;    TMaskBoundary HighModificationMask;    TDateTime HighModification;    TMaskBoundary LowModificationMask;    TDateTime LowModification;    UnicodeString MaskStr;    UnicodeString UserStr;  };  typedef std::vector<TMask> TMasks;  TMasks FMasks[4];  mutable TStrings * FMasksStr[4];  void __fastcall SetStr(const UnicodeString value, bool SingleMask);  void __fastcall SetMasks(const UnicodeString value);  void __fastcall CreateMaskMask(const UnicodeString & Mask, int Start, int End,    bool Ex, TMaskMask & MaskMask);  void __fastcall CreateMask(const UnicodeString & MaskStr, int MaskStart,    int MaskEnd, bool Include);  TStrings * __fastcall GetMasksStr(int Index) const;  static UnicodeString __fastcall MakeDirectoryMask(UnicodeString Str);  static inline void __fastcall ReleaseMaskMask(TMaskMask & MaskMask);  inline void __fastcall Init();  void __fastcall DoInit(bool Delete);  void __fastcall Clear();  static void __fastcall Clear(TMasks & Masks);  static void __fastcall TrimEx(UnicodeString & Str, int & Start, int & End);  static bool __fastcall MatchesMasks(const UnicodeString FileName, bool Directory,    const UnicodeString Path, const TParams * Params, const TMasks & Masks, bool Recurse);  static inline bool __fastcall MatchesMaskMask(const TMaskMask & MaskMask, const UnicodeString & Str);  void __fastcall ThrowError(int Start, int End);};//---------------------------------------------------------------------------UnicodeString __fastcall MaskFileName(UnicodeString FileName, const UnicodeString Mask);bool __fastcall IsFileNameMask(const UnicodeString & Mask);bool __fastcall IsEffectiveFileNameMask(const UnicodeString & Mask);UnicodeString __fastcall DelimitFileNameMask(UnicodeString Mask);//---------------------------------------------------------------------------typedef void __fastcall (__closure * TCustomCommandPatternEvent)  (int Index, const UnicodeString Pattern, void * Arg, UnicodeString & Replacement,   bool & LastPass);//---------------------------------------------------------------------------class TCustomCommand{friend class TInteractiveCustomCommand;public:  TCustomCommand();  // Needs an explicit virtual destructor, as is has virtual methods  virtual ~TCustomCommand() {}  UnicodeString __fastcall Complete(const UnicodeString & Command, bool LastPass);  virtual void __fastcall Validate(const UnicodeString & Command);  bool __fastcall HasAnyPatterns(const UnicodeString & Command);  static UnicodeString __fastcall Escape(const UnicodeString & S);protected:  static const wchar_t NoQuote;  static const UnicodeString Quotes;  void __fastcall GetToken(const UnicodeString & Command,    int Index, int & Len, wchar_t & PatternCmd);  void __fastcall CustomValidate(const UnicodeString & Command, void * Arg);  bool __fastcall FindPattern(const UnicodeString & Command, wchar_t PatternCmd);  virtual void __fastcall ValidatePattern(const UnicodeString & Command,    int Index, int Len, wchar_t PatternCmd, void * Arg);  virtual int __fastcall PatternLen(const UnicodeString & Command, int Index) = 0;  virtual void __fastcall PatternHint(int Index, const UnicodeString & Pattern);  virtual bool __fastcall PatternReplacement(int Index, const UnicodeString & Pattern,    UnicodeString & Replacement, bool & Delimit) = 0;  virtual void __fastcall DelimitReplacement(UnicodeString & Replacement, wchar_t Quote);};//---------------------------------------------------------------------------class TInteractiveCustomCommand : public TCustomCommand{public:  TInteractiveCustomCommand(TCustomCommand * ChildCustomCommand);protected:  virtual void __fastcall Prompt(int Index, const UnicodeString & Prompt,    UnicodeString & Value);  virtual void __fastcall Execute(const UnicodeString & Command,    UnicodeString & Value);  virtual int __fastcall PatternLen(const UnicodeString & Command, int Index);  virtual bool __fastcall PatternReplacement(int Index, const UnicodeString & Pattern,    UnicodeString & Replacement, bool & Delimit);  void __fastcall ParsePromptPattern(    const UnicodeString & Pattern, UnicodeString & Prompt, UnicodeString & Default, bool & Delimit);  bool __fastcall IsPromptPattern(const UnicodeString & Pattern);private:  TCustomCommand * FChildCustomCommand;};//---------------------------------------------------------------------------class TTerminal;class TSessionData;struct TCustomCommandData{  __fastcall TCustomCommandData();  __fastcall TCustomCommandData(TTerminal * Terminal);  __fastcall TCustomCommandData(    TSessionData * SessionData, const UnicodeString & AUserName,    const UnicodeString & Password);  __property TSessionData * SessionData = { read = GetSesssionData };  void __fastcall operator=(const TCustomCommandData & Data);private:  std::unique_ptr<TSessionData> FSessionData;  void __fastcall Init(    TSessionData * SessionData, const UnicodeString & AUserName,    const UnicodeString & Password, const UnicodeString & HostKey);  TSessionData * __fastcall GetSesssionData() const;};//---------------------------------------------------------------------------class TFileCustomCommand : public TCustomCommand{public:  TFileCustomCommand();  TFileCustomCommand(const TCustomCommandData & Data, const UnicodeString & Path);  TFileCustomCommand(const TCustomCommandData & Data, const UnicodeString & Path,    const UnicodeString & FileName, const UnicodeString & FileList);  virtual void __fastcall Validate(const UnicodeString & Command);  virtual void __fastcall ValidatePattern(const UnicodeString & Command,    int Index, int Len, wchar_t PatternCmd, void * Arg);  bool __fastcall IsFileListCommand(const UnicodeString & Command);  virtual bool __fastcall IsFileCommand(const UnicodeString & Command);  bool __fastcall IsRemoteFileCommand(const UnicodeString & Command);  bool __fastcall IsSiteCommand(const UnicodeString & Command);  bool __fastcall IsPasswordCommand(const UnicodeString & Command);protected:  virtual int __fastcall PatternLen(const UnicodeString & Command, int Index);  virtual bool __fastcall PatternReplacement(int Index, const UnicodeString & Pattern,    UnicodeString & Replacement, bool & Delimit);private:  TCustomCommandData FData;  UnicodeString FPath;  UnicodeString FFileName;  UnicodeString FFileList;};//---------------------------------------------------------------------------typedef TFileCustomCommand TRemoteCustomCommand;extern UnicodeString FileMasksDelimiters;extern UnicodeString AnyMask;//---------------------------------------------------------------------------#endif
 |