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 "BodyReader.h" 00025 #include "Imports.cpp" 00026 00027 using namespace Http; 00028 00029 BodyReader::BodyReader (Connection *connection) 00030 : p() 00031 { 00032 p.connection = connection; 00033 p.bytesRead = 0; 00034 p.bodySize = 0; 00035 } 00036 00037 BodyReader::~BodyReader() 00038 { 00039 } 00040 00041 void BodyReader::startReading (QIODevice *file, qint64 bodySize) 00042 { 00043 p.file = file; 00044 p.bodySize = bodySize; 00045 p.bytesRead = 0; 00046 00047 QMetaObject::invokeMethod (this, "readyRead", Qt::QueuedConnection); 00048 } 00049 00050 void BodyReader::readyRead() 00051 { 00052 if (p.bodySize <= p.bytesRead) 00053 return; 00054 00055 qint64 read = 0; 00056 do { 00057 qint64 bytesLeft = p.bodySize - p.bytesRead; 00058 if (bytesLeft > BufferSize) 00059 read = BufferSize; 00060 else 00061 read = bytesLeft; 00062 read = p.connection->read (p.buffer, read); 00063 if (read > 0) { 00064 p.bytesRead += read; 00065 qint64 written = p.file->write (p.buffer, read); 00066 if (written != read) { 00067 emit writeError(); // should always be able to write to file! 00068 } 00069 if (p.bytesRead == p.bodySize) { 00070 emit bodyRead(); 00071 } 00072 } 00073 } while (read > 0); 00074 }