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

📄 kwqloader.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
/* * Copyright (C) 2003 Apple Computer, 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 "KWQLoader.h"#include "KWQKJobClasses.h"#include "KWQLogging.h"#include "KWQResourceLoader.h"#include "KWQFoundationExtras.h"#include "WebCoreBridge.h"#include "khtml_part.h"#include "loader.h"#include "KWIQResponse.h"using khtml::Cache;using khtml::CachedObject;using khtml::CachedImage;using khtml::DocLoader;using khtml::Loader;using khtml::Request;using KIO::TransferJob;bool KWQServeRequest(Loader *loader, Request *request, TransferJob *job){    LOG(Loading, "Serving request for base %s, url %s",         request->m_docLoader->part()->baseURL().url().latin1(),        request->object->url().string().latin1());    return KWQServeRequest(loader, request->m_docLoader, job);}extern "C"{void headers_value_key_destroy(gpointer data){    gchar *c = static_cast<gchar *>(data);    g_free(c);}}bool KWQServeRequest(Loader *loader, DocLoader *docLoader, TransferJob *job){    KWQKHTMLPart *part = static_cast<KWQKHTMLPart *>(docLoader->part());    WebCoreBridge *bridge = part->bridge();    part->didTellBridgeAboutLoad(job->url().url());        KWQResourceLoader *resourceLoader = new KWQResourceLoader(job);        GHashTable *headers = 0;     QString headerString = job->queryMetaData("customHTTPHeader");        if (!headerString.isEmpty()) {	headers = g_hash_table_new_full(g_str_hash, g_str_equal,					headers_value_key_destroy,					headers_value_key_destroy);	QStringList l = QStringList::split(QString("\n"), headerString);	QValueList<QString>::Iterator it = l.begin();	QValueList<QString>::Iterator end = l.end();	QString str, key, value;	int pos;	while (it != end) {	    str = (*it);	    pos = str.find(":");	    if (pos != -1) {		key = str.left(pos).stripWhiteSpace();		value = str.right(pos+1).stripWhiteSpace();		g_hash_table_insert(headers, g_strdup(key.utf8()), g_strdup(value.utf8()));	    }	    ++it;	}    }    WebCoreResourceHandle *handle;    if (job->method() == "POST") {	GByteArray* postData = 0;	        const int size = job->postData().size();	if (size) {	    GByteArray* postData = g_byte_array_sized_new(size);	    g_byte_array_append(postData, reinterpret_cast<guint8 *>(g_strdup(job->postData().data())), size);	}	handle = bridge->startLoadingResource(resourceLoader,					      job->url().url().utf8(),					      headers,					      postData);	if (postData)	    g_byte_array_free(postData, true);    } else {	handle = bridge->startLoadingResource(resourceLoader,					      job->url().url().utf8(),					      headers );    }    if (headers) g_hash_table_destroy(headers);        resourceLoader->setHandle(handle);       return handle != 0;    }QByteArray KWQServeSynchronousRequest(Loader *loader, DocLoader *docLoader, TransferJob *job, KURL &finalURL, QString &responseHeaders){#if 0    KWQKHTMLPart *part = static_cast<KWQKHTMLPart *>(docLoader->part());    WebCoreBridge *bridge = part->bridge();    part->didTellBridgeAboutLoad(job->url().url());    NSDictionary *headerDict = nil;    QString headerString = job->queryMetaData("customHTTPHeader");    if (!headerString.isEmpty()) {	headerDict = [[NSDictionary alloc] _webcore_initWithHeaderString:headerString.getNSString()];    }    NSData *postData = nil;        if (job->method() == "POST") {	postData = [NSData dataWithBytesNoCopy:job->postData().data() length:job->postData().size() freeWhenDone:NO];    }    KURL returnedFinalURL;    QDict<String> responseHeaderDict;    int statusCode = 0;    QByteArray resultData = bridge->syncLoadResourceWithURL(job->url().url(), headerDict, job->postData(),							 &returnedFinalURL,							 &responseHeaderDict,							 &statusCode);        job->kill();    finalURL = returnedFinalURL;    responseHeaders = KWQHeaderStringFromDictionary(responseHeaderDict, statusCode);    QByteArray results(resultData->length());    memcpy( results.data(), resultData->bytes(), resultData->length() );    return results;#endif    return QByteArray();}int KWQNumberOfPendingOrLoadingRequests(khtml::DocLoader *dl){    return Cache::loader()->numRequests(dl);}bool KWQCheckIfReloading(DocLoader *loader){    return static_cast<KWQKHTMLPart *>(loader->part())->bridge()->isReloading();}void KWQCheckCacheObjectStatus(DocLoader *loader, CachedObject *cachedObject){    // Return from the function for objects that we didn't load from the cache.    if (!cachedObject)        return;    switch (cachedObject->status()) {    case CachedObject::Persistent:    case CachedObject::Cached:    case CachedObject::Uncacheable:        break;    case CachedObject::NotCached:    case CachedObject::Unknown:    case CachedObject::New:    case CachedObject::Pending:        return;    }        ASSERT(cachedObject->response());        // Notify the caller that we "loaded".    KWQKHTMLPart *part = static_cast<KWQKHTMLPart *>(loader->part());    QString urlString = cachedObject->url().string();    if (!part->haveToldBridgeAboutLoad(urlString)) {	WebCoreBridge *bridge = part->bridge();	// FIXME: KWIQ: Apple has here cachedimage specific code, which	// uses dynamic cast to get cachedImage->dataSize() instead of	// cachedObject->size() 	// why is that?	bridge->objectLoadedFromCacheWithURL(cachedObject->url().string().utf8(),					     cachedObject->response(),					     cachedObject->size());	part->didTellBridgeAboutLoad(urlString);	    }	}void KWQRetainResponse(KWIQResponse *r){    KWQRetain(r);}void KWQReleaseResponse(KWIQResponse *r){    KWQRelease(r);}QString KWQResponseMIMEType(KWIQResponse *r){    return QString();    ASSERT(r);    return r->getMimeType();}QString KWQResponseHeaderString(KWIQResponse *r){    return 0;    ASSERT(r);        return r->headers();}time_t KWQCacheObjectExpiresTime(khtml::DocLoader *docLoader, KWIQResponse *response){    return response->expiresTime();}KWQLoader::KWQLoader(Loader *loader)    : _requestStarted(loader,SIGNAL(requestStarted(khtml::DocLoader *, khtml::CachedObject *)))    , _requestDone(loader, SIGNAL(requestDone(khtml::DocLoader *, khtml::CachedObject *)))    , _requestFailed(loader, SIGNAL(requestFailed(khtml::DocLoader *, khtml::CachedObject *))){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -