#ifndef TSOCKET_H #define TSOCKET_H #include #include #include #include #include #include union ipv4_addr { u32 addr; TArray addr_bytes; }; class TSocket : public TObject { private: ipv4_addr m_dst_addr; u16 m_dst_port; u16 m_src_port; ipv4_addr m_src_addr; s16 m_sock_fd; u8 m_sock_flags; bool m_buffer_cleared; s16 m_size; s16 m_buffer_offset; u32 m_unused; TArray m_unused2; TArray m_packet_buffer; s16 m_stat_val; u16 m_unused3; u32 m_send_window; u32 m_recv_window; void (*m_callback)(TSocket *socket); public: TSocket(TObject *parent); virtual ~TSocket(); virtual short open() = 0; virtual short close() = 0; virtual void recv() = 0; virtual short send(u8 *data) = 0; virtual int send(u8 *data, size_t size) = 0; int resolve_domain(char *domain); void set_ip_address(u32 addr); void set_port(u32 port); const u8 next(); int is_empty(); void set_flags(u8 flags) { m_sock_flags |= flags; }; void clear_flags(u8 flags) { m_sock_flags &= ~flags; }; void toggle_flags(u8 flags) { m_sock_flags ^= flags; }; u8 get_flags(u8 flags) { return m_sock_flags & flags; }; PRIVATE_MEMBER_ACCESSORS(ipv4_addr, dst_addr); PRIVATE_MEMBER_ACCESSORS(u16, dst_port); PRIVATE_MEMBER_ACCESSORS(u16, src_port); PRIVATE_MEMBER_ACCESSORS(ipv4_addr, src_addr); PRIVATE_MEMBER_ACCESSORS(s16, sock_fd); PRIVATE_MEMBER_ACCESSORS(u8, sock_flags); PRIVATE_MEMBER_ACCESSORS(bool, buffer_cleared); PRIVATE_MEMBER_ACCESSORS(s16, size); PRIVATE_MEMBER_ACCESSORS(s16, buffer_offset); PRIVATE_MEMBER_ACCESSORS(u32, unused); PRIVATE_MEMBER_ACCESSORS_ARRAY(u8, unused2, 64); PRIVATE_MEMBER_ACCESSORS_ARRAY(u8, packet_buffer, 2048); PRIVATE_MEMBER_ACCESSORS(s16, stat_val); PRIVATE_MEMBER_ACCESSORS(u16, unused3); PRIVATE_MEMBER_ACCESSORS(u32, send_window); PRIVATE_MEMBER_ACCESSORS(u32, recv_window); PRIVATE_MEMBER_ACCESSORS_FUNC(void, callback, TSocket *socket); }; #endif