Skip to content

Commit 7f73018

Browse files
committed
Fixed file blocks and added a go to url block
1 parent 6725f33 commit 7f73018

File tree

2 files changed

+132
-45
lines changed

2 files changed

+132
-45
lines changed

src/Specs.as

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,15 @@ public class Specs {
435435
// --HTTP--
436436
["%m.httpMethod %s", " ", 13, "httpBlock:", "GET", "https://api.scratch.mit.edu"],
437437
["http return", "r", 13, "httpReturn:"],
438+
["go to %s", " ", 13, "goToURL:"],
438439
// --Files--
439440
["save %s to file %s", " ", 14, "saveFile:", ":)", "smileface.txt"],
440441
["load file", " ", 14, "loadFile:"],
441442
["loaded file name", "r", 14, "loadedFileName:"],
442443
["loaded file data", "r", 14, "loadedFileData:"],
444+
["loaded?", "b", 14, "fileLoaded:"],
445+
["loading failed?", "b", 14, "fileLoadFailed:"],
446+
["loading failure reason", "r", 14, "fileLoadFailReason:"],
443447

444448

445449
// Scratch

src/primitives/Primitives.as

Lines changed: 128 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ package primitives {
3232

3333
import flash.net.*;
3434
import flash.events.Event;
35+
import flash.events.IOErrorEvent;
36+
import flash.events.SecurityErrorEvent;
3537
import flash.utils.ByteArray;
3638

3739
import mx.utils.Base64Encoder;
3840
import mx.utils.Base64Decoder;
41+
42+
import uiwidgets.DialogBox;
3943

4044
public class Primitives {
4145

@@ -46,7 +50,7 @@ public class Primitives {
4650
private var counter:int;
4751
private var httpReturn:String = "";
4852
private var httpRequestsAllowed:int = 10; private var httpRequestsActive:int = 0; // TODO: Add "hidden" setting for HTTP requests allowed
49-
private var fileNameValue:String; private var fileDataValue:String;
53+
private var fileNameValue:String; private var fileDataValue:String; private var fileLoadedValue:Boolean; private var fileErrored:Boolean; private var fileErrorValue:String;
5054

5155
public function Primitives(app:Scratch, interpreter:Interpreter) {
5256
this.app = app;
@@ -110,11 +114,15 @@ public class Primitives {
110114
// Sharp -- HTTP
111115
primTable["httpBlock:"] = primHttp;
112116
primTable["httpReturn:"] = function(b:*):* {return httpReturn};
117+
primTable["goToURL:"] = primGoTo;
113118
// Sharp -- Files
114119
primTable["saveFile:"] = primFileSave;
115120
primTable["loadFile:"] = primFileLoad;
116121
primTable["loadedFileName:"] = function(b:*):*{ return fileNameValue; };
117122
primTable["loadedFileData:"] = function(b:*):*{ return fileDataValue; };
123+
primTable["fileLoaded:"] = primFileLoaded;
124+
primTable["fileLoadFailed:"] = primFileLoadFail;
125+
primTable["fileLoadFailReason:"] = primFileLoadFailReason;
118126

119127
new LooksPrims(app, interp).addPrimsTo(primTable, specialTable);
120128
new MotionAndPenPrims(app, interp).addPrimsTo(primTable, specialTable);
@@ -272,50 +280,6 @@ public class Primitives {
272280
private function primStrReplace(b:Array):String{
273281
return b[1].replace(new RegExp(b[0], "g"), b[2]);
274282
}
275-
// Sharp --- HTTP
276-
private function primHttp(b:Array):void {
277-
if(httpRequestsActive == httpRequestsAllowed) return;
278-
httpRequestsActive++;
279-
var url:String = b[1];
280-
var req:URLRequest = new URLRequest(url);
281-
req.method = URLRequestMethod.GET;
282-
283-
var loader:URLLoader = new URLLoader();
284-
loader.addEventListener(Event.COMPLETE, onComplete);
285-
loader.dataFormat = URLLoaderDataFormat.TEXT;
286-
loader.load(req);
287-
288-
function onComplete(e:Event){
289-
httpReturn = e.target.data.readUTFBytes(e.target.data.bytesAvailable);
290-
httpRequestsActive--;
291-
}
292-
}
293-
//Sharp --- Files
294-
private function primFileSave(b:Array):void{
295-
var file:FileReference = new FileReference();
296-
file.save(b[0], b[1]);
297-
}
298-
private function primFileLoad(b:Array):void{
299-
var fileName:String, data:ByteArray;
300-
function fileLoaded(event:Event):void{
301-
var file:FileReference = FileReference(event.target);
302-
fileName = file.name;
303-
data = file.data;
304-
305-
fileNameValue = fileName;
306-
fileDataValue = data.readUTFBytes(data.bytesAvailable);
307-
}
308-
function fileSelected(event:Event):void{
309-
var file:FileReference = FileReference(fileList.fileList[0]);
310-
file.addEventListener(Event.COMPLETE, fileLoaded);
311-
file.load();
312-
}
313-
var fileList:FileReferenceList = new FileReferenceList();
314-
fileList.addEventListener(Event.SELECT, fileSelected);
315-
try{
316-
fileList.browse(null);
317-
}catch(e:*){}
318-
}
319283
private function primDigitalRoot(b:Array):Number{
320284
if(interp.numarg(b[0]) < 9){
321285
return interp.numarg(b[0])
@@ -352,4 +316,123 @@ public class Primitives {
352316
}
353317
return false;
354318
}
319+
// Sharp --- HTTP
320+
private function primHttp(b:Array):void {
321+
if(httpRequestsActive == httpRequestsAllowed) return;
322+
httpRequestsActive++;
323+
var url:String = b[1];
324+
var req:URLRequest = new URLRequest(url);
325+
req.method = URLRequestMethod.GET;
326+
327+
var loader:URLLoader = new URLLoader();
328+
loader.addEventListener(Event.COMPLETE, onComplete);
329+
loader.dataFormat = URLLoaderDataFormat.TEXT;
330+
loader.load(req);
331+
332+
function onComplete(e:Event){
333+
httpReturn = e.target.data.readUTFBytes(e.target.data.bytesAvailable);
334+
httpRequestsActive--;
335+
}
336+
}
337+
private function primGoTo(b:Array):void{
338+
DialogBox.confirm("Do you want to go to '" + b[0] + "'?", null, okFunc);
339+
function okFunc():void{
340+
var request:URLRequest = new URLRequest(b[0]);
341+
navigateToURL(request, "_blank");
342+
}
343+
}
344+
//Sharp --- Files
345+
private function primFileSave(b:Array):void{
346+
DialogBox.confirm("Would you like to save the file '" + b[1] + "' to your computer?", null, okFunc, cancelFunc);
347+
function okFunc():void{
348+
function cancelHandle(e:Event){
349+
fileLoadedValue = true;
350+
fileErrored = true;
351+
fileErrorValue = "Cancelled by user";
352+
}
353+
function ioErrorHandle(e:IOErrorEvent){
354+
fileLoadedValue = true;
355+
fileErrored = true;
356+
fileErrorValue = "An IO error occurred!";
357+
}
358+
function securityError(e:SecurityErrorEvent){
359+
fileLoadedValue = true;
360+
fileErrored = true;
361+
fileErrorValue = "A security error occurred! This is most likely a problem with Sharp!";
362+
}
363+
var file:FileReference = new FileReference();
364+
file.addEventListener(Event.CANCEL, cancelHandle);
365+
file.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandle);
366+
file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
367+
file.save(b[0], b[1]);
368+
fileLoadedValue = true;
369+
}
370+
function cancelFunc():void{
371+
fileLoadedValue = true;
372+
fileErrored = true;
373+
fileErrorValue = "Denied by user";
374+
}
375+
}
376+
private function primFileLoad(b:Array):void{
377+
DialogBox.confirm("Would you like to open a file from your computer?", null, okFunc, cancelFunc);
378+
function okFunc():void{
379+
var fileName:String, data:ByteArray;
380+
function cancelHandle(e:Event){
381+
fileLoadedValue = true;
382+
fileErrored = true;
383+
fileErrorValue = "Cancelled by user";
384+
}
385+
function ioErrorHandle(e:IOErrorEvent){
386+
fileLoadedValue = true;
387+
fileErrored = true;
388+
fileErrorValue = "An IO error occurred!";
389+
}
390+
function securityError(e:SecurityErrorEvent){
391+
fileLoadedValue = true;
392+
fileErrored = true;
393+
fileErrorValue = "A security error occurred! This is most likely a problem with Sharp!";
394+
}
395+
function fileLoaded(event:Event):void{
396+
var file:FileReference = FileReference(event.target);
397+
file.addEventListener(Event.CANCEL, cancelHandle);
398+
file.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandle);
399+
file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
400+
fileName = file.name;
401+
data = file.data;
402+
403+
fileNameValue = fileName;
404+
fileDataValue = data.readUTFBytes(data.bytesAvailable);
405+
fileLoadedValue = true;
406+
}
407+
function fileSelected(event:Event):void{
408+
var file:FileReference = FileReference(fileList.fileList[0]);
409+
file.addEventListener(Event.COMPLETE, fileLoaded);
410+
file.load();
411+
}
412+
var fileList:FileReferenceList = new FileReferenceList();
413+
fileList.addEventListener(Event.SELECT, fileSelected);
414+
fileList.addEventListener(Event.CANCEL, cancelHandle);
415+
fileList.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandle);
416+
fileList.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
417+
try{
418+
fileList.browse(null);
419+
}catch(e:*){}
420+
}
421+
function cancelFunc():void{
422+
fileLoadedValue = true;
423+
fileErrored = true;
424+
fileErrorValue = "Denied by user";
425+
}
426+
}
427+
private function primFileLoaded(b:Array):Boolean{
428+
var bl:Boolean = fileLoadedValue;
429+
fileLoadedValue = false;
430+
return bl;
431+
}
432+
private function primFileLoadFail(b:Array):Boolean{
433+
return fileErrored;
434+
}
435+
private function primFileLoadFailReason(b:Array):String{
436+
return fileErrorValue;
437+
}
355438
}}

0 commit comments

Comments
 (0)