You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by bi...@apache.org on 2012/08/06 09:13:06 UTC
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/
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