khtml Library API Documentation

kjavadownloader.cpp

00001 /* This file is part of the KDE project 00002 * 00003 * Copyright (C) 2000 Richard Moore <rich@kde.org> 00004 * 2000 Wynn Wilkes <wynnw@caldera.com> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Library General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Library General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Library General Public License 00017 * along with this library; see the file COPYING.LIB. If not, write to 00018 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00019 * Boston, MA 02111-1307, USA. 00020 */ 00021 00022 #include "kjavadownloader.h" 00023 #include "kjavaappletserver.h" 00024 00025 #include <kurl.h> 00026 #include <kio/job.h> 00027 #include <kio/jobclasses.h> 00028 #include <kdebug.h> 00029 #include <qfile.h> 00030 00031 static const int DATA = 0; 00032 static const int FINISHED = 1; 00033 static const int ERRORCODE = 2; 00034 static const int HEADERS = 3; 00035 static const int REDIRECT = 4; 00036 static const int MIMETYPE = 5; 00037 static const int CONNECTED = 6; 00038 static const int REQUESTDATA = 7; 00039 00040 static const int KJAS_STOP = 0; 00041 static const int KJAS_HOLD = 1; 00042 static const int KJAS_RESUME = 2; 00043 00044 KJavaKIOJob::~KJavaKIOJob() {} 00045 00046 void KJavaKIOJob::data( const QByteArray& ) 00047 { 00048 kdError(6100) << "Job id mixup" << endl; 00049 } 00050 00051 //----------------------------------------------------------------------------- 00052 00053 class KJavaDownloaderPrivate 00054 { 00055 friend class KJavaDownloader; 00056 public: 00057 KJavaDownloaderPrivate() : responseCode(0), isfirstdata(true) {} 00058 ~KJavaDownloaderPrivate() 00059 { 00060 delete url; 00061 if (job) job->kill(); // KIO::Job::kill deletes itself 00062 } 00063 private: 00064 int loaderID; 00065 KURL* url; 00066 QByteArray file; 00067 KIO::TransferJob* job; 00068 int responseCode; 00069 bool isfirstdata; 00070 }; 00071 00072 00073 KJavaDownloader::KJavaDownloader( int ID, const QString& url ) 00074 { 00075 kdDebug(6100) << "KJavaDownloader(" << ID << ") = " << url << endl; 00076 00077 d = new KJavaDownloaderPrivate; 00078 00079 d->loaderID = ID; 00080 d->url = new KURL( url ); 00081 00082 d->job = KIO::get( *d->url, false, false ); 00083 d->job->addMetaData("PropagateHttpHeader", "true"); 00084 connect( d->job, SIGNAL(data( KIO::Job*, const QByteArray& )), 00085 this, SLOT(slotData( KIO::Job*, const QByteArray& )) ); 00086 connect( d->job, SIGNAL(connected(KIO::Job*)), 00087 this, SLOT(slotConnected(KIO::Job*))); 00088 connect( d->job, SIGNAL(mimetype(KIO::Job*, const QString&)), 00089 this, SLOT(slotMimetype(KIO::Job*, const QString&))); 00090 connect( d->job, SIGNAL(result(KIO::Job*)), 00091 this, SLOT(slotResult(KIO::Job*)) ); 00092 } 00093 00094 KJavaDownloader::~KJavaDownloader() 00095 { 00096 delete d; 00097 } 00098 00099 void KJavaDownloader::slotData( KIO::Job*, const QByteArray& qb ) 00100 { 00101 kdDebug(6100) << "slotData(" << d->loaderID << ")" << endl; 00102 00103 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00104 if (d->isfirstdata) { 00105 QString headers = d->job->queryMetaData("HTTP-Headers"); 00106 if (!headers.isEmpty()) { 00107 d->file.resize( headers.length() ); 00108 memcpy( d->file.data(), headers.ascii(), headers.length() ); 00109 server->sendURLData( d->loaderID, HEADERS, d->file ); 00110 d->file.resize( 0 ); 00111 } 00112 d->isfirstdata = false; 00113 } 00114 if ( qb.size() ) 00115 server->sendURLData( d->loaderID, DATA, qb ); 00116 KJavaAppletServer::freeJavaServer(); 00117 } 00118 00119 void KJavaDownloader::slotConnected(KIO::Job*) 00120 { 00121 kdDebug(6100) << "slave connected" << endl; 00122 d->responseCode = d->job->error(); 00123 } 00124 00125 void KJavaDownloader::slotMimetype(KIO::Job*, const QString & type) { 00126 kdDebug(6100) << "slave mimetype " << type << endl; 00127 } 00128 00129 void KJavaDownloader::slotResult( KIO::Job* ) 00130 { 00131 kdDebug(6100) << "slotResult(" << d->loaderID << ")" << endl; 00132 00133 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00134 if( d->job->error()) 00135 { 00136 kdDebug(6100) << "slave had an error = " << d->job->errorString() << endl; 00137 int code = d->job->error(); 00138 if (!code) 00139 code = 404; 00140 QString codestr = QString::number(code); 00141 d->file.resize(codestr.length()); 00142 memcpy( d->file.data(), codestr.ascii(), codestr.length() ); 00143 kdDebug(6100) << "slave had an error = " << code << endl; 00144 00145 server->sendURLData( d->loaderID, ERRORCODE, d->file ); 00146 d->file.resize( 0 ); 00147 } 00148 else 00149 { 00150 kdDebug(6100) << "slave got all its data, sending to KJAS" << endl; 00151 kdDebug(6100) << "size of data = " << d->file.size() << endl; 00152 server->sendURLData( d->loaderID, FINISHED, d->file ); 00153 } 00154 d->job = 0L; // signal KIO::Job::result deletes itself 00155 server->removeDataJob( d->loaderID ); // will delete this 00156 KJavaAppletServer::freeJavaServer(); 00157 } 00158 00159 void KJavaDownloader::jobCommand( int cmd ) 00160 { 00161 if (!d->job) return; 00162 switch (cmd) { 00163 case KJAS_STOP: { 00164 kdDebug(6100) << "jobCommand(" << d->loaderID << ") stop" << endl; 00165 d->job->kill(); 00166 d->job = 0L; // KIO::Job::kill deletes itself 00167 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00168 server->removeDataJob( d->loaderID ); // will delete this 00169 KJavaAppletServer::freeJavaServer(); 00170 break; 00171 } 00172 case KJAS_HOLD: 00173 kdDebug(6100) << "jobCommand(" << d->loaderID << ") hold" << endl; 00174 d->job->suspend(); 00175 break; 00176 case KJAS_RESUME: 00177 kdDebug(6100) << "jobCommand(" << d->loaderID << ") resume" << endl; 00178 d->job->resume(); 00179 break; 00180 } 00181 } 00182 00183 //----------------------------------------------------------------------------- 00184 00185 class KJavaUploaderPrivate 00186 { 00187 public: 00188 KJavaUploaderPrivate() {} 00189 ~KJavaUploaderPrivate() 00190 { 00191 delete url; 00192 if (job) job->kill(); // KIO::Job::kill deletes itself 00193 } 00194 int loaderID; 00195 KURL* url; 00196 QByteArray file; 00197 KIO::TransferJob* job; 00198 bool finished; 00199 }; 00200 00201 KJavaUploader::KJavaUploader( int ID, const QString& url ) 00202 { 00203 kdDebug(6100) << "KJavaUploader(" << ID << ") = " << url << endl; 00204 00205 d = new KJavaUploaderPrivate; 00206 00207 d->loaderID = ID; 00208 d->url = new KURL( url ); 00209 d->job = 0L; 00210 d->finished = false; 00211 } 00212 00213 void KJavaUploader::start() 00214 { 00215 kdDebug(6100) << "KJavaUploader::start(" << d->loaderID << ")" << endl; 00216 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00217 // create a suspended job 00218 d->job = KIO::put( *d->url, -1, false, false, false ); 00219 d->job->suspend(); 00220 connect( d->job, SIGNAL(dataReq( KIO::Job*, QByteArray& )), 00221 this, SLOT(slotDataRequest( KIO::Job*, QByteArray& )) ); 00222 connect( d->job, SIGNAL(result(KIO::Job*)), 00223 this, SLOT(slotResult(KIO::Job*)) ); 00224 server->sendURLData( d->loaderID, CONNECTED, d->file ); 00225 KJavaAppletServer::freeJavaServer(); 00226 } 00227 00228 KJavaUploader::~KJavaUploader() 00229 { 00230 delete d; 00231 } 00232 00233 void KJavaUploader::slotDataRequest( KIO::Job*, QByteArray& qb ) 00234 { 00235 // send our data and suspend 00236 kdDebug(6100) << "slotDataRequest(" << d->loaderID << ") finished:" << d->finished << endl; 00237 qb.resize( d->file.size() ); 00238 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00239 if (d->file.size() == 0) { 00240 d->job = 0L; // eof, job deletes itself 00241 server->removeDataJob( d->loaderID ); // will delete this 00242 } else { 00243 memcpy( qb.data(), d->file.data(), d->file.size() ); 00244 d->file.resize( 0 ); 00245 if (!d->finished) { 00246 server->sendURLData( d->loaderID, REQUESTDATA, d->file ); 00247 d->job->suspend(); 00248 } 00249 } 00250 KJavaAppletServer::freeJavaServer(); 00251 } 00252 00253 void KJavaUploader::data( const QByteArray& qb ) 00254 { 00255 kdDebug(6100) << "KJavaUploader::data(" << d->loaderID << ")" << endl; 00256 d->file.resize( qb.size() ); 00257 memcpy( d->file.data(), qb.data(), qb.size() ); 00258 d->job->resume(); 00259 } 00260 00261 void KJavaUploader::slotResult( KIO::Job* ) 00262 { 00263 kdDebug(6100) << "slotResult(" << d->loaderID << ") job:" << d->job << endl; 00264 00265 if (!d->job) 00266 return; 00267 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer(); 00268 if (d->job->error()) 00269 { 00270 int code = d->job->error(); 00271 QString codestr = QString::number(code); 00272 d->file.resize(codestr.length()); 00273 memcpy( d->file.data(), codestr.ascii(), codestr.length() ); 00274 kdDebug(6100) << "slave had an error " << code << ": " << d->job->errorString() << endl; 00275 00276 server->sendURLData( d->loaderID, ERRORCODE, d->file ); 00277 d->file.resize( 0 ); 00278 } 00279 else // shouldn't come here 00280 kdError(6100) << "slotResult(" << d->loaderID << ") job:" << d->job << endl; 00281 d->job = 0L; // signal KIO::Job::result deletes itself 00282 server->removeDataJob( d->loaderID ); // will delete this 00283 KJavaAppletServer::freeJavaServer(); 00284 } 00285 00286 void KJavaUploader::jobCommand( int cmd ) 00287 { 00288 if (!d->job) return; 00289 switch (cmd) { 00290 case KJAS_STOP: { 00291 kdDebug(6100) << "jobCommand(" << d->loaderID << ") stop" << endl; 00292 d->finished = true; 00293 if (d->job->isSuspended()) 00294 d->job->resume(); 00295 break; 00296 } 00297 } 00298 } 00299 00300 #include "kjavadownloader.moc"
KDE Logo
This file is part of the documentation for khtml Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Oct 10 18:56:14 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003