|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2015 by Alexander V. Lukyanov (lav@yars.free.net)
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
8f70b4 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
8f70b4 |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
8f70b4 |
* (at your option) any later version.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
8f70b4 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8f70b4 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
8f70b4 |
* GNU General Public License for more details.
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
8f70b4 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
8f70b4 |
*/
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#ifndef FISH_H
|
|
Packit |
8f70b4 |
#define FISH_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "SSH_Access.h"
|
|
Packit |
8f70b4 |
#include "StringSet.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class Fish : public SSH_Access
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
enum state_t
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
DISCONNECTED,
|
|
Packit |
8f70b4 |
CONNECTING,
|
|
Packit |
8f70b4 |
CONNECTING_1,
|
|
Packit |
8f70b4 |
CONNECTED,
|
|
Packit |
8f70b4 |
FILE_RECV,
|
|
Packit |
8f70b4 |
FILE_SEND,
|
|
Packit |
8f70b4 |
WAITING,
|
|
Packit |
8f70b4 |
DONE
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
state_t state;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Init();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int max_send;
|
|
Packit |
8f70b4 |
void Send(const char *format,...) PRINTF_LIKE(2,3);
|
|
Packit |
8f70b4 |
void SendMethod();
|
|
Packit |
8f70b4 |
void SendArrayInfoRequests();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void DisconnectLL();
|
|
Packit |
8f70b4 |
int IsConnected() const
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(state==DISCONNECTED)
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
if(state==CONNECTING)
|
|
Packit |
8f70b4 |
return 1;
|
|
Packit |
8f70b4 |
return 2;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
off_t body_size;
|
|
Packit |
8f70b4 |
off_t bytes_received;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
enum expect_t
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
EXPECT_FISH,
|
|
Packit |
8f70b4 |
EXPECT_VER,
|
|
Packit |
8f70b4 |
EXPECT_PWD,
|
|
Packit |
8f70b4 |
EXPECT_CWD,
|
|
Packit |
8f70b4 |
EXPECT_DIR,
|
|
Packit |
8f70b4 |
EXPECT_RETR_INFO,
|
|
Packit |
8f70b4 |
EXPECT_RETR,
|
|
Packit |
8f70b4 |
EXPECT_INFO,
|
|
Packit |
8f70b4 |
EXPECT_DEFAULT,
|
|
Packit |
8f70b4 |
EXPECT_STOR_PRELIMINARY,
|
|
Packit |
8f70b4 |
EXPECT_STOR,
|
|
Packit |
8f70b4 |
EXPECT_QUOTE,
|
|
Packit |
8f70b4 |
EXPECT_IGNORE
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void PushExpect(expect_t);
|
|
Packit |
8f70b4 |
int HandleReplies();
|
|
Packit |
8f70b4 |
void CloseExpectQueue();
|
|
Packit |
8f70b4 |
int ReplyLogPriority(int);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xqueue<expect_t,xarray<expect_t> > RespQueue;
|
|
Packit |
8f70b4 |
StringSet path_queue;
|
|
Packit |
8f70b4 |
void PushDirectory(const char *d) { path_queue.Append(d); }
|
|
Packit |
8f70b4 |
void PopDirectory(xstring *d) { d->set_allocated(path_queue.Pop()); }
|
|
Packit |
8f70b4 |
void EmptyPathQueue() { path_queue.Empty(); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool RespQueueIsEmpty() { return RespQueue.count()==0; }
|
|
Packit |
8f70b4 |
int RespQueueSize() { return RespQueue.count(); }
|
|
Packit |
8f70b4 |
void EmptyRespQueue() { RespQueue.empty(); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void GetBetterConnection(int level);
|
|
Packit |
8f70b4 |
void MoveConnectionHere(Fish *o);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring line;
|
|
Packit |
8f70b4 |
xstring message;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool eof;
|
|
Packit |
8f70b4 |
bool encode_file;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
static void ClassInit();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Fish();
|
|
Packit |
8f70b4 |
Fish(const Fish*);
|
|
Packit |
8f70b4 |
~Fish();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
const char *GetProto() const { return "fish"; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
FileAccess *Clone() const { return new Fish(this); }
|
|
Packit |
8f70b4 |
static FileAccess *New();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
int Do();
|
|
Packit |
8f70b4 |
int Done();
|
|
Packit |
8f70b4 |
int Read(Buffer *,int);
|
|
Packit |
8f70b4 |
int Write(const void *,int);
|
|
Packit |
8f70b4 |
int StoreStatus();
|
|
Packit |
8f70b4 |
int Buffered();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Close();
|
|
Packit |
8f70b4 |
const char *CurrentStatus();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void Reconfig(const char *name=0);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool SameSiteAs(const FileAccess *fa) const;
|
|
Packit |
8f70b4 |
bool SameLocationAs(const FileAccess *fa) const;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
DirList *MakeDirList(ArgV *args);
|
|
Packit |
8f70b4 |
Glob *MakeGlob(const char *pattern);
|
|
Packit |
8f70b4 |
ListInfo *MakeListInfo(const char *p);
|
|
Packit |
8f70b4 |
FileSet *ParseLongList(const char *buf,int len,int *err=0) const;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void DontEncodeFile() { encode_file=false; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
bool NeedSizeDateBeforehand() { return true; }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SuspendInternal();
|
|
Packit |
8f70b4 |
void ResumeInternal();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class FishDirList : public DirList
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
SMTaskRef<IOBuffer> ubuf;
|
|
Packit |
8f70b4 |
const xstring_ca pattern;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
FishDirList(Fish *s,ArgV *a)
|
|
Packit |
8f70b4 |
: DirList(s,a), pattern(args->CombineShellQuoted(1)) {}
|
|
Packit |
8f70b4 |
const char *Status();
|
|
Packit |
8f70b4 |
int Do();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SuspendInternal();
|
|
Packit |
8f70b4 |
void ResumeInternal();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class FishListInfo : public GenericParseListInfo
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
FileSet *Parse(const char *buf,int len);
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
FishListInfo(Fish *session,const char *path)
|
|
Packit |
8f70b4 |
: GenericParseListInfo(session,path)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
can_get_prec_time=false;
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif
|