PacketSerializer.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2006-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 */
00022 
00023 #include "Qt.h"
00024 #include "PacketSerializer.h"
00025 #include "Imports.cpp"
00026 
00028 
00032 PacketSerializer::PacketSerializer (PacketProtocol *pp)
00033  :  packetProtocol (pp)
00034 {
00035 }
00036 
00038 PacketSerializer::~PacketSerializer()
00039 {
00040 }
00041 
00043 
00053 bool PacketSerializer::read (Data &data, Transport *transport)
00054 {
00055     int headerLength = packetProtocol->headerLength();
00056     Q_ASSERT (headerLength != 0);
00057     QByteArray peekedHeader = transport->peek (headerLength);
00058     if (peekedHeader.length() == headerLength) {
00059         int payloadLength = packetProtocol->payloadLength (peekedHeader);
00060         if (transport->canRead (headerLength + payloadLength)) {
00061             QByteArray header = transport->read (headerLength);
00062             Q_ASSERT (header.length() == headerLength);
00063             QByteArray payload = transport->read (payloadLength);
00064             Q_ASSERT (payload.length() == payloadLength);
00065             data = packetProtocol->createPacket (header, payload);
00066             return true;
00067         }
00068     }
00069     return false;
00070 }
00071 
00073 
00081 bool PacketSerializer::write (const Data &data, Transport *transport)
00082 {
00083     Packet packet = data;
00084     if (transport->canWrite (packet->packetLength())) {
00085         bool ok = transport->write (packet->rawHeader(), false);
00086         Q_ASSERT (ok == true);
00087         ok = transport->write (packet->rawPayload(), true);
00088         Q_ASSERT (ok == true);
00089         return true;
00090     } else
00091         return false;
00092 }