version 0.1.0
[fms.git] / include / nntp / nntpconnection.h
diff --git a/include/nntp/nntpconnection.h b/include/nntp/nntpconnection.h
new file mode 100644 (file)
index 0000000..d2bf167
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef _nntpconnection_\r
+#define _nntpconnection_\r
+\r
+#include "../socketdefines.h"\r
+#include "../ilogger.h"\r
+#include "../message.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+#include <zthread/Runnable.h>\r
+\r
+class NNTPConnection:public ZThread::Runnable,public ILogger//,public IDatabase\r
+{\r
+public:\r
+       NNTPConnection(SOCKET sock);\r
+       ~NNTPConnection();\r
+\r
+       void Disconnect();\r
+       const bool Disconnected()               { return m_socket==INVALID_SOCKET; }\r
+\r
+       void run();\r
+\r
+private:\r
+\r
+       typedef enum ClientMode\r
+       {\r
+               MODE_NONE=0,\r
+               MODE_READER\r
+       };\r
+       struct NNTPCommand\r
+       {\r
+               std::string m_command;\r
+               std::vector<std::string> m_arguments;\r
+       };\r
+       struct ClientStatus\r
+       {\r
+               ClientMode m_mode;\r
+               bool m_allowpost;\r
+               bool m_isposting;\r
+               long m_boardid;\r
+               long m_messageid;\r
+       };\r
+\r
+       void SendBuffered(const std::string &data);\r
+       void SendBufferedLine(const std::string &data)  { SendBuffered(data+"\r\n"); }\r
+       void SocketSend();                      // immediately send buffered data - will block if send if no ready\r
+       void SocketReceive();           // immediately recv data on socket - will block if no data is waiting\r
+       void HandleReceivedData();\r
+       std::vector<char>::iterator Find(std::vector<char> &buffer, const std::string &val);\r
+       const bool HandleCommand(const NNTPCommand &command);\r
+       void HandlePostedMessage(const std::string &message);\r
+\r
+       void SendArticleParts(const NNTPCommand &command);\r
+       void SendArticleOverInfo(const Message &message);\r
+\r
+       // various NNTP commands to handle\r
+       const bool HandleQuitCommand(const NNTPCommand &command);\r
+       const bool HandleModeCommand(const NNTPCommand &command);\r
+       const bool HandleCapabilitiesCommand(const NNTPCommand &command);\r
+       const bool HandleHelpCommand(const NNTPCommand &command);\r
+       const bool HandleDateCommand(const NNTPCommand &command);\r
+       const bool HandleListCommand(const NNTPCommand &command);\r
+       const bool HandleGroupCommand(const NNTPCommand &command);\r
+       const bool HandleListGroupCommand(const NNTPCommand &command);\r
+       const bool HandleNextCommand(const NNTPCommand &command);\r
+       const bool HandleLastCommand(const NNTPCommand &command);\r
+       const bool HandleArticleCommand(const NNTPCommand &command);\r
+       const bool HandleHeadCommand(const NNTPCommand &command);\r
+       const bool HandleBodyCommand(const NNTPCommand &command);\r
+       const bool HandleStatCommand(const NNTPCommand &command);\r
+       const bool HandleNewGroupsCommand(const NNTPCommand &command);\r
+       const bool HandlePostCommand(const NNTPCommand &command);\r
+       const bool HandleOverCommand(const NNTPCommand &command);\r
+\r
+       SOCKET m_socket;\r
+       ClientStatus m_status;\r
+       std::vector<char> m_sendbuffer;\r
+       std::vector<char> m_receivebuffer;\r
+       std::vector<char> m_tempbuffer;\r
+\r
+};\r
+\r
+#endif // _nntpconnection_\r