diff options
author | Ben Boeckel <MathStuf@gmail.com> | 2008-11-02 23:33:52 +0000 |
---|---|---|
committer | Ben Boeckel <MathStuf@gmail.com> | 2008-11-02 23:33:52 +0000 |
commit | e6ea5a782398c6cb8257e7b178b7cd180b6e4c91 (patch) | |
tree | 243f78c2d1c62c1defca8620f14a0a783f3d5cab /signet | |
parent | aaf9850c8350e3d7d20a91d3fe4e026576a7a032 (diff) | |
download | sigen-e6ea5a782398c6cb8257e7b178b7cd180b6e4c91.tar.gz sigen-e6ea5a782398c6cb8257e7b178b7cd180b6e4c91.tar.xz sigen-e6ea5a782398c6cb8257e7b178b7cd180b6e4c91.zip |
[FIX] Minor fixes with the ChallengeMediator
[ADD] Added ConnectMediator code
[FIX] Added more packet types
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@297 6ecfd1a5-f3ed-3746-8530-beee90d26b22
Diffstat (limited to 'signet')
-rw-r--r-- | signet/CMakeLists.txt | 1 | ||||
-rw-r--r-- | signet/Table.cpp | 8 | ||||
-rw-r--r-- | signet/protocol/ChallengeMediator.cpp | 18 | ||||
-rw-r--r-- | signet/protocol/ConnectMediator.cpp | 74 | ||||
-rw-r--r-- | signet/protocol/ConnectMediator.h | 7 | ||||
-rw-r--r-- | signet/protocol/Packet.h | 32 | ||||
-rw-r--r-- | signet/protocol/PacketMaker.cpp | 20 | ||||
-rw-r--r-- | signet/protocol/PacketMaker.h | 4 |
8 files changed, 146 insertions, 18 deletions
diff --git a/signet/CMakeLists.txt b/signet/CMakeLists.txt index 190c5520..3aeb09dd 100644 --- a/signet/CMakeLists.txt +++ b/signet/CMakeLists.txt @@ -23,6 +23,7 @@ SET(signet_HEADERS ) SET(signet_PROTOCOL_SRCS protocol/ChallengeMediator.cpp + protocol/ConnectMediator.cpp protocol/Packet.cpp protocol/PacketMaker.cpp ) diff --git a/signet/Table.cpp b/signet/Table.cpp index 5cd6373d..89012237 100644 --- a/signet/Table.cpp +++ b/signet/Table.cpp @@ -38,5 +38,11 @@ void Signet::Table::packetReceived(QTcpSocket* client, Protocol::Packet* packet) // TODO: Handle the packet } else - Protocol::PacketMaker::unknownReceiver(client); + { + if (receiver == "spectators") + { + } + else + Protocol::PacketMaker::unknownReceiver(client); + } } diff --git a/signet/protocol/ChallengeMediator.cpp b/signet/protocol/ChallengeMediator.cpp index 0f09faff..45d70deb 100644 --- a/signet/protocol/ChallengeMediator.cpp +++ b/signet/protocol/ChallengeMediator.cpp @@ -116,7 +116,7 @@ void Signet::Protocol::ChallengeMediator::init(const QByteArray& id) void Signet::Protocol::ChallengeMediator::sendServerKey(const QByteArray& serverKey) { - PacketMaker::rawData(m_socket, serverKey); + PacketMaker::challengeKey(m_socket, serverKey); } void Signet::Protocol::ChallengeMediator::recvServerKey(QByteArray* serverKey) @@ -125,7 +125,7 @@ void Signet::Protocol::ChallengeMediator::recvServerKey(QByteArray* serverKey) Packet packet = PacketMaker::unwrap(m_socket); if (packet.isValid()) { - if (packet.type() == Packet::RawData) + if (packet.type() == Packet::ChallengeKey) packet.rawDump(&buffer); else if (packet.type() == Packet::Denial) m_error = UnknownUser; @@ -138,8 +138,8 @@ void Signet::Protocol::ChallengeMediator::recvServerKey(QByteArray* serverKey) void Signet::Protocol::ChallengeMediator::sendClientResponse(const QByteArray& clientKey, const QByteArray& clientResponse) { - PacketMaker::rawData(m_socket, clientKey); - PacketMaker::rawData(m_socket, clientResponse); + PacketMaker::challengeKey(m_socket, clientKey); + PacketMaker::challengeResponse(m_socket, clientResponse); } void Signet::Protocol::ChallengeMediator::recvClientResponse(QByteArray* clientKey, QByteArray* clientResponse) @@ -148,18 +148,20 @@ void Signet::Protocol::ChallengeMediator::recvClientResponse(QByteArray* clientK Packet packet = PacketMaker::unwrap(m_socket); if (packet.isValid()) { - if (packet.type() == Packet::RawData) + if (packet.type() == Packet::ChallengeKey) { packet.rawDump(&buffer); buffer.setBuffer(clientResponse); packet = PacketMaker::unwrap(m_socket); if (packet.isValid()) { - if (packet.type() == Packet::RawData) + if (packet.type() == Packet::ChallengeResponse) packet.rawDump(&buffer); else m_error = UnexpectedError; } + else + m_error = SocketError; } else m_error = UnexpectedError; @@ -170,7 +172,7 @@ void Signet::Protocol::ChallengeMediator::recvClientResponse(QByteArray* clientK void Signet::Protocol::ChallengeMediator::sendServerResponse(const QByteArray& serverResponse) { - PacketMaker::rawData(m_socket, serverResponse); + PacketMaker::challengeResponse(m_socket, serverResponse); } void Signet::Protocol::ChallengeMediator::recvServerResponse(QByteArray* serverResponse) @@ -179,7 +181,7 @@ void Signet::Protocol::ChallengeMediator::recvServerResponse(QByteArray* serverR Packet packet = PacketMaker::unwrap(m_socket); if (packet.isValid()) { - if (packet.type() == Packet::RawData) + if (packet.type() == Packet::ChallengeResponse) packet.rawDump(&buffer); else if (packet.type() == Packet::Denial) m_error = ClientFailed; diff --git a/signet/protocol/ConnectMediator.cpp b/signet/protocol/ConnectMediator.cpp new file mode 100644 index 00000000..5610281a --- /dev/null +++ b/signet/protocol/ConnectMediator.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2008 Ben Boeckel <MathStuf@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// Header include +#include "ConnectMediator.h" + +// Protocol includes +#include "PacketMaker.h" + +// Qt includes +#include <QtNetwork/QTcpSocket> + +Signet::Protocol::ConnectMediator::ConnectMediator(QTcpSocket* socket, Side side) : + m_side(side), + m_error(NoError), + m_socket(socket) +{ +} + +Signet::Protocol::ConnectMediator::Error Signet::Protocol::ConnectMediator::requestConnection() +{ + if (m_side != Client) + return SideError; + init(); + recvAck(); + return m_error; +} + +Signet::Protocol::ConnectMediator::Error Signet::Protocol::ConnectMediator::replyToConnection() +{ + if (m_side != Server) + return SideError; + recvAck(); + if (m_error != NoError) + return m_error; + sendAck(); + return m_error; +} + +void Signet::Protocol::ConnectMediator::init() +{ + PacketMaker::makeConnection(m_socket); +} + +void Signet::Protocol::ConnectMediator::sendAck() +{ + PacketMaker::ack(m_socket); +} + +void Signet::Protocol::ConnectMediator::recvAck() +{ + Packet packet = PacketMaker::unwrap(m_socket); + if (packet.isValid()) + { + if (packet.type() != Packet::Acknowledge) + m_error = UnexpectedError; + } + else + m_error = SocketError; +} diff --git a/signet/protocol/ConnectMediator.h b/signet/protocol/ConnectMediator.h index 78c91fc3..666d7409 100644 --- a/signet/protocol/ConnectMediator.h +++ b/signet/protocol/ConnectMediator.h @@ -21,6 +21,9 @@ // Signet includes #include "../Global.h" +// Forward declarations +class QTcpSocket; + namespace Signet { namespace Protocol @@ -51,6 +54,10 @@ class SIGNET_IMPORT ConnectMediator void sendAck(); void recvAck(); + private: + const Side m_side; + Error m_error; + QTcpSocket* m_socket; }; } } diff --git a/signet/protocol/Packet.h b/signet/protocol/Packet.h index a66e94d2..1f426e16 100644 --- a/signet/protocol/Packet.h +++ b/signet/protocol/Packet.h @@ -38,27 +38,41 @@ class SIGNET_IMPORT Packet enum Type { // Errors - UnknownReceiver = 0x7F00, - UnhandledPacket = 0x7F01, - LimitedPermissions = 0x7F02, - Invalid = 0x7FFF, + UnknownReceiver = 0x4000, + UnhandledPacket = 0x4001, + LimitedPermissions = 0x4002, + Invalid = 0x40FF, // Requests ConnectRequest = 0x0100, DisconnectRequest = 0x0101, ChallengeRequest = 0x0102, - ServerListRequest = 0x0103, - UserListRequest = 0x0104, + UserListRequest = 0x0103, + ServerListRequest = 0x0104, RoomListRequest = 0x0105, TableListRequest = 0x0106, SigmodListRequest = 0x0107, SigmodRequest = 0x0108, - - // Data types + TableState = 0x0109, + DecisionRequest = 0x010A, + // Data RawData = 0x0200, Acceptance = 0x0201, Denial = 0x0202, - Message = 0x0204, + Acknowledge = 0x0203, + ChallengeKey = 0x0204, + ChallengeResponse = 0x0205, + Message = 0x0206, + ServerList = 0x0207, + UserList = 0x0208, + RoomList = 0x0209, + SigmodList = 0x020A, + Sigmod = 0x020B, + BattleState = 0x020C, + MapState = 0x020D, + Decision = 0x020E, + // Updates }; + enum SectionType { Receiver = 0, diff --git a/signet/protocol/PacketMaker.cpp b/signet/protocol/PacketMaker.cpp index 5ede3996..a5b8e890 100644 --- a/signet/protocol/PacketMaker.cpp +++ b/signet/protocol/PacketMaker.cpp @@ -68,6 +68,12 @@ void Signet::Protocol::PacketMaker::accept(QIODevice* device, const QStringList& packet.dump(device); } +void Signet::Protocol::PacketMaker::ack(QIODevice* device, const QStringList& receivers) +{ + Packet packet(Packet::Acceptance, receivers); + packet.dump(device); +} + void Signet::Protocol::PacketMaker::challenge(QIODevice* device, const QByteArray& id, const QStringList& receivers) { Packet packet(Packet::ChallengeRequest, receivers); @@ -75,6 +81,20 @@ void Signet::Protocol::PacketMaker::challenge(QIODevice* device, const QByteArra packet.dump(device); } +void Signet::Protocol::PacketMaker::challengeKey(QIODevice* device, const QByteArray& key, const QStringList& receivers) +{ + Packet packet(Packet::ChallengeKey, receivers); + packet.write(key); + packet.dump(device); +} + +void Signet::Protocol::PacketMaker::challengeResponse(QIODevice* device, const QByteArray& response, const QStringList& receivers) +{ + Packet packet(Packet::ChallengeResponse, receivers); + packet.write(response); + packet.dump(device); +} + void Signet::Protocol::PacketMaker::makeConnection(QIODevice* device, const QStringList& receivers) { Packet packet(Packet::ConnectRequest, receivers); diff --git a/signet/protocol/PacketMaker.h b/signet/protocol/PacketMaker.h index f044b20a..46d45f77 100644 --- a/signet/protocol/PacketMaker.h +++ b/signet/protocol/PacketMaker.h @@ -41,7 +41,11 @@ class SIGNET_IMPORT PacketMaker static void deny(QIODevice* device, const QStringList& receivers = QStringList()); static void accept(QIODevice* device, const QStringList& receivers = QStringList()); + static void ack(QIODevice* device, const QStringList& receivers = QStringList()); + static void challenge(QIODevice* device, const QByteArray& id, const QStringList& receivers = QStringList()); + static void challengeKey(QIODevice* device, const QByteArray& key, const QStringList& receivers = QStringList()); + static void challengeResponse(QIODevice* device, const QByteArray& response, const QStringList& receivers = QStringList()); static void message(QIODevice* device, const QString& message, const QStringList& receivers = QStringList()); |