package com.adobe.air.net
{
import com.adobe.crypto.MD5;
import com.adobe.net.DynamicURLLoader;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IOErrorEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import com.adobe.air.net.events.ResourceCacheEvent;
public class ResourceCache extends EventDispatcher
{
private var _cacheName:String;
public function ResourceCache(cacheName:String)
{
_cacheName = cacheName;
}
public function get cacheName():String
{
return _cacheName;
}
private function getStorageDir():File
{
return File.applicationStorageDirectory.resolvePath(_cacheName);
}
public function itemExists(key:String):Boolean
{
return getItemFile(key).exists;
}
public function clearCache():void
{
var cacheDir:File = getStorageDir();
try
{
cacheDir.deleteDirectory(true);
}
catch (e:IOErrorEvent)
{
}
}
public function getItemFile(key:String):File
{
var dir:File = getStorageDir();
var fName:String = generateKeyHash(key);
var file:File = dir.resolvePath(fName);
return file;
}
public function retrieve(url:String):void
{
var key:String = generateKeyHash(url);
var file:File = getItemFile(key);
if(file.exists)
{
var e:ResourceCacheEvent = new ResourceCacheEvent(ResourceCacheEvent.ITEM_READY);
e.key = key;
e.file = file;
dispatchEvent(e);
return;
}
var loader:DynamicURLLoader = new DynamicURLLoader();
loader.file = file;
loader.key = key;
loader.addEventListener(Event.COMPLETE, onDataLoad);
loader.addEventListener(IOErrorEvent.IO_ERROR, onLoadError);
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(new URLRequest(url));
}
private function onLoadError(event:IOErrorEvent):void
{
trace("onLoadError : could not cache item");
}
private function onDataLoad(event:Event):void
{
var loader:DynamicURLLoader = DynamicURLLoader(event.target);
var f:File = File(loader.file);
var key:String = String(loader.key);
var fileStream:FileStream = new FileStream();
fileStream.open(f, FileMode.WRITE);
fileStream.writeBytes(loader.data as ByteArray);
fileStream.close();
var g:ResourceCacheEvent = new ResourceCacheEvent(ResourceCacheEvent.ITEM_CACHED);
g.key = key;
g.file = f;
dispatchEvent(g);
var e:ResourceCacheEvent = new ResourceCacheEvent(ResourceCacheEvent.ITEM_READY);
e.key = key;
e.file = f;
dispatchEvent(e);
}
private function generateKeyHash(key:String):String
{
return MD5.hash(key);
}
}
}