00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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();
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;
00155 server->removeDataJob( d->loaderID );
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;
00167 KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer();
00168 server->removeDataJob( d->loaderID );
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();
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
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
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;
00241 server->removeDataJob( d->loaderID );
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
00280 kdError(6100) << "slotResult(" << d->loaderID << ") job:" << d->job << endl;
00281 d->job = 0L;
00282 server->removeDataJob( d->loaderID );
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"