//////////////////////////////////////////////////////////////////////////////// | |
// | |
// Licensed to the Apache Software Foundation (ASF) under one or more | |
// contributor license agreements. See the NOTICE file distributed with | |
// this work for additional information regarding copyright ownership. | |
// The ASF licenses this file to You 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. | |
// | |
//////////////////////////////////////////////////////////////////////////////// | |
// Original component created by Dan Florio (http://www.polygeek.com), and donated | |
// via Nick Kwiatkowski (quetwo) to the Apache Flex Project | |
//////////////////////////////////////////////////////////////////////////////// | |
package org.apache.components | |
{ | |
import flash.display.Bitmap; | |
import flash.display.Loader; | |
import flash.events.Event; | |
import flash.events.IOErrorEvent; | |
import flash.filesystem.File; | |
import flash.filesystem.FileMode; | |
import flash.filesystem.FileStream; | |
import flash.net.URLLoader; | |
import flash.net.URLLoaderDataFormat; | |
import flash.net.URLRequest; | |
import flash.system.Capabilities; | |
import flash.utils.ByteArray; | |
import spark.primitives.BitmapImage; | |
public class ImageGate extends BitmapImage | |
{ | |
private var _urlRequest:URLRequest; | |
private var _urlLoader:URLLoader; | |
private var _loader:Loader; | |
private var _fileStream:FileStream; | |
private var _url:String; | |
private var _filename:String; | |
private var _file:File; | |
private var _assetURL:String; | |
private var _assetURL160:String; | |
private var _assetURL240:String; | |
private var _assetURL320:String; | |
private var _localFolder:String; | |
public function ImageGate() | |
{ | |
super(); | |
} | |
private function findImage():void | |
{ | |
/** | |
* The _localFolder must be set in order to proceed. | |
*/ | |
if (_localFolder == null) | |
{ | |
return; | |
} | |
var gotAllMultiScreenURLs:Boolean = false; | |
if (_assetURL160 != null | |
&& _assetURL240 != null | |
&& _assetURL320 != null) | |
{ | |
gotAllMultiScreenURLs = true; | |
} | |
/** | |
* If we don't have either of the _assetURL or all of the | |
* multi-screen URLs then we can not proceed. | |
*/ | |
if (_assetURL == null && !gotAllMultiScreenURLs) | |
{ | |
return | |
} | |
if (_assetURL == '') | |
{ | |
return | |
} | |
/** | |
* Check to see what the _url is going to be for this particular image. | |
* -If _assetURL != null then use that url. | |
* -Otherwise find the correct _url based on the current screen resolution. | |
*/ | |
if (_assetURL != null) | |
{ | |
_url = _assetURL; | |
} | |
else if (Capabilities.screenDPI >= 280) | |
{ | |
_url = _assetURL320 | |
} | |
else if (Capabilities.screenDPI >= 200) | |
{ | |
_url = _assetURL240 | |
} | |
else | |
{ | |
_url = _assetURL160 | |
} | |
_filename = _url.substring(_url.lastIndexOf('/') + 1); | |
if (Capabilities.os.toLowerCase().indexOf('iphone') != -1 || Capabilities.os.toLowerCase().indexOf('ipad') != -1 || Capabilities.os.toLowerCase().indexOf('ipod') != -1) | |
{ | |
// Store the downloaded files in the Cache directory on iOS devices only. This is to comply with the | |
// new AppStore guidelines that are in effect as of iOS 5.1 | |
_file = new File(File.applicationDirectory.nativePath + "/\.\./Library/Caches").resolvePath(_localFolder + '/' + _filename); | |
} | |
else | |
{ | |
// Store the downloaded files in the applicationStorage Directory. | |
_file = File.applicationStorageDirectory.resolvePath(_localFolder + '/' + _filename); | |
} | |
if (_file.exists) | |
{ | |
var byteArray:ByteArray = new ByteArray(); | |
_fileStream = new FileStream(); | |
_fileStream.open(_file, FileMode.READ); | |
_fileStream.readBytes(byteArray); | |
_fileStream.close(); | |
_fileStream = null; | |
_file = null; | |
_loader = new Loader(); | |
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); | |
_loader.loadBytes(byteArray); | |
} | |
else | |
{ | |
downloadRemoteFile(); | |
} | |
} | |
private function onBytesLoaded(e:Event):void | |
{ | |
this.source = new Bitmap(e.target.content.bitmapData); | |
_loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onBytesLoaded); | |
// Cleanup | |
_loader = null; | |
_filename = null; | |
} | |
private function downloadRemoteFile():void | |
{ | |
_urlLoader = new URLLoader(); | |
_urlRequest = new URLRequest(_url); | |
_urlLoader.dataFormat = URLLoaderDataFormat.BINARY; | |
_urlLoader.addEventListener(Event.COMPLETE, onDownloadComplete); | |
_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOerror); | |
_urlLoader.load(_urlRequest); | |
} | |
private function onDownloadComplete(e:Event):void | |
{ | |
var byteArray:ByteArray = _urlLoader.data; | |
_fileStream = new FileStream(); | |
_fileStream.open(_file, FileMode.WRITE); | |
_fileStream.writeBytes(byteArray, 0, byteArray.length); | |
_fileStream.close(); | |
_loader = new Loader(); | |
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesLoaded); | |
_loader.loadBytes(byteArray); | |
// Cleanup | |
_urlLoader.close(); | |
_urlLoader = null; | |
_fileStream = null; | |
_urlRequest = null; | |
_url = null; | |
} | |
private function onIOerror(e:IOErrorEvent):void | |
{ | |
trace("image download error : " + _url + " : " + _filename); | |
// Cleanup | |
_urlLoader.close(); | |
_urlLoader = null; | |
_fileStream = null; | |
_filename = null; | |
} | |
/* ************************************************************ | |
* Setters | |
* ************************************************************ */ | |
public function set assetURL(value:String):void | |
{ | |
if (_assetURL == value) | |
{ | |
return; | |
} | |
_assetURL = value; | |
findImage(); | |
} | |
public function set localFolder(value:String):void | |
{ | |
if (_localFolder == value) | |
{ | |
return; | |
} | |
_localFolder = value; | |
findImage(); | |
} | |
public function set assetURL160(value:String):void | |
{ | |
if (_assetURL160 == value) | |
{ | |
return; | |
} | |
_assetURL160 = value; | |
findImage(); | |
} | |
public function set assetURL240(value:String):void | |
{ | |
if (_assetURL240 == value) | |
{ | |
return; | |
} | |
_assetURL240 = value; | |
findImage(); | |
} | |
public function set assetURL320(value:String):void | |
{ | |
if (_assetURL320 == value) | |
{ | |
return; | |
} | |
_assetURL320 = value; | |
findImage(); | |
} | |
/* ************************************************************ | |
* Getters | |
* ************************************************************ */ | |
public function get assetURL():String | |
{ | |
return _assetURL; | |
} | |
public function get localFolder():String | |
{ | |
return _localFolder; | |
} | |
public function get assetURL160():String | |
{ | |
return _assetURL160; | |
} | |
public function get assetURL240():String | |
{ | |
return _assetURL240; | |
} | |
public function get assetURL320():String | |
{ | |
return _assetURL320; | |
} | |
} | |
} |