|
Packit |
8f70b4 |
/*
|
|
Packit |
8f70b4 |
* lftp - file transfer program
|
|
Packit |
8f70b4 |
*
|
|
Packit |
8f70b4 |
* Copyright (c) 1996-2012 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 JOB_H
|
|
Packit |
8f70b4 |
#define JOB_H
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include <stdarg.h>
|
|
Packit |
8f70b4 |
#include "trio.h"
|
|
Packit |
8f70b4 |
#undef printf
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#include "SMTask.h"
|
|
Packit |
8f70b4 |
#include "StatusLine.h"
|
|
Packit |
8f70b4 |
#include "fg.h"
|
|
Packit |
8f70b4 |
#include "FileAccess.h"
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#define JobRef SMTaskRef // it is basically the same
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class Job : public SMTask
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
static void SortJobs();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xlist<Job> all_jobs_node;
|
|
Packit |
8f70b4 |
static xlist_head<Job> all_jobs;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xlist_head<Job> children_jobs;
|
|
Packit |
8f70b4 |
xlist<Job> children_jobs_node;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
bool fg;
|
|
Packit |
8f70b4 |
Ref<FgData> fg_data;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void PrepareToDie();
|
|
Packit |
8f70b4 |
virtual ~Job();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
int jobno;
|
|
Packit |
8f70b4 |
Job *parent;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xarray<Job*> waiting;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void AddWaiting(Job *);
|
|
Packit |
8f70b4 |
template<class T> void AddWaiting(const JobRef<T>& r) { AddWaiting(r.get_non_const()); }
|
|
Packit |
8f70b4 |
void RemoveWaiting(const Job *);
|
|
Packit |
8f70b4 |
void ReplaceWaiting(Job *from,Job *to);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void SetParent(Job *j);
|
|
Packit |
8f70b4 |
void SetParentFg(Job *j, bool f=true)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
SetParent(j);
|
|
Packit |
8f70b4 |
if(f && j->fg)
|
|
Packit |
8f70b4 |
Fg();
|
|
Packit |
8f70b4 |
// else if(f && !j->fg)
|
|
Packit |
8f70b4 |
// Bg();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void AllocJobno();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void PrintStatus(int,const char *prefix="\t");
|
|
Packit |
8f70b4 |
virtual xstring& FormatStatus(xstring& s,int v,const char *prefix="\t") { return s; }
|
|
Packit |
8f70b4 |
virtual xstring& FormatShortStatus(xstring& s);
|
|
Packit |
8f70b4 |
virtual void ShowRunStatus(const SMTaskRef<StatusLine>&);
|
|
Packit |
8f70b4 |
void ClearStatus()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
eprintf("%s",""); /* just "" causes a -Wformat-zero-length" warning */
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
virtual void SayFinal() {}; // final phrase of fg job
|
|
Packit |
8f70b4 |
virtual int Done()=0;
|
|
Packit |
8f70b4 |
virtual int ExitCode() { return 0; }
|
|
Packit |
8f70b4 |
virtual int Do()=0;
|
|
Packit |
8f70b4 |
virtual int AcceptSig(int);
|
|
Packit |
8f70b4 |
virtual void Bg();
|
|
Packit |
8f70b4 |
virtual void Fg();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring cmdline;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
virtual const xstring& GetCmdLine() { return cmdline?cmdline:xstring::get_tmp("?",1); }
|
|
Packit |
8f70b4 |
xstring& FormatJobTitle(xstring& s,int indent=0,const char *suffix=0);
|
|
Packit |
8f70b4 |
xstring& FormatOneJob(xstring& s,int verbose,int indent=0,const char *suffix=0);
|
|
Packit |
8f70b4 |
xstring& FormatOneJobRecursively(xstring& s,int verbose,int indent=0);
|
|
Packit |
8f70b4 |
virtual xstring& FormatJobs(xstring& s,int verbose,int indent=0);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void PrintJobTitle(int indent=0,const char *suffix=0);
|
|
Packit |
8f70b4 |
void ListOneJob(int verbose,int indent=0,const char *suffix=0);
|
|
Packit |
8f70b4 |
void ListOneJobRecursively(int verbose,int indent);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void ListDoneJobs();
|
|
Packit |
8f70b4 |
void BuryDoneJobs();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Job *FindAnyChild();
|
|
Packit |
8f70b4 |
bool WaitsFor(Job *);
|
|
Packit |
8f70b4 |
static Job *FindWhoWaitsFor(Job *);
|
|
Packit |
8f70b4 |
bool CheckForWaitLoop(Job *parent);
|
|
Packit |
8f70b4 |
int NumAwaitedJobs() { return waiting.count(); }
|
|
Packit |
8f70b4 |
Job *FindDoneAwaitedJob();
|
|
Packit |
8f70b4 |
void WaitForAllChildren();
|
|
Packit |
8f70b4 |
void AllWaitingFg();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
static int NumberOfJobs();
|
|
Packit |
8f70b4 |
int NumberOfChildrenJobs();
|
|
Packit |
8f70b4 |
static Job *FindJob(int n);
|
|
Packit |
8f70b4 |
static bool Running(int n)
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
Job *j=FindJob(n);
|
|
Packit |
8f70b4 |
return j && !j->Done();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
void Kill(int n);
|
|
Packit |
8f70b4 |
static void Kill(Job*);
|
|
Packit |
8f70b4 |
void SendSig(int n,int sig);
|
|
Packit |
8f70b4 |
static void KillAll();
|
|
Packit |
8f70b4 |
static void Cleanup();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void vfprintf(FILE *file,const char *fmt,va_list v);
|
|
Packit |
8f70b4 |
// CmdExec redefines this, and traps all messages of its children.
|
|
Packit |
8f70b4 |
virtual void top_vfprintf(FILE *file,const char *fmt,va_list v);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
// C-like functions calling vfprintf
|
|
Packit |
8f70b4 |
void eprintf(const char *fmt,...) PRINTF_LIKE(2,3);
|
|
Packit |
8f70b4 |
void fprintf(FILE *file,const char *fmt,...) PRINTF_LIKE(3,4);
|
|
Packit |
8f70b4 |
void printf(const char *fmt,...) PRINTF_LIKE(2,3);
|
|
Packit |
8f70b4 |
void perror(const char *);
|
|
Packit |
8f70b4 |
void puts(const char *);
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
Job();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
virtual const char *GetConnectURL() { return 0; }
|
|
Packit |
8f70b4 |
virtual void lftpMovesToBackground() { Resume(); }
|
|
Packit |
8f70b4 |
static void lftpMovesToBackground_ToAll();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
virtual off_t GetBytesCount();
|
|
Packit |
8f70b4 |
virtual double GetTimeSpent();
|
|
Packit |
8f70b4 |
virtual double GetTransferRate();
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
void WaitDone();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
class SessionJob : public Job
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
protected:
|
|
Packit |
8f70b4 |
SessionJob(FileAccess *s) : session(s) {}
|
|
Packit |
8f70b4 |
FileAccess *Clone() const { return session->Clone(); }
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
public:
|
|
Packit |
8f70b4 |
FileAccessRef session;
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
xstring& FormatStatus(xstring&,int,const char *);
|
|
Packit |
8f70b4 |
const char *GetConnectURL()
|
|
Packit |
8f70b4 |
{
|
|
Packit |
8f70b4 |
if(!session)
|
|
Packit |
8f70b4 |
return 0;
|
|
Packit |
8f70b4 |
return session->GetConnectURL();
|
|
Packit |
8f70b4 |
}
|
|
Packit |
8f70b4 |
void Fg();
|
|
Packit |
8f70b4 |
void Bg();
|
|
Packit |
8f70b4 |
};
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
|
|
Packit |
8f70b4 |
#endif /* JOB_H */
|