summaryrefslogtreecommitdiffstats
path: root/tdeioslave/fish/fish.h
diff options
context:
space:
mode:
Diffstat (limited to 'tdeioslave/fish/fish.h')
-rw-r--r--tdeioslave/fish/fish.h211
1 files changed, 211 insertions, 0 deletions
diff --git a/tdeioslave/fish/fish.h b/tdeioslave/fish/fish.h
new file mode 100644
index 000000000..43dd5477d
--- /dev/null
+++ b/tdeioslave/fish/fish.h
@@ -0,0 +1,211 @@
+/***************************************************************************
+ fish.h - a FISH tdeioslave
+ -------------------
+ begin : Thu Oct 4 17:09:14 CEST 2001
+ copyright : (C) 2001 by Jö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 <tqstring.h>
+#include <tqcstring.h>
+
+
+#include <kurl.h>
+#include <tdeio/global.h>
+#include <tdeio/slavebase.h>
+#include <kprocess.h>
+#include <tdeio/authinfo.h>
+#include <time.h>
+
+#define FISH_EXEC_CMD 'X'
+
+class fishProtocol : public TDEIO::SlaveBase
+{
+public:
+ fishProtocol(const TQCString &pool_socket, const TQCString &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 TQString & host, int port, const TQString & user, const TQString & 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 TQString &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 TQString& 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 TQByteArray &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 */
+ TDEIO::fileoffset_t outBufPos;
+ /** length of buffer */
+ TDEIO::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 */
+ TQString redirectUser, redirectPass;
+
+protected: // Protected attributes
+ /** for LIST/STAT */
+ TDEIO::UDSEntry udsEntry;
+ /** for LIST/STAT */
+ TDEIO::UDSEntry udsStatEntry;
+ /** for LIST/STAT */
+ TDEIO::UDSAtom typeAtom;
+ /** for LIST/STAT */
+ TDEIO::UDSAtom mimeAtom;
+ /** for LIST/STAT */
+ TQString thisFn;
+ /** for STAT */
+ TQString wantedFn;
+ TQString statPath;
+ /** url of current request */
+ KURL url;
+ /** true if connection is logged in successfully */
+ bool isLoggedIn;
+ /** host name of current connection */
+ TQString connectionHost;
+ /** user name of current connection */
+ TQString connectionUser;
+ /** port of current connection */
+ int connectionPort;
+ /** password of current connection */
+ TQString connectionPassword;
+ /** AuthInfo object used for logging in */
+ TDEIO::AuthInfo connectionAuth;
+ /** number of lines received, == 0 -> everything went ok */
+ int errorCount;
+ /** queue for lines to be sent */
+ TQStringList qlist;
+ /** queue for commands to be sent */
+ TQStringList commandList;
+ /** queue for commands to be sent */
+ TQValueList<int> commandCodes;
+ /** bytes still to be read in raw mode */
+ TDEIO::fileoffset_t rawRead;
+ /** bytes still to be written in raw mode */
+ TDEIO::fileoffset_t rawWrite;
+ /** data bytes to read in next read command */
+ TDEIO::fileoffset_t recvLen;
+ /** data bytes to write in next write command */
+ TDEIO::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 */
+ TDEIO::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 */
+ TQByteArray rawData;
+ /** buffer for storing bytes used for MimeMagic */
+ TQByteArray mimeBuffer;
+ /** whther the mimetype has been sent already */
+ bool mimeTypeSent;
+ /** number of bytes read so far */
+ TDEIO::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, TDEIO::fileoffset_t buflen);
+ int received(const char *buffer, TDEIO::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 TQString &str);
+ /** parses a ls -l time spec */
+ int makeTimeFromLs(const TQString &dayStr, const TQString &monthStr, const TQString &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, TDEIO::fileoffset_t len);
+ /** parses response from server and acts accordingly */
+ void manageConnection(const TQString &line);
+ /** writes to process */
+ void writeStdin(const TQString &line);
+};
+
+
+#endif