--- /dev/null
+#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