version 0.1.1
[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 #ifdef _WIN32\r
13 \r
14 #else\r
15         #include <sys/socket.h>\r
16         #include <sys/select.h>\r
17         #include <sys/types.h>\r
18         #include <netdb.h>\r
19         #include <netinet/in.h>\r
20         #include <arpa/inet.h>\r
21 #endif\r
22 \r
23 class NNTPConnection:public ZThread::Runnable,public ILogger//,public IDatabase\r
24 {\r
25 public:\r
26         NNTPConnection(SOCKET sock);\r
27         ~NNTPConnection();\r
28 \r
29         void Disconnect();\r
30         const bool Disconnected()               { return m_socket==INVALID_SOCKET; }\r
31 \r
32         void run();\r
33 \r
34 private:\r
35 \r
36         typedef enum ClientMode\r
37         {\r
38                 MODE_NONE=0,\r
39                 MODE_READER\r
40         };\r
41         struct NNTPCommand\r
42         {\r
43                 std::string m_command;\r
44                 std::vector<std::string> m_arguments;\r
45         };\r
46         struct ClientStatus\r
47         {\r
48                 ClientMode m_mode;\r
49                 bool m_allowpost;\r
50                 bool m_isposting;\r
51                 long m_boardid;\r
52                 long m_messageid;\r
53         };\r
54 \r
55         void SendBuffered(const std::string &data);\r
56         void SendBufferedLine(const std::string &data)  { SendBuffered(data+"\r\n"); }\r
57         void SocketSend();                      // immediately send buffered data - will block if send if no ready\r
58         void SocketReceive();           // immediately recv data on socket - will block if no data is waiting\r
59         void HandleReceivedData();\r
60         std::vector<char>::iterator Find(std::vector<char> &buffer, const std::string &val);\r
61         const bool HandleCommand(const NNTPCommand &command);\r
62         void HandlePostedMessage(const std::string &message);\r
63 \r
64         void SendArticleParts(const NNTPCommand &command);\r
65         void SendArticleOverInfo(Message &message);\r
66 \r
67         // various NNTP commands to handle\r
68         const bool HandleQuitCommand(const NNTPCommand &command);\r
69         const bool HandleModeCommand(const NNTPCommand &command);\r
70         const bool HandleCapabilitiesCommand(const NNTPCommand &command);\r
71         const bool HandleHelpCommand(const NNTPCommand &command);\r
72         const bool HandleDateCommand(const NNTPCommand &command);\r
73         const bool HandleListCommand(const NNTPCommand &command);\r
74         const bool HandleGroupCommand(const NNTPCommand &command);\r
75         const bool HandleListGroupCommand(const NNTPCommand &command);\r
76         const bool HandleNextCommand(const NNTPCommand &command);\r
77         const bool HandleLastCommand(const NNTPCommand &command);\r
78         const bool HandleArticleCommand(const NNTPCommand &command);\r
79         const bool HandleHeadCommand(const NNTPCommand &command);\r
80         const bool HandleBodyCommand(const NNTPCommand &command);\r
81         const bool HandleStatCommand(const NNTPCommand &command);\r
82         const bool HandleNewGroupsCommand(const NNTPCommand &command);\r
83         const bool HandlePostCommand(const NNTPCommand &command);\r
84         const bool HandleOverCommand(const NNTPCommand &command);\r
85 \r
86         SOCKET m_socket;\r
87         ClientStatus m_status;\r
88         std::vector<char> m_sendbuffer;\r
89         std::vector<char> m_receivebuffer;\r
90         std::vector<char> m_tempbuffer;\r
91 \r
92 };\r
93 \r
94 #endif  // _nntpconnection_\r