Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

BFTPServer.h

00001 // BFTPServer.h (this is -*- C++ -*-)
00002 // 
00003 // \author: Bjoern Giesler <bjoern@giesler.de>
00004 // 
00005 // \mainpage
00006 // 
00007 // $Author: giesler $
00008 // $Locker$
00009 // $Revision$
00010 // $Date: 2002-08-19 10:41:28 +0200 (Mon, 19 Aug 2002) $
00011 
00113 #ifndef BFTPSERVER_H
00114 #define BFTPSERVER_H
00115 
00116 /* system includes */
00117 #include <deque>
00118 #include <netinet/in.h>
00119 #include "gba_nds_fat/gba_nds_fat.h"
00120 
00121 /* my includes */
00122 #include "BTCPConnection.h"
00123 
00124 #if !defined(FILE_TIME_SUPPORT)
00125 #error DSFTP needs FILE_TIME_SUPPORT commented in (see gba_nds_fat.h)
00126 #endif
00127 
00128 class BFTPControlConn;
00129 
00131 typedef struct {
00133   std::string name;
00134 
00136   std::string pass;
00137 
00139   std::string root;
00140 
00142   std::string home;
00143 
00145   bool writePermission;
00146 
00148   bool bootPermission;
00149 
00151   bool loggedIn;
00152 } BFTPUser;
00153 
00161 class BFTPServer: public BTCPConnection {
00162 public:
00163 
00171   BFTPServer();
00172 
00174   BFTPServer(short port);
00175   ~BFTPServer();
00176 
00178   virtual void handle();
00179 
00181   int numActiveConnections() { return connections.size(); }
00182 
00188 
00189   void addUser(const std::string& name,
00190                const std::string& pass,
00191                const std::string& home = "/",
00192                const std::string& root = "/",
00193                bool writePermission = true,
00194                bool bootPermission = true);
00195 
00197   bool anonymousLoginOK();
00198 
00200   void setMOTDFile(const std::string& motdFile);
00202   const std::string& getMOTDFile() { return motdFile; }
00203 
00212   void setMasqueradeAsHost(const std::string& host);
00214   const std::string& getMasqueradeAsHost() { return masqueradeAsHost; }
00215 
00222   void setInactivityTimeout(int timeout);
00224   int getInactivityTimeout() { return inactivityTimeout; }
00225 
00227   void setPortRangeStart(int portRangeStart);
00229   int getPortRangeStart() { return portRangeStart; }
00231   void setPortRangeEnd(int portRangeEnd);
00233   int getPortRangeEnd() { return portRangeEnd; }
00234 
00244   class Delegate {
00245   public:
00246     virtual ~Delegate() {}
00248     virtual bool controlConnectionWillOpen(BFTPServer *server,
00249                                            long address) { return true; }
00250     virtual void controlConnectionDidOpen(BFTPServer *server,
00251                                           BFTPControlConn *conn) {}
00252   };
00253 
00254   void setDelegate(Delegate* deleg);
00255   Delegate* delegate() { return deleg; }
00256 
00261 
00262   void connectionDidClose(BFTPControlConn* conn);
00263 
00265   void setScreenSaverTimeout(int to) { ssTimeout = to; }
00267   int screenSaverTimeout() { return ssTimeout; }
00268 
00269 protected:
00270   virtual bool handleAccept();
00271 
00272 private:
00273   std::string motdFile;
00274   std::deque<BFTPUser> users;
00275   std::string masqueradeAsHost;
00276   int inactivityTimeout;
00277   int portRangeStart, portRangeEnd;
00278   std::deque<BFTPControlConn*> connections;
00279   std::deque<BFTPControlConn*> connectionsToDelete;
00280   Delegate *deleg;
00281 
00282   int ssTimeout;
00283 
00284 public:
00285   BFTPUser getUserWithName(const std::string& name);
00286   int getNumberOfUsers() { return users.size(); }
00287 };
00288 
00295 class BFTPControlConn: public BTCPConnection {
00296 protected:
00297 
00304   class BFTPDataConn: public BTCPConnection {
00305   public:
00306     BFTPDataConn(long addr, short port, BFTPControlConn* master);
00307     BFTPDataConn(const char* hostname, short port, BFTPControlConn* master);
00308     BFTPDataConn(short port, BFTPControlConn* master);
00309     virtual bool handleAccept();
00310     virtual bool handleConnection();
00311     virtual void close();
00312     bool jobDone() { return jobdone; }
00313     int finishCode() { return fcode; }
00314     const std::string& finishMessage() { return fdescr; }
00315 
00316     virtual void startStoring(FAT_FILE* file);
00317     virtual void startRetrieving(FAT_FILE* file);
00318     virtual void startSendingData(const std::string& data);
00319 
00320     virtual bool handleStore();
00321     virtual bool handleRetrieve();
00322     virtual bool handleSend();
00323 
00324     virtual void abort();
00325 
00326     typedef enum {
00327       DCMODE_IDLE,
00328       DCMODE_STORING,
00329       DCMODE_RETRIEVING,
00330       DCMODE_SENDINGDATA
00331     } DCMode;
00332 
00333   private:
00334     void finish(int code, const std::string& descr);
00335     
00336     BFTPControlConn* master;
00337 
00338     std::string data;
00339     FAT_FILE* file;
00340     DCMode mode;
00341 
00342     char buf[8192];
00343     unsigned int buflen, bufindex, total;
00344     bool finished, remoteclosed, jobdone;
00345     int fcode; std::string fdescr;
00346   };
00347 
00348 public:
00349   BFTPControlConn(BFTPServer* master, int conn,
00350                   const struct sockaddr_in& lastaddr);
00351   virtual ~BFTPControlConn();
00352 
00353   std::string userInfo();
00354   const BFTPUser& currentUser();
00355   
00356   virtual void close();
00357   virtual void handle();
00358 
00359   int createDataConnection();
00360   void destroyDataConnection();
00361   void updateActivityTime();
00362   
00368   class Delegate {
00369   public:
00370     virtual ~Delegate() {}
00371     virtual void controlConnectionWillClose(BFTPControlConn *conn) {}
00372     virtual void controlConnectionDidClose(BFTPControlConn *conn) {}
00373 
00375     virtual void activityOnControlConnection(BFTPControlConn *conn) {}
00376 
00377     virtual bool handleUnknownCommand(BFTPControlConn *cconn,
00378                                       std::string& cmd, std::string& arg)
00379     {
00380       return false;
00381     }
00382       
00383   };
00384 
00385   void setDelegate(Delegate* deleg) { this->deleg = deleg; }
00386   Delegate* delegate() { return deleg; }
00387 
00392   bool sendReply(int code, const char* format, ...);
00393   bool sendReply(int code, const std::string& reply);
00394 
00396   std::string makeAbsoluteFilename(const std::string& fname);
00397 
00398 protected:
00399   virtual bool handleInput(const unsigned char* buf, int buflen);
00400 
00401   bool setLoginName(const std::string& name);
00402   bool setLoginPassword(const std::string& pass);
00403   bool setCurrentUserByName(const std::string& name);
00404 
00405   bool changeWorkingDir(const std::string& newwd);
00406   bool moveFile(const std::string& file1, const std::string& file2);
00407   bool listDir(BFTPDataConn* dc, const std::string& args,
00408                bool namesOnly = false);
00409   bool storeFile(BFTPDataConn* dc, const std::string& args);
00410   bool retrieveFile(BFTPDataConn* dc, const std::string& args);
00411 
00412   void closeIfInactive();
00413 
00414   BFTPDataConn* dc;
00415   BFTPServer* master;
00416   Delegate *deleg;
00417 
00418   void dcHandleAccept(BFTPDataConn* dc);
00419   void dcReportFinish(BFTPDataConn* dc,
00420                       BFTPDataConn::DCMode mode,
00421                       bool remoteclosed);
00422 
00423   std::string cwd, fullcwd;
00424   std::string lastcmd, lastarg;
00425   std::string renameFrom;
00426 
00427   char buf[4096];
00428 
00429   typedef enum {
00430     TYPE_ASCII,
00431     TYPE_IMAGE
00432   } TransferType;
00433   TransferType ttype;
00434 
00435   BFTPUser user;
00436 
00437   time_t lastActivityTime;
00438 };
00439 
00440 
00441 #endif /* BFTPSERVER_H */

Generated on Sun Jan 7 21:24:18 2007 for libDSFTP by doxygen1.3-rc3