-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFlashFileDownloader.as
146 lines (127 loc) · 4.72 KB
/
FlashFileDownloader.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.ui.Mouse;
import flash.utils.Timer;
import flash.utils.ByteArray;
import flash.net.FileReference;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
public class FlashFileDownloader extends Sprite {
private var fileLoader:URLLoader = new URLLoader();
private var imageLoader:Loader = new Loader();
private var fileReference:FileReference = new FileReference();
private var stageFiller:Sprite;
private var jsProgressHandler:String;
private var jsSuccessHandler:String;
private var jsFailureHandler:String;
private var lastProgressBytes:Number = -1;
private var fileName:String = "bitparcel-download";
public function FlashFileDownloader() {
configureExternalInterface();
}
private function configureExternalInterface():void {
if (ExternalInterface.available) {
try {
trace("Adding callbacks...\n");
ExternalInterface.addCallback("download", download);
ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript);
ExternalInterface.addCallback("addCallback", addCallback);
if (checkJavaScriptReady()) {
trace("JavaScript is ready.\n");
} else {
trace("JavaScript is not ready, creating timer.\n");
var readyTimer:Timer = new Timer(100, 0);
readyTimer.addEventListener(TimerEvent.TIMER, timerHandler);
readyTimer.start();
}
} catch (error:SecurityError) {
trace("A SecurityError occurred: " + error.message + "\n");
} catch (error:Error) {
trace("An Error occurred: " + error.message + "\n");
}
} else {
trace("External interface is not available for this container.");
}
}
private function timerHandler(event:TimerEvent):void {
trace("Checking JavaScript status...\n");
var isReady:Boolean = checkJavaScriptReady();
trace(isReady);
if (isReady) {
trace("JavaScript is ready.");
Timer(event.target).stop();
}
}
private function checkJavaScriptReady():Boolean {
var isReady:Boolean = ExternalInterface.call("FileDownloader_isJavaScriptReady");
return isReady;
}
private function receivedFromJavaScript(value:String):void {
trace("JavaScript says: " + value);
}
private function download(url:String):void {
// Save the filename for when the user downloads the file
var url_split:Array = url.split('/');
fileName = url_split[url_split.length - 1];
var fileData:ByteArray= new ByteArray();
fileLoader.dataFormat = URLLoaderDataFormat.BINARY;
fileLoader.addEventListener(Event.COMPLETE, completeHandler);
fileLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
fileLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
fileLoader.load(new URLRequest(url));
}
/*
* Call out to JavaScript and execute jsEventHandler when the given
* event occurs. Event can be:
* - success
* - failure
* - progrss
*/
private function addCallback(event:String, jsEventHandler:String):void {
trace("Setting JS handler for event: " + event + "to: " + jsEventHandler);
if (event == "success") {
jsSuccessHandler = jsEventHandler;
} else if (event == "failure") {
jsFailureHandler = jsEventHandler;
} else if (event == "progress") {
jsProgressHandler = jsEventHandler;
}
}
private function progressHandler(event:ProgressEvent):void {
// Don't throw do anything on duplicate event (we get the progress
// event twice for each downloaded packet/buffer).
if (lastProgressBytes >= event.bytesLoaded) {
return;
}
lastProgressBytes = event.bytesLoaded;
ExternalInterface.call(jsProgressHandler, event);
trace("progressHandler: bytesLoaded=" + event.bytesLoaded + " bytesTotal=" + event.bytesTotal);
}
private function ioErrorHandler(event:IOErrorEvent):void {
ExternalInterface.call(jsFailureHandler, event);
trace("ioErrorHandler: " + event);
}
private function completeHandler(event:Event):void {
ExternalInterface.call(jsSuccessHandler, event);
trace("completeHandler: " + event);
showSaveElement();
}
private function showSaveElement():void {
stage.addEventListener(MouseEvent.CLICK, function():void {
fileReference.save(fileLoader.data, fileName)
});
// Need a sprite overlay to set cursor
var stageFiller:Sprite = new Sprite();
stageFiller.graphics.beginFill(0xFFFFFF, 0.0);
stageFiller.graphics.drawCircle(0,0,4000);
stageFiller.graphics.endFill();
stageFiller.buttonMode = true;
stageFiller.useHandCursor = true;
addChild(stageFiller);
}
}
}