⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kwqkjobclasses.cpp

📁 手机浏览器源码程序,功能强大
💻 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 + -