UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

514 lines (402 loc) 11.6 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Andreas Ecker (ecker) ************************************************************************ */ /** * Abstract for all transport implementations */ qx.Class.define("qx.io.remote.transport.Abstract", { type : "abstract", extend : qx.core.Object, /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ construct : function() { this.base(arguments); this.setRequestHeaders({}); this.setParameters({}); this.setFormFields({}); }, /* ***************************************************************************** EVENTS ***************************************************************************** */ events : { /** Event when a request is created */ "created" : "qx.event.type.Event", /** Event when a request is configured */ "configured" : "qx.event.type.Event", /** Event when a request is send */ "sending" : "qx.event.type.Event", /** Event when a request is received */ "receiving" : "qx.event.type.Event", /** Event when a request is completed */ "completed" : "qx.event.type.Event", /** Event when a request is aborted */ "aborted" : "qx.event.type.Event", /** Event when a request has failed */ "failed" : "qx.event.type.Event", /** Event when a request has timed out */ "timeout" : "qx.event.type.Event" }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { /** Target url to issue the request to */ url : { check : "String", nullable : true }, /** Determines what type of request to issue */ method : { check : "String", nullable : true, init : "GET" }, /** Set the request to asynchronous */ asynchronous : { check : "Boolean", nullable : true, init : true }, /** Set the data to be sent via this request */ data : { check : "String", nullable : true }, /** Username to use for HTTP authentication */ username : { check : "String", nullable : true }, /** Password to use for HTTP authentication */ password : { check : "String", nullable : true }, /** The state of the current request */ state : { check : [ "created", "configured", "sending", "receiving", "completed", "aborted", "timeout", "failed" ], init : "created", event : "changeState", apply : "_applyState" }, /** Request headers */ requestHeaders : { check : "Object", nullable : true }, /** Request parameters to send. */ parameters : { check : "Object", nullable : true }, /** Request form fields to send. */ formFields : { check : "Object", nullable : true }, /** Response Type */ responseType : { check : "String", nullable : true }, /** Use Basic HTTP Authentication */ useBasicHttpAuth : { check : "Boolean", nullable : true } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { /* --------------------------------------------------------------------------- USER METHODS --------------------------------------------------------------------------- */ /** * Sending a request. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @throws {Error} the abstract function warning. */ send : function() { throw new Error("send is abstract"); }, /** * Force the transport into the aborted state ("aborted"). * * Listeners of the "aborted" signal are notified about the event. * */ abort : function() { if (qx.core.Environment.get("qx.debug")) { if (qx.core.Environment.get("qx.debug.io.remote")) { this.warn("Aborting..."); } } this.setState("aborted"); }, /** * Force the transport into the timeout state ("timeout"). * * Listeners of the "timeout" signal are notified about the event. * */ timeout : function() { if (qx.core.Environment.get("qx.debug")) { if (qx.core.Environment.get("qx.debug.io.remote")) { this.warn("Timeout..."); } } this.setState("timeout"); }, /** * Force the transport into the failed state ("failed"). * * Listeners of the "failed" signal are notified about the event. * */ failed : function() { if (qx.core.Environment.get("qx.debug")) { if (qx.core.Environment.get("qx.debug.io.remote")) { this.warn("Failed..."); } } this.setState("failed"); }, /* --------------------------------------------------------------------------- REQUEST HEADER SUPPORT --------------------------------------------------------------------------- */ /** * Add a request header to this transports qx.io.remote.Request. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @param vLabel {String} Request header name * @param vValue {var} Value for the header * @throws {Error} the abstract function warning. */ setRequestHeader : function(vLabel, vValue) { throw new Error("setRequestHeader is abstract"); }, /* --------------------------------------------------------------------------- RESPONSE HEADER SUPPORT --------------------------------------------------------------------------- */ /** * Returns the request header of the request. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @param vLabel {String} Response header name * @return {Object} * @throws {Error} the abstract function warning. */ getResponseHeader : function(vLabel) { throw new Error("getResponseHeader is abstract"); }, /** * Provides an hash of all response headers. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {Object} * @throws {Error} the abstract function warning. */ getResponseHeaders : function() { throw new Error("getResponseHeaders is abstract"); }, /* --------------------------------------------------------------------------- STATUS SUPPORT --------------------------------------------------------------------------- */ /** * Returns the current status code of the request if available or -1 if not. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {Integer} * @throws {Error} the abstract function warning. */ getStatusCode : function() { throw new Error("getStatusCode is abstract"); }, /** * Provides the status text for the current request if available and null otherwise. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {String} * @throws {Error} the abstract function warning. */ getStatusText : function() { throw new Error("getStatusText is abstract"); }, /* --------------------------------------------------------------------------- RESPONSE DATA SUPPORT --------------------------------------------------------------------------- */ /** * Provides the response text from the request when available and null otherwise. * By passing true as the "partial" parameter of this method, incomplete data will * be made available to the caller. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {String} * @throws {Error} the abstract function warning. */ getResponseText : function() { throw new Error("getResponseText is abstract"); }, /** * Provides the XML provided by the response if any and null otherwise. * By passing true as the "partial" parameter of this method, incomplete data will * be made available to the caller. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {Object} * @throws {Error} the abstract function warning. */ getResponseXml : function() { throw new Error("getResponseXml is abstract"); }, /** * Returns the length of the content as fetched thus far. * * This method is virtual and concrete subclasses are supposed to * implement it. * * @abstract * @return {Integer} * @throws {Error} the abstract function warning. */ getFetchedLength : function() { throw new Error("getFetchedLength is abstract"); }, /* --------------------------------------------------------------------------- APPLY ROUTINES --------------------------------------------------------------------------- */ /** * Apply method for "state" property. For each state value a corresponding * event is fired to inform the listeners. * * @param value {var} Current value * @param old {var} Previous value */ _applyState : function(value, old) { if (qx.core.Environment.get("qx.debug")) { if (qx.core.Environment.get("qx.debug.io.remote")) { this.debug("State: " + value); } } switch(value) { case "created": this.fireEvent("created"); break; case "configured": this.fireEvent("configured"); break; case "sending": this.fireEvent("sending"); break; case "receiving": this.fireEvent("receiving"); break; case "completed": this.fireEvent("completed"); break; case "aborted": this.fireEvent("aborted"); break; case "failed": this.fireEvent("failed"); break; case "timeout": this.fireEvent("timeout"); break; } return true; } }, /* ***************************************************************************** DESTRUCTOR ***************************************************************************** */ destruct : function() { this.setRequestHeaders(null); this.setParameters(null); this.setFormFields(null); } });