flex-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ha...@apache.org
Subject git commit: [flex-asjs] [refs/heads/develop] - Added support for JS upload progress events
Date Fri, 14 Jul 2017 09:52:47 GMT
Repository: flex-asjs
Updated Branches:
  refs/heads/develop b88f92e7b -> ef400cfc2


Added support for JS upload progress events


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/ef400cfc
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/ef400cfc
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/ef400cfc

Branch: refs/heads/develop
Commit: ef400cfc253279b11d9e0a62e611e0e0579fb582
Parents: b88f92e
Author: Harbs <harbs@in-tools.com>
Authored: Fri Jul 14 12:52:43 2017 +0300
Committer: Harbs <harbs@in-tools.com>
Committed: Fri Jul 14 12:52:43 2017 +0300

----------------------------------------------------------------------
 .../org/apache/flex/events/ProgressEvent.as     |  10 ++
 .../Network/src/main/flex/NetworkClasses.as     |   1 +
 .../flex/org/apache/flex/net/URLBinaryLoader.as |  48 ++------
 .../org/apache/flex/net/URLBinaryUploader.as    | 102 +++++++++++++++++
 .../main/flex/org/apache/flex/net/URLStream.as  |  52 ++++++---
 .../flex/org/apache/flex/net/URLUploadStream.as | 114 +++++++++++++++++++
 6 files changed, 278 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Core/src/main/flex/org/apache/flex/events/ProgressEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/events/ProgressEvent.as
b/frameworks/projects/Core/src/main/flex/org/apache/flex/events/ProgressEvent.as
index cc15416..be1606d 100644
--- a/frameworks/projects/Core/src/main/flex/org/apache/flex/events/ProgressEvent.as
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/events/ProgressEvent.as
@@ -75,6 +75,16 @@ package org.apache.flex.events
          */
 		public static const PROGRESS:String = "progress";
 
