PacketWriter.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "Qt.h"
00024 #include "PacketWriter.h"
00025 #include "Protocols/Transports/Connection.h"
00026
00027 using Gnutella::PacketProcessing::PacketWriter;
00028 using Protocols::Transports::Connection;
00029 using Gnutella::Packets::Packet;
00030
00031 PacketWriter::PacketWriter (Connection *connection)
00032 : p()
00033 {
00034
00035 p.packetLength = 0;
00036 p.packetBytesWritten = 0;
00037 p.connection = connection;
00038
00039 connect (p.connection, SIGNAL (bytesWritten (qint64)),
00040 this, SLOT (bytesWritten (qint64)));
00041 }
00042
00043 PacketWriter::~PacketWriter()
00044 {
00045
00046
00047 }
00048
00049 void PacketWriter::write (const Packet &packet)
00050 {
00051 using Gnutella::Packets::Packet;
00052 using Gnutella::Packets::HeaderLength;
00053 using Gnutella::Packets::MaximalPayloadLength;
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 QByteArray header = packet.rawHeader();
00065 QByteArray payload = packet.rawPayload();
00066
00067 Q_ASSERT (header.length() == HeaderLength);
00068 Q_ASSERT (payload.length() <= MaximalPayloadLength);
00069
00070 memcpy (p.rawPacket, header.data(), header.length());
00071 memcpy (p.rawPacket + header.length(), payload.data(), payload.length());
00072
00073 p.packetLength = header.length() + payload.length();
00074 p.packetBytesWritten = 0;
00075
00076
00077
00078
00079
00080 QMetaObject::invokeMethod (this, "bytesWritten", Qt::QueuedConnection,
00081 QGenericReturnArgument(), Q_ARG (qint64, 0));
00082 }
00083
00084 void PacketWriter::bytesWritten (qint64)
00085 {
00086 using Gnutella::Packets::HeaderLength;
00087 using Gnutella::Packets::MaximalPayloadLength;
00088
00089 if (p.packetLength == p.packetBytesWritten)
00090 return;
00091
00092 char *dataStart = p.rawPacket + p.packetBytesWritten;
00093 qint64 dataLength = p.packetLength - p.packetBytesWritten;
00094 qint64 written = p.connection->write (dataStart, dataLength);
00095
00096 if (written >= 0) {
00097 p.packetBytesWritten += written;
00098 if (p.packetBytesWritten == p.packetLength)
00099 emit packetWritten();
00100 } else {
00101 emit writeError();
00102 return;
00103 }
00104
00105 return;
00106 }
00107
00108 bool PacketWriter::canWrite() const
00109 {
00110 return p.packetBytesWritten == p.packetLength;
00111 }