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

📄 kwqslot.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 "KWQSlot.h"#include "KWQAssertions.h"#include "dom_docimpl.h"#include "khtml_part.h"#include "kjs_window.h"#include "render_form.h"#include "render_layer.h"#include "xmlhttprequest.h"using DOM::DocumentImpl;using khtml::CachedObject;using khtml::DocLoader;using khtml::Loader;using khtml::RenderCheckBox;using khtml::RenderFileButton;using khtml::RenderFormElement;using khtml::RenderLineEdit;using khtml::RenderSelect;#if !KWIQusing khtml::RenderSlider;#endifusing khtml::RenderTextArea;using khtml::RenderWidget;using khtml::RenderScrollMediator;using KIO::Job;using KJS::WindowQObject;using KJS::XMLHttpRequestQObject;enum FunctionNumber {    signalFinishedParsing,    slotChildCompleted,    slotChildCompletedWithBool,    slotChildStarted,    slotClicked,    slotFinishedParsing,    slotLoaderRequestDone,    slotLoaderRequestStarted,    slotParentCompleted,    slotParentDestroyed,    slotPerformSearch,    slotRedirect,    slotReturnPressed,    slotSelected,    slotSelectionChanged,#if !KWIQ    slotSliderValueChanged,#endif    slotStateChanged,    slotSubmitFormAgain,    slotTextChanged,    slotTextChangedWithString_RenderLineEdit,    slotTextChangedWithString_RenderFileButton,    slotValueChanged,    slotWidgetDestructed,    slotData_Loader,    slotData_XMLHttpRequest,    slotRedirection_KHTMLPart,    slotRedirection_XMLHttpRequest,    slotFinished_KHTMLPart,    slotFinished_Loader,    slotFinished_XMLHttpRequest,    slotReceivedResponse};KWQSlot::KWQSlot(QObject *object, const char *member){    #define CASE(function, parameters, type) \        if (KWQNamesMatch(member, "SLOT:" #function #parameters)) { \            ASSERT( QOBJECT_IS_A(object, type) ); \            m_function = function; \        } else        CASE(slotClicked, (), RenderFormElement)    CASE(slotChildCompleted, (), KHTMLPart)    CASE(slotChildStarted, (KIO::Job *), KHTMLPart)    CASE(slotFinishedParsing, (), KHTMLPart)    CASE(slotLoaderRequestDone, (khtml::DocLoader *, khtml::CachedObject *), KHTMLPart)    CASE(slotLoaderRequestStarted, (khtml::DocLoader *, khtml::CachedObject *), KHTMLPart)    CASE(slotParentCompleted, (), KHTMLPart)    CASE(slotPerformSearch, (), RenderLineEdit)    CASE(slotRedirect, (), KHTMLPart)    CASE(slotReturnPressed, (), RenderLineEdit)    CASE(slotSelected, (int), RenderSelect)    CASE(slotSelectionChanged, (), RenderSelect)#if !KWIQ    CASE(slotSliderValueChanged, (), RenderSlider)#endif    CASE(slotStateChanged, (int), RenderCheckBox)    CASE(slotTextChanged, (), RenderTextArea)    CASE(slotValueChanged, (int), RenderScrollMediator)    CASE(slotWidgetDestructed, (), RenderWidget)           #undef CASE    if (KWQNamesMatch(member, SIGNAL(finishedParsing()))) {        ASSERT(QOBJECT_IS_A(object, DocumentImpl));        m_function = signalFinishedParsing;    } else if (KWQNamesMatch(member, SLOT(slotChildCompleted(bool)))) {        ASSERT(QOBJECT_IS_A(object, KHTMLPart));        m_function = slotChildCompletedWithBool;    } else if (KWQNamesMatch(member, SLOT(parentDestroyed()))) {	ASSERT(QOBJECT_IS_A(object, WindowQObject));	m_function = slotParentDestroyed;    } else if (KWQNamesMatch(member, SLOT(submitFormAgain()))) {        ASSERT(QOBJECT_IS_A(object, KHTMLPart));        m_function = slotSubmitFormAgain;    } else if (KWQNamesMatch(member, SLOT(slotTextChanged(const QString &)))) {        ASSERT(QOBJECT_IS_A(object, RenderLineEdit) || QOBJECT_IS_A(object, RenderFileButton));	if (QOBJECT_IS_A(object, RenderLineEdit)) {	    m_function = slotTextChangedWithString_RenderLineEdit;	} else {	    m_function = slotTextChangedWithString_RenderFileButton;	}    } else if (KWQNamesMatch(member, SLOT(slotData(KIO::Job *, const char *, int)))) {	ASSERT(QOBJECT_IS_A(object, Loader) || QOBJECT_IS_A(object, XMLHttpRequestQObject));	if (QOBJECT_IS_A(object, Loader)) {	    m_function = slotData_Loader;	} else {	    m_function = slotData_XMLHttpRequest;	}    } else if (KWQNamesMatch(member, SLOT(slotRedirection(KIO::Job *, const KURL&)))) {	ASSERT(QOBJECT_IS_A(object, KHTMLPart ) || QOBJECT_IS_A(object, XMLHttpRequestQObject));	if (QOBJECT_IS_A(object, KHTMLPart )) {	    m_function = slotRedirection_KHTMLPart;	} else {	    m_function = slotRedirection_XMLHttpRequest;	}    } else if (KWQNamesMatch(member, SLOT(slotFinished(KIO::Job *)))) {	ASSERT(QOBJECT_IS_A(object, khtml::Loader) || QOBJECT_IS_A(object, KHTMLPart) || QOBJECT_IS_A(object, XMLHttpRequestQObject));	if (QOBJECT_IS_A(object, khtml::Loader)) {	    m_function = slotFinished_Loader;	} else if (QOBJECT_IS_A(object, KHTMLPart)) {	    m_function = slotFinished_KHTMLPart;	} else {	    m_function = slotFinished_XMLHttpRequest;	}    } else if (KWQNamesMatch(member, SLOT(slotReceivedResponse(KIO::Job *, KWIQResponse *)))) {	ASSERT(QOBJECT_IS_A(object, khtml::Loader));	m_function = slotReceivedResponse;    } else {        ERROR("trying to create a slot for unknown member %s", member);        return;    }        m_object = object;}    void KWQSlot::call() const{    if (m_object.isNull()) {        return;    }        #define CASE(member, type, function) \        case member: \            static_cast<type *>(m_object.pointer())->function(); \            return;        switch (m_function) {        CASE(signalFinishedParsing, DocumentImpl, m_finishedParsing.call)        CASE(slotChildCompleted, KHTMLPart, slotChildCompleted)        CASE(slotClicked, RenderFormElement, slotClicked)        CASE(slotFinishedParsing, KHTMLPart, slotFinishedParsing)        CASE(slotParentCompleted, KHTMLPart, slotParentCompleted)        CASE(slotParentDestroyed, WindowQObject, parentDestroyed)        CASE(slotPerformSearch, RenderLineEdit, slotPerformSearch)        CASE(slotRedirect, KHTMLPart, slotRedirect)        CASE(slotReturnPressed, RenderLineEdit, slotReturnPressed)        CASE(slotSelectionChanged, RenderSelect, slotSelectionChanged)#if 0        CASE(slotSliderValueChanged, RenderSlider, slotSliderValueChanged)#endif        CASE(slotSubmitFormAgain, KHTMLPart, submitFormAgain)        CASE(slotTextChanged, RenderTextArea, slotTextChanged)        CASE(slotWidgetDestructed, RenderWidget, slotWidgetDestructed)    }        #undef CASE}void KWQSlot::call(bool b) const{    if (m_object.isNull()) {        return;    }        #define CASE(member, type, function) \        case member: \            static_cast<type *>(m_object.pointer())->function(b); \            return;        switch (m_function) {        CASE(slotChildCompletedWithBool, KHTMLPart, slotChildCompleted)    }        #undef CASE        call();}void KWQSlot::call(int i) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotStateChanged:            static_cast<RenderCheckBox *>(m_object.pointer())->slotStateChanged(i);            return;        case slotSelected:            static_cast<RenderSelect *>(m_object.pointer())->slotSelected(i);            return;        case slotValueChanged:            static_cast<RenderScrollMediator *>(m_object.pointer())->slotValueChanged(i);            return;    }        call();}void KWQSlot::call(const QString &string) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotTextChangedWithString_RenderLineEdit:            static_cast<RenderLineEdit *>(m_object.pointer())->slotTextChanged(string);	    return;#if KWIQ //FIXME:KWIQ: FileButton code commented out        case slotTextChangedWithString_RenderFileButton:            static_cast<RenderFileButton *>(m_object.pointer())->slotTextChanged(string);            return;#endif	        }        call();}void KWQSlot::call(Job *job) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotChildStarted:            static_cast<KHTMLPart *>(m_object.pointer())->slotChildStarted(job);            return;        case slotFinished_KHTMLPart:            static_cast<KHTMLPart *>(m_object.pointer())->slotFinished(job);            return;        case slotFinished_Loader:            static_cast<Loader *>(m_object.pointer())->slotFinished(job);            return;        case slotFinished_XMLHttpRequest:            static_cast<XMLHttpRequestQObject *>(m_object.pointer())->slotFinished(job);            return;    }        call();}void KWQSlot::call(Job *job, const char *data, int size) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotData_Loader:	    static_cast<Loader *>(m_object.pointer())->slotData(job, data, size);	    return;        case slotData_XMLHttpRequest:	    static_cast<XMLHttpRequestQObject *>(m_object.pointer())->slotData(job, data, size);	    return;    }    call();}void KWQSlot::call(Job *job, const KURL &url) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotRedirection_KHTMLPart:	    static_cast<KHTMLPart *>(m_object.pointer())->slotRedirection(job, url);	    return;        case slotRedirection_XMLHttpRequest:	    static_cast<XMLHttpRequestQObject *>(m_object.pointer())->slotRedirection(job, url);	    return;    }    call();}#if  !KWIQvoid KWQSlot::call(KIO::Job *job, void *response) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotReceivedResponse:	    static_cast<Loader *>(m_object.pointer())->slotReceivedResponse(job, response);	    return;    }    call();}#elsevoid KWQSlot::call(KIO::Job *job, KWIQResponse *response) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotReceivedResponse:	    static_cast<Loader *>(m_object.pointer())->slotReceivedResponse(job, response);	    return;    }    call();}#endifvoid KWQSlot::call(DocLoader *loader, CachedObject *cachedObject) const{    if (m_object.isNull()) {        return;    }        switch (m_function) {        case slotLoaderRequestDone:            static_cast<KHTMLPart *>(m_object.pointer())->slotLoaderRequestDone(loader, cachedObject);            return;        case slotLoaderRequestStarted:            static_cast<KHTMLPart *>(m_object.pointer())->slotLoaderRequestStarted(loader, cachedObject);            return;    }        call();}bool operator==(const KWQSlot &a, const KWQSlot &b){    return a.m_object == b.m_object && (a.m_object == 0 || a.m_function == b.m_function);}bool KWQNamesMatch(const char *a, const char *b){    char ca = *a;    char cb = *b;        for (;;) {        while (ca == ' ') {            ca = *++a;        }        while (cb == ' ') {            cb = *++b;        }                if (ca != cb) {            return false;        }        if (ca == 0) {            return true;        }                ca = *++a;        cb = *++b;    }}

⌨️ 快捷键说明

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