/* * lftp - file transfer program * * Copyright (c) 1996-2015 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 FISH_H #define FISH_H #include "SSH_Access.h" #include "StringSet.h" class Fish : public SSH_Access { enum state_t { DISCONNECTED, CONNECTING, CONNECTING_1, CONNECTED, FILE_RECV, FILE_SEND, WAITING, DONE }; state_t state; void Init(); int max_send; void Send(const char *format,...) PRINTF_LIKE(2,3); void SendMethod(); void SendArrayInfoRequests(); void DisconnectLL(); int IsConnected() const { if(state==DISCONNECTED) return 0; if(state==CONNECTING) return 1; return 2; } off_t body_size; off_t bytes_received; enum expect_t { EXPECT_FISH, EXPECT_VER, EXPECT_PWD, EXPECT_CWD, EXPECT_DIR, EXPECT_RETR_INFO, EXPECT_RETR, EXPECT_INFO, EXPECT_DEFAULT, EXPECT_STOR_PRELIMINARY, EXPECT_STOR, EXPECT_QUOTE, EXPECT_IGNORE }; void PushExpect(expect_t); int HandleReplies(); void CloseExpectQueue(); int ReplyLogPriority(int); xqueue > RespQueue; StringSet path_queue; void PushDirectory(const char *d) { path_queue.Append(d); } void PopDirectory(xstring *d) { d->set_allocated(path_queue.Pop()); } void EmptyPathQueue() { path_queue.Empty(); } bool RespQueueIsEmpty() { return RespQueue.count()==0; } int RespQueueSize() { return RespQueue.count(); } void EmptyRespQueue() { RespQueue.empty(); } void GetBetterConnection(int level); void MoveConnectionHere(Fish *o); xstring line; xstring message; bool eof; bool encode_file; public: static void ClassInit(); Fish(); Fish(const Fish*); ~Fish(); const char *GetProto() const { return "fish"; } FileAccess *Clone() const { return new Fish(this); } static FileAccess *New(); int Do(); int Done(); int Read(Buffer *,int); int Write(const void *,int); int StoreStatus(); int Buffered(); void Close(); const char *CurrentStatus(); void Reconfig(const char *name=0); bool SameSiteAs(const FileAccess *fa) const; bool SameLocationAs(const FileAccess *fa) const; DirList *MakeDirList(ArgV *args); Glob *MakeGlob(const char *pattern); ListInfo *MakeListInfo(const char *p); FileSet *ParseLongList(const char *buf,int len,int *err=0) const; void DontEncodeFile() { encode_file=false; } bool NeedSizeDateBeforehand() { return true; } void SuspendInternal(); void ResumeInternal(); }; class FishDirList : public DirList { SMTaskRef ubuf; const xstring_ca pattern; public: FishDirList(Fish *s,ArgV *a) : DirList(s,a), pattern(args->CombineShellQuoted(1)) {} const char *Status(); int Do(); void SuspendInternal(); void ResumeInternal(); }; class FishListInfo : public GenericParseListInfo { FileSet *Parse(const char *buf,int len); public: FishListInfo(Fish *session,const char *path) : GenericParseListInfo(session,path) { can_get_prec_time=false; } }; #endif