-rw-r--r-- | noncore/net/ubrowser/httpcomm.cpp | 43 | ||||
-rw-r--r-- | noncore/net/ubrowser/httpcomm.h | 6 | ||||
-rw-r--r-- | noncore/net/ubrowser/httpfactory.cpp | 25 | ||||
-rw-r--r-- | noncore/net/ubrowser/httpfactory.h | 1 |
4 files changed, 59 insertions, 16 deletions
diff --git a/noncore/net/ubrowser/httpcomm.cpp b/noncore/net/ubrowser/httpcomm.cpp index 3c14053..4f189ce 100644 --- a/noncore/net/ubrowser/httpcomm.cpp +++ b/noncore/net/ubrowser/httpcomm.cpp @@ -18,85 +18,90 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA HttpComm::HttpComm(QSocket *newSocket, QTextBrowser *newBrowser):QObject() { socket = newSocket; connect(socket, SIGNAL(hostFound()), this, SLOT(hostFound()) ); connect(socket, SIGNAL(connected()), this, SLOT(connected()) ); connect(socket, SIGNAL(readyRead()), this, SLOT(incoming()) ); connect(socket, SIGNAL(connectionClosed()), this, SLOT(connectionClosed()) ); headerRead=false; length = 0; bRead = 0; chunked=false; lengthset=false; browser=newBrowser; } void HttpComm::setUp(QString *newName) { name = newName; } -void HttpComm::setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText) +void HttpComm::setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText, QImageDrag *newImage, bool newIsImage) { host = newHost; portS = newPortS; file = newFile; text = newText; + isImage = newIsImage; + image = newImage; } void HttpComm::hostFound() { printf("HttpComm::hostFound: host found\n"); } void HttpComm::connected() { QString request("GET " + file + " HTTP/1.1\r\nHost: " + host + ':' + portS + "\r\nConnection: close\r\n\r\n"); // QString request("GET " + file + " HTTP/1.0\r\n\r\n"); printf("HttpComm::data: bytes written: %d\n", socket->writeBlock(request.latin1(), request.length()) ); printf("HttpComm::data: request sent:\n%s", request.latin1()); headerRead=false; bRead=0; length = 0; header=""; body=""; chunked=false; lengthset=false; } void HttpComm::incoming() { - int ba=socket->bytesAvailable(), i=0, j=0, semi=0; + int ba=socket->size(), i=0, j=0, semi=0; char *tempString = new char [ba]; + int br = socket->readBlock(tempString, ba); + socket->flush(); bool nextChunk=false; bool done=false; - socket->readBlock(tempString, ba); printf("HttpComm::incoming: ba: %d\n", ba); + printf("HttpComm::incoming: bytes read from socket: %d\n", br); +// printf("HttpComm::incoming: tempString length: %d\n"); QString sclength; if(headerRead == false) { for(i=0; i<ba; i++) { if(tempString[i] != '\r') { if(tempString[i] == '\n' && header[header.length()-1] == '\n') { j=i; headerRead = true; parseHeader(); goto body; } else { header+=tempString[i]; } } // printf("%d %d\n", ba, i); } } else @@ -111,48 +116,49 @@ void HttpComm::incoming() { for( ; j<ba ; j++) { body+=tempString[j]; bRead++; // printf("bRead1: %d\n", bRead); } } else { body += tempString; bRead+=ba; // printf("bRead2: %d\n", bRead); } if(bRead >= length) { printf("HttpComm::incoming: finished reading body\n"); processBody(); socket->close(); } } else { + int startclength=0; QString tempQString = tempString; //remove the http header, if one exists if(j != 0) { tempQString.remove(0, j+1); printf("HttpComm::incoming: removing http header. Result: \n%s", tempQString.latin1()); } while(!done) { switch(status) { //case 0=need to read chunk length case 0: j = tempQString.find('\n'); sclength = tempQString; sclength.truncate(j); clength = sclength.toUInt(0, 16); printf("HttpComm::Incoming: chunk length: %d\n", clength); printf("HttpComm::Incoming: chunk length string: %s\n", sclength.latin1()); //end of data if(clength==0) { processBody(); done=true; @@ -167,101 +173,111 @@ void HttpComm::incoming() } //still more data waiting else { done=false; //remove the chunk length header tempQString.remove(0,j+1); } bRead=0; // break; //if there is more fall through to: //chunk length just read, still more in tempQstring case 1: //the current data extends beyond the end of the chunk if(bRead + tempQString.length() > clength) { QString newTQstring = tempQString; newTQstring.truncate(clength-bRead); bRead+=newTQstring.length(); body+=newTQstring; printf("HttpComm::incoming: start new body piece 1: \n"); printf("%s", newTQstring.latin1() ); printf("HttpComm::incoming: end new body piece 1.\n"); status=0; - tempQString = tempQString.remove(0, clength); + tempQString = tempQString.remove(0, newTQstring.length()); + startclength = tempQString.find('\n'); + printf("HttpComm::incoming: startclength: %d\n", startclength); + tempQString = tempQString.remove(0, startclength+1); done=false; // break; } //the chunk extends beyond the current data; else { if(tempQString.length() <= ba) { + printf("HttpComm::incoming: not truncating tempQString\n"); body+=tempQString; bRead+=tempQString.length(); } else { + printf("HttpComm::incoming: truncating tempQString\n"); tempQString.truncate(ba); body+=tempQString; bRead+=tempQString.length(); } printf("HttpComm::incoming: start new body piece 2: \n"); printf("%s", tempQString.latin1() ); printf("HttpComm::incoming: end new body piece 2.\n"); done=true; status=2; // break; } break; //just got data in, continue reading chunk case 2: //the current data extends beyond the end of the chunk if(bRead + tempQString.length() > clength) { QString newTQstring = tempQString; newTQstring.truncate(clength-bRead); bRead+=newTQstring.length(); body+=newTQstring; printf("HttpComm::incoming: start new body piece 3: \n"); printf("%s", newTQstring.latin1() ); printf("HttpComm::incoming: end new body piece 3.\n"); status=0; - tempQString = tempQString.remove(0, clength); + tempQString = tempQString.remove(0, newTQstring.length()); + startclength = tempQString.find('\n'); + printf("HttpComm::incoming: startclength, tempQString length: %d %d\n", startclength, tempQString.length()); + tempQString = tempQString.remove(0, startclength+1); done=false; // break; } //the chunk extends beyond the current data; else { if(tempQString.length() <= ba) { + printf("HttpComm::incoming: not truncating tempQString\n"); body+=tempQString; bRead+=tempQString.length(); } else { + printf("HttpComm::incoming: truncating tempQString\n"); tempQString.truncate(ba); body+=tempQString; bRead+=tempQString.length(); } printf("HttpComm::incoming: start new body piece 4: \n"); printf("%s", tempQString.latin1() ); printf("HttpComm::incoming: end new body piece 4.\n"); done=true; status=2; // break; } break; } printf("HttpComm::incoming: chunked encoding: bRead: %d\n", bRead); } } } delete tempString; } void HttpComm::connectionClosed() { printf("HttpComm::connectionClosed: connection closed\n"); processBody(); @@ -287,31 +303,40 @@ void HttpComm::parseHeader() length = tempList[1].toUInt(); } else if(headerLines[i].startsWith("Transfer-Encoding: chunked") ) { printf("HttpComm::parseHeader: using chunked encoding\n"); chunked = true; status=0; } } printf("HttpConn::parseHeader: content-length: %d\n", length); } void HttpComm::processBody() { printf("HttpComm::processBody: processing body\n"); // printf("HttpComm::processBody: start body\n\n"); // printf("%s", body.latin1()); // printf("HttpComm::processBody: end body\n"); int lastSlash = file.findRev('/'); QString end = file; end.truncate(lastSlash+1); - QString context("http://"+host+':'+portS+end); + QString context = "http://"+host+':'+portS+end; printf("HttpComm::processBody: context: %s\n", context.latin1() ); - browser->setTextFormat(RichText); - browser->mimeSourceFactory()->setFilePath(context); - browser->setText(body, context); + if(!isImage) + { + browser->setTextFormat(RichText); + browser->mimeSourceFactory()->setFilePath(context); + browser->setText(body, context); + } + else + { + QImage tempImage(body.latin1()); + image->setImage(tempImage); + browser->update(); + } } diff --git a/noncore/net/ubrowser/httpcomm.h b/noncore/net/ubrowser/httpcomm.h index c20fe72..d6f63fc 100644 --- a/noncore/net/ubrowser/httpcomm.h +++ b/noncore/net/ubrowser/httpcomm.h @@ -1,57 +1,61 @@ /* Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing Copyright (C) 2002 Thomas Stephens 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <qobject.h> #include <qstring.h> #include <qsocket.h> #include <qstringlist.h> #include <qdragobject.h> #include <qtextbrowser.h> +#include <qcstring.h> +#include <qimage.h> #include <stdio.h> class HttpComm : public QObject { Q_OBJECT public: HttpComm(QSocket *newSocket, QTextBrowser *newBrowser); void setUp(QString *newName); - void setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText); + void setStuff(QString newHost, QString newPortS, QString newFile, QTextDrag *newText, QImageDrag *newImage, bool newIsImage); void parseHeader(); void processBody(); public slots: void hostFound(); void connected(); void connectionClosed(); void incoming(); private: QString *name; QSocket *socket; QString host; QString portS; QString file; bool headerRead; QString header; QString body; unsigned int length; unsigned int bRead; QTextDrag *text; + QImageDrag *image; QTextBrowser *browser; bool chunked; bool lengthset; unsigned int clength; int status; + bool isImage; }; diff --git a/noncore/net/ubrowser/httpfactory.cpp b/noncore/net/ubrowser/httpfactory.cpp index 92718fb..50a3c9a 100644 --- a/noncore/net/ubrowser/httpfactory.cpp +++ b/noncore/net/ubrowser/httpfactory.cpp @@ -1,104 +1,117 @@ /* Opie-uBrowser. a very small web browser, using on QTextBrowser for html display/parsing Copyright (C) 2002 Thomas Stephens 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "httpfactory.h" HttpFactory::HttpFactory(QTextBrowser *newBrowser):QMimeSourceFactory() { socket = new QSocket; text = new QTextDrag; browser=newBrowser; comm = new HttpComm(socket, browser); + image = new QImageDrag; } const QMimeSource * HttpFactory::data(const QString &abs_name) const { printf("HttpFactory::data: using absolute data func\n"); int port=80, addrEnd, portSep; QString host, file, portS, name, tempString; - bool done=false; + bool done=false, isImage=false; comm->setUp((QString *)&abs_name); name = abs_name; // name = name.lower(); name = name.stripWhiteSpace(); printf("%s\n", name.latin1()); if(name.startsWith("http://")) { name = name.remove(0, 7); } else { - return 0; + name.prepend(browser->context()); + name = name.remove(0, 7); } addrEnd = name.find('/'); if(addrEnd == -1) { name += '/'; addrEnd = name.length()-1; } host = name; file = name; host.truncate(addrEnd); file.remove(0, addrEnd); portSep = host.find(':'); if(portSep != -1) { portS=host; host.truncate(portSep); portS.remove(0, portSep+1); port = portS.toInt(); } printf("%s %s %d\n", host.latin1(), file.latin1(), port); if(port == 80) { portS="80"; } + + if(file.find(".png", file.length()-4) != -1 || file.find(".gif", file.length()-4) != -1 || file.find(".jpg", file.length()-4) != -1) + { + isImage=true; + } - comm->setStuff(host, portS, file, text); + comm->setStuff(host, portS, file, text, image, isImage); socket->connectToHost(host, port); - text->setText(""); - - return text; + if(!image) + { + text->setText(""); + return text; + } + else + { + return image; + } } const QMimeSource * HttpFactory::data(const QString &abs_or_rel_name, const QString & context) const { printf("HttpFactory::data: using relative data func\n"); if(abs_or_rel_name.startsWith(context)) { return data(abs_or_rel_name); } else { return data(context + abs_or_rel_name); } return 0; } diff --git a/noncore/net/ubrowser/httpfactory.h b/noncore/net/ubrowser/httpfactory.h index bb7615b..1802f56 100644 --- a/noncore/net/ubrowser/httpfactory.h +++ b/noncore/net/ubrowser/httpfactory.h @@ -13,26 +13,27 @@ Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <qmime.h> #include <qsocket.h> #include <qstring.h> #include <qdragobject.h> #include <qtextbrowser.h> #include <stdio.h> #include "httpcomm.h" class HttpFactory : public QMimeSourceFactory { public: HttpFactory(QTextBrowser *newBrowser); const QMimeSource * data(const QString &abs_name) const; const QMimeSource * data(const QString &abs_or_rel_name, const QString & context) const; private: QSocket *socket; HttpComm *comm; QTextDrag *text; + QImageDrag *image; QTextBrowser *browser; }; |