UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

253 lines (227 loc) 9.16 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * 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. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "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 EGRET AND 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. // ////////////////////////////////////////////////////////////////////////////////////// namespace egret.native { /** * @private */ export class NativeHttpRequest extends EventDispatcher implements HttpRequest { /** * @private */ public constructor() { super(); } private _response:string; /** * @private * 本次请求返回的数据,数据类型根据responseType设置的值确定。 */ public get response():any { return this._response; } /** * @private */ private _responseType:string; /** * @private * 设置返回的数据格式,请使用 HttpResponseType 里定义的枚举值。设置非法的值或不设置,都将使用HttpResponseType.TEXT。 */ public get responseType():string { return this._responseType; } public set responseType(value:string) { this._responseType = value; } /** * @private */ private _withCredentials:boolean; /** * @private * 表明在进行跨站(cross-site)的访问控制(Access-Control)请求时,是否使用认证信息(例如cookie或授权的header)。 默认为 false。(这个标志不会影响同站的请求) */ public get withCredentials():boolean { return this._withCredentials; } public set withCredentials(value:boolean) { this._withCredentials = value; } /** * @private */ private _url:string = ""; private _method:string = ""; /** * @private * 初始化一个请求.注意,若在已经发出请求的对象上调用此方法,相当于立即调用abort(). * @param url 该请求所要访问的URL该请求所要访问的URL * @param method 请求所使用的HTTP方法, 请使用 HttpMethod 定义的枚举值. */ public open(url:string, method:string = "GET"):void { this._url = url; this._method = method; } /** * @private */ private urlData:any = {}; /** * @private * 发送请求. * @param data 需要发送的数据 */ public send(data?:any):void { let self = this; if (self.isNetUrl(self._url)) {//网络请求 self.urlData.type = self._method; //写入POST数据 if (self._method == HttpMethod.POST && data) { if(data instanceof ArrayBuffer) { self.urlData.data = data; } else { self.urlData.data = data.toString(); } } else { delete self.urlData["data"]; } if (self._responseType == HttpResponseType.ARRAY_BUFFER) { self.urlData.binary = true; } else { self.urlData.header = false; } //写入header信息 if (this.headerObj) { self.urlData.header = JSON.stringify(this.headerObj); } else { delete self.urlData.header; } let promise = PromiseObject.create(); promise.onSuccessFunc = function (getted_str) { self._response = getted_str; $callAsync(egret.Event.dispatchEvent, egret.Event, self, egret.Event.COMPLETE); }; promise.onErrorFunc = function (error_code) { $warn(1019, error_code); Event.dispatchEvent(self, IOErrorEvent.IO_ERROR); }; promise.onResponseHeaderFunc = this.onResponseHeader; promise.onResponseHeaderThisObject = this; egret_native.requireHttp(self._url, self.urlData, promise); } else if (!egret_native.isFileExists(self._url)) { download(); } else { readFileAsync(); } function readFileAsync() { let promise = new egret.PromiseObject(); promise.onSuccessFunc = function (content) { self._response = content; Event.dispatchEvent(self, Event.COMPLETE); }; promise.onErrorFunc = function () { Event.dispatchEvent(self, IOErrorEvent.IO_ERROR); }; if (self._responseType == HttpResponseType.ARRAY_BUFFER) { egret_native.readFileAsync(self._url, promise, "ArrayBuffer"); } else { egret_native.readFileAsync(self._url, promise); } } function download() { let promise = PromiseObject.create(); promise.onSuccessFunc = readFileAsync; promise.onErrorFunc = function () { Event.dispatchEvent(self, IOErrorEvent.IO_ERROR); }; promise.onResponseHeaderFunc = this.onResponseHeader; promise.onResponseHeaderThisObject = this; egret_native.download(self._url, self._url, promise); } } /** * 是否是网络地址 * @param url * @returns {boolean} */ private isNetUrl(url:string):boolean { return url.indexOf("http://") != -1 || url.indexOf("HTTP://") != -1 || url.indexOf("https://") != -1 || url.indexOf("HTTPS://") != -1; } /** * @private * 如果请求已经被发送,则立刻中止请求. */ public abort():void { } private responseHeader:string = ""; private onResponseHeader(headers:string):void { this.responseHeader = ""; let obj = JSON.parse(headers); for(let key in obj) { this.responseHeader += key + ": " + obj[key] + "\r\n"; } } /** * @private * 返回所有响应头信息(响应头名和值), 如果响应头还没接受,则返回"". */ public getAllResponseHeaders():string { return this.responseHeader; } private headerObj:any; /** * @private * 给指定的HTTP请求头赋值.在这之前,您必须确认已经调用 open() 方法打开了一个url. * @param header 将要被赋值的请求头名称. * @param value 给指定的请求头赋的值. */ public setRequestHeader(header:string, value:string):void { if(!this.headerObj) { this.headerObj = {}; } this.headerObj[header] = value; } /** * @private * 返回指定的响应头的值, 如果响应头还没被接受,或该响应头不存在,则返回"". * @param header 要返回的响应头名称 */ public getResponseHeader(header:string):string { return ""; } } HttpRequest = NativeHttpRequest; }