d2bf16792a0df418be7f7a46086d740b6354a067
[fms.git] / include / nntp / nntpconnection.h
1 #ifndef _nntpconnection_\r
2 #define _nntpconnection_\r
3 \r
4 #include "../socketdefines.h"\r
5 #include "../ilogger.h"\r
6 #include "../message.h"\r
7 \r
8 #include <string>\r
9 #include <vector>\r
10 #include <zthread/Runnable.h>\r
11 \r
12 class NNTPConnection:public ZThread::Runnable,public ILogger//,public IDatabase\r
13 {\r
14 public:\r
15         NNTPConnection(SOCKET sock);\r
16         ~NNTPConnection();\r
17 \r
18         void Disconnect();\r
19         const bool Disconnected()               { return m_socket==INVALID_SOCKET; }\r
20 \r
21         void run();\r
22 \r
23 private:\r
24 \r
25         typedef enum ClientMode\r
26         {\r
27                 MODE_NONE=0,\r
28                 MODE_READER\r
29         };\r
30         struct NNTPCommand\r
31         {\r
32                 std::string m_command;\r
33                 std::vector<std::string> m_arguments;\r
34         };\r
35         struct ClientStatus\r
36         {\r
37                 ClientMode m_mode;\r
38                 bool m_allowpost;\r
39                 bool m_isposting;\r
40                 long m_boardid;\r
41                 long m_messageid;\r
42         };\r
43 \r
44         void SendBuffered(const std::string &data);\r
45         void SendBufferedLine(const std::string &data)  { SendBuffered(data+"\r\n"); }\r
46         void SocketSend();                      // immediately send buffered data - will block if send if no ready\r
47         void SocketReceive();           // immediately recv data on socket - will block if no data is waiting\r
48         void HandleReceivedData();\r
49         std::vector<char>::iterator Find(std::vector<char> &buffer, const std::string &val);\r
50         const bool HandleCommand(const NNTPCommand &command);\r
51         void HandlePostedMessage(const std::string &message);\r
52 \r
53         void SendArticleParts(const NNTPCommand &command);\r
54         void SendArticleOverInfo(const Message &message);\r
55 \r
56         // various NNTP commands to handle\r
57         const bool HandleQuitCommand(const NNTPCommand &command);\r
58         const bool HandleModeCommand(const NNTPCommand &command);\r
59         const bool HandleCapabilitiesCommand(const NNTPCommand &command);\r
60         const bool HandleHelpCommand(const NNTPCommand &command);\r
61         const bool HandleDateCommand(const NNTPCommand &command);\r
62         const bool HandleListCommand(const NNTPCommand &command);\r
63         const bool HandleGroupCommand(const NNTPCommand &command);\r
64         const bool HandleListGroupCommand(const NNTPCommand &command);\r
65         const bool HandleNextCommand(const NNTPCommand &command);\r
66         const bool HandleLastCommand(const NNTPCommand &command);\r
67         const bool HandleArticleCommand(const NNTPCommand &command);\r
68         const bool HandleHeadCommand(const NNTPCommand &command);\r
69         const bool HandleBodyCommand(const NNTPCommand &command);\r
70         const bool HandleStatCommand(const NNTPCommand &command);\r
71         const bool HandleNewGroupsCommand(const NNTPCommand &command);\r
72         const bool HandlePostCommand(const NNTPCommand &command);\r
73         const bool HandleOverCommand(const NNTPCommand &command);\r
74 \r
75         SOCKET m_socket;\r
76         ClientStatus m_status;\r
77         std::vector<char> m_sendbuffer;\r
78         std::vector<char> m_receivebuffer;\r
79         std::vector<char> m_tempbuffer;\r
80 \r
81 };\r
82 \r
83 #endif  // _nntpconnection_\r