/* * socket.h * Stuff to deal with sockets * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * Permission to use, modify and distribute is granted via the * Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Copyright (C) 2007-2009 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #ifndef SOCKET_H_ #define SOCKET_H_ // C Includes #include <zlib.h> #include <netinet/in.h> //class sockaddr_in; // C++ Includes #include <queue> #include <string> #include <list> // Mud Includes // Defines needed #define TELOPTS #define TELCMDS #define NAWS TELOPT_NAWS #define TTYPE TELOPT_TTYPE extern long InBytes; extern long OutBytes; class Player; enum telnetNegotiation { NEG_NONE, NEG_IAC, NEG_WILL, NEG_WONT, NEG_DO, NEG_DONT, NEG_SB, NEG_START_NAWS, NEG_SB_NAWS_COL_HIGH, NEG_SB_NAWS_COL_LOW, NEG_SB_NAWS_ROW_HIGH, NEG_SB_NAWS_ROW_LOW, NEG_END_NAWS, NEG_SB_TTYPE, NEG_UNUSED }; namespace telnet { #define TELOPT_COMPRESS 85 #define TELOPT_COMPRESS2 86 #define TELOPT_MSSP 70 #define TELOPT_MXP 91 #define MSSP_VAR 1 #define MSSP_VAL 2 extern unsigned const char will_mxp[]; // MXP Support extern unsigned const char will_comp2[]; // MCCP V2 support extern unsigned const char will_comp1[]; // MCCP V1 support extern unsigned const char will_echo[]; // Echo input extern unsigned const char will_eor[]; // EOR After every prompt extern unsigned const char will_mssp[]; // MSSP Support extern unsigned const char sb_mssp_start[]; // Start MSSP String extern unsigned const char sb_mssp_end[];// End MSSP String extern unsigned const char do_ttype[]; // Terminal type negotation extern unsigned const char query_ttype[];// Begin terminal type subnegotiations extern unsigned const char do_naws[]; // Window size negotation NAWS extern unsigned const char start_mxp[]; // Start MPX string extern unsigned const char start_mccp[]; // Start compress extern unsigned const char start_mccp2[];// Start compress2 extern unsigned const char eor_str[]; // For MCCP void *zlib_alloc(void *opaque, unsigned int items, unsigned int size); void zlib_free(void *opaque, void *address); } class Socket { struct Host { bstring hostName; bstring ip; }; struct Term { int rows; int cols; bstring type; }; struct SockOptions { int mccp; bool mxp; bool eor; bool compressing; }; public: Socket(int pFd); Socket(int pFd, sockaddr_in pAddr, bool &dnsDone); ~Socket(); void reset(); void sendTelnetNeg(); void setState(int pState, int pFnParam = 1); void restoreState(); void addToPlayerList(); int write(bstring toWrite, bool pSpy = true); void askFor(const char *str); void vprint(const char *fmt, va_list ap, bool parseColor = false); void bprint(bstring toPrint); void println(bstring toPrint = ""); // void printPrompt(bstring toPrint); void print(const char* format, ...); void printColor(const char* format, ...); int processInput(void); int processOneCommand(void); void reconnect(bool pauseScreen=false); void disconnect(); void showLoginScreen(bool dnsDone=true); void flush(void); // Flush any pending output // Telopt related bool handleNaws(int& colRow, unsigned char& chr, bool high); int processCompressed(void); // Mccp int startCompress(void); int endCompress(void); int sendMSSP(); // Send MSSP Variables // End Telopt related int getFd(void) const; bool isConnected() const; int getState(void) const; const bstring& getIp(void) const; const bstring& getHostname(void) const; void checkLockOut(void); void setHostname(bstring pName); void setIp(bstring pIp); bool hasOutput(void) const; bool hasCommand(void) const; // void login(bstring& cmd); // void command(bstring& cmd); // void createPlayer(bstring& cmd); void ANSI(int color); long getIdle() const; int getMccp() const; bool getMxp() const; bool canForce() const; bool getEor() const; bstring getTermType() const; int getTermCols() const; int getTermRows() const; Player* getPlayer() const; void setPlayer(Player* ply); void freePlayer(); // Static Methods static void resolveIp(const sockaddr_in &addr, bstring& ip); void clearSpying(); void clearSpiedOn(); void setSpying(Socket *sock); void removeSpy(Socket *sock); void addSpy(Socket *sock); // TODO - Retool so they can be moved to protected public: char tempstr[4][256]; int getParam(); void setParam(int newParam); protected: int fd; // File Descriptor of this socket Host host; Term term; SockOptions opts; bool inPlayerList; int lastState; int connState; int tState; bool oneIAC; bool watchBrokenClient; //std::queue<bstring> output; // Output to send bstring output; std::queue<bstring> input; // Processed Input buffer bstring inBuf; // Input Buffer bstring inLast; // Last command Player* myPlayer; // From ply extr struct int ansi; unsigned long timeout; // Old items from IOBUF that we might keep char *out_compress_buf; z_stream *out_compress; void (*fn)(Socket*, char*); char fnparam; char commands; Socket *spyingOn; // Socket we are spying on std::list<Socket*> spying; // Sockets spying on us // TEMP public: char color; long ltime; char intrpt; public: static const int COMPRESSED_OUTBUF_SIZE; static int NumSockets; }; // Other socket related prototypes int nonBlock(int pFd); int restoreState(Socket* sock); #endif /*SOCKET_H_*/