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"