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.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Apr 22 14:26:07 2004 by doxygen 1.2.18 written by Dimitri van Heesch, © 1997-2003