@@ -52,27 +52,27 @@ void DiscordSocket::onConnected()
5252
5353void DiscordSocket::handshake ()
5454{
55- send (generateHandshake (), Opcode::Handshake);
55+ enqueue (generateHandshake (), Opcode::Handshake);
5656}
5757
58- void DiscordSocket::errorOccurred ([[maybe_unused]] QLocalSocket::LocalSocketError socketError )
58+ void DiscordSocket::processReply ( )
5959{
60- emit failed ();
61- }
62-
63- void DiscordSocket::read ()
64- {
65- if (m_socket.bytesAvailable () != 0 ) {
66- disconnect (&m_socket, &QLocalSocket::readyRead, this , &DiscordSocket::read);
60+ const auto reply = QJsonDocument::fromJson (m_msg);
61+ const auto obj = reply.object ();
62+ if (obj[" cmd" ] == " DISPATCH" && obj[" evt" ] == " READY" ) {
6763 emit connected ();
64+ return ;
65+ }
66+
67+ if (!m_messagesToSend.isEmpty ()) {
68+ emit send ();
6869 }
6970}
7071
71- bool DiscordSocket::send (const QByteArray& data, Opcode opcode )
72+ void DiscordSocket::send ()
7273{
73- if (m_socket.state () != QLocalSocket::ConnectedState) {
74- qDebug () << " socket.state() != QLocalSocket::ConnectedState" ;
75- }
74+ m_state = State::Sent;
75+ auto [data, opcode] = m_messagesToSend.dequeue ();
7676
7777 QByteArray frame;
7878 QDataStream stream (&frame, QIODevice::WriteOnly);
@@ -87,10 +87,54 @@ bool DiscordSocket::send(const QByteArray& data, Opcode opcode)
8787 const auto sent = m_socket.write (frame);
8888 if (sent != frame.size ()) {
8989 qDebug () << " send failed, sent " << sent << ' /' << frame.size ();
90- return false ;
90+ return ;
9191 }
9292 m_socket.flush ();
93- return true ;
93+ }
94+
95+ void DiscordSocket::errorOccurred ([[maybe_unused]] QLocalSocket::LocalSocketError socketError)
96+ {
97+ emit failed ();
98+ }
99+
100+ void DiscordSocket::read ()
101+ {
102+ if (m_state != State::Reading) {
103+ if (m_socket.bytesAvailable () >= sizeof (quint32) * 2 ) {
104+ QDataStream in (&m_socket);
105+ in.setByteOrder (QDataStream::LittleEndian);
106+
107+ quint32 op;
108+ in >> op;
109+
110+ quint32 bytes;
111+ in >> bytes;
112+ m_pendingBytes = bytes;
113+
114+ m_state = State::Reading;
115+ m_msg = {};
116+ } else {
117+ return ;
118+ }
119+ }
120+
121+ if (m_state == State::Reading) {
122+ auto toRead = std::min (m_socket.bytesAvailable (), m_pendingBytes);
123+ m_msg.append (m_socket.read (toRead));
124+ m_pendingBytes -= toRead;
125+ if (m_pendingBytes == 0 ) {
126+ m_state = State::Waiting;
127+ processReply ();
128+ }
129+ }
130+ }
131+
132+ void DiscordSocket::enqueue (const QByteArray& data, Opcode opcode)
133+ {
134+ m_messagesToSend.enqueue ({ data, opcode });
135+ if (m_state == State::Waiting) {
136+ emit send ();
137+ }
94138}
95139
96140void UnixDiscordSocket::connectSocket ()
0 commit comments