incubator-flex-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bigosma...@apache.org
Subject svn commit: r1369734 - in /incubator/flex/utilities/InstallApacheFlex/src: ./ com/adobe/ com/adobe/crypto/ com/adobe/utils/ org/apache/flex/packageflexsdk/resource/ org/apache/flex/packageflexsdk/util/
Date Mon, 06 Aug 2012 07:13:06 GMT
Author: bigosmallm
Date: Mon Aug  6 07:13:05 2012
New Revision: 1369734

URL: http://svn.apache.org/viewvc?rev=1369734&view=rev
Log:
Committing Erik de Bruin's patch for FLEX-33149 and FLEX-33150
Relevant discussion here: http://markmail.org/thread/2c6b66yyrm7nbx6s

Added:
    incubator/flex/utilities/InstallApacheFlex/src/com/adobe/
    incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/
    incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/MD5Stream.as
    incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/
    incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/IntUtil.as
    incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/InternetUtil.as
    incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MD5CompareUtil.as
    incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MirrorURLUtil.as
Modified:
    incubator/flex/utilities/InstallApacheFlex/src/ApacheFlexConfig.xml
    incubator/flex/utilities/InstallApacheFlex/src/InstallApacheFlex.mxml
    incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/RuntimeLocale.as
    incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/ViewResourceConstants.as

Modified: incubator/flex/utilities/InstallApacheFlex/src/ApacheFlexConfig.xml
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/ApacheFlexConfig.xml?rev=1369734&r1=1369733&r2=1369734&view=diff
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/ApacheFlexConfig.xml (original)
+++ incubator/flex/utilities/InstallApacheFlex/src/ApacheFlexConfig.xml Mon Aug  6 07:13:05 2012
@@ -20,7 +20,7 @@ limitations under the License.
 	<version>1.0</version>
 	<files>
 		<!-- Apache Flex binary distribution -->
-		<file name="ApacheFlexSDK" path="http://people.apache.org/~cframpton/ApacheFlexRC/release_candidate_3/binaries/" file="apache-flex-sdk-4.8.0-incubating-bin.zip" />
+		<file name="ApacheFlexSDK" path="incubator/flex/4.8.0-incubating/binaries/" file="apache-flex-sdk-4.8.0-incubating-bin.zip" />
 		
 		<!-- Adobe AIR SDK -->
 		<file name="AdobeAIRSDKWin" path="http://airdownload.adobe.com/air/win/download/3.1/" file="AdobeAIRSDK.zip" />

Modified: incubator/flex/utilities/InstallApacheFlex/src/InstallApacheFlex.mxml
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/InstallApacheFlex.mxml?rev=1369734&r1=1369733&r2=1369734&view=diff
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/InstallApacheFlex.mxml (original)
+++ incubator/flex/utilities/InstallApacheFlex/src/InstallApacheFlex.mxml Mon Aug  6 07:13:05 2012
@@ -30,6 +30,7 @@ variables are not required because the l
 
 -->
 
+
 <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
 					   xmlns:s="library://ns.adobe.com/flex/spark" 
 					   xmlns:mx="library://ns.adobe.com/flex/mx"
@@ -53,12 +54,13 @@ variables are not required because the l
 			import mx.core.IFlexDisplayObject;
 			import mx.events.FlexEvent;
 			import mx.managers.PopUpManager;
-			import mx.rpc.events.ResultEvent;
 			import mx.utils.StringUtil;
 			
 			import org.apache.flex.packageflexsdk.model.OptionalComponentVO;
 			import org.apache.flex.packageflexsdk.resource.RuntimeLocale;
 			import org.apache.flex.packageflexsdk.resource.ViewResourceConstants;
+			import org.apache.flex.packageflexsdk.util.MD5CompareUtil;
+			import org.apache.flex.packageflexsdk.util.MirrorURLUtil;
 			import org.apache.flex.packageflexsdk.view.UpdaterDialog;
 			import org.apache.flex.packageflexsdk.view.components.AdobeLicense;
 			import org.apache.flex.packageflexsdk.view.components.ConsoleWindow;
@@ -79,6 +81,17 @@ variables are not required because the l
 			private static const INSTALLER_BUILD_NUMBER:String = String(INSTALLER::buildNumber);
 			
 			/**
+			 * Local Constants
+			 */
+			private const TMP_URL:String = "http://mirror.metrocast.net/apache/";
+			
+			/**
+			 * Utility Singleton Instances
+			 */
+			private var _md5CompareUtil:MD5CompareUtil = MD5CompareUtil.instance;
+			private var _mirrorURLUtil:MirrorURLUtil = MirrorURLUtil.instance;
+
+			/**
 			 * The url that stores the current version number of the InstallApacheFlex.{exe|dmg}  
 			 */
 			private var VERSION_URL:String;
@@ -89,6 +102,8 @@ variables are not required because the l
 			 * Values stored in ApacheFlexConfig.xml edit file to change
 			 * 
 			 */
+			private var APACHE_FLEX_BIN_DISTRO_DOMAIN:String;
+			private var APACHE_FLEX_BIN_DISTRO_PATH:String;
 			private var APACHE_FLEX_BIN_DISTRO_FILE:String;
 			private var APACHE_FLEX_BIN_DISTRO_URL:String;
 			
@@ -172,11 +187,28 @@ variables are not required because the l
 			protected function handleApplicationComplete(event:FlexEvent):void
 			{
 				centerWindow();
+				
 				_constants = ViewResourceConstants.getInstance();
 				_runtimeLocale.enumerateBundles();
 				_langSelect.dataProvider = _runtimeLocale.supportedLanguage;
 				_langSelect.selectedIndex = 0;
 				selectDefaultLanguage();
+				
+				_mirrorURLUtil.getMirrorURL(getApacheMirrorURLResultHandler);
+			}
+			
+			private function getApacheMirrorURLResultHandler(abort:Boolean, classLog:ArrayCollection):void
+			{
+				var i:int;
+				var n:int = classLog.length;
+				for (i = 0; i < n; i++)
+				{
+					log(String(classLog.getItemAt(i)));
+				}
+				
+				if (abort)
+					abortInstallation();
+				
 				loadXML();
 			}
 			
