@@ -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
4044public 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