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