version 0.3.29
[fms.git] / include / nntp / nntpconnection.h
1 #ifndef _nntpconnection_\r
2 #define _nntpconnection_\r
3 \r
4 #include "../threadwrapper/cancelablerunnable.h"\r
5 #include "../socketdefines.h"\r
6 #include "../ilogger.h"\r
7 #include "../message.h"\r
8 #include "../localidentity.h"\r
9 #include "../ithreaddatabase.h"\r
10 \r
11 #include <string>\r
12 #include <vector>\r
13 \r
14 #ifdef _WIN32\r
15 \r
16 #else\r
17         #include <sys/socket.h>\r
18         #include <sys/select.h>\r
19         #include <sys/types.h>\r
20         #include <netdb.h>\r
21         #include <netinet/in.h>\r
22         #include <arpa/inet.h>\r
23 #endif\r
24 \r
25 class NNTPConnection:public CancelableRunnable,public ILogger,public IThreadDatabase\r
26 {\r
27 public:\r
28         NNTPConnection(SOCKET sock);\r
29         ~NNTPConnection();\r
30 \r
31         void Disconnect();\r
32         const bool Disconnected()               { return m_socket==INVALID_SOCKET; }\r
33 \r
34         void run();\r
35 \r
36 private:\r
37 \r
38         typedef enum ClientMode\r
39         {\r
40                 MODE_NONE=0,\r
41                 MODE_READER\r
42         };\r
43         struct NNTPCommand\r
44         {\r
45                 std::string m_command;\r
46                 std::vector<std::string> m_arguments;\r
47         };\r
48         struct ClientStatus\r
49         {\r
50                 ClientStatus(SQLite3DB::DB *db):m_authuser(db)          {}\r
51 \r
52                 ClientMode m_mode;\r
53                 bool m_allowpost;\r
54                 bool m_isposting;\r
55                 long m_boardid;\r
56                 long m_messageid;\r
57                 LocalIdentity m_authuser;               // -1 if user not authenticated, otherwise id of user from tblLocalIdentity\r
58                 bool m_authenticated;\r
59         };\r
60 \r
61         void SendBuffered(const std::string &data);\r
62         void SendBufferedLine(const std::string &data)  { SendBuffered(data+"\r\n"); }\r
63         void SocketSend();                      // immediately send buffered data - will block if send if no ready\r
64         void SocketReceive();           // immediately recv data on socket - will block if no data is waiting\r
65         void HandleReceivedData();\r
66         std::vector<char>::iterator Find(std::vector<char> &buffer, const std::string &val);\r
67         const bool HandleCommand(const NNTPCommand &command);\r
68         void HandlePostedMessage(const std::string &message);\r
69 \r
70         void SendArticleParts(const NNTPCommand &command);\r
71         void SendArticleOverInfo(Message &message);\r
72 \r
73         // various NNTP commands to handle\r
74         const bool HandleQuitCommand(const NNTPCommand &command);\r
75         const bool HandleModeCommand(const NNTPCommand &command);\r
76         const bool HandleCapabilitiesCommand(const NNTPCommand &command);\r
77         const bool HandleHelpCommand(const NNTPCommand &command);\r
78         const bool HandleDateCommand(const NNTPCommand &command);\r
79         const bool HandleListCommand(const NNTPCommand &command);\r
80         const bool HandleGroupCommand(const NNTPCommand &command);\r
81         const bool HandleListGroupCommand(const NNTPCommand &command);\r
82         const bool HandleNextCommand(const NNTPCommand &command);\r
83         const bool HandleLastCommand(const NNTPCommand &command);\r
84         const bool HandleArticleCommand(const NNTPCommand &command);\r
85         const bool HandleHeadCommand(const NNTPCommand &command);\r
86         const bool HandleBodyCommand(const NNTPCommand &command);\r
87         const bool HandleStatCommand(const NNTPCommand &command);\r
88         const bool HandleNewGroupsCommand(const NNTPCommand &command);\r
89         const bool HandlePostCommand(const NNTPCommand &command);\r
90         const bool HandleOverCommand(const NNTPCommand &command);\r
91         const bool HandleAuthInfoCommand(const NNTPCommand &command);\r
92         const bool HandleGetTrustCommand(const NNTPCommand &command);\r
93         const bool HandleSetTrustCommand(const NNTPCommand &command);\r
94         const bool HandleGetTrustListCommand(const NNTPCommand &command);\r
95 \r
96         SOCKET m_socket;\r
97         ClientStatus m_status;\r
98         std::vector<char> m_sendbuffer;\r
99         std::vector<char> m_receivebuffer;\r
100         std::vector<char> m_tempbuffer;\r
101 \r
102 };\r
103 \r
104 #endif  // _nntpconnection_\r