/** * Copyright 2008 - 2015 The Loon Game Engine Authors * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * * @project loon * @author cping * @email:javachenpeng@yahoo.com * @version 0.5 */ package loon.html5.gwt.preloader; import loon.html5.gwt.GWTScriptLoader; import loon.html5.gwt.preloader.AssetFilter.AssetType; import com.google.gwt.dom.client.ImageElement; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.typedarrays.shared.Int8Array; import com.google.gwt.typedarrays.shared.TypedArrays; import com.google.gwt.xhr.client.ReadyStateChangeHandler; import com.google.gwt.xhr.client.XMLHttpRequest; import com.google.gwt.xhr.client.XMLHttpRequest.ResponseType; public class AssetDownloader extends IDownloader { public AssetDownloader() { super(); } @SuppressWarnings("unchecked") public void load(String url, AssetType type, String mimeType, AssetLoaderListener<?> listener) { switch (type) { case Text: loadText(url, (AssetLoaderListener<String>) listener); break; case Image: loadImage(url, mimeType, (AssetLoaderListener<ImageElement>) listener); break; case Binary: loadBinary(url, (AssetLoaderListener<Blob>) listener); break; case Audio: loadAudio(url, (AssetLoaderListener<Void>) listener); break; case Directory: listener.onSuccess(null); break; default: throw new RuntimeException("Unsupported asset type " + type); } } public void loadText(String url, final AssetLoaderListener<String> listener) { XMLHttpRequest request = XMLHttpRequest.create(); request.setOnReadyStateChange(new ReadyStateChangeHandler() { @Override public void onReadyStateChange(XMLHttpRequest xhr) { if (xhr.getReadyState() == XMLHttpRequest.DONE) { if (xhr.getStatus() != 200) { listener.onFailure(); } else { listener.onSuccess(xhr.getResponseText()); } } } }); setOnProgress(request, listener); request.open("GET", url); request.setRequestHeader("Content-Type", "text/plain; charset=utf-8"); request.send(); } public void loadBinary(final String url, final AssetLoaderListener<Blob> listener) { XMLHttpRequest request = XMLHttpRequest.create(); request.setOnReadyStateChange(new ReadyStateChangeHandler() { @Override public void onReadyStateChange(XMLHttpRequest xhr) { if (xhr.getReadyState() == XMLHttpRequest.DONE) { if (xhr.getStatus() != 200) { listener.onFailure(); } else { Int8Array data = TypedArrays.createInt8Array(xhr .getResponseArrayBuffer()); listener.onSuccess(new Blob(data)); } } } }); setOnProgress(request, listener); request.open("GET", url); request.setResponseType(ResponseType.ArrayBuffer); request.send(); } public void loadAudio(String url, final AssetLoaderListener<Void> listener) { if (useBrowserCache) { loadBinary(url, new AssetLoaderListener<Blob>() { @Override public void onProgress(double amount) { listener.onProgress(amount); } @Override public void onFailure() { listener.onFailure(); } @Override public void onSuccess(Blob result) { listener.onSuccess(null); } }); } else { listener.onSuccess(null); } } public void loadImage(final String url, final String mimeType, final AssetLoaderListener<ImageElement> listener) { loadImage(url, mimeType, null, listener); } public void loadImage(final String url, final String mimeType, final String crossOrigin, final AssetLoaderListener<ImageElement> listener) { if (useBrowserCache || useInlineBase64) { loadBinary(url, new AssetLoaderListener<Blob>() { @Override public void onProgress(double amount) { listener.onProgress(amount); } @Override public void onFailure() { listener.onFailure(); } @Override public void onSuccess(Blob result) { final ImageElement image = createImage(); if (null != crossOrigin) { GWTScriptLoader.setCrossOrigin(image, "crossOrigin"); } hookImgListener(image, new ImgEventListener() { @Override public void onEvent(NativeEvent event) { if (event.getType().equals("error")) { listener.onFailure(); } else { listener.onSuccess(image); } } }); if (isUseInlineBase64()) { image.setSrc("data:" + mimeType + ";base64," + result.toBase64()); } else { image.setSrc(url); } } }); } else { final ImageElement image = createImage(); if (null != crossOrigin) { GWTScriptLoader.setCrossOrigin(image, "crossOrigin"); } hookImgListener(image, new ImgEventListener() { @Override public void onEvent(NativeEvent event) { if (event.getType().equals("error")) { listener.onFailure(); } else { listener.onSuccess(image); } } }); image.setSrc(url); } } @Override public void clear() { // noop } }