00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#ifndef _XMLHTTPREQUEST_H_
00022
#define _XMLHTTPREQUEST_H_
00023
00024
#include "ecma/kjs_binding.h"
00025
#include "ecma/kjs_dom.h"
00026
#include "misc/decoder.h"
00027
#include "kio/jobclasses.h"
00028
00029
namespace KJS {
00030
00031
class JSEventListener;
00032
class XMLHttpRequestQObject;
00033
00034
00035
enum XMLHttpRequestState {
00036 Uninitialized = 0,
00037 Loading = 1,
00038 Loaded = 2,
00039 Interactive = 3,
00040 Completed = 4
00041 };
00042
00043
class XMLHttpRequestConstructorImp :
public ObjectImp {
00044
public:
00045 XMLHttpRequestConstructorImp(ExecState *exec,
const DOM::Document &d);
00046
virtual bool implementsConstruct() const;
00047 virtual Object construct(ExecState *exec, const List &args);
00048 private:
00049 DOM::
Document doc;
00050 };
00051
00052 class XMLHttpRequest : public
DOMObject {
00053
public:
00054 XMLHttpRequest(ExecState *,
const DOM::Document &d);
00055 ~XMLHttpRequest();
00056
virtual Value tryGet(ExecState *exec,
const Identifier &propertyName)
const;
00057 Value getValueProperty(ExecState *exec,
int token)
const;
00058
virtual void tryPut(ExecState *exec,
const Identifier &propertyName,
const Value& value,
int attr = None);
00059
void putValueProperty(ExecState *exec,
int token,
const Value& value,
int );
00060
virtual bool toBoolean(ExecState *)
const {
return true; }
00061
virtual const ClassInfo* classInfo()
const {
return &info; }
00062
static const ClassInfo info;
00063
enum { Onload, Onreadystatechange, ReadyState, ResponseText, ResponseXML, Status, StatusText, Abort,
00064 GetAllResponseHeaders, GetResponseHeader, Open, Send, SetRequestHeader };
00065
00066
private:
00067
friend class XMLHttpRequestProtoFunc;
00068
friend class XMLHttpRequestQObject;
00069
00070 Value getStatusText() const;
00071 Value getStatus() const;
00072
bool urlMatchesDocumentDomain(const
KURL&) const;
00073
00074 XMLHttpRequestQObject *qObject;
00075
00076 #ifdef APPLE_CHANGES
00077
void slotData( KIO::Job* job, const
char *data,
int size );
00078 #else
00079
void slotData( KIO::Job* job, const
QByteArray &data );
00080 #endif
00081
void slotFinished( KIO::Job* );
00082
void slotRedirection( KIO::Job*, const
KURL& );
00083
00084
void processSyncLoadResults(const
QByteArray &data, const KURL &finalURL, const
QString &headers);
00085
00086
void open(const
QString& _method, const KURL& _url,
bool _async);
00087
void send(const
QString& _body);
00088
void abort();
00089
void setRequestHeader(const
QString& name, const
QString &value);
00090 Value getAllResponseHeaders() const;
00091 Value getResponseHeader(const
QString& name) const;
00092
00093
void changeState(XMLHttpRequestState newState);
00094
00095
QGuardedPtr<DOM::DocumentImpl> doc;
00096
00097 KURL url;
00098
QString method;
00099
bool async;
00100
QString requestHeaders;
00101
QString contentType;
00102
00103 KIO::TransferJob * job;
00104
00105 XMLHttpRequestState state;
00106 JSEventListener *onReadyStateChangeListener;
00107 JSEventListener *onLoadListener;
00108
00109 khtml::Decoder *decoder;
00110
QString encoding;
00111
QString responseHeaders;
00112
00113
QString response;
00114 mutable
bool createdDocument;
00115 mutable
bool typeIsXML;
00116 mutable DOM::
Document responseXML;
00117
00118
bool aborted;
00119 };
00120
00121
00122 class XMLHttpRequestQObject : public
QObject {
00123 Q_OBJECT
00124
00125
public:
00126 XMLHttpRequestQObject(XMLHttpRequest *_jsObject);
00127
00128
public slots:
00129
void slotData(
KIO::Job* job,
const QByteArray &data );
00130
void slotFinished(
KIO::Job* job );
00131
void slotRedirection(
KIO::Job* job,
const KURL& url);
00132
00133
private:
00134 XMLHttpRequest *jsObject;
00135 };
00136
00137 }
00138
00139
#endif