📄 kwqkjobclasses.cpp
字号:
/*
* Copyright (C) 2003 Apple Computer, Inc. All rights reserved.
* Portions Copyright (c) 2005 Nokia Corporation, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "KWQLogging.h"
#include "KWQExceptions.h"
#include "KWQKJobClasses.h"
#include "KWQLoader.h"
#include "KWQResourceLoader.h"
#include "KWQString.h"
//#include "KWQFoundationExtras.h"
#include "WebCoreUrlResponseInfo.h"
#include "KWQDict.h"
#include "formdata.h"
using khtml::FormData;
namespace KIO {
// The allocations and releases in TransferJobPrivate are
// definitely Cocoa-exception-free (either simple Foundation
// classes or our own KWQResourceLoader which avoides doing work
// in dealloc
class TransferJobPrivate
OOM_MODIFIED
{
public:
TransferJobPrivate(const KURL& kurl)
: status(0)
, metaData(0)
, URL(kurl)
, loader(NULL)
, method("GET")
, response(0)
, assembledResponseHeaders(true)
, retrievedCharset(true)
{
}
TransferJobPrivate(const KURL& kurl, const FormData &_postData)
: status(0)
, metaData(0)
, URL(kurl)
, loader(NULL)
, method("POST")
, postData(_postData)
, response(0)
, assembledResponseHeaders(true)
, retrievedCharset(true)
{
}
~TransferJobPrivate()
{
if (response)
response->DeRef();
delete metaData;
delete loader;
}
int status;
QDict<QString> *metaData;
KURL URL;
KWQResourceLoader *loader;
QString method;
FormData postData;
MWebCoreUrlResponseHeaderInfo* response;
bool assembledResponseHeaders;
bool retrievedCharset;
QString responseHeaders;
};
TransferJob::TransferJob(const KURL &url, bool reload, bool deliverAllData)
: d(new TransferJobPrivate(url)),
m_deliverAllData(deliverAllData),
m_data(this, SIGNAL(data(KIO::Job*, const char*, int))),
m_redirection(this, SIGNAL(redirection(KIO::Job*, const KURL&))),
m_result(this, deliverAllData ? SIGNAL(result(KIO::Job*, const TDesC8 &)) : SIGNAL(result(KIO::Job*))),
m_receivedResponse(this, SIGNAL(receivedResponse(KIO::Job*, MWebCoreUrlResponseHeaderInfo *)))
{
}
TransferJob::TransferJob(const KURL &url, const FormData &postData, bool deliverAllData)
: d(new TransferJobPrivate(url, postData)),
m_deliverAllData(deliverAllData),
m_data(this, SIGNAL(data(KIO::Job*, const char*, int))),
m_redirection(this, SIGNAL(redirection(KIO::Job*, const KURL&))),
m_result(this, deliverAllData ? SIGNAL(result(KIO::Job*, const TDesC8 &)) : SIGNAL(result(KIO::Job*))),
m_receivedResponse(this, SIGNAL(receivedResponse(KIO::Job*, MWebCoreUrlResponseHeaderInfo *)))
{
}
TransferJob::~TransferJob()
{
// This will cancel the handle, and who knows what that could do
if( d->loader )
{
d->loader->jobWillBeDeallocated();
}
delete d;
}
bool TransferJob::isErrorPage() const
{
return d->status != 0;
}
int TransferJob::error() const
{
return d->status;
}
void TransferJob::setError(int e)
{
d->status = e;
}
QString TransferJob::errorText() const
{
// LOG(NotYetImplemented, "not yet implemented");
return QString::null;
}
void TransferJob::assembleResponseHeaders() const
{
if( !d->response )
return;
if (!d->assembledResponseHeaders) {
TPtrC headerPtr = d->response->ResponseHeadersString();
if( headerPtr.Length() ) {
d->responseHeaders.SetBufferFromDes( headerPtr );
d->assembledResponseHeaders = true;
}
}
}
void TransferJob::retrieveCharset() const
{
if( !d->response )
return;
if (!d->retrievedCharset) {
TPtrC charset = d->response->Charset();
if (charset != KNullDesC) {
const_cast<TransferJob*>(this)->addMetaData(QString("charset"),QString::FromDes(charset));
}
d->retrievedCharset = true;
}
}
QString TransferJob::queryMetaData(const QString &key) const
{
if (key == "HTTP-Headers") {
assembleResponseHeaders();
return d->responseHeaders;
}
if (!d->metaData)
return QString::null;
if (key == "charset") {
// this will put it in the regular metadata dictionary
retrieveCharset();
}
QString* value = d->metaData->find( key );
return value ? *value : QString::null;
}
void TransferJob::addMetaData(const QString &key, const QString &value)
{
if( !d->metaData ){
d->metaData = new QDict<QString>();
d->metaData->setAutoDelete(true);
}
d->metaData->insert( key, new QString(value) );
}
void TransferJob::addMetaData(const QMap<QString, QString> &keysAndValues)
{
if( !d->metaData ){
d->metaData = new QDict<QString>();
d->metaData->setAutoDelete(true);
}
QMapConstIterator<QString, QString> it = keysAndValues.begin();
QMapConstIterator<QString, QString> end = keysAndValues.end();
while (it != end) {
d->metaData->insert(it.key(), new QString(it.data()));
++it;
}
}
void TransferJob::kill()
{
delete this;
}
void TransferJob::setLoader(KWQResourceLoader *loader)
{
delete d->loader;
d->loader = loader;
}
KURL TransferJob::url() const
{
return d->URL;
}
FormData TransferJob::postData() const
{
return d->postData;
}
QString TransferJob::method() const
{
return d->method;
}
void TransferJob::emitData(const char *data, int size)
{
m_data.call(this, data, size);
}
void TransferJob::emitRedirection(const KURL &url)
{
m_redirection.call(this, url);
}
void TransferJob::emitResult(const TDesC8& alldata)
{
OOM_CRITICAL_PATH_BEGIN( "TransferJob::emitResult", 0 )
m_result.call(this,alldata);
OOM_CRITICAL_PATH_END
}
void TransferJob::emitReceivedResponse(MWebCoreUrlResponseHeaderInfo *response)
{
d->assembledResponseHeaders = false;
if (response)
response->Ref();
if (d->response)
d->response->DeRef();
d->response = response;
m_receivedResponse.call(this, response);
}
} // namespace KIO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -