You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kioslave/fish/fish.h

212 lines
7.3 KiB

/***************************************************************************
fish.h - a FISH kioslave
-------------------
begin : Thu Oct 4 17:09:14 CEST 2001
copyright : (C) 2001 by J<EFBFBD>rg Walter
email : trouble@garni.ch
***************************************************************************/
/***************************************************************************
* *
* 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, version 2 of the License *
* *
***************************************************************************/
#ifndef __fish_h__
#define __fish_h__
#include <qstring.h>
#include <qcstring.h>
#include <kurl.h>
#include <kio/global.h>
#include <kio/slavebase.h>
#include <kprocess.h>
#include <kio/authinfo.h>
#include <time.h>
#define FISH_EXEC_CMD 'X'
class fishProtocol : public KIO::SlaveBase
{
public:
fishProtocol(const QCString &pool_socket, const QCString &app_socket);
virtual ~fishProtocol();
/**
Connects to a server and logs us in via SSH. Then starts FISH protocol.
@ref isConnected is set to true if logging on was successful.
It is set to false if the connection becomes closed.
*/
void openConnection();
/**
Clean up connection
*/
void shutdownConnection(bool forced=false);
/** sets connection information for subsequent commands */
void setHost(const QString & host, int port, const QString & user, const QString & pass);
/** Forced close of the connection */
void closeConnection();
/** get a file */
void get(const KURL& url);
/** put a file */
void put(const KURL& url, int permissions, bool overwrite, bool resume);
/** aborts command sequence and calls error() */
void error(int type, const QString &detail);
/** executes next command in sequence or calls finished() if all is done */
void finished();
/** stat a file */
void stat(const KURL& url);
/** find mimetype for a file */
void mimetype(const KURL& url);
/** list a directory */
void listDir(const KURL& url);
/** create a directory */
void mkdir(const KURL&url, int permissions);
/** rename a file */
void rename(const KURL& src, const KURL& dest, bool overwrite);
/** create a symlink */
void symlink(const QString& target, const KURL& dest, bool overwrite);
/** change file permissions */
void chmod(const KURL& url, int permissions);
/** copies a file */
void copy(const KURL &src, const KURL &dest, int permissions, bool overwrite);
/** report status */
void slave_status();
/** removes a file or directory */
void del(const KURL &u, bool isfile);
/** special like background execute */
void special( const QByteArray &data );
private: // Private attributes
/** the SSH process used to communicate with the remote end */
pid_t childPid;
/** fd for reading and writing to the process */
int childFd;
/** buffer for data to be written */
const char *outBuf;
/** current write position in buffer */
KIO::fileoffset_t outBufPos;
/** length of buffer */
KIO::fileoffset_t outBufLen;
/** use su if true else use ssh */
bool local;
/** // FIXME: just a workaround for konq deficiencies */
bool isStat;
/** // FIXME: just a workaround for konq deficiencies */
QString redirectUser, redirectPass;
protected: // Protected attributes
/** for LIST/STAT */
KIO::UDSEntry udsEntry;
/** for LIST/STAT */
KIO::UDSEntry udsStatEntry;
/** for LIST/STAT */
KIO::UDSAtom typeAtom;
/** for LIST/STAT */
KIO::UDSAtom mimeAtom;
/** for LIST/STAT */
QString thisFn;
/** for STAT */
QString wantedFn;
QString statPath;
/** url of current request */
KURL url;
/** true if connection is logged in successfully */
bool isLoggedIn;
/** host name of current connection */
QString connectionHost;
/** user name of current connection */
QString connectionUser;
/** port of current connection */
int connectionPort;
/** password of current connection */
QString connectionPassword;
/** AuthInfo object used for logging in */
KIO::AuthInfo connectionAuth;
/** number of lines received, == 0 -> everything went ok */
int errorCount;
/** queue for lines to be sent */
QStringList qlist;
/** queue for commands to be sent */
QStringList commandList;
/** queue for commands to be sent */
QValueList<int> commandCodes;
/** bytes still to be read in raw mode */
KIO::fileoffset_t rawRead;
/** bytes still to be written in raw mode */
KIO::fileoffset_t rawWrite;
/** data bytes to read in next read command */
KIO::fileoffset_t recvLen;
/** data bytes to write in next write command */
KIO::fileoffset_t sendLen;
/** true if the last write operation was finished */
bool writeReady;
/** true if a command stack is currently executing */
bool isRunning;
/** reason of LIST command */
enum { CHECK, LIST } listReason;
/** true if FISH server understands APPEND command */
bool hasAppend;
/** permission of created file */
int putPerm;
/** true if file may be overwritten */
bool checkOverwrite;
/** current position of write */
KIO::fileoffset_t putPos;
/** true if file already existed */
bool checkExist;
/** true if this is the first login attempt (== use cached password) */
bool firstLogin;
/** write buffer */
QByteArray rawData;
/** buffer for storing bytes used for MimeMagic */
QByteArray mimeBuffer;
/** whther the mimetype has been sent already */
bool mimeTypeSent;
/** number of bytes read so far */
KIO::fileoffset_t dataRead;
/** details about each fishCommand */
static const struct fish_info {
const char *command;
int params;
const char *alt;
int lines;
} fishInfo[];
/** last FISH command sent to server */
enum fish_command_type { FISH_FISH, FISH_VER, FISH_PWD, FISH_LIST, FISH_STAT,
FISH_RETR, FISH_STOR,
FISH_CWD, FISH_CHMOD, FISH_DELE, FISH_MKD, FISH_RMD,
FISH_RENAME, FISH_LINK, FISH_SYMLINK, FISH_CHOWN,
FISH_CHGRP, FISH_READ, FISH_WRITE, FISH_COPY, FISH_APPEND, FISH_EXEC } fishCommand;
int fishCodeLen;
protected: // Protected methods
/** manages initial communication setup including password queries */
int establishConnection(char *buffer, KIO::fileoffset_t buflen);
int received(const char *buffer, KIO::fileoffset_t buflen);
void sent();
/** builds each FISH request and sets the error counter */
bool sendCommand(fish_command_type cmd, ...);
/** checks response string for result code, converting 000 and 001 appropriately */
int handleResponse(const QString &str);
/** parses a ls -l time spec */
int makeTimeFromLs(const QString &dayStr, const QString &monthStr, const QString &timeyearStr);
/** executes a chain of commands */
void run();
/** creates the subprocess */
bool connectionStart();
/** writes one chunk of data to stdin of child process */
void writeChild(const char *buf, KIO::fileoffset_t len);
/** parses response from server and acts accordingly */
void manageConnection(const QString &line);
/** writes to process */
void writeStdin(const QString &line);
};
#endif