+        /**
+         *  For upload progress events.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+		public static const UPLOAD_PROGRESS:String = "uploadprogress";
+
 		/**
 		 * Create a copy/clone of the ProgressEvent object.
 		 *

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Network/src/main/flex/NetworkClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Network/src/main/flex/NetworkClasses.as b/frameworks/projects/Network/src/main/flex/NetworkClasses.as
index 51482f3..c4b5177 100644
--- a/frameworks/projects/Network/src/main/flex/NetworkClasses.as
+++ b/frameworks/projects/Network/src/main/flex/NetworkClasses.as
@@ -30,6 +30,7 @@ internal class NetworkClasses
 {	
 	import org.apache.flex.net.URLBinaryLoader; URLBinaryLoader;
     import org.apache.flex.net.HTTPConstants; HTTPConstants;
+    import org.apache.flex.net.URLBinaryUploader; URLBinaryUploader;
 }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as
b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as
index 326ccbe..7d46cbc 100644
--- a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as
+++ b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryLoader.as
@@ -27,7 +27,7 @@ package org.apache.flex.net
 
 
 	/**
-	 *  The BinaryUploader class is a relatively low-level class designed to get
+	 *  The URLBinaryLoader class is a relatively low-level class designed to get
 	 *  binary data over HTTP the intent is to create similar classes for text and URL vars.
 
 	 *  
 	 *  @langversion 3.0
@@ -59,7 +59,7 @@ package org.apache.flex.net
 		public var endian:String = Endian.BIG_ENDIAN;
 		
 
-        private var stream:URLStream;
+        protected var stream:URLStream;
         
 		/**
 		 *  The number of bytes loaded so far.
@@ -84,13 +84,17 @@ package org.apache.flex.net
         public function URLBinaryLoader()
         {
             super();
+            createStream();
+        }
+        protected function createStream():void
+        {
             stream = new URLStream();
         }
         private function progressFunction(stream:URLStream):void
         {
             bytesLoaded = stream.bytesLoaded;
             bytesTotal = stream.bytesTotal;
-            dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS,false,false,bytesLoaded,bytesTotal));
+            dispatchEvent(new ProgressEvent("progress",false,false,bytesLoaded,bytesTotal));
             if(onProgress)
                 onProgress(this);
         }
@@ -98,14 +102,14 @@ package org.apache.flex.net
         private function statusFunction(stream:URLStream):void
         {
             requestStatus = stream.requestStatus;
-            dispatchEvent(new DetailEvent(HTTPConstants.STATUS,false,false,""+requestStatus));
+            dispatchEvent(new DetailEvent("httpStatus",false,false,""+requestStatus));
             if(onStatus)
                 onStatus(this);
         }
         
         private function errorFunction(stream:URLStream):void
         {
-            dispatchEvent(new DetailEvent(HTTPConstants.COMMUNICATION_ERROR,false,false,""+requestStatus));
+            dispatchEvent(new DetailEvent("communicationError",false,false,""+requestStatus));
             if(onError)
                 onError(this);
             cleanupCallbacks();
@@ -114,13 +118,13 @@ package org.apache.flex.net
         private function completeFunction(stream:URLStream):void
         {
 			data = stream.response;
-            dispatchEvent(new org.apache.flex.events.Event(HTTPConstants.COMPLETE));
+            dispatchEvent(new org.apache.flex.events.Event("complete"));
             if(onComplete)
                 onComplete(this);
             cleanupCallbacks();
         }
         
-        private function setupCallbacks():void
+        protected function setupCallbacks():void
         {
             stream.onProgress = progressFunction;
 
@@ -153,37 +157,9 @@ package org.apache.flex.net
         public function close():void
         {
             stream.close();
+            cleanupCallbacks();
 			//TODO do we need a callback for canceling?
         }
-        
-        private function completeHandler(event:Event):void
-        {
-            data = stream.response;
-            if (data)
-            {
-                dispatchEvent(event);
-				if(onComplete)
-					onComplete(this);
-
-            }
-            else
-            {
-                // TODO dipatch error event?
-                dispatchEvent(new Event(HTTPConstants.IO_ERROR));
-				if(onError)
-					onError(this);
-            }
-			cleanupCallbacks();
-        }
-        
-        private function progressHandler(event:ProgressEvent):void
-        {
-            this.bytesLoaded = event.current;
-            this.bytesTotal = event.total;
-            dispatchEvent(event);
-			if(onProgress)
-				onProgress(this);
-        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryUploader.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryUploader.as
b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryUploader.as
new file mode 100644
index 0000000..6650d38
--- /dev/null
+++ b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLBinaryUploader.as
@@ -0,0 +1,102 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package org.apache.flex.net
+{
+
+	import org.apache.flex.events.ProgressEvent;
+	import org.apache.flex.net.URLUploadStream;
+	import org.apache.flex.net.URLBinaryUploader;
+
+	/**
+	 * @see URLBinaryLoader
+	 * The URLBinaryUploader class subclasses URLBinaryLoader to offer upload progress events.
+	 *  
+	 * This class is only used for JS implementations because Flash upload events need to be
handled differently.
+	 * In Flash, URLLoader does not dispatch upload events. It only dispatches download events.
+	 * To get upload events in Flash, you need to use File/FileReference.upload() and attach
event listeners to that.
+	 *
+	 * Care should be taken when using this class because it attaches a progress listener to
the xhr.upload object.
+	 * Doing so causes browsers to send OPTIONS requests. This will return an unauthorized response
from servers not
+	 * configured to allow CORS OPTIONS requests. See this S.O. post for details. https://stackoverflow.com/a/17057853
+	 *  
+	 * @langversion 3.0
+	 * @playerversion Flash 10.2
+	 * @playerversion AIR 2.6
+	 * @productversion FlexJS 0.9.0
+	 */
+	public class URLBinaryUploader extends URLBinaryLoader
+	{
+		public function URLBinaryUploader()
+		{
+			super();
+		}
+        override protected function createStream():void
+        {
+            stream = new URLUploadStream();
+        }
+
+		/**
+		 * @flexjsignorecoercion org.apache.flex.net.URLUploadStream
+		 */
+        override protected function setupCallbacks():void
+        {
+			super.setupCallbacks();
+			(stream as URLUploadStream).onUploadProgress = uploadProgressFunction;
+        }
+		override protected function cleanupCallbacks():void
+		{
+			super.cleanupCallbacks();
+			onUploadProgress = null;
+		}
+
+		/**
+		 *  Callback for upload progress event.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.9.0
+		 */		
+		public var onUploadProgress:Function;
+
+		/**
+		 *  Convenience function for upoad progress event to allow chaining.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.9.0
+		 */		
+		public function uploadProgress(callback:Function):URLBinaryUploader
+		{
+			onUploadProgress = callback;
+			return this;
+		}
+
+        private function uploadProgressFunction(stream:URLStream):void
+        {
+            bytesLoaded = stream.bytesLoaded;
+            bytesTotal = stream.bytesTotal;
+            dispatchEvent(new ProgressEvent("uploadprogress",false,false,bytesLoaded,bytesTotal));
+            if(onUploadProgress)
+                onUploadProgress(this);
+        }
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as
index 3946fa3..e1609b5 100644
--- a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as
+++ b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLStream.as
@@ -38,19 +38,26 @@ package org.apache.flex.net
         import flash.net.URLVariables;
         import flash.utils.ByteArray;
     }
