00001 /* 00002 00003 Copyright (C) 2005-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 "HeaderWriter.h" 00025 #include "Header.h" 00026 #include "Imports.cpp" 00027 00028 using namespace Http; 00029 00030 HeaderWriter::HeaderWriter (Connection *connection) 00031 : p() 00032 { 00033 Q_ASSERT (connection != 0); 00034 00035 p.connection = connection; 00036 p.bytesWritten = 0; 00037 00038 connect (p.connection, SIGNAL (bytesWritten (qint64)), 00039 this, SLOT (bytesWritten (qint64))); 00040 } 00041 00042 HeaderWriter::~HeaderWriter() 00043 { 00044 // LocalPeer may happen to delete p.connection in its connectionClosed 00045 // slot before we come to here. 00046 //QObject::disconnect (p.connection, SIGNAL (bytesWritten (qint64)), 00047 // this, SLOT (bytesWritten (qint64))); 00048 } 00049 00050 void HeaderWriter::write (const Header &header) 00051 { 00052 p.handshakeBytes = header.toString().toLatin1(); 00053 p.bytesWritten = 0; 00054 QMetaObject::invokeMethod (this, "bytesWritten", Qt::QueuedConnection, 00055 QGenericReturnArgument(), Q_ARG (qint64, 0)); 00056 } 00057 00058 void HeaderWriter::bytesWritten (qint64 bytes) 00059 { 00060 // \todo Is this correct? bytes == number of bytes write() returned last time 00061 if (bytes > 0) { 00062 p.bytesWritten += bytes; 00063 if (p.bytesWritten == p.handshakeBytes.length()) { 00064 emit headerWritten(); 00065 return; 00066 } 00067 } 00068 if (p.connection->write (p.handshakeBytes.data() + p.bytesWritten, 00069 p.handshakeBytes.length() - p.bytesWritten) < 0) 00070 emit writeError(); // would be Error::DeviceError 00071 } 00072 00073 bool HeaderWriter::canWrite() const 00074 { 00075 return p.bytesWritten == p.handshakeBytes.length(); 00076 } 00077