@@ -202,7 +234,7 @@ variables are not required because the l
 			
 			protected function loadXML():void
 			{
-				var request:URLRequest = new URLRequest(_constants.CONFIG_URL);
+				var request:URLRequest = new URLRequest(ViewResourceConstants.URL_CONFIG_XML);
 				
 				_loader = new URLLoader();
 				
@@ -245,14 +277,26 @@ variables are not required because the l
 				
 				VERSION_URL = data.versionurl.toString();
 				
+				APACHE_FLEX_BIN_DISTRO_DOMAIN = _mirrorURLUtil.url;
 				APACHE_FLEX_BIN_DISTRO_FILE = files.(@name == 'ApacheFlexSDK').@file.toString();
-				APACHE_FLEX_BIN_DISTRO_URL = files.(@name == 'ApacheFlexSDK').@path.toString();
-				if (!APACHE_FLEX_BIN_DISTRO_FILE || !APACHE_FLEX_BIN_DISTRO_URL)
+				APACHE_FLEX_BIN_DISTRO_PATH = files.(@name == 'ApacheFlexSDK').@path.toString();
+				
+				/* 
+					Tempory parsing while waiting for updated (patched) config XML.
+				
+					Assume the domain part of the path is: 
+					http://mirror.metrocast.net/apache/ (as was the case on 2012-08-02)
+				*/
+				if (APACHE_FLEX_BIN_DISTRO_PATH.substr(0, TMP_URL.length) == TMP_URL)
+					APACHE_FLEX_BIN_DISTRO_PATH = APACHE_FLEX_BIN_DISTRO_PATH.substr(TMP_URL.length);
+
+				if (!APACHE_FLEX_BIN_DISTRO_FILE || !APACHE_FLEX_BIN_DISTRO_PATH)
 				{
 					log(_constants.ERROR_INVALID_SDK_URL);
 					keepGoing = false;
 				}
-				APACHE_FLEX_BIN_DISTRO_URL += APACHE_FLEX_BIN_DISTRO_FILE;
+				APACHE_FLEX_BIN_DISTRO_URL = APACHE_FLEX_BIN_DISTRO_DOMAIN + 
+					APACHE_FLEX_BIN_DISTRO_PATH + APACHE_FLEX_BIN_DISTRO_FILE;
 				
 				ADOBE_AIR_SDK_WIN_FILE = files.(@name == 'AdobeAIRSDKWin').@file.toString();
 				ADOBE_AIR_SDK_WIN_URL = files.(@name == 'AdobeAIRSDKWin').@path.toString();
@@ -327,7 +371,7 @@ variables are not required because the l
 			{
 			    // Log the Installer version to help with any support issues that arise.
 			    log("Version" + " " + 
-			        INSTALLER_VERSION + "." + INSTALLER_BUILD_NUMBER + " (" + _os + ")");
+			        INSTALLER_VERSION + "." + INSTALLER_BUILD_NUMBER + " (" + _os + ")",0);
 				checkVersion();
 				initiateInstallStepsActivity();
 				initializeOptionInstallsDataProvider();
@@ -413,6 +457,7 @@ variables are not required because the l
 			{
 				_installationSteps.addItem(new StepItem(_constants.STEP_CREATE_DIRECTORIES));
 				_installationSteps.addItem(new StepItem(_constants.STEP_DOWNLOAD_FLEX_SDK));
+				_installationSteps.addItem(new StepItem(_constants.STEP_VERIFY_FLEX_SDK));
 				_installationSteps.addItem(new StepItem(_constants.STEP_UNZIP_FLEX_SDK));
 				_installationSteps.addItem(new StepItem(_constants.STEP_DOWNLOAD_AIR_RUNTIME_KIT));
 				_installationSteps.addItem(new StepItem(_constants.STEP_UNZIP_AIR_RUNTIME_KIT));
@@ -475,7 +520,7 @@ variables are not required because the l
 			{
 				var selectedDir:File =  File(event.target);
 				
-				if(isDirectoryEmpty(selectedDir))
+				if (isDirectoryEmpty(selectedDir))
 				{
 					_flexHome = selectedDir.nativePath;
 					flexSDKTxtInput.text = _flexHome;
@@ -606,8 +651,22 @@ variables are not required because the l
 					abortInstallation();
 				}
 				
-				updateActivityStep(_constants.STEP_DOWNLOAD_FLEX_SDK, StepItem.COMPLETE);	
-				unzipApacheFlexSDK();
+				updateActivityStep(_constants.STEP_DOWNLOAD_FLEX_SDK, StepItem.COMPLETE);
+				
+				updateActivityStep(_constants.STEP_VERIFY_FLEX_SDK, StepItem.ACTIVE);
+
+				log(_constants.STEP_VERIFY_FLEX_SDK);
+				
+				_md5CompareUtil.addEventListener(ProgressEvent.PROGRESS, md5VerificationProgressHandler);
+				_md5CompareUtil.verifyMD5(
+					_apacheFlexSDKZipFile, 
+					APACHE_FLEX_BIN_DISTRO_PATH + APACHE_FLEX_BIN_DISTRO_FILE, 
+					unzipApacheFlexSDK);
+			}
+			
+			protected function md5VerificationProgressHandler(event:ProgressEvent):void
+			{
+				progressBar.percent = Math.round((event.bytesLoaded / event.bytesTotal) * 100);
 			}
 			
 			protected function handleApacheFlexSDKDownloadError(event:*=null):void{
@@ -618,6 +677,22 @@ variables are not required because the l
 			
 			protected function unzipApacheFlexSDK():void
 			{
+				if (!_md5CompareUtil.fileIsVerified)
+				{
+					updateActivityStep(_constants.STEP_VERIFY_FLEX_SDK, StepItem.ERROR);
+					
+					log(_constants.ERROR_VERIFY_FLEX_SDK);
+					
+					abortInstallation();
+					return;
+				}
+				else
+				{
+					updateActivityStep(_constants.STEP_VERIFY_FLEX_SDK, StepItem.COMPLETE);
+					
+					log(_constants.INFO_VERIFY_FLEX_SDK_DONE);
+				} 
+
 				updateActivityStep(_constants.STEP_UNZIP_FLEX_SDK, StepItem.ACTIVE);
 				
 				try
@@ -1537,9 +1612,16 @@ variables are not required because the l
 				}
 			}
 			
-			private function log(text:String):void
+			private function log(text:String,position:int=-1):void
 			{
-				_messages.addItem(text);
+				if(position == -1)
+				{
+					_messages.addItem(text);
+				}
+				else
+				{
+					_messages.addItemAt(text,position);
+				}
 			}
 			
 			private function showConsole(event:Event):void 
@@ -1582,10 +1664,7 @@ variables are not required because the l
 			
 			protected function clickLogo(event:MouseEvent):void
 			{
-				var url:String = _constants.APACHE_FLEX_URL; 
-				var urlReq:URLRequest = new URLRequest(url); 
-				
-				navigateToURL(urlReq);
+				navigateToURL(new URLRequest(ViewResourceConstants.URL_APACHE_FLEX));
 			}
 			
 			protected function getStepItemFromStepLabel(stepLabel:String):StepItem{
@@ -1611,12 +1690,21 @@ variables are not required because the l
 			
 			private function isDirectoryEmpty(dir:File):Boolean
 			{
-				var files:Array = dir.getDirectoryListing();
-				if(files.length == 0)
+				var result:Boolean;
+				
+				var filesArray:Array = dir.getDirectoryListing();
+				
+				var length:int = filesArray.length;
+				result = length == 0;
+				if (length == 1)
 				{
-					return true;
+					var explodedPath:Array = File(filesArray[0]).url.split("/");
+					
+					// the .DS_Store file doesn't bother anybody, so we can safely ignore it
+					result = explodedPath[explodedPath.length - 1] == ".DS_Store";
 				}
-				return false;
+				
+				return result;
 			}
 			
 		]]>
@@ -1735,7 +1823,7 @@ variables are not required because the l
 					  width="88" 
 					  height="32" 
 					  right="10"
-					  label="{ViewResourceConstants.getInstance().INSTALL_BTN_LABEL}" 
+					  label="{_constants.INSTALL_BTN_LABEL}" 
 					  enabled="false" 
 					  click="handleInstallBtnClick(event)" />
 		</s:controlBarContent>

Added: incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/MD5Stream.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/MD5Stream.as?rev=1369734&view=auto
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/MD5Stream.as (added)
+++ incubator/flex/utilities/InstallApacheFlex/src/com/adobe/crypto/MD5Stream.as Mon Aug  6 07:13:05 2012
@@ -0,0 +1,402 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+package com.adobe.crypto
+{
+    import com.adobe.utils.IntUtil;   
+    import flash.utils.ByteArray;
+
+    /**
+     * Perform MD5 hash of an input stream in chunks. This class is
+     * based on com.adobe.crypto.MD5 and can process data in
+     * chunks. Both block creation and hash computation are done
+     * together for whatever input is available so that the memory
+     * overhead at a time is always fixed. Memory usage is governed by
+     * two parameters: one is the amount of data passed in to update()
+     * and the other is memoryBlockSize. The latter comes into play
+     * only when the memory window exceeds the pre allocated memory
+     * window of flash player. Usage: create an instance, call
+     * update(data) repeatedly for all chunks and finally complete()
+     * which will return the md5 hash.
+     */      
+    public class MD5Stream
+    {
+        private static var mask:int = 0xFF;
+
+        private var arr:Array = [];
+
+        /* running count of length */
+        private var arrLen:int;
+        
+        // initialize the md buffers
+        private var a:int = 1732584193;
+        private var b:int = -271733879;
+        private var c:int = -1732584194;
+        private var d:int = 271733878;
+        
+        // variables to store previous values
+        private var aa:int;
+        private var bb:int;
+        private var cc:int;
+        private var dd:int;
+
+        /* index for data read */
+        private var arrIndexLen:int = 0;
+        /* index for hash computation */
+        private var arrProcessIndex:int = 0;
+        /* index for removing stale arr values */
+        private var cleanIndex:int = 0;
+        
+        /** 
+         * Change this value from the default (16384) in the range of
+         * MBs to actually affect GC as GC allocates in pools of
+         * memory */
+        public var memoryBlockSize:int = 16384;
+        
+        
+        public function MD5Stream()
+        {
+            
+        }
+               
+        
+        /**
+         * Pass in chunks of the input data with update(), call
+         * complete() with an optional chunk which will return the
+         * final hash. Equivalent to the way
+         * java.security.MessageDigest works.
+         *
+         * @param input The optional bytearray chunk which is the final part of the input
+         * @return A string containing the hash value
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */
+        public function complete(input:ByteArray=null):String
+        {
+            if ( arr.length == 0 )
+            {
+                if ( input == null )
+                {
+                    throw new Error("null input to complete without prior call to update. At least an empty bytearray must be passed.");
+                }		 		
+            }
+            
+            if ( input != null )
+            {
+                readIntoArray(input);
+            }
+
+            //pad, append length
+            padArray(arrLen);
+
+            hashRemainingChunks(false);
+            
+            var res:String = IntUtil.toHex( a ) + IntUtil.toHex( b ) + 
+            				 IntUtil.toHex( c ) + IntUtil.toHex( d );
+            resetFields();
+            
+            return res;
+        }
+
+        /**
+         * Pass in chunks of the input data with update(), call
+         * complete() with an optional chunk which will return the
+         * final hash. Equivalent to the way
+         * java.security.MessageDigest works.
+         *
+         * @param input The bytearray chunk to perform the hash on
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */        
+        public function update(input:ByteArray):void
+        {
+            readIntoArray(input);
+            hashRemainingChunks();
+        }
+
+        /**
+         * Re-initialize this instance for use to perform hashing on
+         * another input stream. This is called automatically by
+         * complete().
+         *
+         * @langversion ActionScript 3.0
+         * @playerversion Flash 8.5
+         * @tiptext
+         */               
+        public function resetFields():void
+        {
+            //truncate array
+            arr.length = 0;
+            arrLen = 0;
+            
+            // initialize the md buffers
+            a = 1732584193;
+            b = -271733879;
+            c = -1732584194;
+            d = 271733878;
+            
+            // variables to store previous values
+            aa = 0;
+            bb = 0;
+            cc = 0;
+            dd = 0;
+            
+            arrIndexLen = 0;            
+            arrProcessIndex = 0;
+            cleanIndex = 0;
+        }
+        
+        /** read into arr and free up used blocks of arr */
+        private function readIntoArray(input:ByteArray):void
+        {
+            var closestChunkLen:int = input.length * 8;
+            arrLen += closestChunkLen;
+            
+            /* clean up memory. if there are entries in the array that
+             * are already processed and the amount is greater than
+             * memoryBlockSize, create a new array, copy the last
+             * block into it and let the old one get picked up by
+             * GC. */
+            if ( arrProcessIndex - cleanIndex > memoryBlockSize )
+            {
+                var newarr:Array= new Array();
+                
+                /* AS Arrays in sparse arrays. arr[2002] can exist 
+                 * without values for arr[0] - arr[2001] */
+                for ( var j:int = arrProcessIndex; j < arr.length; j++ )
+                {						
+                    newarr[j] = arr[j];
+                }
+                
+                cleanIndex = arrProcessIndex;
+                arr = null;
+                arr = newarr;
+            }
+            
+            for ( var k:int = 0; k < closestChunkLen; k+=8 )
+            {
+                //discard high bytes (convert to uint)
+                arr[ int(arrIndexLen >> 5) ] |= ( input[ k / 8 ] & mask ) << ( arrIndexLen % 32 );
+                arrIndexLen += 8;
+            }
+            
+            
+        }
+        
+        private function hashRemainingChunks(bUpdate:Boolean=true):void
+        {
+            var len:int = arr.length;
+
+            /* leave a 16 word block untouched if we are called from
+             * update. This is because, padArray() can modify the last
+             * block and this modification has to happen before we
+             * compute the hash.  */
+            if ( bUpdate )
+            {
+                len -= 16;
+            }
+
+            /* don't do anything if don't have a 16 word block. */
+            if ( arrProcessIndex >= len || len - arrProcessIndex < 15 )
+            {
+                return;
+            }
+
+            
+            for ( var i:int = arrProcessIndex; i < len ; i += 16, arrProcessIndex += 16) 
+            {            	
+                // save previous values
+                aa = a;
+                bb = b;
+                cc = c;
+                dd = d;                         
+                
+                // Round 1
+                a = ff( a, b, c, d, arr[int(i+ 0)],  7, -680876936 );     // 1
+                d = ff( d, a, b, c, arr[int(i+ 1)], 12, -389564586 );     // 2
+                c = ff( c, d, a, b, arr[int(i+ 2)], 17, 606105819 );      // 3
+                b = ff( b, c, d, a, arr[int(i+ 3)], 22, -1044525330 );    // 4
+                a = ff( a, b, c, d, arr[int(i+ 4)],  7, -176418897 );     // 5
+                d = ff( d, a, b, c, arr[int(i+ 5)], 12, 1200080426 );     // 6
+                c = ff( c, d, a, b, arr[int(i+ 6)], 17, -1473231341 );    // 7
+                b = ff( b, c, d, a, arr[int(i+ 7)], 22, -45705983 );      // 8
+                a = ff( a, b, c, d, arr[int(i+ 8)],  7, 1770035416 );     // 9
+                d = ff( d, a, b, c, arr[int(i+ 9)], 12, -1958414417 );    // 10
+                c = ff( c, d, a, b, arr[int(i+10)], 17, -42063 );                 // 11
+                b = ff( b, c, d, a, arr[int(i+11)], 22, -1990404162 );    // 12
+                a = ff( a, b, c, d, arr[int(i+12)],  7, 1804603682 );     // 13
+                d = ff( d, a, b, c, arr[int(i+13)], 12, -40341101 );      // 14
+                c = ff( c, d, a, b, arr[int(i+14)], 17, -1502002290 );    // 15
+                b = ff( b, c, d, a, arr[int(i+15)], 22, 1236535329 );     // 16
+                
+                // Round 2
+                a = gg( a, b, c, d, arr[int(i+ 1)],  5, -165796510 );     // 17
+                d = gg( d, a, b, c, arr[int(i+ 6)],  9, -1069501632 );    // 18
+                c = gg( c, d, a, b, arr[int(i+11)], 14, 643717713 );      // 19
+                b = gg( b, c, d, a, arr[int(i+ 0)], 20, -373897302 );     // 20
+                a = gg( a, b, c, d, arr[int(i+ 5)],  5, -701558691 );     // 21
+                d = gg( d, a, b, c, arr[int(i+10)],  9, 38016083 );       // 22
+                c = gg( c, d, a, b, arr[int(i+15)], 14, -660478335 );     // 23
+                b = gg( b, c, d, a, arr[int(i+ 4)], 20, -405537848 );     // 24
+                a = gg( a, b, c, d, arr[int(i+ 9)],  5, 568446438 );      // 25
+                d = gg( d, a, b, c, arr[int(i+14)],  9, -1019803690 );    // 26
+                c = gg( c, d, a, b, arr[int(i+ 3)], 14, -187363961 );     // 27
+                b = gg( b, c, d, a, arr[int(i+ 8)], 20, 1163531501 );     // 28
+                a = gg( a, b, c, d, arr[int(i+13)],  5, -1444681467 );    // 29
+                d = gg( d, a, b, c, arr[int(i+ 2)],  9, -51403784 );      // 30
+                c = gg( c, d, a, b, arr[int(i+ 7)], 14, 1735328473 );     // 31
+                b = gg( b, c, d, a, arr[int(i+12)], 20, -1926607734 );    // 32
+                
+                // Round 3
+                a = hh( a, b, c, d, arr[int(i+ 5)],  4, -378558 );        // 33
+                d = hh( d, a, b, c, arr[int(i+ 8)], 11, -2022574463 );    // 34
+                c = hh( c, d, a, b, arr[int(i+11)], 16, 1839030562 );     // 35
+                b = hh( b, c, d, a, arr[int(i+14)], 23, -35309556 );      // 36
+                a = hh( a, b, c, d, arr[int(i+ 1)],  4, -1530992060 );    // 37
+                d = hh( d, a, b, c, arr[int(i+ 4)], 11, 1272893353 );     // 38
+                c = hh( c, d, a, b, arr[int(i+ 7)], 16, -155497632 );     // 39
+                b = hh( b, c, d, a, arr[int(i+10)], 23, -1094730640 );    // 40
+                a = hh( a, b, c, d, arr[int(i+13)],  4, 681279174 );      // 41
+                d = hh( d, a, b, c, arr[int(i+ 0)], 11, -358537222 );     // 42
+                c = hh( c, d, a, b, arr[int(i+ 3)], 16, -722521979 );     // 43
+                b = hh( b, c, d, a, arr[int(i+ 6)], 23, 76029189 );       // 44
+                a = hh( a, b, c, d, arr[int(i+ 9)],  4, -640364487 );     // 45
+                d = hh( d, a, b, c, arr[int(i+12)], 11, -421815835 );     // 46
+                c = hh( c, d, a, b, arr[int(i+15)], 16, 530742520 );      // 47
+                b = hh( b, c, d, a, arr[int(i+ 2)], 23, -995338651 );     // 48
+                
+                // Round 4
+                a = ii( a, b, c, d, arr[int(i+ 0)],  6, -198630844 );     // 49
+                d = ii( d, a, b, c, arr[int(i+ 7)], 10, 1126891415 );     // 50
+                c = ii( c, d, a, b, arr[int(i+14)], 15, -1416354905 );    // 51
+                b = ii( b, c, d, a, arr[int(i+ 5)], 21, -57434055 );      // 52
+                a = ii( a, b, c, d, arr[int(i+12)],  6, 1700485571 );     // 53
+                d = ii( d, a, b, c, arr[int(i+ 3)], 10, -1894986606 );    // 54
+                c = ii( c, d, a, b, arr[int(i+10)], 15, -1051523 );       // 55
+                b = ii( b, c, d, a, arr[int(i+ 1)], 21, -2054922799 );    // 56
+                a = ii( a, b, c, d, arr[int(i+ 8)],  6, 1873313359 );     // 57
+                d = ii( d, a, b, c, arr[int(i+15)], 10, -30611744 );      // 58
+                c = ii( c, d, a, b, arr[int(i+ 6)], 15, -1560198380 );    // 59
+                b = ii( b, c, d, a, arr[int(i+13)], 21, 1309151649 );     // 60
+                a = ii( a, b, c, d, arr[int(i+ 4)],  6, -145523070 );     // 61
+                d = ii( d, a, b, c, arr[int(i+11)], 10, -1120210379 );    // 62
+                c = ii( c, d, a, b, arr[int(i+ 2)], 15, 718787259 );      // 63
+                b = ii( b, c, d, a, arr[int(i+ 9)], 21, -343485551 );     // 64
+                
+                a += aa;
+                b += bb;
+                c += cc;
+                d += dd;
+                
+            }
+            
+        }
+        
+        private function padArray(len:int):void
+        {	 		
+            arr[ int(len >> 5) ] |= 0x80 << ( len % 32 );
+            arr[ int(( ( ( len + 64 ) >>> 9 ) << 4 ) + 14) ] = len;
+            arrLen = arr.length;
+        }  
+        
+        /* Code below same as com.adobe.crypto.MD5 */ 
+        
+        /**
+         * Auxiliary function f as defined in RFC
+         */
+        private static function f( x:int, y:int, z:int ):int {
+            return ( x & y ) | ( (~x) & z );
+        }
+        
+        /**
+         * Auxiliary function g as defined in RFC
+         */
+        private static function g( x:int, y:int, z:int ):int {
+            return ( x & z ) | ( y & (~z) );
+        }
+        
+        /**
+         * Auxiliary function h as defined in RFC
+         */
+        private static function h( x:int, y:int, z:int ):int {
+            return x ^ y ^ z;
+        }
+        
+        /**
+         * Auxiliary function i as defined in RFC
+         */
+        private static function i( x:int, y:int, z:int ):int {
+            return y ^ ( x | (~z) );
+        }
+        
+        /**
+         * A generic transformation function.  The logic of ff, gg, hh, and
+         * ii are all the same, minus the function used, so pull that logic
+         * out and simplify the method bodies for the transoformation functions.
+         */
+        private static function transform( func:Function, a:int, b:int, c:int, d:int, x:int, s:int, t:int):int {
+            var tmp:int = a + int( func( b, c, d ) ) + x + t;
+            return IntUtil.rol( tmp, s ) +  b;
+        }
+        
+        /**
+         * ff transformation function
+         */
+        private static function ff ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+            return transform( f, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * gg transformation function
+         */
+        private static function gg ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+            return transform( g, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * hh transformation function
+         */
+        private static function hh ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+            return transform( h, a, b, c, d, x, s, t );
+        }
+        
+        /**
+         * ii transformation function
+         */
+        private static function ii ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {
+            return transform( i, a, b, c, d, x, s, t );
+        }
+        
+    }
+}
\ No newline at end of file

Added: incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/IntUtil.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/IntUtil.as?rev=1369734&view=auto
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/IntUtil.as (added)
+++ incubator/flex/utilities/InstallApacheFlex/src/com/adobe/utils/IntUtil.as Mon Aug  6 07:13:05 2012
@@ -0,0 +1,99 @@
+/*
+  Copyright (c) 2008, Adobe Systems Incorporated
+  All rights reserved.
+
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are
+  met:
+
+  * Redistributions of source code must retain the above copyright notice, 
+    this list of conditions and the following disclaimer.
+  
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the 
+    documentation and/or other materials provided with the distribution.
+  
+  * Neither the name of Adobe Systems Incorporated nor the names of its 
+    contributors may be used to endorse or promote products derived from 
+    this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+  IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
+  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+package com.adobe.utils {
+	
+	import flash.utils.Endian;
+	
+	/**
+	 * Contains reusable methods for operations pertaining 
+	 * to int values.
+	 */
+	public class IntUtil {
+		
+		/**
+		 * Rotates x left n bits
+		 *
+		 * @langversion ActionScript 3.0
+		 * @playerversion Flash 9.0
+		 * @tiptext
+		 */
+		public static function rol ( x:int, n:int ):int {
+			return ( x << n ) | ( x >>> ( 32 - n ) );
+		}
+		
+		/**
+		 * Rotates x right n bits
+		 *
+		 * @langversion ActionScript 3.0
+		 * @playerversion Flash 9.0
+		 * @tiptext
+		 */
+		public static function ror ( x:int, n:int ):uint {
+			var nn:int = 32 - n;
+			return ( x << nn ) | ( x >>> ( 32 - nn ) );
+		}
+		
+		/** String for quick lookup of a hex character based on index */
+		private static var hexChars:String = "0123456789abcdef";
+		
+		/**
+		 * Outputs the hex value of a int, allowing the developer to specify
+		 * the endinaness in the process.  Hex output is lowercase.
+		 *
+		 * @param n The int value to output as hex
+		 * @param bigEndian Flag to output the int as big or little endian
+		 * @return A string of length 8 corresponding to the 
+		 *		hex representation of n ( minus the leading "0x" )
+		 * @langversion ActionScript 3.0
+		 * @playerversion Flash 9.0
+		 * @tiptext
+		 */
+		public static function toHex( n:int, bigEndian:Boolean = false ):String {
+			var s:String = "";
+			
+			if ( bigEndian ) {
+				for ( var i:int = 0; i < 4; i++ ) {
+					s += hexChars.charAt( ( n >> ( ( 3 - i ) * 8 + 4 ) ) & 0xF ) 
+						+ hexChars.charAt( ( n >> ( ( 3 - i ) * 8 ) ) & 0xF );
+				}
+			} else {
+				for ( var x:int = 0; x < 4; x++ ) {
+					s += hexChars.charAt( ( n >> ( x * 8 + 4 ) ) & 0xF )
+						+ hexChars.charAt( ( n >> ( x * 8 ) ) & 0xF );
+				}
+			}
+			
+			return s;
+		}
+	}
+		
+}
\ No newline at end of file

Modified: incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/RuntimeLocale.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/RuntimeLocale.as?rev=1369734&r1=1369733&r2=1369734&view=diff
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/RuntimeLocale.as (original)
+++ incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/RuntimeLocale.as Mon Aug  6 07:13:05 2012
@@ -89,6 +89,23 @@ package org.apache.flex.packageflexsdk.r
 			var _resourceManager:IResourceManager = ResourceManager.getInstance();
 			var _resource:ResourceBundle = new ResourceBundle("en_US", "messagestrings");
 			
+			_resource.content["ERROR_VERIFY_FLEX_SDK"]="The Apache Flex SDK MD5 Signature of the downloaded files doesn not match the reference value. The file is invalid, installation is aborted.";
+			_resource.content["ERROR_MIRROR_FETCH"]="Error while trying to fetch a mirror for downloading the Apache Flex SDK binaries: ";
+	
+			_resource.content["FETCH_GEO_IP"]="Trying to fetch the user's country code from the GeoIP service...";
+			_resource.content["FETCH_GEO_IP_DONE"]="Fetched the user's country code from the GeoIP service.";
+			_resource.content["FETCH_GEO_IP_ERROR"]="An error occurred while fetching the user's country code from the GeoIP service.";
+			_resource.content["FETCH_MIRROR_CGI"]="Trying to fetch the SDK download mirror URL from the CGI...";
+			_resource.content["FETCH_MIRROR_CGI_DONE"]="Fetched the SDK download mirror URL from the CGI.";
+			_resource.content["FETCH_MIRROR_CGI_ERROR"]="Could not fetch the SDK download mirror URL from the CGI. Going to try the GeoIP route.";
+			_resource.content["FETCH_MIRROR_LIST"]="Trying to fetch the mirror list from Apache.org...";
+			_resource.content["FETCH_MIRROR_LIST_DONE"]="Fetched the mirror list from Apache.org.";
+			_resource.content["FETCH_MIRROR_LIST_PARSED"]="Parsed the mirror list using the country code and got this domain: ";
+
+			_resource.content["INFO_VERIFY_FLEX_SDK_DONE"]="The Apache Flex SDK MD5 Signature of the downloaded files matches the reference. The file is valid.";
+			
+			_resource.content["STEP_VERIFY_FLEX_SDK"]="Verifying Apache Flex SDK MD5 Signature";
+			
 			_resource.content["browse_btn_label"]="BROWSE";
 			_resource.content["install_log_btn_label"]="INSTALL LOG";
 			_resource.content["install_btn_label"]="INSTALL";

Modified: incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/ViewResourceConstants.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/ViewResourceConstants.as?rev=1369734&r1=1369733&r2=1369734&view=diff
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/ViewResourceConstants.as (original)
+++ incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/resource/ViewResourceConstants.as Mon Aug  6 07:13:05 2012
@@ -27,7 +27,37 @@ package org.apache.flex.packageflexsdk.r
 	
 	public final class ViewResourceConstants
 	{
+		public static const URL_APACHE_FLEX:String = "http://incubator.apache.org/flex/";
+		public static const URL_CONFIG_XML:String = "http://people.apache.org/~bigosmallm/installapacheflex/ApacheFlexConfig.xml";
+		/*
+			I'm not entirely sure (as IANAL), but on http://www.hostip.info/faq.html
+			I see this: "Hostip.info is an open project ... contributed by the 
+			community as part of an ongoing open-source effort." Not a license 
+			per se, but I guess it'll have to do :-)
+		*/
+		public static const URL_FETCH_GEO_IP:String = "http://api.hostip.info/country.php";
+		public static const URL_FETCH_MIRROR_LIST:String = "http://www.apache.org/mirrors/mirrors.list";
+		public static const URL_FETCH_MIRROR_CGI:String = "http://incubator.apache.org/flex/single-mirror-url.cgi";
+		
 		private static var _instance:ViewResourceConstants;
+
+		private var _STEP_VERIFY_FLEX_SDK:String;
+		
+		private var _ERROR_VERIFY_FLEX_SDK:String;
+		private var _ERROR_MIRROR_FETCH:String;
+		
+		private var _FETCH_GEO_IP:String;
+		private var _FETCH_GEO_IP_DONE:String;
+		private var _FETCH_GEO_IP_ERROR:String;
+		private var _FETCH_MIRROR_CGI:String;
+		private var _FETCH_MIRROR_CGI_DONE:String;
+		private var _FETCH_MIRROR_CGI_ERROR:String;
+		private var _FETCH_MIRROR_LIST:String;
+		private var _FETCH_MIRROR_LIST_DONE:String;
+		private var _FETCH_MIRROR_LIST_PARSED:String;
+		
+		private var _INFO_VERIFY_FLEX_SDK_DONE:String;
+		
 		//Labels
 		private var _INSTALL_BTN_LABEL:String;
 		private var _SELECT_PATH_PROMPT:String;
@@ -138,6 +168,23 @@ package org.apache.flex.packageflexsdk.r
 		
 		private function populateStrings():void
 		{
+			_ERROR_VERIFY_FLEX_SDK = _iResourceManager.getString("messagestrings","ERROR_VERIFY_FLEX_SDK");
+			_ERROR_MIRROR_FETCH = _iResourceManager.getString("messagestrings","ERROR_MIRROR_FETCH");
+			
+			_FETCH_GEO_IP = _iResourceManager.getString("messagestrings","FETCH_GEO_IP");
+			_FETCH_GEO_IP_DONE = _iResourceManager.getString("messagestrings","FETCH_GEO_IP_DONE");
+			_FETCH_GEO_IP_ERROR = _iResourceManager.getString("messagestrings","FETCH_GEO_IP_ERROR");
+			_FETCH_MIRROR_CGI = _iResourceManager.getString("messagestrings","FETCH_MIRROR_CGI");
+			_FETCH_MIRROR_CGI_DONE = _iResourceManager.getString("messagestrings","FETCH_MIRROR_CGI_DONE");
+			_FETCH_MIRROR_CGI_ERROR = _iResourceManager.getString("messagestrings","FETCH_MIRROR_CGI_ERROR");
+			_FETCH_MIRROR_LIST = _iResourceManager.getString("messagestrings","FETCH_MIRROR_LIST");
+			_FETCH_MIRROR_LIST_DONE = _iResourceManager.getString("messagestrings","FETCH_MIRROR_LIST_DONE");
+			_FETCH_MIRROR_LIST_PARSED = _iResourceManager.getString("messagestrings","FETCH_MIRROR_LIST_PARSED");
+			
+			_INFO_VERIFY_FLEX_SDK_DONE = _iResourceManager.getString("messagestrings","INFO_VERIFY_FLEX_SDK_DONE");
+			
+			_STEP_VERIFY_FLEX_SDK = _iResourceManager.getString("messagestrings","STEP_VERIFY_FLEX_SDK");
+			
 			_INSTALL_BTN_LABEL = _iResourceManager.getString("messagestrings","install_btn_label");
 			_SELECT_PATH_PROMPT = _iResourceManager.getString("messagestrings","select_path_prompt");
 			_BROWSE_BTN_LABEL = _iResourceManager.getString("messagestrings","browse_btn_label");
@@ -212,6 +259,76 @@ package org.apache.flex.packageflexsdk.r
 			
 		}
 		
+		public function get STEP_VERIFY_FLEX_SDK():String
+		{
+			return _STEP_VERIFY_FLEX_SDK;
+		}
+		
+		public function get ERROR_VERIFY_FLEX_SDK():String
+		{
+			return _ERROR_VERIFY_FLEX_SDK;
+		}
+		
+		public function get ERROR_MIRROR_FETCH():String
+		{
+			return _ERROR_MIRROR_FETCH;
+		}
+		
+		public function get FETCH_GEO_IP():String
+		{
+			return _FETCH_GEO_IP;
+		}
+		
+		public function get FETCH_GEO_IP_DONE():String
+		{
+			return _FETCH_GEO_IP_DONE;
+		}
+		
+		public function get FETCH_GEO_IP_ERROR():String
+		{
+			return _FETCH_GEO_IP_ERROR;
+		}
+		
+		public function get FETCH_MIRROR_CGI():String
+		{
+			return _FETCH_MIRROR_CGI;
+		}
+		
+		public function get FETCH_MIRROR_CGI_DONE():String
+		{
+			return _FETCH_MIRROR_CGI_DONE;
+		}
+		
+		public function get FETCH_MIRROR_CGI_ERROR():String
+		{
+			return _FETCH_MIRROR_CGI_ERROR;
+		}
+		
+		public function get FETCH_MIRROR_LIST():String
+		{
+			return _FETCH_MIRROR_LIST;
+		}
+		
+		public function get FETCH_MIRROR_LIST_DONE():String
+		{
+			return _FETCH_MIRROR_LIST_DONE;
+		}
+		
+		public function get FETCH_MIRROR_LIST_PARSED():String
+		{
+			return _FETCH_MIRROR_LIST_PARSED;
+		}
+		
+		public function get INFO_VERIFY_FLEX_SDK_DONE():String
+		{
+			return _INFO_VERIFY_FLEX_SDK_DONE;
+		}
+		
+		public function get STEP_UNZIP_FLEX_SDK():String
+		{
+			return _STEP_UNZIP_FLEX_SDK;
+		}
+		
 		public function get INFO_DOWNLOADED():String
 		{
 			return _INFO_DOWNLOADED;
@@ -382,11 +499,6 @@ package org.apache.flex.packageflexsdk.r
 			return _STEP_DOWNLOAD_FLEX_SDK;
 		}
 
-		public function get STEP_UNZIP_FLEX_SDK():String
-		{
-			return _STEP_UNZIP_FLEX_SDK;
-		}
-
 		public function get STEP_DOWNLOAD_AIR_RUNTIME_KIT():String
 		{
 			return _STEP_DOWNLOAD_AIR_RUNTIME_KIT;

Added: incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/InternetUtil.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/InternetUtil.as?rev=1369734&view=auto
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/InternetUtil.as (added)
+++ incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/InternetUtil.as Mon Aug  6 07:13:05 2012
@@ -0,0 +1,153 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.packageflexsdk.util
+{
+
+import flash.events.Event;
+import flash.events.IOErrorEvent;
+import flash.net.URLLoader;
+import flash.net.URLLoaderDataFormat;
+import flash.net.URLRequest;
+
+public class InternetUtil
+{
+
+	//--------------------------------------------------------------------------
+	//
+	//    Class properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    instance
+	//----------------------------------
+	
+	private static var _instance:InternetUtil;
+	
+	public static function get instance():InternetUtil
+	{
+		if (!_instance)
+			_instance = new InternetUtil(new SE());
+		
+		return _instance;
+	}
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Constructor
+	//
+	//--------------------------------------------------------------------------
+	
+	public function InternetUtil(se:SE) {}
+		
+	//--------------------------------------------------------------------------
+	//
+	//    Variables
+	//
+	//--------------------------------------------------------------------------
+	
+	private var _callback:Function;
+	
+	private var _urlLoader:URLLoader;
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    errorMessage
+	//----------------------------------
+	
+	private var _errorMessage:String = "";
+
+	public function get errorMessage():String
+	{
+		return _errorMessage;
+	}
+
+	//----------------------------------
+	//    errorOccurred
+	//----------------------------------
+	
+	private var _errorOccurred:Boolean;
+	
+	public function get errorOccurred():Boolean
+	{
+		return _errorOccurred;
+	}
+	
+	//----------------------------------
+	//    result
+	//----------------------------------
+	
+	private var _result:String;
+	
+	public function get result():String
+	{
+		return _result;
+	}
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Methods
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    fetchResultHandler
+	//----------------------------------
+	
+	private function fetchResultHandler(event:Event):void
+	{
+		_errorOccurred = event is IOErrorEvent;
+		
+		if (!_errorOccurred)
+			_result = _urlLoader.data;
+		else
+			_errorMessage = String(IOErrorEvent(event).text);
+		
+		_callback();
+	}
+	
+	//----------------------------------
+	//    fetch
+	//----------------------------------
+	
+	public function fetch(fetchURL:String, fetchCompleteHandler:Function):void
+	{
+		_callback = fetchCompleteHandler;
+		
+		_errorMessage = "";
+		_errorOccurred = false;
+		_result = "";
+		
+		_urlLoader = new URLLoader();
+		_urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
+		_urlLoader.addEventListener(Event.COMPLETE, fetchResultHandler);
+		_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, fetchResultHandler);
+		_urlLoader.load(new URLRequest(fetchURL));
+	}
+	
+}
+}
+
+class SE {}
\ No newline at end of file

Added: incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MD5CompareUtil.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MD5CompareUtil.as?rev=1369734&view=auto
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MD5CompareUtil.as (added)
+++ incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MD5CompareUtil.as Mon Aug  6 07:13:05 2012
@@ -0,0 +1,227 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.packageflexsdk.util
+{
+
+import com.adobe.crypto.MD5Stream;
+
+import flash.events.Event;
+import flash.events.EventDispatcher;
+import flash.events.IOErrorEvent;
+import flash.events.OutputProgressEvent;
+import flash.events.ProgressEvent;
+import flash.filesystem.File;
+import flash.filesystem.FileMode;
+import flash.filesystem.FileStream;
+import flash.net.URLLoader;
+import flash.net.URLLoaderDataFormat;
+import flash.net.URLRequest;
+import flash.utils.ByteArray;
+
+[Event(name="progress", type="flash.events.ProgressEvent")]
+
+public class MD5CompareUtil extends EventDispatcher
+{
+
+	//--------------------------------------------------------------------------
+	//
+	//    Class constants
+	//
+	//--------------------------------------------------------------------------
+	
+	public static const MD5_DOMAIN:String = "https://www.apache.org/dist/";
+	
+	public static const MD5_POSTFIX:String = ".md5";
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Class properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    instance
+	//----------------------------------
+	
+	private static var _instance:MD5CompareUtil;
+	
+	public static function get instance():MD5CompareUtil
+	{
+		if (!_instance)
+			_instance = new MD5CompareUtil(new SE());
+		
+		return _instance;
+	}
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Constructor
+	//
+	//--------------------------------------------------------------------------
+	
+	public function MD5CompareUtil(se:SE) {}
+		
+	//--------------------------------------------------------------------------
+	//
+	//    Variables
+	//
+	//--------------------------------------------------------------------------
+	
+	private var _callback:Function;
+	
+	private var _file:File;
+	
+	private var _fileStream:FileStream;
+	
+	private var _remoteMD5Value:String;
+	
+	private var _md5Stream:MD5Stream;
+	
+	private var _urlLoader:URLLoader;
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    errorMessage
+	//----------------------------------
+	
+	private var _errorMessage:String = "";
+
+	public function get errorMessage():String
+	{
+		return _errorMessage;
+	}
+
+	//----------------------------------
+	//    errorOccurred
+	//----------------------------------
+	
+	private var _errorOccurred:Boolean;
+
+	public function get errorOccurred():Boolean
+	{
+		return _errorOccurred;
+	}
+
+	//----------------------------------
+	//    fileIsVerified
+	//----------------------------------
+	
+	private var _fileIsVerified:Boolean;
+
+	public function get fileIsVerified():Boolean
+	{
+		return _fileIsVerified;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//    Methods
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    compareSignatures
+	//----------------------------------
+	
+	private function compareSignatures():void
+	{
+		_md5Stream = new MD5Stream();
+		
+		_fileStream = new FileStream();
+		_fileStream.addEventListener(Event.COMPLETE, fileStreamOpenHandler);
+		_fileStream.addEventListener(ProgressEvent.PROGRESS, fileStreamOpenHandler);
+		_fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, fileStreamOpenHandler);
+		_fileStream.openAsync(_file, FileMode.READ); 
+	}
+	
+	//----------------------------------
+	//    fileStreamOpenHandler
+	//----------------------------------
+	
+	private function fileStreamOpenHandler(event:Event):void
+	{
+		var data:ByteArray = new ByteArray();
+		_fileStream.readBytes(data, 0, _fileStream.bytesAvailable);
+		
+		if (event is ProgressEvent)
+		{
+			_md5Stream.update(data);
+			
+			dispatchEvent(event.clone());
+		}
+		else
+		{
+			if (event.type == Event.COMPLETE)
+			{
+				_fileIsVerified = (_md5Stream.complete(data) == _remoteMD5Value);
+				
+				_callback();
+			}
+		}
+	}
+	
+	//----------------------------------
+	//    urlLoaderResultHandler
+	//----------------------------------
+	
+	private function urlLoaderResultHandler(event:Event):void
+	{
+		_errorOccurred = event is IOErrorEvent;
+		
+		if (!_errorOccurred)
+		{
+			_remoteMD5Value = String(_urlLoader.data);
+			_remoteMD5Value = _remoteMD5Value.split("\n")[0]; // we need only the first line
+			
+			compareSignatures();
+		}
+		else
+		{
+			_errorMessage = String(IOErrorEvent(event).text);
+		}
+	}
+	
+	//----------------------------------
+	//    verifyMD5
+	//----------------------------------
+	
+	public function verifyMD5(localSDKZipFile:File, remoteSDKZipPath:String, 
+							  onVerificationComplete:Function):void
+	{
+		_file = localSDKZipFile;
+		
+		_callback = onVerificationComplete;
+		
+		_urlLoader = new URLLoader();
+		_urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
+		_urlLoader.addEventListener(Event.COMPLETE, urlLoaderResultHandler);
+		_urlLoader.addEventListener(IOErrorEvent.IO_ERROR, urlLoaderResultHandler);
+		_urlLoader.load(new URLRequest(MD5_DOMAIN + remoteSDKZipPath + MD5_POSTFIX));
+	}
+	
+}
+}
+
+class SE {}
\ No newline at end of file

Added: incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MirrorURLUtil.as
URL: http://svn.apache.org/viewvc/incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MirrorURLUtil.as?rev=1369734&view=auto
==============================================================================
--- incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MirrorURLUtil.as (added)
+++ incubator/flex/utilities/InstallApacheFlex/src/org/apache/flex/packageflexsdk/util/MirrorURLUtil.as Mon Aug  6 07:13:05 2012
@@ -0,0 +1,224 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.packageflexsdk.util
+{
+import mx.collections.ArrayCollection;
+
+import org.apache.flex.packageflexsdk.resource.ViewResourceConstants;
+
+public class MirrorURLUtil
+{
+
+	//--------------------------------------------------------------------------
+	//
+	//    Class properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    instance
+	//----------------------------------
+	
+	private static var _instance:MirrorURLUtil;
+	
+	public static function get instance():MirrorURLUtil
+	{
+		if (!_instance)
+			_instance = new MirrorURLUtil(new SE());
+		
+		return _instance;
+	}
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Constructor
+	//
+	//--------------------------------------------------------------------------
+	
+	public function MirrorURLUtil(se:SE) 
+	{
+		_internetUtil = InternetUtil.instance;
+		
+		_constants = ViewResourceConstants.getInstance();
+	}
+		
+	//--------------------------------------------------------------------------
+	//
+	//    Constants
+	//
+	//--------------------------------------------------------------------------
+	
+	private const FIRST:String = "first";
+	private const SECOND:String = "second";
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Variables
+	//
+	//--------------------------------------------------------------------------
+	
+	private var _callback:Function;
+	private var _internetUtil:InternetUtil;
+	private var _log:ArrayCollection;
+	private var _mirrorFetchStep:String;
+	private var _constants:ViewResourceConstants;
+	private var _userCountryCode:String;
+	
+	//--------------------------------------------------------------------------
+	//
+	//    Properties
+	//
+	//--------------------------------------------------------------------------
+	
+	//----------------------------------
+	//    url
+	//----------------------------------
+	
+	private var _url:String;
+
+	public function get url():String
+	{
+		return _url;
+	}
+
+	//--------------------------------------------------------------------------
+	//
+	//    Methods
+	//
+	//--------------------------------------------------------------------------
+	
+	private function addLogLine(line:String):void
+	{
+		_log.addItem(line);
+	}
+	
+	//----------------------------------
+	//    fetchGeoIPResult
+	//----------------------------------
+	
+	private function fetchGeoIPResult():void
+	{
+		if (!_internetUtil.errorOccurred)
+		{
+			addLogLine(_constants.FETCH_GEO_IP_DONE);
+			
+			_userCountryCode = _internetUtil.result.toLowerCase();
+			
+			addLogLine(_constants.FETCH_MIRROR_LIST);
+			
+			_internetUtil.fetch(ViewResourceConstants.URL_FETCH_MIRROR_LIST, fetchMirrorListResult);
+		}
+		else
+		{
+			addLogLine(_constants.FETCH_GEO_IP_ERROR);
+			
+			addLogLine(_constants.ERROR_MIRROR_FETCH + _internetUtil.errorMessage);
+			
+			_callback(true, _log);
+		}
+	}
+	
+	//----------------------------------
+	//    fetchMirrorListResult
+	//----------------------------------
+	
+	private function fetchMirrorListResult():void
+	{
+		var abort:Boolean;
+		
+		if (!_internetUtil.errorOccurred)
+		{
+			addLogLine(_constants.FETCH_MIRROR_LIST_DONE);
+			
+			var mirrorListArrayFiltered:Array = [];
+			var mirrorListArrayRaw:Array = _internetUtil.result.split("\n");
+			
+			var i:int;
+			var n:int = mirrorListArrayRaw.length;
+			var mirrorArray:Array;
+			for (i = n - 1; i > -1; i--)
+			{
+				mirrorArray = mirrorListArrayRaw[i].split(" ");
+				if (mirrorArray[0] == "http" && mirrorArray[1] == _userCountryCode)
+				{
+					mirrorListArrayFiltered.push(mirrorArray[2]);
+				}
+			}
+			
+			n = mirrorListArrayFiltered.length;
+			i = Math.floor(Math.random() * n);
+			
+			_url = mirrorListArrayFiltered[i];
+			
+			addLogLine(_constants.FETCH_MIRROR_LIST_PARSED + "'" + _url + "'");
+		}
+		else
+		{
+			addLogLine(_constants.ERROR_MIRROR_FETCH + _internetUtil.errorMessage);
+
+			abort = true;
+		}
+		
+		_callback(abort, _log);
+	}
+	
+	//----------------------------------
+	//    fetchMirrorFromCGIResult
+	//----------------------------------
+	
+	private function fetchMirrorFromCGIResult():void 
+	{
+		if (!_internetUtil.errorOccurred)
+		{
+			addLogLine(_constants.FETCH_MIRROR_CGI_DONE);
+			
+			_url = _internetUtil.result;
+			
+			_callback(false, _log);
+		}
+		else
+		{
+			addLogLine(_constants.FETCH_MIRROR_CGI_ERROR);
+			
+			addLogLine(_constants.FETCH_GEO_IP);
+			
+			_internetUtil.fetch(ViewResourceConstants.URL_FETCH_GEO_IP, fetchGeoIPResult);
+		}
+	}
+	
+	//----------------------------------
+	//    getMirrorURL
+	//----------------------------------
+	
+	public function getMirrorURL(callback:Function):void
+	{
+		_callback = callback;
+	
+		_log = new ArrayCollection();
+		
+		addLogLine(_constants.FETCH_MIRROR_CGI);
+
+		_internetUtil.fetch(ViewResourceConstants.URL_FETCH_MIRROR_CGI, fetchMirrorFromCGIResult);
+	}
+	
+}
+}
+
+class SE {}
\ No newline at end of file



Mime
View raw message