-        
+    
+	/**
+	 * The URLStream class deals with the underlying platform-specifc architecture for HTTP
Requests
+	 * It makes the request and stores the response, dispatching events.
+	 */
     public class URLStream extends EventDispatcher
     {
         COMPILE::JS 
         {
-            private var xhr:XMLHttpRequest;
+            protected var xhr:XMLHttpRequest;
         }
             
         COMPILE::SWF
         {
             private var flashUrlStream:flash.net.URLStream
         }
-            
+        
+		/**
+		 * constructor
+		 */
         public function URLStream()
         {
             super();
@@ -76,6 +83,10 @@ package org.apache.flex.net
 		 */        
 		public var bytesTotal:uint = 0;
 
+		/**
+		 * The BinaryData reponse received from the request. This can be a response or an error
response.
+		 * The client should check the status to know how to interpret the response.
+		 */
         public function get response():BinaryData
         {
             COMPILE::JS
@@ -90,6 +101,13 @@ package org.apache.flex.net
 			}
         }
 
+		/**
+		 * loads the request
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.7.0
+		 */
         public function load(urlRequest:org.apache.flex.net.URLRequest):void
         {
             COMPILE::JS {
@@ -114,8 +132,7 @@ package org.apache.flex.net
             		xhr.setRequestHeader("Content-type", urlRequest.contentType);
 				}
 				var requestData:Object = urlRequest.data is BinaryData ? (urlRequest.data as BinaryData).data
: HTTPUtils.encodeUrlVariables(urlRequest.data);
-				xhr.send(requestData);
-//				xhr.send(HTTPUtils.encodeUrlVariables(urlRequest.data));
+				send(requestData);
             }
             COMPILE::SWF 
             {
@@ -152,6 +169,15 @@ package org.apache.flex.net
                 flashUrlStream.load(req);
             }
         }
+		/**
+		 * send is a protected function in js so a subclass can attach an upload listener
+		 * without rewriting the whole load() function
+		 */
+		COMPILE::JS
+		protected function send(requestData:Object):void
+		{
+			xhr.send(requestData);
+		}
 
 		/**
 		 *  HTTP status changed (Flash only).
@@ -221,7 +247,7 @@ package org.apache.flex.net
         }
 
 		/**
-		 *  Upload is progressing (Flash only).
+		 *  Download is progressing (Flash only).
 		 *
 		 *  @langversion 3.0
 		 *  @playerversion Flash 10.2
@@ -241,7 +267,7 @@ package org.apache.flex.net
         }
 
 		/**
-		 *  Upload is progressing (JS only).
+		 *  Download is progressing (JS only).
 		 *
 		 *  @langversion 3.0
 		 *  @playerversion Flash 10.2
@@ -278,26 +304,26 @@ package org.apache.flex.net
 			if(xhr.status == 0)
 			{
 				//Error. We don't know if there's a network error or a CORS error so there's no detail
-				dispatchEvent(new DetailEvent(HTTPConstants.COMMUNICATION_ERROR));
+				dispatchEvent(new DetailEvent("communicationError"));
 				if(onError)
 					onError(this);
 			}
 			else if(xhr.status < 200)
 			{
-				dispatchEvent(new DetailEvent(HTTPConstants.COMMUNICATION_ERROR,false,false,""+requestStatus));
+				dispatchEvent(new DetailEvent("communicationError",false,false,""+requestStatus));
 				if(onError)
 					onError(this);
 			}
 			else if(xhr.status < 300)
 			{
-				dispatchEvent(new org.apache.flex.events.Event(HTTPConstants.COMPLETE));
+				dispatchEvent(new org.apache.flex.events.Event("complete"));
 				if(onComplete)
 					onComplete(this);
 				
 			}
 			else
 			{
-				dispatchEvent(new DetailEvent(HTTPConstants.COMMUNICATION_ERROR,false,false,""+requestStatus));
+				dispatchEvent(new DetailEvent("communicationError",false,false,""+requestStatus));
 				if(onError)
 					onError(this);
 			}
@@ -317,7 +343,7 @@ package org.apache.flex.net
 			if(value != requestStatus)
 			{
 				requestStatus = value;
-				dispatchEvent(new DetailEvent(HTTPConstants.STATUS,false,false,""+value));
+				dispatchEvent(new DetailEvent("httpStatus",false,false,""+value));
 				if(onStatus)
 					onStatus(this);
 			}
@@ -376,7 +402,7 @@ package org.apache.flex.net
 		 *  @playerversion AIR 2.6
 		 *  @productversion FlexJS 0.7.0
 		 */
