• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

KHTML

kjavadownloader.cpp

Go to the documentation of this file.
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., 51 Franklin Street, Fifth Floor,
00019  * Boston, MA 02110-1301, 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         server->sendURLData( d->loaderID, FINISHED, d->file );
00151     }
00152     d->job = 0L; // signal KIO::Job::result deletes itself
00153     server->removeDataJob( d->loaderID ); // will delete this
00154     KJavaAppletServer::freeJavaServer();
00155 }
00156 
00157 void KJavaDownloader::jobCommand( int cmd )
00158 {
00159     if (!d->job) return;
00160     switch (cmd) {
00161         case KJAS_STOP: {
00162             kdDebug(6100) << "jobCommand(" << d->loaderID << ") stop" << endl;
00163             d->job->kill();
00164             d->job = 0L; // KIO::Job::kill deletes itself
00165             KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer();
00166             server->removeDataJob( d->loaderID ); // will delete this
00167             KJavaAppletServer::freeJavaServer();
00168             break;
00169         }
00170         case KJAS_HOLD:
00171             kdDebug(6100) << "jobCommand(" << d->loaderID << ") hold" << endl;
00172             d->job->suspend();
00173             break;
00174         case KJAS_RESUME:
00175             kdDebug(6100) << "jobCommand(" << d->loaderID << ") resume" << endl;
00176             d->job->resume();
00177             break;
00178     }
00179 }
00180 
00181 //-----------------------------------------------------------------------------
00182 
00183 class KJavaUploaderPrivate
00184 {
00185 public:
00186     KJavaUploaderPrivate() {}
00187     ~KJavaUploaderPrivate()
00188     {
00189         delete url;
00190         if (job) job->kill(); // KIO::Job::kill deletes itself
00191     }
00192     int               loaderID;
00193     KURL*             url;
00194     QByteArray        file;
00195     KIO::TransferJob* job;
00196     bool              finished;
00197 };
00198 
00199 KJavaUploader::KJavaUploader( int ID, const QString& url )
00200 {
00201     kdDebug(6100) << "KJavaUploader(" << ID << ") = " << url << endl;
00202 
00203     d = new KJavaUploaderPrivate;
00204 
00205     d->loaderID = ID;
00206     d->url = new KURL( url );
00207     d->job = 0L;
00208     d->finished = false;
00209 }
00210 
00211 void KJavaUploader::start()
00212 {
00213     kdDebug(6100) << "KJavaUploader::start(" << d->loaderID << ")" << endl;
00214     KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer();
00215     // create a suspended job
00216     d->job = KIO::put( *d->url, -1, false, false, false );
00217     d->job->suspend();
00218     connect( d->job, SIGNAL(dataReq( KIO::Job*, QByteArray& )),
00219             this,   SLOT(slotDataRequest( KIO::Job*, QByteArray& )) );
00220     connect( d->job, SIGNAL(result(KIO::Job*)),
00221             this,   SLOT(slotResult(KIO::Job*)) );
00222     server->sendURLData( d->loaderID, CONNECTED, d->file );
00223     KJavaAppletServer::freeJavaServer();
00224 }
00225 
00226 KJavaUploader::~KJavaUploader()
00227 {
00228     delete d;
00229 }
00230 
00231 void KJavaUploader::slotDataRequest( KIO::Job*, QByteArray& qb )
00232 {
00233     // send our data and suspend
00234     kdDebug(6100) << "slotDataRequest(" << d->loaderID << ") finished:" << d->finished << endl;
00235     qb.resize( d->file.size() );
00236     KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer();
00237     if (d->file.size() == 0) {
00238         d->job = 0L; // eof, job deletes itself
00239         server->removeDataJob( d->loaderID ); // will delete this
00240     } else {
00241         memcpy( qb.data(), d->file.data(), d->file.size() );
00242         d->file.resize( 0 );
00243     if (!d->finished) {
00244             server->sendURLData( d->loaderID, REQUESTDATA, d->file );
00245             d->job->suspend();
00246         }
00247     }
00248     KJavaAppletServer::freeJavaServer();
00249 }
00250 
00251 void KJavaUploader::data( const QByteArray& qb )
00252 {
00253     kdDebug(6100) << "KJavaUploader::data(" << d->loaderID << ")" << endl;
00254     d->file.resize( qb.size() );
00255     memcpy( d->file.data(), qb.data(), qb.size() );
00256     d->job->resume();
00257 }
00258 
00259 void KJavaUploader::slotResult( KIO::Job* )
00260 {
00261     kdDebug(6100) << "slotResult(" << d->loaderID << ") job:" << d->job << endl;
00262 
00263     if (!d->job)
00264         return;
00265     KJavaAppletServer* server = KJavaAppletServer::allocateJavaServer();
00266     if (d->job->error())
00267     {
00268         int code = d->job->error();
00269         QString codestr = QString::number(code);
00270         d->file.resize(codestr.length());
00271         memcpy( d->file.data(), codestr.ascii(), codestr.length() );
00272         kdDebug(6100) << "slave had an error " << code <<  ": " << d->job->errorString() << endl;
00273 
00274         server->sendURLData( d->loaderID, ERRORCODE, d->file );
00275         d->file.resize( 0 );
00276     }
00277     else // shouldn't come here
00278         kdError(6100) << "slotResult(" << d->loaderID << ") job:" << d->job << endl;
00279     d->job = 0L; // signal KIO::Job::result deletes itself
00280     server->removeDataJob( d->loaderID ); // will delete this
00281     KJavaAppletServer::freeJavaServer();
00282 }
00283 
00284 void KJavaUploader::jobCommand( int cmd )
00285 {
00286     if (!d->job) return;
00287     switch (cmd) {
00288         case KJAS_STOP: {
00289             kdDebug(6100) << "jobCommand(" << d->loaderID << ") stop" << endl;
00290         d->finished = true;
00291             if (d->job->isSuspended())
00292                 d->job->resume();
00293             break;
00294         }
00295     }
00296 }
00297 
00298 #include "kjavadownloader.moc"

KHTML

Skip menu "KHTML"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal