summaryrefslogtreecommitdiff
path: root/context.h
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2023-03-03 15:03:06 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2023-03-03 15:03:06 -0400
commitfd25a2530d126fb51c80c594244f856b46430335 (patch)
tree48b98e6ee9abdc310f0b76acc2a6050160dbb2a4 /context.h
parent9634309c46742c13cbd198b223fe5301dab53632 (diff)
TTcpSocket: Make most of the virtuals inline
This is to make the function order match better.
Diffstat (limited to 'context.h')
-rw-r--r--context.h120
1 files changed, 113 insertions, 7 deletions
diff --git a/context.h b/context.h
index 76183b7..dbd1d26 100644
--- a/context.h
+++ b/context.h
@@ -900,19 +900,125 @@ private:
int m_is_encrypted;
public:
WEAK_FUNC TTcpSocket(TObject *parent = nullptr);
- virtual ~TTcpSocket();
- virtual short open() override;
- virtual short close() override;
- virtual void recv() override;
- virtual short send(u8 *data) override;
- virtual int send(u8 *data, size_t size) override;
+ virtual ~TTcpSocket() {
+ close();
+ };
+
+ virtual void recv() {
+ if (sock_fd() != -1) {
+ packet_buffer().fill(0);
+ set_buffer_cleared(true);
+ (int)tcp_receive(sock_fd(), notify, packet_buffer().size(), packet_buffer().data());
+ }
+ };
+
+ virtual int send(u8 *data, size_t size) {
+ if (sock_fd() != -1) {
+ if (!m_is_encrypted) {
+ m_send_crypt.encrypt(data, size);
+ }
+
+ const s8 flags = sock_flags();
+ if (flags || !get_link_status()) {
+ return -1;
+ } else {
+ if (int status = stat()) {
+ log(get_sock_status_name(status));
+ set_flags(1);
+ return 1;
+ } else {
+ if (send_window() <= size) {
+ set_flags(1);
+ return 1;
+ } else {
+ if (stat_val() < 0) {
+ set_flags(1);
+ return 1;
+ } else {
+ struct send_buffs sb;
+ sb.buff = data;
+ sb.len = size;
+ set_unused(0);
+ int ret = tcp_send(sock_fd(), nullptr, 1, &sb);
+ if (ret >= 1 || ret < -1) {
+ set_flags(1);
+ log(get_sock_status_name(ret));
+ close();
+ return ret;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ return -1;
+ }
+ };
+
+ virtual short send(u8 *data) {
+ if (sock_fd() != -1) {
+ const s8 flags = sock_flags();
+ if (flags || !get_link_status()) {
+ return -1;
+ } else {
+ if (short status = stat()) {
+ log(get_sock_status_name(status));
+ set_flags(1);
+ return 1;
+ } else {
+ if (stat_val() < 0) {
+ set_flags(1);
+ return 1;
+ } else {
+ s8 len = strlen(reinterpret_cast<const char *>(data));
+ struct send_buffs sb;
+ sb.buff = data;
+ sb.len = len;
+ if (send_window() <= len) {
+ set_flags(1);
+ return 1;
+ } else {
+ short ret = tcp_send(sock_fd(), nullptr, 1, &sb);
+ if (ret) {
+ close();
+ }
+ return ret;
+ }
+ }
+ }
+ }
+ } else {
+ return -1;
+ }
+ };
+
+ virtual short open();
+ virtual short close();
short stat();
void some_stub();
int test_connection();
- static void notify(short size, short sock_fd);
+ static void notify(short size, short sock_fd) {
+ char tmp_str[64];
+ TTcpSocket *socket = tcp_socket_table[sock_fd];
+
+ if (socket != nullptr) {
+ if (size > 0) {
+ socket->set_buffer_cleared(false);
+ socket->set_size(size);
+ socket->set_buffer_offset(0);
+ sprintf(tmp_str, "Rcv:%d byte", size);
+ socket->log(tmp_str);
+ if (socket->callback() != nullptr) {
+ socket->callback()(socket);
+ }
+ } else {
+ socket->set_flags(1);
+ }
+ }
+ };
PRIVATE_MEMBER_ACCESSORS(PSOV3EncryptionTCP, send_crypt);
PRIVATE_MEMBER_ACCESSORS(PSOV3EncryptionTCP, recv_crypt);