-		private function cleanupCallbacks():void
+		protected function cleanupCallbacks():void
 		{
 			onComplete = null;
 			onError = null;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/ef400cfc/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLUploadStream.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLUploadStream.as
b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLUploadStream.as
new file mode 100644
index 0000000..81f6c9e
--- /dev/null
+++ b/frameworks/projects/Network/src/main/flex/org/apache/flex/net/URLUploadStream.as
@@ -0,0 +1,114 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.net
+{   
+    import org.apache.flex.events.ProgressEvent;
+    
+	/**
+	 * @see URLStream
+	 * The URLUploadStream extends the URLStream class to support upload progress events.
+	 *
+	 * This class is only used for JS implementations because Flash upload events need to be
handled differently.
+	 * In Flash, URLLoader does not dispatch upload events. It only dispatches download events.
+	 * To get upload events in Flash, you need to use File/FileReference.upload() and attach
event listeners to that.
+	 *
+	 * Care should be taken when using this class because it attaches a progress listener to
the xhr.upload object.
+	 * Doing so causes browsers to send OPTIONS requests. This will return an unauthorized response
from servers not
+	 * configured to allow CORS OPTIONS requests. See this S.O. post for details. https://stackoverflow.com/a/17057853
+	 *
+	 * @langversion 3.0
+	 * @playerversion Flash 10.2
+	 * @playerversion AIR 2.6
+	 * @productversion FlexJS 0.9.0
+	 */
+    public class URLUploadStream extends URLStream
+    {
+            
+        public function URLUploadStream()
+        {
+            super();
+        }
+        
+        COMPILE::JS
+        override protected function send(requestData:Object):void
+		{
+			xhr.upload.onprogress = xhr_uploadprogress;
+			xhr.send(requestData);
+		}
+
+		/**
+		 *  Upload is progressing (JS only).
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.7.0
+		 */
+		COMPILE::JS
+        private function xhr_uploadprogress(progress:Object):void
+        {
+			var progEv:ProgressEvent = new ProgressEvent("uploadprogress");
+			progEv.current = bytesLoaded = progress["loaded"];
+			progEv.total = bytesTotal = progress["total"];
+			
+            dispatchEvent(progEv);
+			if(onUploadProgress)
+				onUploadProgress(this);
+        }
+
+		/**
+		 *  Cleanup all callbacks.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.7.0
+		 */
+		override protected function cleanupCallbacks():void
+		{
+			super.cleanupCallbacks();
+			onUploadProgress = null;
+		}
+		
+		/**
+		 *  Callback for upload progress event.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.7.0
+		 */		
+		public var onUploadProgress:Function;
+
+		/**
+		 *  Convenience function for upload progress event to allow chaining.
+		 *  
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion FlexJS 0.7.0
+		 */		
+		public function uploadProgress(callback:Function):org.apache.flex.net.URLStream
+		{
+			onUploadProgress = callback;
+			return this;
+		}
+	}
+}
+


Mime
View raw message