├── .gitignore ├── LICENSE ├── README.textile ├── bin ├── examples │ ├── ALLoggerExample.swf │ ├── AddConfigComplexExample.swf │ ├── AddConfigExample.swf │ ├── AddLazyExample.swf │ ├── SoundLoaderOnReadyExample.swf │ ├── StatsMonitorExample.swf │ ├── complex-queue-config.xml │ └── simple-queue-config.xml └── testing │ ├── FlexTestSuite.swf │ └── assets │ ├── InspectorTestAssets.fla │ ├── InspectorTestAssets.swf │ └── test │ ├── testCSS.css │ ├── testIMAGE.png │ ├── testJSON.json │ ├── testSOUND.mp3 │ ├── testSWF.swf │ ├── testTXT.txt │ ├── testVIDEO.flv │ ├── testXML.xml │ └── testZIP.zip ├── build.properties ├── build.xml ├── build └── libs │ ├── as3-signals-v0.8.swc │ ├── as3corelib-json.swc │ └── flexunit │ ├── License.txt │ ├── as3-signals-utilities-async-v0.8.swc │ ├── flexUnitTasks-4.1.0-8-javadoc.jar │ ├── flexUnitTasks-4.1.0-8-sources.jar │ ├── flexUnitTasks-4.1.0-8.jar │ ├── flexunit-4.1.0-8-flex_4.1.0.16076.swc │ ├── flexunit-aircilistener-4.1.0-8-4.1.0.16076.swc │ ├── flexunit-cilistener-4.1.0-8-4.1.0.16076.swc │ ├── flexunit-flexcoverlistener-4.1.0-8-4.1.0.16076.swc │ ├── flexunit-uilistener-4.1.0-8-4.1.0.16076.swc │ └── fluint-extensions-4.1.0-8-4.1.0.16076.swc ├── src └── org │ └── assetloader │ ├── AssetLoader.as │ ├── base │ ├── AbstractLoader.as │ ├── AssetLoaderBase.as │ ├── AssetLoaderError.as │ ├── AssetType.as │ ├── LoaderFactory.as │ ├── LoaderStats.as │ ├── Param.as │ └── StatsMonitor.as │ ├── core │ ├── IAssetLoader.as │ ├── IConfigParser.as │ ├── ILoadStats.as │ ├── ILoader.as │ └── IParam.as │ ├── loaders │ ├── BaseLoader.as │ ├── BinaryLoader.as │ ├── CSSLoader.as │ ├── DisplayObjectLoader.as │ ├── ImageLoader.as │ ├── JSONLoader.as │ ├── SWFLoader.as │ ├── SoundLoader.as │ ├── TextLoader.as │ ├── VideoLoader.as │ └── XMLLoader.as │ ├── parsers │ ├── URLParser.as │ └── XmlConfigParser.as │ ├── signals │ ├── ErrorSignal.as │ ├── HttpStatusSignal.as │ ├── LoaderSignal.as │ ├── NetStatusSignal.as │ └── ProgressSignal.as │ └── utils │ ├── ALLogger.as │ └── Inspector.as ├── src_examples └── org │ └── assetloader │ └── example │ ├── ALLoggerExample.as │ ├── AddConfigComplexExample.as │ ├── AddConfigExample.as │ ├── AddLazyExample.as │ ├── SoundLoaderOnReadyExample.as │ └── StatsMonitorExample.as └── src_unit ├── FlexUnitRunner.mxml └── org └── assetloader ├── AssetLoaderTest.as ├── AssetLoaderTestSuite.as ├── base ├── AbstractLoaderTest.as ├── AssetLoaderErrorTest.as ├── AssetLoaderQueueTest.as ├── BaseTestSuite.as ├── LoaderFactoryTest.as ├── LoaderStatsTest.as ├── ParamTest.as └── StatsMonitorTest.as ├── loaders ├── BaseLoaderTest.as ├── BinaryLoaderTest.as ├── CSSLoaderTest.as ├── DisplayObjectLoaderTest.as ├── ImageLoaderTest.as ├── JSONLoaderTest.as ├── LoadersTestSuite.as ├── SWFLoaderTest.as ├── SoundLoaderTest.as ├── TextLoaderTest.as ├── VideoLoaderTest.as └── XMLLoaderTest.as ├── parsers ├── ParsersTestSuite.as ├── URLParserTest.as └── XmlConfigParserTest.as └── utils ├── InspectorTest.as └── UtilsTestSuite.as /.gitignore: -------------------------------------------------------------------------------- 1 | /.settings/* 2 | 3 | /html-template/* 4 | /bin-debug/* 5 | /bin-release/* 6 | /bin/*.swc 7 | /bin/*.cache 8 | /bin/testing/*.cache 9 | docs/* 10 | obj/* 11 | 12 | .actionScriptProperties 13 | .flexProperties 14 | .flexLibProperties 15 | .FlexUnitSettings 16 | .project 17 | 18 | Icon 19 | Thumbs.db 20 | .DS_Store 21 | dist/* 22 | report/* 23 | doc/* 24 | 25 | user.properties 26 | 27 | *.iml 28 | *.ipr 29 | *.iws -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2009, 2010 the original author or authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.textile: -------------------------------------------------------------------------------- 1 | h2. AssetLoader 2 | 3 | Multi file/asset loader for AS3 built on AS3Signals. 4 | 5 | h3. Overview 6 | 7 | AssetLoader provides an easy way to load multiple files. Assetloader does not use events; instead it uses "AS3Signals":http://github.com/robertpenner/as3-signals. 8 | 9 | h3. Some Features 10 | 11 | Please check out the "wiki section":http://github.com/Matan/AssetLoader/wiki for more information and examples. 12 | 13 | * Automatic Type detection. 14 | * Multiple connections, which you can define = faster loading = less waiting = happier users. 15 | * **No Events, AS3Signals only.** 16 | * No singletons! Construct as many AssetLoaders as you want! 17 | * Data is dispatched with strong types. NO CASTING! 18 | * Endless recursive group loaders within loaders, within loaders, etc. 19 | * Pause/Resume/Destroy capabilities. 20 | * Dynamic parameter system that works with code completion - No guessing! 21 | * Loader parameters smartly inherit from their parent loaders, which mean you write less code. 22 | * Real-time loading stats. This provides latency, speed, average and progress of all downloads. 23 | * Consolidated stats, loaders reclusively consolidate loading stats all the way down to the last child. 24 | * Can be configured via XML, straight up or from an external file with one easy call. 25 | * All loader errors are consolidated to one signal. IOError, SecurityError, etc. - you don't have to worry about it, they all boil down to one place. Which means you can "globally" handle loading errors with one listener/command. 26 | * Interfaces all round. 27 | * Unit tested! :D 28 | * Works super well with "Robotlegs":http://www.robotlegs.org! //what doesn’t :P 29 | * And some other stuff too! 30 | 31 | h2. License 32 | 33 | The MIT License 34 | 35 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 36 | 37 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 38 | 39 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /bin/examples/ALLoggerExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/ALLoggerExample.swf -------------------------------------------------------------------------------- /bin/examples/AddConfigComplexExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/AddConfigComplexExample.swf -------------------------------------------------------------------------------- /bin/examples/AddConfigExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/AddConfigExample.swf -------------------------------------------------------------------------------- /bin/examples/AddLazyExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/AddLazyExample.swf -------------------------------------------------------------------------------- /bin/examples/SoundLoaderOnReadyExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/SoundLoaderOnReadyExample.swf -------------------------------------------------------------------------------- /bin/examples/StatsMonitorExample.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/examples/StatsMonitorExample.swf -------------------------------------------------------------------------------- /bin/examples/complex-queue-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /bin/examples/simple-queue-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /bin/testing/FlexTestSuite.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/FlexTestSuite.swf -------------------------------------------------------------------------------- /bin/testing/assets/InspectorTestAssets.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/InspectorTestAssets.fla -------------------------------------------------------------------------------- /bin/testing/assets/InspectorTestAssets.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/InspectorTestAssets.swf -------------------------------------------------------------------------------- /bin/testing/assets/test/testCSS.css: -------------------------------------------------------------------------------- 1 | body 2 | { 3 | background-color:#d0e4fe; 4 | } 5 | h1 6 | { 7 | color:orange; 8 | text-align:center; 9 | } 10 | p 11 | { 12 | font-family:"Times New Roman"; 13 | font-size:20px; 14 | } -------------------------------------------------------------------------------- /bin/testing/assets/test/testIMAGE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/test/testIMAGE.png -------------------------------------------------------------------------------- /bin/testing/assets/test/testJSON.json: -------------------------------------------------------------------------------- 1 | {"base":"http://www.matan.co.za/AssetLoader/testAssets/","assets":[{"id":"SAMPLE_GROUP","preventCache":false,"assets":[{"src":"sampleTXT.txt","id":"SAMPLE_TXT"},{"src":"sampleJSON.json","id":"SAMPLE_JSON"},{"src":"sampleXML.xml","id":"SAMPLE_XML"},{"src":"sampleCSS.css","id":"SAMPLE_CSS"},{"src":"sampleZIP.zip","weight":3493,"id":"SAMPLE_BINARY"},{"src":"sampleSOUND.mp3","weight":"213 kb","id":"SAMPLE_SOUND"}],"connections":0},{"assets":[{"src":"sampleIMAGE.jpg","weight":"328.5 kb","id":"SAMPLE_IMAGE"},{"id":"SAMPLE_VIDEO","onDemand":true,"src":"sampleVIDEO.mp4","weight":"10 mb"},{"id":"SAMPLE_SWF","src":"sampleSWF.swf","weight":941410,"priority":1}],"preventCache":true},{"base":"/","id":"SAMPLE_ERROR","src":"fileThatDoesNotExist.php","type":"image","retries":5}],"connections":3} -------------------------------------------------------------------------------- /bin/testing/assets/test/testSOUND.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/test/testSOUND.mp3 -------------------------------------------------------------------------------- /bin/testing/assets/test/testSWF.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/test/testSWF.swf -------------------------------------------------------------------------------- /bin/testing/assets/test/testTXT.txt: -------------------------------------------------------------------------------- 1 | FlexUnit 4 is under an MIT license. 2 | 3 | Copyright (c) 2007 Digital Primates IT Consulting Group 4 | 5 | Permission is hereby granted, free of charge, to any person 6 | obtaining a copy of this software and associated documentation 7 | files (the "Software"), to deal in the Software without 8 | restriction, including without limitation the rights to use, 9 | copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following 12 | conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | 26 | http://flexunit.org/ -------------------------------------------------------------------------------- /bin/testing/assets/test/testVIDEO.flv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/test/testVIDEO.flv -------------------------------------------------------------------------------- /bin/testing/assets/test/testXML.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /bin/testing/assets/test/testZIP.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/bin/testing/assets/test/testZIP.zip -------------------------------------------------------------------------------- /build.properties: -------------------------------------------------------------------------------- 1 | #Properties file for build.xml 2 | project.name = AssetLoader 3 | 4 | #Version number for current AssetLoader and AS3Singals releases 5 | assetloader.ver.num = v2.5.1 6 | as3.signals.version = v0.8 7 | project.name.versioned = ${project.name}-${assetloader.ver.num} 8 | as3.signals.name.versioned = as3-signals-${as3.signals.version} 9 | as3.corelib.json.name = as3corelib-json 10 | 11 | #build locations 12 | asdoc.loc = ${FLEX_HOME}/bin/asdoc 13 | main.src.loc = ${basedir}/src 14 | test.src.loc = ${basedir}/src_unit 15 | exam.src.loc = ${basedir}/src_examples 16 | bin.loc = ${basedir}/bin 17 | report.loc = ${basedir}/report 18 | dist.loc = ${basedir}/dist 19 | doc.loc = ${basedir}/doc 20 | lib.loc = ${basedir}/build/libs 21 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | [clean] Removing Build and Report directories 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | [clean] Build and Report directories removed 43 | 44 | 45 | 46 | 47 | [init] Creating Bin and Report directories 48 | 49 | 50 | [init] Bin and Report directories created 51 | 52 | 53 | 54 | 55 | [compile] Compiling release SWC 56 | [compile] Using Flex SDK at: ${FLEX_HOME} 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | [compile] Release SWC ${project.name.versioned}.swc created successfully 71 | 72 | 73 | 74 | 75 | [test] Running Unit Tests 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | [test] Running SWF ${build.loc}/testing/FlexTestSuite.swf 94 | 95 | 96 | 102 | [test] Finished running Unit Tests 103 | 104 | 105 | 106 | 107 | [asdoc] Generating ASDOC documentation 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | [asdoc] ASDOC documentation generated successfully 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | [package] Packaging Release 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | [package] Release packaged successfully 181 | 182 | 183 | -------------------------------------------------------------------------------- /build/libs/as3-signals-v0.8.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/as3-signals-v0.8.swc -------------------------------------------------------------------------------- /build/libs/as3corelib-json.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/as3corelib-json.swc -------------------------------------------------------------------------------- /build/libs/flexunit/License.txt: -------------------------------------------------------------------------------- 1 | FlexUnit 4 is under an MIT license. 2 | 3 | Copyright (c) 2007 Digital Primates IT Consulting Group 4 | 5 | Permission is hereby granted, free of charge, to any person 6 | obtaining a copy of this software and associated documentation 7 | files (the "Software"), to deal in the Software without 8 | restriction, including without limitation the rights to use, 9 | copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following 12 | conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | 26 | http://flexunit.org/ -------------------------------------------------------------------------------- /build/libs/flexunit/as3-signals-utilities-async-v0.8.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/as3-signals-utilities-async-v0.8.swc -------------------------------------------------------------------------------- /build/libs/flexunit/flexUnitTasks-4.1.0-8-javadoc.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexUnitTasks-4.1.0-8-javadoc.jar -------------------------------------------------------------------------------- /build/libs/flexunit/flexUnitTasks-4.1.0-8-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexUnitTasks-4.1.0-8-sources.jar -------------------------------------------------------------------------------- /build/libs/flexunit/flexUnitTasks-4.1.0-8.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexUnitTasks-4.1.0-8.jar -------------------------------------------------------------------------------- /build/libs/flexunit/flexunit-4.1.0-8-flex_4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexunit-4.1.0-8-flex_4.1.0.16076.swc -------------------------------------------------------------------------------- /build/libs/flexunit/flexunit-aircilistener-4.1.0-8-4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexunit-aircilistener-4.1.0-8-4.1.0.16076.swc -------------------------------------------------------------------------------- /build/libs/flexunit/flexunit-cilistener-4.1.0-8-4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexunit-cilistener-4.1.0-8-4.1.0.16076.swc -------------------------------------------------------------------------------- /build/libs/flexunit/flexunit-flexcoverlistener-4.1.0-8-4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexunit-flexcoverlistener-4.1.0-8-4.1.0.16076.swc -------------------------------------------------------------------------------- /build/libs/flexunit/flexunit-uilistener-4.1.0-8-4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/flexunit-uilistener-4.1.0-8-4.1.0.16076.swc -------------------------------------------------------------------------------- /build/libs/flexunit/fluint-extensions-4.1.0-8-4.1.0.16076.swc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Matan/AssetLoader/e717ee7f410439ba2880621a70d191793cac2c46/build/libs/flexunit/fluint-extensions-4.1.0-8-4.1.0.16076.swc -------------------------------------------------------------------------------- /src/org/assetloader/AssetLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader 2 | { 3 | import org.assetloader.base.AssetLoaderBase; 4 | import org.assetloader.base.AssetLoaderError; 5 | import org.assetloader.base.AssetType; 6 | import org.assetloader.base.Param; 7 | import org.assetloader.core.IAssetLoader; 8 | import org.assetloader.core.ILoader; 9 | import org.assetloader.parsers.URLParser; 10 | import org.assetloader.signals.ErrorSignal; 11 | import org.assetloader.signals.LoaderSignal; 12 | 13 | import flash.net.URLRequest; 14 | 15 | /** 16 | * @author Matan Uberstein 17 | */ 18 | public class AssetLoader extends AssetLoaderBase implements IAssetLoader 19 | { 20 | /** 21 | * @private 22 | */ 23 | protected var _onChildOpen : LoaderSignal; 24 | /** 25 | * @private 26 | */ 27 | protected var _onChildError : ErrorSignal; 28 | /** 29 | * @private 30 | */ 31 | protected var _onChildComplete : LoaderSignal; 32 | 33 | public function AssetLoader(id : String = "PrimaryGroup") 34 | { 35 | super(id); 36 | } 37 | 38 | /** 39 | * @private 40 | */ 41 | override protected function initSignals() : void 42 | { 43 | super.initSignals(); 44 | _onChildOpen = new LoaderSignal(ILoader); 45 | _onChildError = new ErrorSignal(ILoader); 46 | _onChildComplete = new LoaderSignal(ILoader); 47 | } 48 | 49 | /** 50 | * @inheritDoc 51 | */ 52 | public function addConfig(config : String) : void 53 | { 54 | var urlParser : URLParser = new URLParser(config); 55 | if(urlParser.isValid) 56 | { 57 | var loader : ILoader = _loaderFactory.produce("config", AssetType.TEXT, new URLRequest(config)); 58 | loader.setParam(Param.PREVENT_CACHE, true); 59 | 60 | loader.onError.add(error_handler); 61 | loader.onComplete.add(configLoader_complete_handler); 62 | loader.start(); 63 | } 64 | else 65 | { 66 | try 67 | { 68 | configParser.parse(this, config); 69 | } 70 | catch(error : Error) 71 | { 72 | throw new AssetLoaderError(AssetLoaderError.COULD_NOT_PARSE_CONFIG(_id, error.message), error.errorID); 73 | } 74 | } 75 | } 76 | 77 | /** 78 | * @inheritDoc 79 | */ 80 | override public function start() : void 81 | { 82 | _data = _assets; 83 | _invoked = true; 84 | _stopped = false; 85 | 86 | sortIdsByPriority(); 87 | 88 | if(numConnections == 0) 89 | numConnections = _numLoaders; 90 | 91 | super.start(); 92 | 93 | for(var k : int = 0;k < numConnections;k++) 94 | { 95 | startNextLoader(); 96 | } 97 | } 98 | 99 | /** 100 | * @inheritDoc 101 | */ 102 | public function startLoader(id : String) : void 103 | { 104 | var loader : ILoader = getLoader(id); 105 | if(loader) 106 | loader.start(); 107 | 108 | updateTotalBytes(); 109 | } 110 | 111 | /** 112 | * @inheritDoc 113 | */ 114 | override public function stop() : void 115 | { 116 | var loader : ILoader; 117 | 118 | for(var i : int = 0;i < _numLoaders;i++) 119 | { 120 | loader = getLoader(_ids[i]); 121 | 122 | if(!loader.loaded) 123 | loader.stop(); 124 | } 125 | 126 | super.stop(); 127 | } 128 | 129 | // --------------------------------------------------------------------------------------------------------------------------------// 130 | // PROTECTED FUNCTIONS 131 | // --------------------------------------------------------------------------------------------------------------------------------// 132 | /** 133 | * @private 134 | */ 135 | protected function sortIdsByPriority() : void 136 | { 137 | var priorities : Array = []; 138 | for(var i : int = 0;i < _numLoaders;i++) 139 | { 140 | var loader : ILoader = getLoader(_ids[i]); 141 | priorities.push(loader.getParam(Param.PRIORITY)); 142 | } 143 | 144 | var sortedIndexs : Array = priorities.sort(Array.NUMERIC | Array.DESCENDING | Array.RETURNINDEXEDARRAY); 145 | var idsCopy : Array = _ids.concat(); 146 | 147 | for(var j : int = 0;j < _numLoaders;j++) 148 | { 149 | _ids[j] = idsCopy[sortedIndexs[j]]; 150 | } 151 | } 152 | 153 | /** 154 | * @private 155 | */ 156 | protected function startNextLoader() : void 157 | { 158 | if(_invoked) 159 | { 160 | var loader : ILoader; 161 | var ON_DEMAND : String = Param.ON_DEMAND; 162 | for(var i : int = 0;i < _numLoaders;i++) 163 | { 164 | loader = getLoader(_ids[i]); 165 | 166 | if(!loader.loaded && !loader.failed && !loader.getParam(ON_DEMAND)) 167 | { 168 | if(!loader.invoked || (loader.invoked && loader.stopped)) 169 | { 170 | startLoader(loader.id); 171 | return; 172 | } 173 | } 174 | } 175 | } 176 | } 177 | 178 | /** 179 | * @private 180 | */ 181 | protected function checkForComplete(signal : LoaderSignal) : void 182 | { 183 | var sum : int = _failOnError ? _numLoaded : _numLoaded + _numFailed; 184 | if(sum == _numLoaders) 185 | super.complete_handler(signal, _assets); 186 | else 187 | startNextLoader(); 188 | } 189 | 190 | // --------------------------------------------------------------------------------------------------------------------------------// 191 | // PROTECTED HANDLERS 192 | // --------------------------------------------------------------------------------------------------------------------------------// 193 | /** 194 | * @private 195 | */ 196 | override protected function open_handler(signal : LoaderSignal) : void 197 | { 198 | _inProgress = true; 199 | _onChildOpen.dispatch(this, signal.loader); 200 | super.open_handler(signal); 201 | } 202 | 203 | /** 204 | * @private 205 | */ 206 | override protected function error_handler(signal : ErrorSignal) : void 207 | { 208 | var loader : ILoader = signal.loader; 209 | 210 | _failedIds.push(loader.id); 211 | _numFailed = _failedIds.length; 212 | 213 | _onChildError.dispatch(this, signal.type, signal.message, loader); 214 | super.error_handler(signal); 215 | 216 | if(!_failOnError) 217 | checkForComplete(signal); 218 | else 219 | startNextLoader(); 220 | } 221 | 222 | /** 223 | * @private 224 | */ 225 | override protected function complete_handler(signal : LoaderSignal, data : * = null) : void 226 | { 227 | var loader : ILoader = signal.loader; 228 | 229 | removeListeners(loader); 230 | 231 | _assets[loader.id] = loader.data; 232 | _loadedIds.push(loader.id); 233 | _numLoaded = _loadedIds.length; 234 | 235 | _onChildComplete.dispatch(this, signal.loader); 236 | 237 | checkForComplete(signal); 238 | } 239 | 240 | /** 241 | * @private 242 | */ 243 | protected function configLoader_complete_handler(signal : LoaderSignal, data : *) : void 244 | { 245 | var loader : ILoader = signal.loader; 246 | loader.onComplete.remove(configLoader_complete_handler); 247 | loader.onError.remove(error_handler); 248 | 249 | if(!configParser.isValid(loader.data)) 250 | _onError.dispatch(this, "config-error", "Could not parse config after it has been loaded."); 251 | else 252 | { 253 | addConfig(loader.data); 254 | _onConfigLoaded.dispatch(this); 255 | } 256 | 257 | loader.destroy(); 258 | } 259 | 260 | /** 261 | * @inheritDoc 262 | */ 263 | public function get onChildOpen() : LoaderSignal 264 | { 265 | return _onChildOpen; 266 | } 267 | 268 | /** 269 | * @inheritDoc 270 | */ 271 | public function get onChildError() : ErrorSignal 272 | { 273 | return _onChildError; 274 | } 275 | 276 | /** 277 | * @inheritDoc 278 | */ 279 | public function get onChildComplete() : LoaderSignal 280 | { 281 | return _onChildComplete; 282 | } 283 | } 284 | } -------------------------------------------------------------------------------- /src/org/assetloader/base/AssetLoaderError.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | 4 | /** 5 | * AssetLoader errors. 6 | * 7 | * @author Matan Uberstein 8 | */ 9 | public class AssetLoaderError extends Error 10 | { 11 | public static const INVALID_URL : String = "Asset's url is invalid."; 12 | public static const ASSET_TYPE_NOT_RECOGNIZED : String = "Asset type not recognized. Try an asset type found on org.assetloader.base.AssetType ."; 13 | public static const ASSET_AUTO_TYPE_NOT_FOUND : String = "Could not determine asset's type automatically. Please set the asset's type."; 14 | public static const ALREADY_CONTAINS_LOADER : String = "Already contains this instance of ILoader."; 15 | public static const DOESNT_CONTAIN_LOADER : String = "Does not contain this instance of ILoader, thus it cannot be removed."; 16 | 17 | public function AssetLoaderError(message : * = "", id : * = 0) 18 | { 19 | super("[AssetLoaderError] " + message, id); 20 | } 21 | 22 | public static function COULD_NOT_PARSE_CONFIG(id : String, message : String) : String 23 | { 24 | return "AssetLoader (" + id + "), Could not parse config, message from parser: " + message; 25 | } 26 | 27 | public static function ALREADY_CONTAINS_LOADER_WITH_ID(parentId : String, childId : String) : String 28 | { 29 | return "AssetLoader (" + parentId + ") already contains a child with the same id (" + childId + ")."; 30 | } 31 | 32 | public static function CIRCULAR_REFERENCE_FOUND(id : String) : String 33 | { 34 | return "AssetLoader (" + id + ") has detected that somewhere in it's loading queue it contains itself."; 35 | } 36 | 37 | public static function ALREADY_CONTAINED_BY_OTHER(id : String, currentParentId : String) : String 38 | { 39 | return "Loader (" + id + ") is already contained by IAssetLoader (" + currentParentId + "). Remove from parent first."; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/org/assetloader/base/AssetType.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | 4 | /** 5 | * @author Matan Uberstein 6 | * 7 | * Asset type constants. 8 | */ 9 | public class AssetType 10 | { 11 | public static const AUTO : String = "AUTO"; public static const GROUP : String = "GROUP"; 12 | 13 | public static const TEXT : String = "TEXT"; 14 | public static const JSON : String = "JSON"; public static const XML : String = "XML"; public static const CSS : String = "CSS"; 15 | 16 | public static const BINARY : String = "BINARY"; 17 | 18 | public static const DISPLAY_OBJECT : String = "DISPLAY_OBJECT"; public static const SWF : String = "SWF"; public static const IMAGE : String = "IMAGE"; public static const SOUND : String = "SOUND"; 19 | public static const VIDEO : String = "VIDEO"; } 20 | } 21 | -------------------------------------------------------------------------------- /src/org/assetloader/base/LoaderFactory.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.parsers.URLParser; 4 | import org.assetloader.AssetLoader; 5 | import org.assetloader.core.ILoader; 6 | import org.assetloader.core.IParam; 7 | import org.assetloader.loaders.BinaryLoader; 8 | import org.assetloader.loaders.CSSLoader; 9 | import org.assetloader.loaders.DisplayObjectLoader; 10 | import org.assetloader.loaders.ImageLoader; 11 | import org.assetloader.loaders.JSONLoader; 12 | import org.assetloader.loaders.SWFLoader; 13 | import org.assetloader.loaders.SoundLoader; 14 | import org.assetloader.loaders.TextLoader; 15 | import org.assetloader.loaders.VideoLoader; 16 | import org.assetloader.loaders.XMLLoader; 17 | 18 | import flash.net.URLRequest; 19 | 20 | /** 21 | * LoaderFactory purly generates ILoader instances. 22 | * 23 | * @see org.assetloader.core.ILoader 24 | * 25 | * @author Matan Uberstein 26 | */ 27 | public class LoaderFactory 28 | { 29 | /** 30 | * @private 31 | */ 32 | protected var _loader : AbstractLoader; 33 | 34 | public function LoaderFactory() 35 | { 36 | } 37 | 38 | /** 39 | * Produces an ILoader instance according to parameters passed. 40 | * 41 | * @param id Unique Loader id. 42 | * @param type Type of the new ILoader. 43 | * @param request URLRequest to be loaded. 44 | * @param params Rest argument of parameters to be passed to ILoader. 45 | * 46 | * @return Resulting ILoader. 47 | * 48 | * @see org.assetloader.base.AssetType * @see org.assetloader.base.Param * @see org.assetloader.core.ILoader 49 | */ 50 | public function produce(id : String, type : String = "AUTO", request : URLRequest = null, params : Array = null) : ILoader 51 | { 52 | if(request) 53 | { 54 | var urlParser : URLParser = new URLParser(request.url); 55 | if(urlParser.isValid) 56 | { 57 | if(type == AssetType.AUTO) 58 | type = getTypeFromExtension(urlParser.fileExtension); 59 | } 60 | else 61 | throw new AssetLoaderError(AssetLoaderError.INVALID_URL); 62 | 63 | } 64 | else if(type == AssetType.AUTO) 65 | type = AssetType.GROUP; 66 | 67 | constructLoader(type, id, request); 68 | 69 | if(params) 70 | processParams(params); 71 | 72 | return _loader; 73 | } 74 | 75 | /** 76 | * @private 77 | */ 78 | protected function processParams(assetParams : Array) : void 79 | { 80 | var pL : int = assetParams.length; 81 | for(var i : int = 0;i < pL;i++) 82 | { 83 | if(assetParams[i] is IParam) 84 | { 85 | var param : IParam = assetParams[i]; 86 | _loader.setParam(param.id, param.value); 87 | } 88 | else if(assetParams[i] is Array) 89 | processParams(assetParams[i]); 90 | } 91 | } 92 | 93 | /** 94 | * @private 95 | */ 96 | protected function getTypeFromExtension(extension : String) : String 97 | { 98 | if(!extension) 99 | extension = ""; 100 | 101 | extension = extension.toLowerCase(); 102 | 103 | var textExt : Array = ["txt", "js", "html", "htm", "php", "asp", "aspx", "jsp", "cfm"]; 104 | var imageExt : Array = ["jpg", "jpeg", "png", "gif"]; 105 | var videoExt : Array = ["flv", "f4v", "f4p", "mp4", "mov"]; 106 | 107 | if(testExtenstion(textExt, extension)) 108 | return AssetType.TEXT; 109 | 110 | if(extension == "json") 111 | return AssetType.JSON; 112 | 113 | if(extension == "xml") 114 | return AssetType.XML; 115 | 116 | if(extension == "css") 117 | return AssetType.CSS; 118 | 119 | if(extension == "zip") 120 | return AssetType.BINARY; 121 | 122 | if(extension == "swf") 123 | return AssetType.SWF; 124 | 125 | if(testExtenstion(imageExt, extension)) 126 | return AssetType.IMAGE; 127 | 128 | if(extension == "mp3") 129 | return AssetType.SOUND; 130 | 131 | if(testExtenstion(videoExt, extension)) 132 | return AssetType.VIDEO; 133 | 134 | throw new AssetLoaderError(AssetLoaderError.ASSET_AUTO_TYPE_NOT_FOUND); 135 | 136 | return ""; 137 | } 138 | 139 | /** 140 | * @private 141 | */ 142 | protected function testExtenstion(extensions : Array, extension : String) : Boolean 143 | { 144 | if(extensions.indexOf(extension) != -1) 145 | return true; 146 | return false; 147 | } 148 | 149 | /** 150 | * @private 151 | */ 152 | protected function constructLoader(type : String, id : String, request : URLRequest) : void 153 | { 154 | switch(type) 155 | { 156 | case AssetType.TEXT: 157 | _loader = new TextLoader(request, id); 158 | break; 159 | 160 | case AssetType.JSON: 161 | _loader = new JSONLoader(request, id); 162 | break; 163 | 164 | case AssetType.XML: 165 | _loader = new XMLLoader(request, id); 166 | break; 167 | 168 | case AssetType.CSS: 169 | _loader = new CSSLoader(request, id); 170 | break; 171 | 172 | case AssetType.BINARY: 173 | _loader = new BinaryLoader(request, id); 174 | break; 175 | 176 | case AssetType.DISPLAY_OBJECT: 177 | _loader = new DisplayObjectLoader(request, id); 178 | break; 179 | 180 | case AssetType.SWF: 181 | _loader = new SWFLoader(request, id); 182 | break; 183 | 184 | case AssetType.IMAGE: 185 | _loader = new ImageLoader(request, id); 186 | break; 187 | 188 | case AssetType.SOUND: 189 | _loader = new SoundLoader(request, id); 190 | break; 191 | 192 | case AssetType.VIDEO: 193 | _loader = new VideoLoader(request, id); 194 | break; 195 | 196 | case AssetType.GROUP: 197 | _loader = new AssetLoader(id); 198 | break; 199 | 200 | default: 201 | throw new AssetLoaderError(AssetLoaderError.ASSET_TYPE_NOT_RECOGNIZED); 202 | } 203 | } 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /src/org/assetloader/base/LoaderStats.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | 5 | import flash.utils.getTimer; 6 | 7 | /** 8 | * @author Matan Uberstein 9 | */ 10 | public class LoaderStats implements ILoadStats 11 | { 12 | /** 13 | * @private 14 | */ 15 | protected var _latency : Number = 0; 16 | /** 17 | * @private 18 | */ 19 | protected var _speed : Number = 0; 20 | /** 21 | * @private 22 | */ 23 | protected var _averageSpeed : Number = 0; 24 | /** 25 | * @private 26 | */ 27 | protected var _progress : Number = 0; 28 | /** 29 | * @private 30 | */ 31 | protected var _totalTime : Number = 0; 32 | 33 | /** 34 | * @private 35 | */ 36 | protected var _numOpened : int = 0; 37 | /** 38 | * @private 39 | */ 40 | protected var _totalLatency : Number = 0; 41 | 42 | /** 43 | * @private 44 | */ 45 | protected var _bytesLoaded : uint = 0; 46 | /** 47 | * @private 48 | */ 49 | protected var _bytesTotal : uint = 0; 50 | 51 | /** 52 | * @private 53 | */ 54 | protected var _startTime : int; 55 | /** 56 | * @private 57 | */ 58 | protected var _openTime : int; 59 | /** 60 | * @private 61 | */ 62 | protected var _updateTime : int; 63 | 64 | public function LoaderStats() 65 | { 66 | } 67 | 68 | /** 69 | * @inheritDoc 70 | */ 71 | public function start() : void 72 | { 73 | _startTime = getTimer(); 74 | 75 | _latency = 0; 76 | _speed = 0; 77 | _averageSpeed = 0; 78 | _progress = 0; 79 | _totalTime = 0; 80 | } 81 | 82 | /** 83 | * @inheritDoc 84 | */ 85 | public function open() : void 86 | { 87 | _numOpened++; 88 | _openTime = getTimer(); 89 | 90 | _totalLatency += _openTime - _startTime; 91 | _latency = _totalLatency / _numOpened; 92 | 93 | update(0, 0); 94 | } 95 | 96 | /** 97 | * @inheritDoc 98 | */ 99 | public function done() : void 100 | { 101 | update(_bytesTotal, _bytesTotal); 102 | 103 | _totalTime = getTimer() - _startTime; 104 | } 105 | 106 | /** 107 | * @inheritDoc 108 | */ 109 | public function update(bytesLoaded : uint, bytesTotal : uint) : void 110 | { 111 | _bytesTotal = bytesTotal; 112 | 113 | if(bytesLoaded > 0) 114 | { 115 | var bytesDif : uint = bytesLoaded - _bytesLoaded; 116 | _bytesLoaded = bytesLoaded; 117 | 118 | _progress = (_bytesLoaded / _bytesTotal) * 100; 119 | 120 | var currentTime : int = getTimer(); 121 | var updateTimeDif : int = currentTime - _updateTime; 122 | 123 | if(updateTimeDif > 0) 124 | { 125 | _updateTime = currentTime; 126 | _speed = (bytesDif / 1024) / (updateTimeDif / 1000); 127 | 128 | var totalTimeDif : Number = (_updateTime - _openTime) / 1000; 129 | _averageSpeed = (_bytesLoaded / 1024) / totalTimeDif; 130 | } 131 | } 132 | } 133 | 134 | /** 135 | * @inheritDoc 136 | */ 137 | public function reset() : void 138 | { 139 | _startTime = NaN; 140 | _openTime = NaN; 141 | _updateTime = NaN; 142 | 143 | _latency = 0; 144 | _speed = 0; 145 | _averageSpeed = 0; 146 | _progress = 0; 147 | _totalTime = 0; 148 | 149 | _bytesLoaded = 0; 150 | _bytesTotal = 0; 151 | 152 | _numOpened = 0; 153 | _totalLatency = 0; 154 | } 155 | 156 | /** 157 | * @inheritDoc 158 | */ 159 | public function get latency() : Number 160 | { 161 | return _latency; 162 | } 163 | 164 | /** 165 | * @inheritDoc 166 | */ 167 | public function get speed() : Number 168 | { 169 | return _speed; 170 | } 171 | 172 | /** 173 | * @inheritDoc 174 | */ 175 | public function get averageSpeed() : Number 176 | { 177 | return _averageSpeed; 178 | } 179 | 180 | /** 181 | * @inheritDoc 182 | */ 183 | public function get progress() : Number 184 | { 185 | return _progress; 186 | } 187 | 188 | /** 189 | * @inheritDoc 190 | */ 191 | public function get totalTime() : Number 192 | { 193 | return _totalTime; 194 | } 195 | 196 | /** 197 | * @inheritDoc 198 | */ 199 | public function get bytesLoaded() : uint 200 | { 201 | return _bytesLoaded; 202 | } 203 | 204 | /** 205 | * @inheritDoc 206 | */ 207 | public function get bytesTotal() : uint 208 | { 209 | return _bytesTotal; 210 | } 211 | 212 | /** 213 | * @inheritDoc 214 | */ 215 | public function set bytesTotal(bytesTotal : uint) : void 216 | { 217 | _bytesTotal = bytesTotal; 218 | } 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /src/org/assetloader/base/Param.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.IParam; 4 | 5 | /** 6 | * Provides assets with parameters. 7 | */ 8 | public class Param implements IParam 9 | { 10 | /** 11 | * Adds a base path to the url. e.g. request.url = base + url; 12 | * 13 | *

Use: All asset types.

14 | *

Type: String

15 | */ 16 | public static const BASE : String = "BASE"; 17 | 18 | /** 19 | * Adds time stamp to url, which makes each call unique. 20 | * 21 | *

Use: All asset types.

22 | *

Type: Boolean

23 | *

Default: false

24 | */ 25 | public static const PREVENT_CACHE : String = "PREVENT_CACHE"; 26 | 27 | /** 28 | * Amount of times the loading is retried. 29 | * 30 | *

Use: All asset types except Group.

31 | *

Type: uint

32 | *

Default: 3

33 | */ public static const RETRIES : String = "RETRIES"; 34 | 35 | /** 36 | * Amount of times the loading is retried. 37 | * 38 | *

Use: All asset types.

39 | *

Type: int

40 | *

Default: Automatically determined according to when asset is added. Starts at 0 (zero) and decreases with each add. 41 | * e.g. Adding three assets one after the other will produce priority values of 0, -1, -2. 42 | * This list is then sorted decendingly, thus thus asset's with higher priority are loaded first.

43 | *

Children ILoader of IAssetLoader will NOT inherit this param.

44 | */ 45 | public static const PRIORITY : String = "PRIORITY"; 46 | 47 | /** 48 | * Set true if you DON'T want the asset to from part of the loading queue. 49 | * This way you must start the asset's loading manually via IAssetLoader startAsset method. 50 | * 51 | *

Use: All asset types.

52 | *

Type: Boolean

53 | *

Default: false

54 | *

Children ILoader of IAssetLoader will NOT inherit this param.

55 | */ 56 | public static const ON_DEMAND : String = "ON_DEMAND"; 57 | 58 | /** 59 | * Sets the bytesTotal amount of the file, this will improve accuracy of the 60 | * progress bar. This is optional, because the bytesTotal is retreived from the server 61 | * when the progress events start coming through. You can set this with a vague value as 62 | * it will be overritten by the value retreived from the server. 63 | * 64 | *

Use: All asset types.

65 | *

Type: unit

66 | *

Default: 0

67 | *

Children ILoader of IAssetLoader will NOT inherit this param.

68 | */ 69 | public static const WEIGHT : String = "WEIGHT"; 70 | 71 | /** 72 | * Sets the URLRequest's headers. 73 | * 74 | *

Use: All asset types except Video.

75 | *

Type: Array

76 | * 77 | * @see flash.net.URLRequestHeader 78 | */ public static const HEADERS : String = "HEADERS"; 79 | 80 | /** 81 | *

Use: DisplayObject, Image and Swf asset types.

82 | *

Type: LoaderContext

83 | * 84 | * @see flash.system.LoaderContext 85 | */ public static const LOADER_CONTEXT : String = "LOADER_CONTEXT"; 86 | 87 | /** 88 | * Sets BitmapData's transparentcy. 89 | * 90 | *

Use: Image asset type.

91 | *

Type: Boolean

92 | * 93 | * @see flash.display.BitmapData 94 | */ 95 | public static const TRANSPARENT : String = "TRANSPARENT"; 96 | 97 | /** 98 | * Sets BitmapData's fill color. 99 | * 100 | *

Use: Image asset type.

101 | *

Type: uint

102 | * 103 | * @see flash.display.BitmapData 104 | */ 105 | public static const FILL_COLOR : String = "FILL_COLOR"; 106 | 107 | /** 108 | * Sets BitmapData's matrix. 109 | * 110 | *

Use: Image asset type.

111 | *

Type: Matrix

112 | * 113 | * @see flash.geom.Matrix 114 | * @see flash.display.BitmapData 115 | */ 116 | public static const MATRIX : String = "MATRIX"; 117 | 118 | /** 119 | * Sets BitmapData's color transform. 120 | * 121 | *

Use: Image asset type.

122 | *

Type: ColorTransform

123 | * 124 | * @see flash.geom.ColorTransform 125 | * @see flash.display.BitmapData 126 | */ 127 | public static const COLOR_TRANSFROM : String = "COLOR_TRANSFROM"; 128 | 129 | /** 130 | * Sets BitmapData's blend mode. 131 | * 132 | *

Use: Image asset type.

133 | *

Type: String

134 | * 135 | * @see flash.display.BlendMode 136 | * @see flash.display.BitmapData 137 | */ 138 | public static const BLEND_MODE : String = "BLEND_MODE"; 139 | 140 | /** 141 | * Sets BitmapData's clipping rectangle. 142 | * 143 | *

Use: Image asset type.

144 | *

Type: Rectangle

145 | * 146 | * @see flash.geom.Rectangle 147 | * @see flash.display.BitmapData 148 | */ 149 | public static const CLIP_RECTANGLE : String = "CLIP_RECTANGLE"; 150 | 151 | /** 152 | * Sets Bitmap's pixel snapping. 153 | * 154 | *

Use: Image asset type.

155 | *

Type: String

156 | * 157 | * @see flash.display.Bitmap 158 | */ 159 | public static const PIXEL_SNAPPING : String = "PIXEL_SNAPPING"; 160 | 161 | /** 162 | * Sets Bitmap and BitmapData's smoothing property. 163 | * 164 | *

Use: Image asset type.

165 | *

Type: Boolean

166 | * 167 | * @see flash.display.Bitmap 168 | * @see flash.display.BitmapData 169 | */ 170 | public static const SMOOTHING : String = "SMOOTHING"; 171 | 172 | /** 173 | * Sets Sound's load context. 174 | * 175 | *

Use: Sound asset type.

176 | *

Type: SoundLoaderContext

177 | * 178 | * @see flash.media.SoundLoaderContext 179 | */ 180 | public static const SOUND_LOADER_CONTEXT : String = "SOUND_LOADER_CONTEXT"; 181 | 182 | /** 183 | * If NetStream should load cross-domain policy file. 184 | * 185 | *

Use: Video asset type.

186 | *

Type: Boolean

187 | * 188 | * @see flash.net.NetStream 189 | */ 190 | public static const CHECK_POLICY_FILE : String = "CHECK_POLICY_FILE"; 191 | 192 | /** 193 | * Adds NetStream client callback Object. 194 | * 195 | *

Use: Video asset type.

196 | *

Type: Object

197 | * 198 | * @see flash.net.NetStream 199 | */ 200 | public static const CLIENT : String = "CLIENT"; 201 | 202 | /** 203 | * Allows you to attach any object/instance to an ILoader. 204 | * 205 | *

Use: All asset types.

206 | *

Type: Any Type

207 | */ 208 | public static const USER_DATA : String = "USER_DATA"; 209 | 210 | /** 211 | * @private 212 | */ 213 | protected var _id : String; 214 | 215 | /** 216 | * @private 217 | */ 218 | protected var _value : *; 219 | 220 | /** 221 | * @param id Param id. 222 | * @param value Param value. 223 | */ 224 | public function Param(id : String, value : *) 225 | { 226 | _id = id; 227 | _value = value; 228 | } 229 | 230 | /** 231 | * @inheritDoc 232 | */ 233 | public function get id() : String 234 | { 235 | return _id; 236 | } 237 | 238 | /** 239 | * @inheritDoc 240 | */ 241 | public function get value() : * 242 | { 243 | return _value; 244 | } 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /src/org/assetloader/base/StatsMonitor.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | import org.assetloader.core.ILoader; 5 | import org.assetloader.signals.LoaderSignal; 6 | import org.assetloader.signals.ProgressSignal; 7 | 8 | /** 9 | * @author Matan Uberstein 10 | * 11 | * Consolidates multiple ILoader's stats. 12 | */ 13 | public class StatsMonitor 14 | { 15 | /** 16 | * @private 17 | */ 18 | protected var _loaders : Array; 19 | /** 20 | * @private 21 | */ 22 | protected var _stats : ILoadStats; 23 | 24 | /** 25 | * @private 26 | */ 27 | protected var _numLoaders : int; 28 | /** 29 | * @private 30 | */ 31 | protected var _numComplete : int; 32 | /** 33 | * @private 34 | */ 35 | protected var _ids : Array = []; 36 | 37 | /** 38 | * @private 39 | */ 40 | protected var _onOpen : LoaderSignal; 41 | /** 42 | * @private 43 | */ 44 | protected var _onProgress : ProgressSignal; 45 | /** 46 | * @private 47 | */ 48 | protected var _onComplete : LoaderSignal; 49 | 50 | public function StatsMonitor() 51 | { 52 | _loaders = []; 53 | _stats = new LoaderStats(); 54 | 55 | _onOpen = new LoaderSignal(); 56 | _onProgress = new ProgressSignal(); 57 | _onComplete = new LoaderSignal(ILoadStats); 58 | } 59 | 60 | /** 61 | * Adds ILoader for monitoring. 62 | * 63 | * @param loader Instance of ILoader or IAssetLoader. 64 | * 65 | * @throws org.assetloader.base.AssetLoaderError ALREADY_CONTAINS_LOADER 66 | */ 67 | public function add(loader : ILoader) : void 68 | { 69 | if(_loaders.indexOf(loader) == -1) 70 | { 71 | loader.onStart.add(start_handler); 72 | 73 | _loaders.push(loader); 74 | _ids.push(loader.id); 75 | _numLoaders = _loaders.length; 76 | if(loader.loaded) 77 | _numComplete++; 78 | } 79 | else 80 | throw new AssetLoaderError(AssetLoaderError.ALREADY_CONTAINS_LOADER); 81 | } 82 | 83 | /** 84 | * Removes ILoader from monitoring. 85 | * 86 | * @param loader An instance of an ILoader already added. 87 | * 88 | * @throws org.assetloader.base.AssetLoaderError DOESNT_CONTAIN_LOADER 89 | */ 90 | public function remove(loader : ILoader) : void 91 | { 92 | var index : int = _loaders.indexOf(loader); 93 | if(index != -1) 94 | { 95 | loader.onStart.remove(start_handler); 96 | removeListeners(loader); 97 | 98 | if(loader.loaded) 99 | _numComplete--; 100 | 101 | _loaders.splice(index, 1); 102 | _ids.splice(index, 1); 103 | _numLoaders = _loaders.length; 104 | } 105 | else 106 | throw new AssetLoaderError(AssetLoaderError.DOESNT_CONTAIN_LOADER); 107 | } 108 | 109 | /** 110 | * Removes all internal listeners and clears the monitoring list. 111 | * 112 | *

Note: After calling destroy, this instance of StatsMonitor is still usable. 113 | * Simply rebuild your monitor list via the add() method.

114 | */ 115 | public function destroy() : void 116 | { 117 | for each(var loader : ILoader in _loaders) 118 | { 119 | loader.onStart.remove(start_handler); 120 | removeListeners(loader); 121 | } 122 | 123 | _loaders = []; 124 | _numLoaders = 0; 125 | _numComplete = 0; 126 | 127 | _onOpen.removeAll(); 128 | _onProgress.removeAll(); 129 | _onComplete.removeAll(); 130 | } 131 | 132 | /** 133 | * @private 134 | */ 135 | protected function addListeners(loader : ILoader) : void 136 | { 137 | loader.onOpen.add(open_handler); 138 | loader.onProgress.add(progress_handler); 139 | loader.onComplete.add(complete_handler); 140 | } 141 | 142 | /** 143 | * @private 144 | */ 145 | protected function removeListeners(loader : ILoader) : void 146 | { 147 | loader.onOpen.remove(open_handler); 148 | loader.onProgress.remove(progress_handler); 149 | loader.onComplete.remove(complete_handler); 150 | } 151 | 152 | /** 153 | * @private 154 | */ 155 | protected function start_handler(signal : LoaderSignal) : void 156 | { 157 | for each(var loader : ILoader in _loaders) 158 | { 159 | loader.onStart.remove(start_handler); 160 | addListeners(loader); 161 | } 162 | _stats.start(); 163 | } 164 | 165 | /** 166 | * @private 167 | */ 168 | protected function open_handler(signal : LoaderSignal) : void 169 | { 170 | _stats.open(); 171 | _onOpen.dispatch(signal.loader); 172 | } 173 | 174 | /** 175 | * @private 176 | */ 177 | protected function progress_handler(signal : ProgressSignal) : void 178 | { 179 | var bytesLoaded : uint; 180 | var bytesTotal : uint; 181 | for each(var loader : ILoader in _loaders) 182 | { 183 | bytesLoaded += loader.stats.bytesLoaded; 184 | bytesTotal += loader.stats.bytesTotal; 185 | } 186 | _stats.update(bytesLoaded, bytesTotal); 187 | 188 | _onProgress.dispatch(signal.loader, _stats.latency, _stats.speed, _stats.averageSpeed, _stats.progress, _stats.bytesLoaded, _stats.bytesTotal); 189 | } 190 | 191 | /** 192 | * @private 193 | */ 194 | protected function complete_handler(signal : LoaderSignal, payload : *) : void 195 | { 196 | _numComplete++; 197 | if(_numComplete == _numLoaders) 198 | { 199 | _stats.done(); 200 | _onComplete.dispatch(null, _stats); 201 | } 202 | } 203 | 204 | /** 205 | * Checks whether the StatsMonitor contains an ILoader with id passed. 206 | * 207 | * @param id Id for the ILoader. 208 | * 209 | * @return Boolean 210 | */ 211 | public function hasLoader(id : String) : Boolean 212 | { 213 | return (_ids.indexOf(id) != -1); 214 | } 215 | 216 | /** 217 | * Gets the load with id passed. 218 | * 219 | * @param id Id for the ILoader. 220 | * 221 | * @return ILoader. 222 | */ 223 | public function getLoader(id : String) : ILoader 224 | { 225 | if(hasLoader(id)) 226 | return _loaders[_ids.indexOf(id)]; 227 | return null; 228 | } 229 | 230 | /** 231 | * All the ids of the ILoaders added to this StatsMonitor. 232 | * 233 | * @return Array of Strings 234 | */ 235 | public function get ids() : Array 236 | { 237 | return _ids; 238 | } 239 | 240 | /** 241 | * Get the overall stats of all the ILoaders in the monitoring list. 242 | * 243 | * @return ILoadStats 244 | */ 245 | public function get stats() : ILoadStats 246 | { 247 | return _stats; 248 | } 249 | 250 | /** 251 | * Dispatches each time a connection has been opend. 252 | * 253 | *

HANDLER ARGUMENTS: (signal:LoaderSignal)

254 | * 257 | * 258 | * @see org.assetloader.signals.LoaderSignal 259 | */ 260 | public function get onOpen() : LoaderSignal 261 | { 262 | return _onOpen; 263 | } 264 | 265 | /** 266 | * Dispatches when loading progress has been made. 267 | * 268 | *

HANDLER ARGUMENTS: (signal:ProgressSignal)

269 | * 272 | * 273 | * @see org.assetloader.signals.ProgressSignal 274 | */ 275 | public function get onProgress() : ProgressSignal 276 | { 277 | return _onProgress; 278 | } 279 | 280 | /** 281 | * Dispatches when the loading operations has completed. 282 | * 283 | *

HANDLER ARGUMENTS: (signal:LoaderSignal, stats:ILoadStats)

284 | * 288 | * 289 | * @see org.assetloader.signals.LoaderSignal 290 | */ 291 | public function get onComplete() : LoaderSignal 292 | { 293 | return _onComplete; 294 | } 295 | 296 | /** 297 | * Gets the amount of loaders added to the monitoring queue. 298 | * 299 | * @return int 300 | */ 301 | public function get numLoaders() : int 302 | { 303 | return _numLoaders; 304 | } 305 | 306 | /** 307 | * Gets the amount of loaders that have finished loading. 308 | * 309 | * @return int 310 | */ 311 | public function get numComplete() : int 312 | { 313 | return _numComplete; 314 | } 315 | } 316 | } 317 | -------------------------------------------------------------------------------- /src/org/assetloader/core/IConfigParser.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.core 2 | { 3 | 4 | /** 5 | * Parses and builds loading queues from String data. 6 | * 7 | * @see org.assetloader.core.ILoader 8 | * @see org.assetloader.core.IAssetLoader 9 | * 10 | * @author Matan Uberstein 11 | */ 12 | public interface IConfigParser 13 | { 14 | /** 15 | * Test data to see if it can be parsed. 16 | * 17 | * @param data String 18 | * 19 | * @return Boolean 20 | */ 21 | function isValid(data : String) : Boolean; 22 | 23 | /** 24 | * Implematation should convert String into respective type and add the parsed 25 | * assets into their repective parent IAssetLoader 26 | * 27 | * @param assetloader IAssetLoader instance that will contain the parsed assets. 28 | * @param data String 29 | * 30 | * @see org.assetloader.base.vo.ConfigVO 31 | */ 32 | function parse(assetloader : IAssetLoader, data : String) : void 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/org/assetloader/core/ILoadStats.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.core 2 | { 3 | 4 | /** 5 | * Calulates download stats. 6 | * 7 | * @author Matan Uberstein 8 | */ 9 | public interface ILoadStats 10 | { 11 | /** 12 | * Records time when invoked. This should be called when you init a loading operation. 13 | */ 14 | function start() : void 15 | 16 | /** 17 | * Records time difference between start and now to calculated latency. 18 | */ 19 | function open() : void 20 | 21 | /** 22 | * Invoke when loading is complete. 23 | */ 24 | function done() : void 25 | /** 26 | * Invoke when loading progress is made. This will updated the stats. 27 | * @param bytesLoaded The amount of bytes loaded. 28 | * @param bytesTotal The total amount of bytes for a loading operation. 29 | */ 30 | function update(bytesLoaded : uint, bytesTotal : uint) : void 31 | 32 | /** 33 | * Resets all the values. 34 | */ 35 | function reset() : void 36 | 37 | /** 38 | * Time between start and open. 39 | * @return Millisecond value. 40 | */ 41 | function get latency() : Number 42 | 43 | /** 44 | * Current speed of download. 45 | * @return Kilobytes per second value. 46 | */ 47 | function get speed() : Number 48 | 49 | /** 50 | * Average speed of download. 51 | * @return Kilobytes per second value. 52 | */ 53 | function get averageSpeed() : Number 54 | 55 | /** 56 | * Current progress percentage of download. 57 | * @return Number between 0 and 100. 58 | */ 59 | function get progress() : Number 60 | 61 | /** 62 | * Total time taken. 63 | * @return Number value in milliseconds 64 | */ 65 | function get totalTime() : Number 66 | 67 | /** 68 | * @return Amount of bytes loaded. 69 | */ 70 | function get bytesLoaded() : uint 71 | 72 | /** 73 | * @return Total amount of bytes to load. 74 | */ 75 | function get bytesTotal() : uint 76 | 77 | /** 78 | * @param value The total amount of bytes for a loading operation. 79 | */ 80 | function set bytesTotal(value : uint) : void 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/org/assetloader/core/IParam.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.core 2 | { 3 | 4 | /** 5 | * Holds parameter data for ILoader instances. 6 | * 7 | * @see org.assetloader.core.ILoader 8 | * 9 | * @author Matan Uberstein 10 | */ 11 | public interface IParam 12 | { 13 | /** 14 | * Gets parameter id. 15 | * 16 | * @return id of parameter. 17 | * @see org.assetloader.base.Param 18 | */ 19 | function get id() : String 20 | /** 21 | * Gets value of parameter. 22 | * 23 | * @return value 24 | */ 25 | function get value() : * 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/BaseLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.parsers.URLParser; 4 | 5 | import flash.net.URLVariables; 6 | 7 | import org.assetloader.base.AbstractLoader; 8 | import org.assetloader.base.Param; 9 | import org.assetloader.core.ILoader; 10 | 11 | import flash.events.ErrorEvent; 12 | import flash.events.Event; 13 | import flash.events.HTTPStatusEvent; 14 | import flash.events.IEventDispatcher; 15 | import flash.events.IOErrorEvent; 16 | import flash.events.ProgressEvent; 17 | import flash.events.SecurityErrorEvent; 18 | import flash.net.URLRequest; 19 | 20 | /** 21 | * @author Matan Uberstein 22 | */ 23 | public class BaseLoader extends AbstractLoader implements ILoader 24 | { 25 | /** 26 | * @private 27 | */ 28 | protected var _eventDispatcher : IEventDispatcher; 29 | 30 | public function BaseLoader(request : URLRequest, type : String, id : String = null) 31 | { 32 | super(id || request.url, type, request); 33 | } 34 | 35 | /** 36 | * @inheritDoc 37 | */ 38 | override public function start() : void 39 | { 40 | if(!_invoked) 41 | { 42 | _invoked = true; 43 | _stopped = false; 44 | 45 | _eventDispatcher = constructLoader(); 46 | 47 | addListeners(_eventDispatcher); 48 | 49 | super.start(); 50 | 51 | invokeLoading(); 52 | } 53 | else 54 | { 55 | _invoked = false; 56 | stop(); 57 | start(); 58 | } 59 | } 60 | 61 | /** 62 | * @private 63 | */ 64 | protected function constructLoader() : IEventDispatcher 65 | { 66 | return null; 67 | } 68 | 69 | /** 70 | * @private 71 | */ 72 | protected function invokeLoading() : void 73 | { 74 | } 75 | 76 | /** 77 | * @inheritDoc 78 | */ 79 | override public function stop() : void 80 | { 81 | removeListeners(_eventDispatcher); 82 | _eventDispatcher = null; 83 | 84 | super.stop(); 85 | } 86 | 87 | /** 88 | * @inheritDoc 89 | */ 90 | override public function destroy() : void 91 | { 92 | removeListeners(_eventDispatcher); 93 | _eventDispatcher = null; 94 | 95 | super.destroy(); 96 | } 97 | 98 | // --------------------------------------------------------------------------------------------------------------------------------// 99 | // HANDLERS 100 | // --------------------------------------------------------------------------------------------------------------------------------// 101 | /** 102 | * @private 103 | */ 104 | protected function error_handler(event : ErrorEvent) : void 105 | { 106 | if(_retryTally < getParam(Param.RETRIES) - 1) 107 | { 108 | _retryTally++; 109 | start(); 110 | } 111 | else 112 | { 113 | _inProgress = false; 114 | _failed = true; 115 | removeListeners(_eventDispatcher); 116 | _onError.dispatch(this, event.type, event.text); 117 | } 118 | } 119 | 120 | /** 121 | * @private 122 | */ 123 | protected function httpStatus_handler(event : HTTPStatusEvent) : void 124 | { 125 | _onHttpStatus.dispatch(this, event.status); 126 | } 127 | 128 | /** 129 | * @private 130 | */ 131 | protected function open_handler(event : Event) : void 132 | { 133 | _stats.open(); 134 | _inProgress = true; 135 | _onOpen.dispatch(this); 136 | } 137 | 138 | /** 139 | * @private 140 | */ 141 | protected function progress_handler(event : ProgressEvent) : void 142 | { 143 | _stats.update(event.bytesLoaded, event.bytesTotal); 144 | _onProgress.dispatch(this, _stats.latency, _stats.speed, _stats.averageSpeed, _stats.progress, _stats.bytesLoaded, _stats.bytesTotal); 145 | } 146 | 147 | /** 148 | * @private 149 | */ 150 | protected function complete_handler(event : Event) : void 151 | { 152 | _stats.done(); 153 | _onProgress.dispatch(this, _stats.latency, _stats.speed, _stats.averageSpeed, _stats.progress, _stats.bytesLoaded, _stats.bytesTotal); 154 | 155 | _inProgress = false; 156 | _failed = false; 157 | _loaded = true; 158 | _onComplete.dispatch(this, _data); 159 | } 160 | 161 | // --------------------------------------------------------------------------------------------------------------------------------// 162 | // PROTECTED 163 | // --------------------------------------------------------------------------------------------------------------------------------// 164 | /** 165 | * @private 166 | */ 167 | protected function addListeners(dispatcher : IEventDispatcher) : void 168 | { 169 | if(dispatcher) 170 | { 171 | dispatcher.addEventListener(IOErrorEvent.IO_ERROR, error_handler); 172 | dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, error_handler); 173 | 174 | dispatcher.addEventListener(Event.OPEN, open_handler); 175 | dispatcher.addEventListener(ProgressEvent.PROGRESS, progress_handler); 176 | dispatcher.addEventListener(Event.COMPLETE, complete_handler); 177 | 178 | dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus_handler); 179 | } 180 | } 181 | 182 | /** 183 | * @private 184 | */ 185 | protected function removeListeners(dispatcher : IEventDispatcher) : void 186 | { 187 | if(dispatcher) 188 | { 189 | dispatcher.removeEventListener(IOErrorEvent.IO_ERROR, error_handler); 190 | dispatcher.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, error_handler); 191 | 192 | dispatcher.removeEventListener(Event.OPEN, open_handler); 193 | dispatcher.removeEventListener(ProgressEvent.PROGRESS, progress_handler); 194 | dispatcher.removeEventListener(Event.COMPLETE, complete_handler); 195 | 196 | dispatcher.removeEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus_handler); 197 | } 198 | } 199 | 200 | /** 201 | * @inheritDoc 202 | */ 203 | override public function setParam(id : String, value : *) : void 204 | { 205 | var success : Boolean = true; 206 | 207 | switch(id) 208 | { 209 | case Param.BASE: 210 | success = setBase(value); 211 | break; 212 | case Param.PREVENT_CACHE: 213 | setPreventCache(value); 214 | break; 215 | case Param.HEADERS: 216 | _request.requestHeaders = value; 217 | break; 218 | } 219 | 220 | if(success) 221 | super.setParam(id, value); 222 | } 223 | 224 | /** 225 | * @private 226 | */ 227 | protected function setBase(value : String) : Boolean 228 | { 229 | if(!value) 230 | return false; 231 | 232 | var urlParser : URLParser = new URLParser(_request.url); 233 | 234 | if(!urlParser.host) 235 | { 236 | _request.url = value + urlParser.url; 237 | return true; 238 | } 239 | 240 | return false; 241 | } 242 | 243 | /** 244 | * @private 245 | */ 246 | protected function setPreventCache(value : Boolean) : void 247 | { 248 | var url : String = _request.url; 249 | if(value) 250 | { 251 | if(url.indexOf("ck=") == -1) 252 | url += ((url.indexOf("?") == -1) ? "?" : "&") + "ck=" + new Date().time; 253 | } 254 | else if(url.indexOf("ck=") != -1) 255 | { 256 | var vrs : URLVariables = new URLVariables(url.slice(url.indexOf("?") + 1)); 257 | var cleanUrl : String = url.slice(0, url.indexOf("?")); 258 | var cleanVrs : URLVariables = new URLVariables(); 259 | 260 | for(var queryKey : String in vrs) 261 | { 262 | if(queryKey != "ck") 263 | cleanVrs[queryKey] = vrs[queryKey]; 264 | } 265 | 266 | var queryString : String = cleanVrs.toString(); 267 | 268 | url = cleanUrl + ((queryString != "") ? "?" + queryString : ""); 269 | } 270 | _request.url = url; 271 | } 272 | } 273 | } 274 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/BinaryLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | 6 | import flash.events.Event; 7 | import flash.events.IEventDispatcher; 8 | import flash.net.URLRequest; 9 | import flash.net.URLStream; 10 | import flash.utils.ByteArray; 11 | 12 | /** 13 | * @author Matan Uberstein 14 | */ 15 | public class BinaryLoader extends BaseLoader 16 | { 17 | /** 18 | * @private 19 | */ 20 | protected var _bytes : ByteArray; 21 | 22 | /** 23 | * @private 24 | */ 25 | protected var _loader : URLStream; 26 | 27 | public function BinaryLoader(request : URLRequest, id : String = null) 28 | { 29 | super(request, AssetType.BINARY, id); 30 | } 31 | 32 | /** 33 | * @private 34 | */ 35 | override protected function initSignals() : void 36 | { 37 | super.initSignals(); 38 | _onComplete = new LoaderSignal(ByteArray); 39 | } 40 | 41 | /** 42 | * @private 43 | */ 44 | override protected function constructLoader() : IEventDispatcher 45 | { 46 | _loader = new URLStream(); 47 | return _loader; 48 | } 49 | 50 | /** 51 | * @private 52 | */ 53 | override protected function invokeLoading() : void 54 | { 55 | _loader.load(request); 56 | } 57 | 58 | /** 59 | * @inheritDoc 60 | */ 61 | override public function stop() : void 62 | { 63 | if(_invoked) 64 | { 65 | try 66 | { 67 | _loader.close(); 68 | } 69 | catch(error : Error) 70 | { 71 | } 72 | } 73 | 74 | super.stop(); 75 | } 76 | 77 | /** 78 | * @inheritDoc 79 | */ 80 | override public function destroy() : void 81 | { 82 | super.destroy(); 83 | _loader = null; 84 | _bytes = null; 85 | } 86 | 87 | /** 88 | * @private 89 | */ 90 | override protected function complete_handler(event : Event) : void 91 | { 92 | _bytes = new ByteArray(); 93 | _loader.readBytes(_bytes); 94 | 95 | _data = _bytes; 96 | 97 | super.complete_handler(event); 98 | } 99 | 100 | /** 101 | * Gets the resulting ByteArray after loading is complete. 102 | * 103 | * @return ByteArray 104 | */ 105 | public function get bytes() : ByteArray 106 | { 107 | return _bytes; 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/CSSLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | 6 | import flash.net.URLRequest; 7 | import flash.text.StyleSheet; 8 | 9 | /** 10 | * @author Matan Uberstein 11 | */ 12 | public class CSSLoader extends TextLoader 13 | { 14 | /** 15 | * @private 16 | */ 17 | protected var _styleSheet : StyleSheet; 18 | 19 | public function CSSLoader(request : URLRequest, id : String = null) 20 | { 21 | super(request, id); 22 | _type = AssetType.CSS; 23 | } 24 | 25 | /** 26 | * @private 27 | */ 28 | override protected function initSignals() : void 29 | { 30 | super.initSignals(); 31 | _onComplete = new LoaderSignal(StyleSheet); 32 | } 33 | 34 | /** 35 | * @inheritDoc 36 | */ 37 | override public function destroy() : void 38 | { 39 | super.destroy(); 40 | _styleSheet = null; 41 | } 42 | 43 | /** 44 | * @private 45 | * 46 | * @inheritDoc 47 | */ 48 | override protected function testData(data : String) : String 49 | { 50 | var errMsg : String = ""; 51 | try 52 | { 53 | _styleSheet = new StyleSheet(); 54 | _styleSheet.parseCSS(data); 55 | _data = _styleSheet; 56 | } 57 | catch(err : Error) 58 | { 59 | errMsg = err.message; 60 | } 61 | 62 | return errMsg; 63 | } 64 | 65 | /** 66 | * Gets the resulting StyleSheet after loading is complete. 67 | * 68 | * @return StyleSheet 69 | */ 70 | public function get styleSheet() : StyleSheet 71 | { 72 | return _styleSheet; 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/DisplayObjectLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import flash.display.LoaderInfo; 4 | import org.assetloader.base.AssetType; 5 | import org.assetloader.base.Param; 6 | import org.assetloader.signals.LoaderSignal; 7 | 8 | import flash.display.DisplayObject; 9 | import flash.display.Loader; 10 | import flash.display.LoaderInfo; 11 | import flash.events.ErrorEvent; 12 | import flash.events.Event; 13 | import flash.events.IEventDispatcher; 14 | import flash.net.URLRequest; 15 | 16 | /** 17 | * @author Matan Uberstein 18 | */ 19 | public class DisplayObjectLoader extends BaseLoader 20 | { 21 | /** 22 | * @private 23 | */ 24 | protected var _displayObject : DisplayObject; 25 | 26 | /** 27 | * @private 28 | */ 29 | protected var _loader : Loader; 30 | 31 | public function DisplayObjectLoader(request : URLRequest, id : String = null) 32 | { 33 | super(request, AssetType.DISPLAY_OBJECT, id); 34 | } 35 | 36 | /** 37 | * @private 38 | */ 39 | override protected function initSignals() : void 40 | { 41 | super.initSignals(); 42 | _onComplete = new LoaderSignal(DisplayObject); 43 | } 44 | 45 | /** 46 | * @private 47 | */ 48 | override protected function constructLoader() : IEventDispatcher 49 | { 50 | _loader = new Loader(); 51 | return _loader.contentLoaderInfo; 52 | } 53 | 54 | /** 55 | * @private 56 | */ 57 | override protected function invokeLoading() : void 58 | { 59 | _loader.load(request, getParam(Param.LOADER_CONTEXT)); 60 | } 61 | 62 | /** 63 | * @inheritDoc 64 | */ 65 | override public function stop() : void 66 | { 67 | if(_invoked) 68 | { 69 | try 70 | { 71 | _loader.close(); 72 | } 73 | catch(error : Error) 74 | { 75 | } 76 | } 77 | super.stop(); 78 | } 79 | 80 | /** 81 | * @inheritDoc 82 | */ 83 | override public function destroy() : void 84 | { 85 | super.destroy(); 86 | _loader = null; 87 | _displayObject = null; 88 | } 89 | 90 | /** 91 | * @private 92 | */ 93 | override protected function complete_handler(event : Event) : void 94 | { 95 | _data = _displayObject = _loader.content; 96 | 97 | var testResult : String = testData(_data); 98 | 99 | if(testResult != "") 100 | { 101 | _onError.dispatch(this, ErrorEvent.ERROR, testResult); 102 | return; 103 | } 104 | 105 | super.complete_handler(event); 106 | } 107 | 108 | /** 109 | * @private 110 | * 111 | * @return Error message, empty String if no error occured. 112 | */ 113 | protected function testData(data : DisplayObject) : String 114 | { 115 | return !data ? "Data is not a DisplayObject." : ""; 116 | } 117 | 118 | /** 119 | * Gets the resulting DisplayObject after loading is complete. 120 | * 121 | * @return DisplayObject 122 | */ 123 | public function get displayObject() : DisplayObject 124 | { 125 | return _displayObject; 126 | } 127 | 128 | /** 129 | * Gets the current content's LoaderInfo. 130 | * 131 | * @return LoaderInfo 132 | */ 133 | public function get contentLoaderInfo() : LoaderInfo 134 | { 135 | return _loader ? _loader.contentLoaderInfo : null; 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/ImageLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.base.Param; 5 | import org.assetloader.signals.LoaderSignal; 6 | 7 | import flash.display.Bitmap; 8 | import flash.display.BitmapData; 9 | import flash.display.DisplayObject; 10 | import flash.net.URLRequest; 11 | 12 | /** 13 | * @author Matan Uberstein 14 | */ 15 | public class ImageLoader extends DisplayObjectLoader 16 | { 17 | /** 18 | * @private 19 | */ 20 | protected var _bitmapData : BitmapData; 21 | /** 22 | * @private 23 | */ 24 | protected var _bitmap : Bitmap; 25 | 26 | public function ImageLoader(request : URLRequest, id : String = null) 27 | { 28 | super(request, id); 29 | _type = AssetType.IMAGE; 30 | } 31 | 32 | /** 33 | * @private 34 | */ 35 | override protected function initSignals() : void 36 | { 37 | super.initSignals(); 38 | _onComplete = new LoaderSignal(Bitmap); 39 | } 40 | 41 | /** 42 | * @inheritDoc 43 | */ 44 | override public function destroy() : void 45 | { 46 | super.destroy(); 47 | try 48 | { 49 | _bitmapData.dispose(); 50 | } 51 | catch(error : Error) 52 | { 53 | } 54 | _bitmap = null; 55 | } 56 | 57 | /** 58 | * @private 59 | * 60 | * @inheritDoc 61 | */ 62 | override protected function testData(data : DisplayObject) : String 63 | { 64 | var errMsg : String = ""; 65 | try 66 | { 67 | var sourceBitmapData:BitmapData = Bitmap(data).bitmapData; 68 | var transparent:Boolean = (getParam(Param.TRANSPARENT) == undefined) ? sourceBitmapData.transparent : getParam(Param.TRANSPARENT); 69 | _bitmapData = new BitmapData(_loader.contentLoaderInfo.width, _loader.contentLoaderInfo.height, transparent, getParam(Param.FILL_COLOR) || 0x0); 70 | _bitmapData.draw(sourceBitmapData, getParam(Param.MATRIX), getParam(Param.COLOR_TRANSFROM), getParam(Param.BLEND_MODE), getParam(Param.CLIP_RECTANGLE), getParam(Param.SMOOTHING) || false); 71 | 72 | _data = _bitmap = new Bitmap(_bitmapData, getParam(Param.PIXEL_SNAPPING) || "auto", getParam(Param.SMOOTHING) || false); 73 | } 74 | catch(err : Error) 75 | { 76 | errMsg = err.message; 77 | } 78 | 79 | return errMsg; 80 | } 81 | 82 | /** 83 | * Gets the resulting BitmapData after loading is complete. 84 | * 85 | * @return BitmapData 86 | */ 87 | public function get bitmapData() : BitmapData 88 | { 89 | return _bitmapData; 90 | } 91 | 92 | /** 93 | * Gets the resulting Bitmap after loading is complete. 94 | * 95 | * @return Bitmap 96 | */ 97 | public function get bitmap() : Bitmap 98 | { 99 | return _bitmap; 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/JSONLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import com.adobe.serialization.json.JSON; 4 | 5 | import org.assetloader.base.AssetType; 6 | import org.assetloader.signals.LoaderSignal; 7 | 8 | import flash.net.URLRequest; 9 | 10 | /** 11 | * @author Matan Uberstein 12 | */ 13 | public class JSONLoader extends TextLoader 14 | { 15 | /** 16 | * @private 17 | */ 18 | protected var _jsonObject : Object; 19 | 20 | public function JSONLoader(request : URLRequest, id : String = null) 21 | { 22 | super(request, id); 23 | _type = AssetType.JSON; 24 | } 25 | 26 | /** 27 | * @private 28 | */ 29 | override protected function initSignals() : void 30 | { 31 | super.initSignals(); 32 | _onComplete = new LoaderSignal(Object); 33 | } 34 | 35 | /** 36 | * @private 37 | */ 38 | override public function destroy() : void 39 | { 40 | super.destroy(); 41 | _jsonObject = null; 42 | } 43 | 44 | /** 45 | * @private 46 | * 47 | * @inheritDoc 48 | */ 49 | override protected function testData(data : String) : String 50 | { 51 | var errMsg : String = ""; 52 | try 53 | { 54 | _data = _jsonObject = JSON.decode(data); 55 | } 56 | catch(err : Error) 57 | { 58 | errMsg = err.message; 59 | } 60 | 61 | return errMsg; 62 | } 63 | 64 | /** 65 | * Gets the resulting Json Object after loading and parsing is complete. 66 | * 67 | * @return Object 68 | */ 69 | public function get jsonObject() : Object 70 | { 71 | return _jsonObject; 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/SWFLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | 6 | import flash.display.DisplayObject; 7 | import flash.display.Sprite; 8 | import flash.events.Event; 9 | import flash.events.IEventDispatcher; 10 | import flash.net.URLRequest; 11 | 12 | /** 13 | * @author Matan Uberstein 14 | */ 15 | public class SWFLoader extends DisplayObjectLoader 16 | { 17 | /** 18 | * @private 19 | */ 20 | protected var _swf : Sprite; 21 | 22 | /** 23 | * @private 24 | */ 25 | protected var _onInit : LoaderSignal; 26 | 27 | public function SWFLoader(request : URLRequest, id : String = null) 28 | { 29 | super(request, id); 30 | _type = AssetType.SWF; 31 | } 32 | 33 | /** 34 | * @private 35 | */ 36 | override protected function initSignals() : void 37 | { 38 | super.initSignals(); 39 | _onInit = new LoaderSignal(); 40 | _onComplete = new LoaderSignal(Sprite); 41 | } 42 | 43 | protected function init_handler(event : Event) : void 44 | { 45 | _data = _displayObject = _loader.content; 46 | 47 | _onInit.dispatch(this, _data); 48 | } 49 | 50 | /** 51 | * @private 52 | */ 53 | override protected function addListeners(dispatcher : IEventDispatcher) : void 54 | { 55 | super.addListeners(dispatcher); 56 | if(dispatcher) 57 | dispatcher.addEventListener(Event.INIT, init_handler); 58 | } 59 | 60 | /** 61 | * @private 62 | */ 63 | override protected function removeListeners(dispatcher : IEventDispatcher) : void 64 | { 65 | super.removeListeners(dispatcher); 66 | if(dispatcher) 67 | dispatcher.removeEventListener(Event.INIT, init_handler); 68 | } 69 | 70 | /** 71 | * @inheritDoc 72 | */ 73 | override public function destroy() : void 74 | { 75 | super.destroy(); 76 | _swf = null; 77 | } 78 | 79 | /** 80 | * @private 81 | * 82 | * @inheritDoc 83 | */ 84 | override protected function testData(data : DisplayObject) : String 85 | { 86 | var errMsg : String = ""; 87 | try 88 | { 89 | _data = _swf = Sprite(data); 90 | } 91 | catch(error : Error) 92 | { 93 | errMsg = error.message; 94 | } 95 | return errMsg; 96 | } 97 | 98 | /** 99 | * Gets the resulting Sprite after loading is complete. 100 | * 101 | * @return Sprite 102 | */ 103 | public function get swf() : Sprite 104 | { 105 | return _swf; 106 | } 107 | 108 | /** 109 | * Gets the resulting Sprite class after loading is complete. 110 | * Allows multiple instanciation of this SWF content. 111 | * 112 | * @return Class 113 | */ 114 | public function get swfClass() : Class 115 | { 116 | var swfClassName:String = getQualifiedClassName(_swf); 117 | var swfClass:Class = getDefinitionByName(swfClassName) as Class; 118 | return swfClass; 119 | } 120 | 121 | /** 122 | * Dispatched when the properties and methods of a loaded SWF file are accessible and ready for use. 123 | * 124 | *

HANDLER ARGUMENTS: (signal:LoaderSignal)

125 | * 128 | * 129 | * @see org.assetloader.signals.LoaderSignal 130 | */ 131 | public function get onInit() : LoaderSignal 132 | { 133 | return _onInit; 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/SoundLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.base.Param; 5 | import org.assetloader.signals.LoaderSignal; 6 | 7 | import flash.events.Event; 8 | import flash.events.IEventDispatcher; 9 | import flash.events.TimerEvent; 10 | import flash.media.Sound; 11 | import flash.net.URLRequest; 12 | import flash.utils.Timer; 13 | 14 | /** 15 | * @author Matan Uberstein 16 | */ 17 | public class SoundLoader extends BaseLoader 18 | { 19 | /** 20 | * @private 21 | */ 22 | protected var _onId3 : LoaderSignal; 23 | 24 | /** 25 | * @private 26 | */ 27 | protected var _onReady : LoaderSignal; 28 | 29 | /** 30 | * @private 31 | */ 32 | protected var _sound : Sound; 33 | 34 | /** 35 | * @private 36 | */ 37 | protected var _readyTimer : Timer; 38 | 39 | /** 40 | * @private 41 | */ 42 | protected var _isReady : Boolean; 43 | 44 | public function SoundLoader(request : URLRequest, id : String = null) 45 | { 46 | super(request, AssetType.SOUND, id); 47 | } 48 | 49 | /** 50 | * @private 51 | */ 52 | override protected function initSignals() : void 53 | { 54 | super.initSignals(); 55 | _onComplete = new LoaderSignal(Sound); 56 | _onReady = new LoaderSignal(Sound); 57 | _onId3 = new LoaderSignal(); 58 | } 59 | 60 | /** 61 | * @private 62 | */ 63 | override protected function constructLoader() : IEventDispatcher 64 | { 65 | _sound = _data = new Sound(); 66 | 67 | if(!_readyTimer) 68 | { 69 | _readyTimer = new Timer(50); 70 | _readyTimer.addEventListener(TimerEvent.TIMER, readyTimer_handler); 71 | } 72 | else 73 | _readyTimer.reset(); 74 | 75 | return _sound; 76 | } 77 | 78 | /** 79 | * @private 80 | */ 81 | override protected function invokeLoading() : void 82 | { 83 | try 84 | { 85 | _sound.load(request, getParam(Param.SOUND_LOADER_CONTEXT)); 86 | } 87 | catch(error : SecurityError) 88 | { 89 | _onError.dispatch(this, error.name, error.message); 90 | } 91 | _readyTimer.start(); 92 | } 93 | 94 | /** 95 | * @inheritDoc 96 | */ 97 | override public function stop() : void 98 | { 99 | if(_invoked) 100 | { 101 | try 102 | { 103 | _sound.close(); 104 | } 105 | catch(error : Error) 106 | { 107 | } 108 | _readyTimer.stop(); 109 | } 110 | super.stop(); 111 | } 112 | 113 | /** 114 | * @inheritDoc 115 | */ 116 | override public function destroy() : void 117 | { 118 | super.destroy(); 119 | 120 | if(_readyTimer) 121 | _readyTimer.removeEventListener(TimerEvent.TIMER, readyTimer_handler); 122 | 123 | _sound = null; 124 | _readyTimer = null; 125 | _isReady = false; 126 | } 127 | 128 | /** 129 | * @private 130 | */ 131 | override protected function addListeners(dispatcher : IEventDispatcher) : void 132 | { 133 | super.addListeners(dispatcher); 134 | if(dispatcher) 135 | dispatcher.addEventListener(Event.ID3, id3_handler); 136 | } 137 | 138 | /** 139 | * @private 140 | */ 141 | override protected function removeListeners(dispatcher : IEventDispatcher) : void 142 | { 143 | super.removeListeners(dispatcher); 144 | if(dispatcher) 145 | dispatcher.removeEventListener(Event.ID3, id3_handler); 146 | } 147 | 148 | /** 149 | * @private 150 | */ 151 | override protected function complete_handler(event : Event) : void 152 | { 153 | if(!_isReady) 154 | { 155 | _isReady = true; 156 | _onReady.dispatch(this, _sound); 157 | _readyTimer.stop(); 158 | } 159 | super.complete_handler(event); 160 | } 161 | 162 | /** 163 | * @private 164 | */ 165 | protected function readyTimer_handler(event : TimerEvent) : void 166 | { 167 | if(!_isReady && !_sound.isBuffering) 168 | { 169 | _onReady.dispatch(this, _sound); 170 | _isReady = true; 171 | _readyTimer.stop(); 172 | } 173 | } 174 | 175 | /** 176 | * @private 177 | */ 178 | protected function id3_handler(event : Event) : void 179 | { 180 | _onId3.dispatch(this); 181 | } 182 | 183 | /** 184 | * Dispatches when the Sound instance is ready to be played e.g. streamed while still loading. 185 | *

The SoundLoader closely monitors the isBuffering property of the Sound instance, the first 186 | * time isBuffering is false, onReady will dispatch. It could happen that the sound file is finished 187 | * loading loading before the isBuffering monitor detected it, so another check occurs onComplete. 188 | * Thus onReady will always fire before onComplete, but only once.

189 | * 190 | *

HANDLER ARGUMENTS: (signal:LoaderSignal, sound:Sound)

191 | * 195 | * 196 | * @see org.assetloader.signals.LoaderSignal 197 | */ 198 | public function get onReady() : LoaderSignal 199 | { 200 | return _onReady; 201 | } 202 | 203 | /** 204 | * Dispatches when the SoundLoader has loaded the ID3 information of 205 | * the sound clip. 206 | *

Note: Not all sound files have ID3 properties, thus this Signal will 207 | * only dispatch if such data exists.

208 | * 209 | *

HANDLER ARGUMENTS: (signal:LoaderSignal)

210 | * 213 | * 214 | * @see org.assetloader.signals.LoaderSignal 215 | */ 216 | public function get onId3() : LoaderSignal 217 | { 218 | return _onId3; 219 | } 220 | 221 | /** 222 | * Gets the Sound instance. 223 | *

Note: this instance will be available as soon as the SoundLoader's 224 | * start method is invoked.

225 | * 226 | * @return Sound 227 | */ 228 | public function get sound() : Sound 229 | { 230 | return _sound; 231 | } 232 | 233 | /** 234 | * Gets whether the Sound instance is ready to be streamed or not. 235 | * 236 | * @see #onReady 237 | */ 238 | public function get isReady() : Boolean 239 | { 240 | return _isReady; 241 | } 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/TextLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | 6 | import flash.events.ErrorEvent; 7 | import flash.events.Event; 8 | import flash.events.IEventDispatcher; 9 | import flash.net.URLRequest; 10 | import flash.net.URLStream; 11 | import flash.utils.ByteArray; 12 | 13 | /** 14 | * @author Matan Uberstein 15 | */ 16 | public class TextLoader extends BaseLoader 17 | { 18 | /** 19 | * @private 20 | */ 21 | protected var _text : String; 22 | 23 | /** 24 | * @private 25 | */ 26 | protected var _loader : URLStream; 27 | 28 | public function TextLoader(request : URLRequest, id : String = null) 29 | { 30 | super(request, AssetType.TEXT, id); 31 | } 32 | 33 | /** 34 | * @private 35 | */ 36 | override protected function initSignals() : void 37 | { 38 | super.initSignals(); 39 | _onComplete = new LoaderSignal(String); 40 | } 41 | 42 | /** 43 | * @private 44 | */ 45 | override protected function constructLoader() : IEventDispatcher 46 | { 47 | _loader = new URLStream(); 48 | return _loader; 49 | } 50 | 51 | /** 52 | * @private 53 | */ 54 | override protected function invokeLoading() : void 55 | { 56 | _loader.load(request); 57 | } 58 | 59 | /** 60 | * @inheritDoc 61 | */ 62 | override public function stop() : void 63 | { 64 | if(_invoked) 65 | { 66 | try 67 | { 68 | _loader.close(); 69 | } 70 | catch(error : Error) 71 | { 72 | } 73 | } 74 | super.stop(); 75 | } 76 | 77 | /** 78 | * @inheritDoc 79 | */ 80 | override public function destroy() : void 81 | { 82 | super.destroy(); 83 | _loader = null; 84 | _text = null; 85 | } 86 | 87 | /** 88 | * @private 89 | */ 90 | override protected function complete_handler(event : Event) : void 91 | { 92 | var bytes : ByteArray = new ByteArray(); 93 | _loader.readBytes(bytes); 94 | 95 | _data = _text = bytes.toString(); 96 | 97 | var testResult : String = testData(_data); 98 | 99 | if(testResult != "") 100 | { 101 | _onError.dispatch(this, ErrorEvent.ERROR, testResult); 102 | return; 103 | } 104 | 105 | super.complete_handler(event); 106 | } 107 | 108 | /** 109 | * @private 110 | * 111 | * @return Error message, empty string if no error occured. 112 | */ 113 | protected function testData(data : String) : String 114 | { 115 | return data == null ? "Data loaded is null." : ""; 116 | } 117 | 118 | /** 119 | * Gets the resulting String after loading is complete. 120 | * 121 | * @return String 122 | */ 123 | public function get text() : String 124 | { 125 | return _text; 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /src/org/assetloader/loaders/XMLLoader.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | 4 | import org.assetloader.base.AssetType; 5 | import org.assetloader.signals.LoaderSignal; 6 | 7 | import flash.net.URLRequest; 8 | 9 | /** 10 | * @author Matan Uberstein 11 | */ 12 | public class XMLLoader extends TextLoader 13 | { 14 | /** 15 | * @private 16 | */ 17 | protected var _xml : XML; 18 | 19 | public function XMLLoader(request : URLRequest, id : String = null) 20 | { 21 | super(request, id); 22 | _type = AssetType.XML; 23 | } 24 | 25 | /** 26 | * @private 27 | */ 28 | override protected function initSignals() : void 29 | { 30 | super.initSignals(); 31 | _onComplete = new LoaderSignal(XML); 32 | } 33 | 34 | /** 35 | * @private 36 | */ 37 | override public function destroy() : void 38 | { 39 | super.destroy(); 40 | _xml = null; 41 | } 42 | 43 | /** 44 | * @private 45 | * 46 | * @inheritDoc 47 | */ 48 | override protected function testData(data : String) : String 49 | { 50 | try 51 | { 52 | _data = _xml = new XML(data); 53 | } 54 | catch(err : Error) 55 | { 56 | return err.message; 57 | } 58 | 59 | if(xml) 60 | if(xml.nodeKind() != "element") 61 | return "Not valid XML."; 62 | 63 | return ""; 64 | } 65 | 66 | /** 67 | * Gets the resulting XML after loading and parsing is complete. 68 | * 69 | * @return XML 70 | */ 71 | public function get xml() : XML 72 | { 73 | return _xml; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/org/assetloader/parsers/URLParser.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.parsers 2 | { 3 | import flash.net.URLVariables; 4 | 5 | /** 6 | * The URLParser is used to check whether URLs are valid or not, also it extracts useful information from the given url. 7 | * 8 | *

URLs are parsed according to three groups; Absolute, Relative and Server.

9 | * 25 | * 26 | * @author Matan Uberstein 27 | */ 28 | public class URLParser 29 | { 30 | /** 31 | * @private 32 | */ 33 | protected var _url : String; 34 | /** 35 | * @private 36 | */ 37 | protected var _protocol : String; 38 | /** 39 | * @private 40 | */ 41 | protected var _login : String; 42 | /** 43 | * @private 44 | */ 45 | protected var _password : String; 46 | /** 47 | * @private 48 | */ 49 | protected var _port : int; 50 | /** 51 | * @private 52 | */ 53 | protected var _host : String; 54 | /** 55 | * @private 56 | */ 57 | protected var _path : String; 58 | /** 59 | * @private 60 | */ 61 | protected var _fileName : String; 62 | /** 63 | * @private 64 | */ 65 | protected var _fileExtension : String; 66 | /** 67 | * @private 68 | */ 69 | protected var _urlVariables : URLVariables; 70 | /** 71 | * @private 72 | */ 73 | protected var _anchor : String; 74 | /** 75 | * @private 76 | */ 77 | protected var _isValid : Boolean = true; 78 | 79 | /** 80 | * Parses url and breaks is down into properties and check whether the url is valid. 81 | * @param url String 82 | */ 83 | public function URLParser(url : String) 84 | { 85 | _url = url; 86 | 87 | if(!_url || _url == "") 88 | { 89 | _isValid = false; 90 | return; 91 | } 92 | 93 | if(_url.length >= 250) 94 | { 95 | _isValid = false; 96 | return; 97 | } 98 | 99 | var urlExp : RegExp = /^(?:(?P\w+):\/\/)?(?:(?P\w+):(?P\w+)@)?(?P(?:(?P[\w\.]+)\.)?(?P\w+\.(?P\w+)))?(?::(?P\d+))?(?P[\w\W]*\/(?P[^?]+(?:\.\w+)?)?)?(?:\?(?P[\w=&]+))?(?:#(?P\w+))?/; 100 | var match : * = urlExp.exec(url); 101 | 102 | if(match) 103 | { 104 | _protocol = match.scheme || null; 105 | 106 | _host = match.host || null; 107 | 108 | _login = match.login || null; 109 | _password = match.pass || null; 110 | 111 | _port = match.port ? int(match.port) : 80; 112 | 113 | _path = match.path || null; 114 | 115 | if(match.arg && match.arg != "") 116 | _urlVariables = new URLVariables(match.arg); 117 | 118 | _anchor = match.anchor || null; 119 | 120 | if(!_protocol && _url.indexOf("/") == -1) 121 | { 122 | _path = _host || _url; 123 | _fileName = _path.slice(-_path.lastIndexOf("/") - 1); 124 | _host = null; 125 | } 126 | 127 | if(!_path || _path == "") 128 | { 129 | _isValid = false; 130 | return; 131 | } 132 | 133 | if(_path.charAt(0) != "/") 134 | _path = "/" + _path; 135 | 136 | if(!_fileName) 137 | _fileName = match.file || null; 138 | 139 | if(_fileName) 140 | if(_fileName.indexOf(".") != -1) 141 | _fileExtension = _fileName.slice(_fileName.lastIndexOf(".") + 1); 142 | 143 | if(!_fileExtension && !_protocol && _path.charAt(_path.length - 1) != "/") 144 | _isValid = false; 145 | } 146 | else 147 | _isValid = false; 148 | } 149 | 150 | /** 151 | * Gets the url passes through constructor. 152 | * 153 | * @return String 154 | */ 155 | public function get url() : String 156 | { 157 | return _url; 158 | } 159 | 160 | /** 161 | * Gets the protocol of the url. 162 | * @return String 163 | */ 164 | public function get protocol() : String 165 | { 166 | return _protocol; 167 | } 168 | 169 | /** 170 | * Gets the login/username from the url. E.g. ftp://Matan:Password@some.where.com will return Matan. 171 | * @return String 172 | */ 173 | public function get login() : String 174 | { 175 | return _login; 176 | } 177 | 178 | /** 179 | * Gets the password from the url. E.g. ftp://Matan:Password@some.where.com will return Password. 180 | * @return String 181 | */ 182 | public function get password() : String 183 | { 184 | return _password; 185 | } 186 | 187 | /** 188 | * Gets the port of the url. 189 | * @default 80 190 | * @return int 191 | */ 192 | public function get port() : int 193 | { 194 | return _port; 195 | } 196 | 197 | /** 198 | * Gets the host of the url. E.g. www.matanuberstein.co.za 199 | * @return String 200 | */ 201 | public function get host() : String 202 | { 203 | return _host; 204 | } 205 | 206 | /** 207 | * Gets the path of the url. E.g. some/path/to/file/ 208 | * @return String 209 | */ 210 | public function get path() : String 211 | { 212 | return _path; 213 | } 214 | 215 | /** 216 | * Gets the file name of the url. E.g. someFileName.ext 217 | * @return String 218 | */ 219 | public function get fileName() : String 220 | { 221 | return _fileName; 222 | } 223 | 224 | /** 225 | * Gets the file extension of the url. E.g. txt, php, etc. 226 | * @return String 227 | */ 228 | public function get fileExtension() : String 229 | { 230 | return _fileExtension; 231 | } 232 | 233 | /** 234 | * Gets the url variables from the url. 235 | * @return URLVariables 236 | */ 237 | public function get urlVariables() : URLVariables 238 | { 239 | return _urlVariables; 240 | } 241 | 242 | /** 243 | * Gets the file hash anchor of the url. E.g. www.matanuberstein.co.za/#hello will return hello. 244 | * @return String 245 | */ 246 | public function get anchor() : String 247 | { 248 | return _anchor; 249 | } 250 | 251 | /** 252 | * Gets whether the url is valid or not. E.g. if a empty path is passed isValid will be false. 253 | * @default true 254 | * @return Boolean 255 | */ 256 | public function get isValid() : Boolean 257 | { 258 | return _isValid; 259 | } 260 | } 261 | } 262 | -------------------------------------------------------------------------------- /src/org/assetloader/parsers/XmlConfigParser.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.parsers 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.base.LoaderFactory; 5 | import org.assetloader.base.Param; 6 | import org.assetloader.core.IAssetLoader; 7 | import org.assetloader.core.IConfigParser; 8 | import org.assetloader.core.ILoader; 9 | 10 | import flash.net.URLRequest; 11 | 12 | /** 13 | * @author Matan Uberstein 14 | */ 15 | public class XmlConfigParser implements IConfigParser 16 | { 17 | /** 18 | * @private 19 | */ 20 | protected var _assetloader : IAssetLoader; 21 | /** 22 | * @private 23 | */ 24 | protected var _loaderFactory : LoaderFactory; 25 | 26 | public function XmlConfigParser() 27 | { 28 | } 29 | 30 | /** 31 | * @inheritDoc 32 | */ 33 | public function isValid(data : String) : Boolean 34 | { 35 | var xml : XML; 36 | 37 | try 38 | { 39 | xml = new XML(data); 40 | } 41 | catch(error : Error) 42 | { 43 | return false; 44 | } 45 | 46 | if(xml.nodeKind() != "element") 47 | return false; 48 | 49 | return true; 50 | } 51 | 52 | /** 53 | * @inheritDoc 54 | */ 55 | public function parse(assetloader : IAssetLoader, data : String) : void 56 | { 57 | _assetloader = assetloader; 58 | _loaderFactory = new LoaderFactory(); 59 | 60 | parseXml(new XML(data)); 61 | 62 | _assetloader = null; 63 | _loaderFactory = null; 64 | } 65 | 66 | /** 67 | * @private 68 | */ 69 | protected function parseXml(xml : XML, inheritFrom : ConfigVO = null) : void 70 | { 71 | var rootVo : ConfigVO = parseVo(xml, inheritFrom); 72 | var children : XMLList = xml.children(); 73 | 74 | var cL : int = children.length(); 75 | for(var i : int = 0;i < cL;i++) 76 | { 77 | var vo : ConfigVO = parseVo(children[i], rootVo); 78 | 79 | if(vo.id != "" && vo.src == "") 80 | { 81 | var group : IAssetLoader = parseGroup(vo); 82 | _assetloader.addLoader(group); 83 | group.addConfig(vo.xml); 84 | } 85 | else if(vo.id != "" && vo.src != "") 86 | _assetloader.addLoader(parseAsset(vo)); 87 | else 88 | parseXml(children[i], vo); 89 | } 90 | } 91 | 92 | /** 93 | * @private 94 | */ 95 | protected function parseGroup(vo : ConfigVO) : IAssetLoader 96 | { 97 | var loader : IAssetLoader = IAssetLoader(_loaderFactory.produce(vo.id, AssetType.GROUP, null, getParams(vo))); 98 | loader.numConnections = vo.connections; 99 | return loader; 100 | } 101 | 102 | /** 103 | * @private 104 | */ 105 | protected function parseAsset(vo : ConfigVO) : ILoader 106 | { 107 | return _loaderFactory.produce(vo.id, vo.type, new URLRequest(vo.src), getParams(vo)); 108 | } 109 | 110 | /** 111 | * @private 112 | */ 113 | protected function parseVo(xml : XML, inheritFrom : ConfigVO = null) : ConfigVO 114 | { 115 | if(!inheritFrom) 116 | inheritFrom = new ConfigVO(); 117 | 118 | var child : ConfigVO = new ConfigVO(); 119 | 120 | child.src = xml.@src || ""; 121 | child.id = xml.@id || ""; 122 | 123 | child.base = xml.@base || inheritFrom.base; 124 | child.type = xml.@type || inheritFrom.type; 125 | child.weight = convertWeight(xml.@weight); 126 | child.connections = xml.@connections || inheritFrom.connections; 127 | child.retries = xml.@retries || inheritFrom.retries; 128 | child.priority = xml.@priority || NaN; 129 | child.onDemand = toBoolean(xml.@onDemand, inheritFrom.onDemand); 130 | child.preventCache = toBoolean(xml.@preventCache, inheritFrom.preventCache); 131 | child.userData = xml.@userData || null; 132 | 133 | child.transparent = toBoolean(xml.@transparent, inheritFrom.transparent); 134 | child.smoothing = toBoolean(xml.@smoothing, inheritFrom.smoothing); 135 | child.fillColor = (xml.@fillColor) ? Number(xml.@fillColor) : inheritFrom.fillColor; 136 | child.blendMode = xml.@blendMode || inheritFrom.blendMode; 137 | child.pixelSnapping = xml.@pixelSnapping || inheritFrom.pixelSnapping; 138 | 139 | child.type = child.type.toUpperCase(); 140 | 141 | child.xml = xml; 142 | 143 | return child; 144 | } 145 | 146 | // --------------------------------------------------------------------------------------------------------------------------------// 147 | // HELPER FUNCTIONS 148 | // --------------------------------------------------------------------------------------------------------------------------------// 149 | /** 150 | * @private 151 | */ 152 | protected function getParams(vo : ConfigVO) : Array 153 | { 154 | var params : Array = []; 155 | 156 | if(!isNaN(vo.priority)) 157 | params.push(new Param(Param.PRIORITY, vo.priority)); 158 | 159 | if(vo.base && vo.base != "") 160 | params.push(new Param(Param.BASE, vo.base)); 161 | 162 | params.push(new Param(Param.WEIGHT, vo.weight)); 163 | params.push(new Param(Param.RETRIES, vo.retries)); 164 | params.push(new Param(Param.ON_DEMAND, vo.onDemand)); 165 | params.push(new Param(Param.PREVENT_CACHE, vo.preventCache)); 166 | params.push(new Param(Param.USER_DATA, vo.userData)); 167 | 168 | params.push(new Param(Param.TRANSPARENT, vo.transparent)); 169 | params.push(new Param(Param.SMOOTHING, vo.smoothing)); 170 | params.push(new Param(Param.FILL_COLOR, vo.fillColor)); 171 | params.push(new Param(Param.BLEND_MODE, vo.blendMode)); 172 | params.push(new Param(Param.PIXEL_SNAPPING, vo.pixelSnapping)); 173 | 174 | return params; 175 | } 176 | 177 | /** 178 | * @private 179 | */ 180 | protected function convertWeight(str : String) : uint 181 | { 182 | if(!str) 183 | return 0; 184 | 185 | str = str.replace(new RegExp(" ", "g"), ""); 186 | 187 | var mbExp : RegExp = new RegExp("mb", "gi"); 188 | if(mbExp.test(str)) 189 | return Number(str.replace(mbExp, "")) * 1024 * 1024; 190 | 191 | var kbExp : RegExp = new RegExp("kb", "gi"); 192 | if(kbExp.test(str)) 193 | return Number(str.replace(kbExp, "")) * 1024; 194 | 195 | return Number(str); 196 | } 197 | 198 | /** 199 | * @private 200 | */ 201 | protected function toBoolean(value : String, defaultReturn : Boolean) : Boolean 202 | { 203 | value = value.toLowerCase(); 204 | 205 | if(value == "1" || value == "yes" || value == "true") 206 | return true; 207 | 208 | if(value == "0" || value == "no" || value == "false") 209 | return false; 210 | 211 | return defaultReturn; 212 | } 213 | } 214 | } 215 | 216 | class ConfigVO 217 | { 218 | // Internal 219 | public var xml : XML; 220 | 221 | // IAssetLoader 222 | public var connections : int = 3; 223 | 224 | // Mixed, but mostly for ILoaders 225 | public var base : String = null; 226 | public var id : String; 227 | public var src : String; 228 | public var type : String = "AUTO"; 229 | public var retries : int = 3; 230 | public var weight : uint = 0; 231 | public var priority : int = NaN; 232 | public var onDemand : Boolean = false; 233 | public var preventCache : Boolean = false; 234 | public var userData : String; 235 | 236 | // ImageLoader 237 | 238 | public var transparent : Boolean = true; 239 | public var fillColor : uint = 4.294967295E9; 240 | public var blendMode : String = null; 241 | public var smoothing : Boolean = false; 242 | public var pixelSnapping : String = "auto"; 243 | } -------------------------------------------------------------------------------- /src/org/assetloader/signals/ErrorSignal.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.signals 2 | { 3 | 4 | /** 5 | * @author Matan Uberstein 6 | */ 7 | public class ErrorSignal extends LoaderSignal 8 | { 9 | /** 10 | * @private 11 | */ 12 | protected var _type : String; 13 | /** 14 | * @private 15 | */ 16 | protected var _message : String; 17 | 18 | public function ErrorSignal(...valueClasses) 19 | { 20 | _signalType = ErrorSignal; 21 | super(valueClasses); 22 | } 23 | 24 | /** 25 | * Dispatches Signal. 26 | * 27 | * @param args1 ILoader - ILoader to which the signal belongs. 28 | * @param args2 String - Error type 29 | * @param args3 String - Error message 30 | */ 31 | override public function dispatch(...args) : void 32 | { 33 | _type = args[1]; 34 | _message = args[2]; 35 | 36 | args.splice(1, 2); 37 | 38 | super.dispatch.apply(null, args); 39 | } 40 | 41 | /** 42 | * Gets the error type. 43 | * 44 | * @return String 45 | */ 46 | public function get type() : String 47 | { 48 | return _type; 49 | } 50 | 51 | /** 52 | * Gets the error message. 53 | * 54 | * @return String 55 | */ 56 | public function get message() : String 57 | { 58 | return _message; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/org/assetloader/signals/HttpStatusSignal.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.signals 2 | { 3 | 4 | /** 5 | * @author Matan Uberstein 6 | */ 7 | public class HttpStatusSignal extends LoaderSignal 8 | { 9 | /** 10 | * @private 11 | */ 12 | protected var _status : int; 13 | 14 | public function HttpStatusSignal(...valueClasses) 15 | { 16 | _signalType = HttpStatusSignal; 17 | super(valueClasses); 18 | } 19 | 20 | /** 21 | * Dispatches Signal. 22 | * 23 | * @param args1 ILoader - ILoader to which the signal belongs. 24 | * @param args2 int - Status code 25 | */ 26 | override public function dispatch(...args) : void 27 | { 28 | _status = args.splice(1, 1)[0]; 29 | super.dispatch.apply(null, args); 30 | } 31 | 32 | /** 33 | * Gets the http status code. 34 | * 35 | * @return int 36 | */ 37 | public function get status() : int 38 | { 39 | return _status; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/org/assetloader/signals/LoaderSignal.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.signals 2 | { 3 | import org.assetloader.core.ILoader; 4 | import org.osflash.signals.Signal; 5 | 6 | /** 7 | * @author Matan Uberstein 8 | */ 9 | public class LoaderSignal extends Signal 10 | { 11 | /** 12 | * @private 13 | */ 14 | protected var _loader : ILoader; 15 | 16 | /** 17 | * @private 18 | */ 19 | protected var _signalType : Class; 20 | 21 | public function LoaderSignal(...valueClasses) 22 | { 23 | super(); 24 | _signalType ||= LoaderSignal; 25 | 26 | if(valueClasses.length == 1 && valueClasses[0] is Array) 27 | valueClasses = valueClasses[0]; 28 | 29 | this.valueClasses = [_signalType].concat.apply(null, valueClasses); 30 | } 31 | 32 | /** 33 | * First argument must be the loader to which this signal belongs. 34 | */ 35 | override public function dispatch(...args) : void 36 | { 37 | _loader = args.shift(); 38 | 39 | super.dispatch.apply(null, [this].concat.apply(null, args)); 40 | } 41 | 42 | /** 43 | * Gets the loader that dispatched this signal. 44 | * 45 | * @return ILoader 46 | */ 47 | public function get loader() : ILoader 48 | { 49 | return _loader; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/org/assetloader/signals/NetStatusSignal.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.signals 2 | { 3 | 4 | /** 5 | * @author Matan Uberstein 6 | */ 7 | public class NetStatusSignal extends LoaderSignal 8 | { 9 | /** 10 | * @private 11 | */ 12 | protected var _info : Object; 13 | 14 | public function NetStatusSignal(...valueClasses) 15 | { 16 | _signalType = NetStatusSignal; 17 | super(valueClasses); 18 | } 19 | 20 | /** 21 | * Dispatches Signal. 22 | * 23 | * @param args1 ILoader - ILoader to which the signal belongs. 24 | * @param args2 Object - NetStatus Info Object 25 | */ 26 | override public function dispatch(...args) : void 27 | { 28 | _info = args.splice(1, 1)[0]; 29 | super.dispatch.apply(null, args); 30 | } 31 | 32 | /** 33 | * Gets the NetStatus info object. 34 | * 35 | * @return Object 36 | */ 37 | public function get info() : Object 38 | { 39 | return _info; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/org/assetloader/signals/ProgressSignal.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.signals 2 | { 3 | 4 | /** 5 | * @author Matan Uberstein 6 | */ 7 | public class ProgressSignal extends LoaderSignal 8 | { 9 | /** 10 | * @private 11 | */ 12 | protected var _latency : Number = 0; 13 | /** 14 | * @private 15 | */ 16 | protected var _speed : Number = 0; 17 | /** 18 | * @private 19 | */ 20 | protected var _averageSpeed : Number = 0; 21 | /** 22 | * @private 23 | */ 24 | protected var _progress : Number = 0; 25 | 26 | /** 27 | * @private 28 | */ 29 | protected var _bytesLoaded : uint = 0; 30 | /** 31 | * @private 32 | */ 33 | protected var _bytesTotal : uint = 0; 34 | 35 | public function ProgressSignal(...valueClasses) 36 | { 37 | _signalType = ProgressSignal; 38 | super(valueClasses); 39 | } 40 | 41 | /** 42 | * Dispatches Signal. 43 | * 44 | * @param args1 ILoader - ILoader to which the signal belongs. 45 | * @param args2 Number - Latency * @param args3 Number - Speed * @param args4 Number - averageSpeed * @param args5 Number - progress * @param args6 uint - bytesLoaded * @param args7 uint - bytesTotal 46 | */ 47 | override public function dispatch(...args) : void 48 | { 49 | _latency = args[1]; 50 | _speed = args[2]; 51 | _averageSpeed = args[3]; 52 | _progress = args[4]; 53 | _bytesLoaded = args[5]; 54 | _bytesTotal = args[6]; 55 | 56 | args.splice(1, 6); 57 | 58 | super.dispatch.apply(null, args); 59 | } 60 | 61 | /** 62 | * Gets the latency in milliseconds. 63 | * 64 | * @return Number. 65 | */ 66 | public function get latency() : Number 67 | { 68 | return _latency; 69 | } 70 | 71 | /** 72 | * Gets speed in kilobytes per second. 73 | * 74 | * @return Number. 75 | */ 76 | public function get speed() : Number 77 | { 78 | return _speed; 79 | } 80 | 81 | /** 82 | * Gets the average speed in kilobytes per second. 83 | */ 84 | public function get averageSpeed() : Number 85 | { 86 | return _averageSpeed; 87 | } 88 | 89 | /** 90 | * Gets the progress in percentage value. 91 | * 92 | * @return Number between 0 and 100 93 | */ 94 | public function get progress() : Number 95 | { 96 | return _progress; 97 | } 98 | 99 | /** 100 | * Gets the bytes loaded. 101 | * 102 | * @return uint 103 | */ 104 | public function get bytesLoaded() : uint 105 | { 106 | return _bytesLoaded; 107 | } 108 | 109 | /** 110 | * Gets the total bytes. 111 | * 112 | * @return uint 113 | */ 114 | public function get bytesTotal() : uint 115 | { 116 | return _bytesTotal; 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/org/assetloader/utils/Inspector.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.utils 2 | { 3 | import flash.media.Sound; 4 | import flash.display.Bitmap; 5 | import flash.display.BitmapData; 6 | import flash.display.DisplayObject; 7 | import flash.display.MovieClip; 8 | import flash.display.Sprite; 9 | import flash.system.ApplicationDomain; 10 | import flash.text.Font; 11 | 12 | /** 13 | * The Incpector class allows you to easily extract assets from a display object's application domain. E.g. 14 | * you've just loaded in a swf that contains serveral assets/classes you'd like to use in your application. 15 | * By constructing an Inspector instance and passing you loaded swf, you are able to "extact" those assets 16 | * just by calling the related api while passing the package/class name. 17 | * 18 | * @author Matan Uberstein + Karl Freeman 19 | */ 20 | public class Inspector 21 | { 22 | /** 23 | * @private 24 | * Domain used so that we can check to see if a class exhists 25 | */ 26 | protected var _domain : ApplicationDomain; 27 | 28 | /** 29 | * Public property of the base package used for all future "get" calls. 30 | * e.g. Setting the basePackage to "com.domain.assets" and then calling 31 | * "getSprite('MyCustomSpriteAsset');" will result in the Inspector returing 32 | * a new Sprite instance of "com.domain.assets.MyCustomSpriteAsset". 33 | */ 34 | public var basePackage : String = ""; 35 | 36 | /** 37 | * Constructor. 38 | * 39 | * @param displayObject The application domain to be inspected. 40 | * 41 | * @see #destroy() 42 | */ 43 | public function Inspector(displayObject : DisplayObject) 44 | { 45 | _domain = displayObject.loaderInfo.applicationDomain; 46 | } 47 | 48 | /** 49 | * This will get rid of any reference held to the DisplayObject passed via constructor. 50 | */ 51 | public function destroy() : void 52 | { 53 | _domain = null; 54 | } 55 | 56 | /** 57 | * Extract a Class object from the DisplayObject's application domain. 58 | *

59 | * Note: If you have specified a basePackage and you pass a "full name" of the class you'd like, 60 | * the basePackge is STILL appended to the "full name". This is done for performance reasons, there is no need to 61 | * do complex String handling. In a case like that, simply set the "overrideBasePackage" to an empty string. 62 | *

63 | *
    64 | *
  • inspector.basePackage = "org.assetloader.assets";
  • 65 | *
  • inspector.getClass("MyAsset1"); // Returns the class for "org.assetloader.assets.MyAsset1"
  • 66 | *
  • inspector.getClass("com.domain.assets.MyAsset2", ""); // Returns the class for "com.domain.assets.MyAsset2"
  • 67 | *
  • inspector.getClass("com.domain.assets.MyAsset2"); // Returns the class for "org.assetloader.assets.com.domain.assets.MyAsset2" - which is null
  • 68 | *
69 | * 70 | * @param classNameOrFullName A straight up class name or full name of a class. 71 | * @param overrideBasePackage Override the basePackage, just for this call. 72 | * 73 | * @return Class object matching package/name combo. 74 | */ 75 | public function getClass(classNameOrFullName : String, overrideBasePackage : String = null) : Class 76 | { 77 | var bp : String = overrideBasePackage || basePackage; 78 | if(!bp) bp = ""; 79 | var fullName : String = bp + ((bp == "") ? "" : ".") + classNameOrFullName; 80 | if(_domain.hasDefinition(fullName)) 81 | return _domain.getDefinition(fullName) as Class; 82 | return null; 83 | 84 | } 85 | 86 | /** 87 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 88 | * 89 | * @param classNameOrFullName A straight up class name or full name of a class. 90 | * @param overrideBasePackage Override the basePackage, just for this call. 91 | * @see #getClass() 92 | */ 93 | public function getSprite(className : String, overrideBasePackage : String = null) : Sprite 94 | { 95 | var clazz : Class = getClass(className, overrideBasePackage); 96 | if(clazz) 97 | return new clazz() as Sprite; 98 | return null; 99 | } 100 | 101 | /** 102 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 103 | * 104 | * @param classNameOrFullName A straight up class name or full name of a class. 105 | * @param overrideBasePackage Override the basePackage, just for this call. 106 | * @see #getClass() 107 | */ 108 | public function getMovieClip(className : String, overrideBasePackage : String = null) : MovieClip 109 | { 110 | var clazz : Class = getClass(className, overrideBasePackage); 111 | if(clazz) 112 | return new clazz() as MovieClip; 113 | return null; 114 | } 115 | 116 | /** 117 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 118 | * 119 | * @param classNameOrFullName A straight up class name or full name of a class. 120 | * @param overrideBasePackage Override the basePackage, just for this call. 121 | * @see #getClass() 122 | */ 123 | public function getFont(className : String, overrideBasePackage : String = null) : Font 124 | { 125 | var clazz : Class = getClass(className, overrideBasePackage); 126 | if(clazz) 127 | return new clazz() as Font; 128 | return null; 129 | } 130 | 131 | /** 132 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 133 | * 134 | * @param classNameOrFullName A straight up class name or full name of a class. 135 | * @param overrideBasePackage Override the basePackage, just for this call. 136 | * @see #getClass() 137 | */ 138 | public function getSound(className : String, overrideBasePackage : String = null) : Sound 139 | { 140 | var clazz : Class = getClass(className, overrideBasePackage); 141 | if(clazz) 142 | return new clazz() as Sound; 143 | return null; 144 | } 145 | 146 | /** 147 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 148 | * 149 | * @param classNameOrFullName A straight up class name or full name of a class. 150 | * @param overrideBasePackage Override the basePackage, just for this call. 151 | * @see #getClass() 152 | */ 153 | public function getBitmapData(className : String, overrideBasePackage : String = null) : BitmapData 154 | { 155 | var clazz : Class = getClass(className, overrideBasePackage); 156 | if(clazz) 157 | return new clazz(0, 0) as BitmapData; 158 | return null; 159 | } 160 | 161 | /** 162 | * Extract a new instance of package/class combo from the DisplayObject's application domain. 163 | * 164 | * @param classNameOrFullName A straight up class name or full name of a class. 165 | * @param overrideBasePackage Override the basePackage, just for this call. 166 | * @see #getClass() 167 | */ 168 | public function getBitmap(className : String, overrideBasePackage : String = null) : Bitmap 169 | { 170 | var bitmapData : BitmapData = getBitmapData(className, overrideBasePackage); 171 | if(bitmapData) 172 | return new Bitmap(bitmapData); 173 | return null; 174 | } 175 | } 176 | } -------------------------------------------------------------------------------- /src_examples/org/assetloader/example/ALLoggerExample.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.example 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.core.IAssetLoader; 5 | import org.assetloader.signals.LoaderSignal; 6 | import org.assetloader.utils.ALLogger; 7 | 8 | import flash.display.Sprite; 9 | import flash.display.StageAlign; 10 | import flash.display.StageScaleMode; 11 | import flash.events.Event; 12 | import flash.events.MouseEvent; 13 | import flash.filters.BevelFilter; 14 | import flash.filters.DropShadowFilter; 15 | import flash.text.TextField; 16 | import flash.text.TextFieldAutoSize; 17 | import flash.text.TextFieldType; 18 | import flash.text.TextFormat; 19 | 20 | /** 21 | * @author Matan Uberstein 22 | */ 23 | public class ALLoggerExample extends Sprite 24 | { 25 | // --- Controls ---// 26 | protected var _btns : Array = []; 27 | // ----------------// 28 | 29 | protected var _assetloader : IAssetLoader; 30 | protected var _field : TextField; 31 | protected var _logger : ALLogger; 32 | 33 | public function ALLoggerExample() 34 | { 35 | stage.scaleMode = StageScaleMode.NO_SCALE; 36 | stage.align = StageAlign.TOP_LEFT; 37 | 38 | initControls(); 39 | initConsole(); 40 | 41 | _assetloader = new AssetLoader("pr-group"); 42 | 43 | // AssetLoader Logger, will output trace statements. 44 | _logger = new ALLogger(); 45 | _logger.onLog.add(append); 46 | 47 | // Sample swapping out of indent char. 48 | _logger.indentChar = "--> "; 49 | } 50 | 51 | // --------------------------------------------------------------------------------------------------------------------------------// 52 | // HANDLERS 53 | // --------------------------------------------------------------------------------------------------------------------------------// 54 | protected function load_click_handler(event : MouseEvent) : void 55 | { 56 | append("//------------------------------------------------------------------------------//"); 57 | append("USER COMMAND: Load Config"); 58 | 59 | _assetloader.onConfigLoaded.addOnce(onConfigLoaded_handler); 60 | _assetloader.addConfig("complex-queue-config.xml"); 61 | } 62 | 63 | protected function start_click_handler(event : MouseEvent) : void 64 | { 65 | append("//------------------------------------------------------------------------------//"); 66 | append("USER COMMAND: Start Loading"); 67 | append("//------------------------------------------------------------------------------//"); 68 | 69 | _assetloader.start(); 70 | } 71 | 72 | protected function attach_click_handler(event : MouseEvent) : void 73 | { 74 | var field : TextField = event.currentTarget.getChildByName("field"); 75 | var verbosity : int = int(TextField(getChildByName("attVInput")).text); 76 | var recursion : int = int(TextField(getChildByName("attRInput")).text); 77 | append("//------------------------------------------------------------------------------//"); 78 | if(field.text == "Attach Logger ") 79 | { 80 | field.text = "Detach Logger"; 81 | _logger.attach(_assetloader, verbosity, recursion); 82 | append("USER COMMAND: Attach Logger | verbosity=" + verbosity + " | recursion=" + recursion); 83 | } 84 | else 85 | { 86 | field.text = "Attach Logger "; 87 | _logger.detach(_assetloader, verbosity, recursion); 88 | append("USER COMMAND: Detach Logger | verbosity=" + verbosity + " | recursion=" + recursion); 89 | } 90 | append("//------------------------------------------------------------------------------//"); 91 | } 92 | 93 | protected function explode_click_handler(event : MouseEvent) : void 94 | { 95 | var verbosity : int = int(TextField(getChildByName("expVInput")).text); 96 | var recursion : int = int(TextField(getChildByName("expRInput")).text); 97 | 98 | append("//------------------------------------------------------------------------------//"); 99 | append("USER COMMAND: Explode | verbosity=" + verbosity + " | recursion=" + recursion); 100 | append("//------------------------------------------------------------------------------//"); 101 | 102 | _logger.explode(_assetloader, verbosity, recursion); 103 | } 104 | 105 | protected function expStats_click_handler(event : MouseEvent) : void 106 | { 107 | var recursion : int = int(TextField(getChildByName("stsRInput")).text); 108 | 109 | append("//------------------------------------------------------------------------------//"); 110 | append("USER COMMAND: Explode | recursion=" + recursion); 111 | append("//------------------------------------------------------------------------------//"); 112 | 113 | _logger.explodeStats(_assetloader, recursion); 114 | } 115 | 116 | protected function clear_click_handler(event:MouseEvent) : void 117 | { 118 | _field.text = ""; 119 | } 120 | 121 | protected function onConfigLoaded_handler(signal : LoaderSignal) : void 122 | { 123 | append("... Config Loaded"); 124 | append("//------------------------------------------------------------------------------//"); 125 | } 126 | 127 | // --------------------------------------------------------------------------------------------------------------------------------// 128 | // CONTROLS 129 | // --------------------------------------------------------------------------------------------------------------------------------// 130 | protected function initControls() : void 131 | { 132 | addButton("Load Config", load_click_handler); 133 | addButton("Start Loading", start_click_handler); 134 | addButton("Attach Logger ", attach_click_handler); 135 | addInputs("att", 0, -1); 136 | addButton("Explode", explode_click_handler); 137 | addInputs("exp", 0, -1); 138 | addButton("Explode Stats", expStats_click_handler); 139 | addInputs("sts", 0, -1); 140 | addButton("Clear Console", clear_click_handler); 141 | 142 | removeChild(getChildByName("stsVInput")); 143 | } 144 | 145 | protected function addButton(label : String, clickHandler : Function) : Sprite 146 | { 147 | var field : TextField = new TextField(); 148 | field.defaultTextFormat = new TextFormat("Arial", 12, 0xFFFFFF, true); 149 | field.autoSize = TextFieldAutoSize.LEFT; 150 | field.x = 4; 151 | field.y = 4; 152 | field.name = "field"; 153 | field.mouseEnabled = false; 154 | field.text = label; 155 | 156 | var btn : Sprite = new Sprite(); 157 | var pBtn : Sprite = _btns[_btns.length - 1]; 158 | if(pBtn) 159 | btn.x = pBtn.x + pBtn.width + 6; 160 | with(btn.graphics) 161 | { 162 | beginFill(0x333333); 163 | drawRoundRect(0, 0, field.width + 8, field.height + 8, 3); 164 | } 165 | btn.buttonMode = true; 166 | btn.filters = [new BevelFilter(2, 45, 0xFFFFFF, .6, 0, .2, 5, 5, 1, 3), new DropShadowFilter(2, 45, 0, .3, 5, 5, 1, 3)]; 167 | btn.addEventListener(MouseEvent.CLICK, clickHandler); 168 | btn.addChild(field); 169 | _btns.push(btn); 170 | addChild(btn); 171 | 172 | return btn; 173 | } 174 | 175 | protected function addInputs(prefix : String, valueV : int, valueR : int) : void 176 | { 177 | var btn : Sprite = _btns[_btns.length - 1]; 178 | if(btn) 179 | { 180 | createInput(prefix + "V", valueV, btn.x, (btn.width / 2) - 4); 181 | createInput(prefix + "R", valueR, btn.x + (btn.width / 2) + 2, (btn.width / 2) - 4); 182 | } 183 | } 184 | 185 | protected function createInput(prefix : String, value : int, x : Number, width : Number) : void 186 | { 187 | var input : TextField = new TextField(); 188 | input.defaultTextFormat = new TextFormat("Courier New", 12, null, null, null, null, null, null, "center"); 189 | input.border = true; 190 | input.type = TextFieldType.INPUT; 191 | input.x = x; 192 | input.y = 32; 193 | input.width = width; 194 | input.height = 18; 195 | input.restrict = "\-0-4"; 196 | input.maxChars = 2; 197 | input.name = prefix + "Input"; 198 | input.text = String(value); 199 | addChild(input); 200 | } 201 | 202 | // --------------------------------------------------------------------------------------------------------------------------------// 203 | // CONSOLE 204 | // --------------------------------------------------------------------------------------------------------------------------------// 205 | protected function initConsole() : void 206 | { 207 | _field = new TextField(); 208 | _field.defaultTextFormat = new TextFormat("Courier New", 12); 209 | _field.multiline = true; 210 | _field.selectable = true; 211 | _field.wordWrap = false; 212 | _field.y = 60; 213 | _field.width = stage.stageWidth; 214 | _field.height = stage.stageHeight - 60; 215 | 216 | stage.addEventListener(Event.RESIZE, resize_handler); 217 | 218 | addChild(_field); 219 | } 220 | 221 | protected function append(text : String) : void 222 | { 223 | _field.appendText(text + "\n"); 224 | } 225 | 226 | protected function resize_handler(event : Event) : void 227 | { 228 | _field.width = stage.stageWidth; 229 | _field.height = stage.stageHeight - 60; 230 | } 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /src_examples/org/assetloader/example/AddConfigComplexExample.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.example 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.core.IAssetLoader; 5 | import org.assetloader.core.ILoadStats; 6 | import org.assetloader.core.ILoader; 7 | import org.assetloader.signals.ErrorSignal; 8 | import org.assetloader.signals.LoaderSignal; 9 | 10 | import flash.display.Sprite; 11 | import flash.display.StageAlign; 12 | import flash.display.StageScaleMode; 13 | import flash.events.Event; 14 | import flash.text.TextField; 15 | import flash.text.TextFormat; 16 | import flash.utils.Dictionary; 17 | 18 | /** 19 | * @author Matan Uberstein 20 | */ 21 | public class AddConfigComplexExample extends Sprite 22 | { 23 | protected var _assetloader : IAssetLoader; 24 | protected var _field : TextField; 25 | 26 | public function AddConfigComplexExample() 27 | { 28 | stage.scaleMode = StageScaleMode.NO_SCALE; 29 | stage.align = StageAlign.TOP_LEFT; 30 | 31 | initConsole(); 32 | 33 | // Just for the output's sake, We are giving our 'primary-loader' a shorther id that matches with the other groups 34 | _assetloader = new AssetLoader("pr-group"); 35 | 36 | // Passing config as a URL. 37 | _assetloader.addConfig("complex-queue-config.xml"); 38 | 39 | // Because we are passing the config as a URL, we need wait until AssetLoader fires onConfigLoaded before stating the queue. 40 | _assetloader.onConfigLoaded.add(onConfigLoaded_handler); 41 | } 42 | 43 | // --------------------------------------------------------------------------------------------------------------------------------// 44 | // HANDLERS 45 | // --------------------------------------------------------------------------------------------------------------------------------// 46 | protected function onConfigLoaded_handler(signal : LoaderSignal) : void 47 | { 48 | // Do your clean up! 49 | _assetloader.onConfigLoaded.remove(onConfigLoaded_handler); 50 | 51 | // Before we start, lets add the listeners to the child group loaders. 52 | var group1 : IAssetLoader = _assetloader.getAssetLoader('group-01'); 53 | addListenersToLoader(group1); 54 | 55 | // group-02 is nested inside group1. 56 | var group2 : IAssetLoader = group1.getAssetLoader('group-02'); 57 | addListenersToLoader(group2); 58 | 59 | // Add Listener to our Primary Loader 60 | addListenersToLoader(_assetloader); 61 | 62 | // Now Start the queue! 63 | _assetloader.start(); 64 | } 65 | 66 | protected function onChildOpen_handler(signal : LoaderSignal, child : ILoader) : void 67 | { 68 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\topened \tLatency\t: " + Math.floor(child.stats.latency) + "\tms"); 69 | } 70 | 71 | protected function onChildError_handler(signal : ErrorSignal, child : ILoader) : void 72 | { 73 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\terror \tType\t: " + signal.type + " | Message: " + signal.message); 74 | } 75 | 76 | protected function onChildComplete_handler(signal : LoaderSignal, child : ILoader) : void 77 | { 78 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\tcomplete\tSpeed\t: " + Math.floor(child.stats.averageSpeed) + "\tkbps"); 79 | } 80 | 81 | protected function onComplete_handler(signal : LoaderSignal, assets : Dictionary) : void 82 | { 83 | var loader : IAssetLoader = IAssetLoader(signal.loader); 84 | 85 | // Do your clean up! 86 | removeListenersFromLoader(loader); 87 | 88 | // Our AssetLoader's stats. 89 | var stats : ILoadStats = loader.stats; 90 | 91 | append("\n[" + loader.id + "]"); 92 | append("LOADING COMPLETE:"); 93 | append("Total Time: " + stats.totalTime + " ms"); 94 | append("Average Latency: " + Math.floor(stats.latency) + " ms"); 95 | append("Average Speed: " + Math.floor(stats.averageSpeed) + " kbps"); 96 | append("Total Bytes: " + stats.bytesTotal); 97 | append(""); 98 | } 99 | 100 | // --------------------------------------------------------------------------------------------------------------------------------// 101 | // ADD / REMOVE LISTENERS 102 | // --------------------------------------------------------------------------------------------------------------------------------// 103 | protected function addListenersToLoader(loader : IAssetLoader) : void 104 | { 105 | loader.onChildOpen.add(onChildOpen_handler); 106 | loader.onChildError.add(onChildError_handler); 107 | loader.onChildComplete.add(onChildComplete_handler); 108 | 109 | loader.onComplete.add(onComplete_handler); 110 | } 111 | 112 | protected function removeListenersFromLoader(loader : IAssetLoader) : void 113 | { 114 | loader.onChildOpen.remove(onChildOpen_handler); 115 | loader.onChildError.remove(onChildError_handler); 116 | loader.onChildComplete.remove(onChildComplete_handler); 117 | 118 | loader.onComplete.remove(onComplete_handler); 119 | } 120 | 121 | // --------------------------------------------------------------------------------------------------------------------------------// 122 | // CONSOLE 123 | // --------------------------------------------------------------------------------------------------------------------------------// 124 | protected function initConsole() : void 125 | { 126 | _field = new TextField(); 127 | _field.defaultTextFormat = new TextFormat("Courier New", 12); 128 | _field.multiline = true; 129 | _field.selectable = true; 130 | _field.wordWrap = false; 131 | _field.width = stage.stageWidth; 132 | _field.height = stage.stageHeight; 133 | 134 | stage.addEventListener(Event.RESIZE, resize_handler); 135 | 136 | addChild(_field); 137 | } 138 | 139 | protected function append(text : String) : void 140 | { 141 | _field.appendText(text + "\n"); 142 | } 143 | 144 | protected function resize_handler(event : Event) : void 145 | { 146 | _field.width = stage.stageWidth; 147 | _field.height = stage.stageHeight; 148 | } 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /src_examples/org/assetloader/example/AddConfigExample.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.example 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.core.IAssetLoader; 5 | import org.assetloader.core.ILoadStats; 6 | import org.assetloader.core.ILoader; 7 | import org.assetloader.signals.ErrorSignal; 8 | import org.assetloader.signals.LoaderSignal; 9 | 10 | import flash.display.Sprite; 11 | import flash.display.StageAlign; 12 | import flash.display.StageScaleMode; 13 | import flash.events.Event; 14 | import flash.text.TextField; 15 | import flash.text.TextFormat; 16 | import flash.utils.Dictionary; 17 | 18 | /** 19 | * @author Matan Uberstein 20 | */ 21 | public class AddConfigExample extends Sprite 22 | { 23 | protected var _assetloader : IAssetLoader; 24 | protected var _field : TextField; 25 | 26 | public function AddConfigExample() 27 | { 28 | stage.scaleMode = StageScaleMode.NO_SCALE; 29 | stage.align = StageAlign.TOP_LEFT; 30 | 31 | initConsole(); 32 | 33 | _assetloader = new AssetLoader(); 34 | 35 | // Passing config as a URL. 36 | _assetloader.addConfig("simple-queue-config.xml"); 37 | 38 | // Because we are passing the config as a URL, we need wait until AssetLoader fires onConfigLoaded before stating the queue. 39 | _assetloader.onConfigLoaded.add(onConfigLoaded_handler); 40 | 41 | // Add listeners 42 | addListenersToLoader(_assetloader); 43 | } 44 | 45 | // --------------------------------------------------------------------------------------------------------------------------------// 46 | // HANDLERS 47 | // --------------------------------------------------------------------------------------------------------------------------------// 48 | protected function onConfigLoaded_handler(signal : LoaderSignal) : void 49 | { 50 | // Do your clean up! 51 | _assetloader.onConfigLoaded.remove(onConfigLoaded_handler); 52 | 53 | // Start! 54 | _assetloader.start(); 55 | } 56 | 57 | protected function onChildOpen_handler(signal : LoaderSignal, child : ILoader) : void 58 | { 59 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\topened \tLatency\t: " + Math.floor(child.stats.latency) + "\tms"); 60 | } 61 | 62 | protected function onChildError_handler(signal : ErrorSignal, child : ILoader) : void 63 | { 64 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\terror \tType\t: " + signal.type + " | Message: " + signal.message); 65 | } 66 | 67 | protected function onChildComplete_handler(signal : LoaderSignal, child : ILoader) : void 68 | { 69 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\tcomplete\tSpeed\t: " + Math.floor(child.stats.averageSpeed) + "\tkbps"); 70 | } 71 | 72 | protected function onComplete_handler(signal : LoaderSignal, assets : Dictionary) : void 73 | { 74 | var loader : IAssetLoader = IAssetLoader(signal.loader); 75 | 76 | // Do your clean up! 77 | removeListenersFromLoader(loader); 78 | 79 | // Our Primary AssetLoader's stats. 80 | var stats : ILoadStats = loader.stats; 81 | 82 | append("\n[" + loader.id + "]"); 83 | append("LOADING COMPLETE:"); 84 | append("Total Time: " + stats.totalTime + " ms"); 85 | append("Average Latency: " + Math.floor(stats.latency) + " ms"); 86 | append("Average Speed: " + Math.floor(stats.averageSpeed) + " kbps"); 87 | append("Total Bytes: " + stats.bytesTotal); 88 | append(""); 89 | } 90 | 91 | // --------------------------------------------------------------------------------------------------------------------------------// 92 | // ADD / REMOVE LISTENERS 93 | // --------------------------------------------------------------------------------------------------------------------------------// 94 | protected function addListenersToLoader(loader : IAssetLoader) : void 95 | { 96 | loader.onChildOpen.add(onChildOpen_handler); 97 | loader.onChildError.add(onChildError_handler); 98 | loader.onChildComplete.add(onChildComplete_handler); 99 | 100 | loader.onComplete.add(onComplete_handler); 101 | } 102 | 103 | protected function removeListenersFromLoader(loader : IAssetLoader) : void 104 | { 105 | loader.onChildOpen.remove(onChildOpen_handler); 106 | loader.onChildError.remove(onChildError_handler); 107 | loader.onChildComplete.remove(onChildComplete_handler); 108 | 109 | loader.onComplete.remove(onComplete_handler); 110 | } 111 | 112 | // --------------------------------------------------------------------------------------------------------------------------------// 113 | // CONSOLE 114 | // --------------------------------------------------------------------------------------------------------------------------------// 115 | protected function initConsole() : void 116 | { 117 | _field = new TextField(); 118 | _field.defaultTextFormat = new TextFormat("Courier New", 12); 119 | _field.multiline = true; 120 | _field.selectable = true; 121 | _field.wordWrap = false; 122 | _field.width = stage.stageWidth; 123 | _field.height = stage.stageHeight; 124 | 125 | stage.addEventListener(Event.RESIZE, resize_handler); 126 | 127 | addChild(_field); 128 | } 129 | 130 | protected function append(text : String) : void 131 | { 132 | _field.appendText(text + "\n"); 133 | } 134 | 135 | protected function resize_handler(event : Event) : void 136 | { 137 | _field.width = stage.stageWidth; 138 | _field.height = stage.stageHeight; 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src_examples/org/assetloader/example/AddLazyExample.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.example 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | 5 | import flash.utils.Dictionary; 6 | import flash.display.StageAlign; 7 | import flash.display.StageScaleMode; 8 | import flash.events.Event; 9 | import flash.text.TextFormat; 10 | import flash.text.TextField; 11 | 12 | import org.assetloader.signals.ErrorSignal; 13 | import org.assetloader.AssetLoader; 14 | import org.assetloader.base.Param; 15 | import org.assetloader.core.IAssetLoader; 16 | import org.assetloader.core.ILoader; 17 | import org.assetloader.signals.LoaderSignal; 18 | 19 | import flash.display.Sprite; 20 | 21 | /** 22 | * @author Matan Uberstein 23 | */ 24 | public class AddLazyExample extends Sprite 25 | { 26 | protected var _assetloader : IAssetLoader; 27 | protected var _field : TextField; 28 | 29 | public function AddLazyExample() 30 | { 31 | stage.scaleMode = StageScaleMode.NO_SCALE; 32 | stage.align = StageAlign.TOP_LEFT; 33 | 34 | initConsole(); 35 | 36 | _assetloader = new AssetLoader(); 37 | 38 | // Child loaders will inherit params. 39 | _assetloader.setParam(Param.PREVENT_CACHE, true); 40 | _assetloader.setParam(Param.BASE, "http://www.matanuberstein.co.za/assets/sample/"); 41 | 42 | // Add assets to queue. 43 | _assetloader.addLazy('txt-asset', "sampleTXT.txt"); 44 | _assetloader.addLazy('jsn-asset', "sampleJSON.json"); 45 | _assetloader.addLazy('css-asset', "sampleCSS.css"); 46 | _assetloader.addLazy('xml-asset', "sampleXML.xml"); 47 | 48 | _assetloader.addLazy('bin-asset', "sampleZIP.zip"); 49 | _assetloader.addLazy('snd-asset', "sampleSOUND.mp3"); 50 | _assetloader.addLazy('img-asset', "sampleIMAGE.png"); 51 | _assetloader.addLazy('swf-asset', "sampleSWF.swf"); 52 | 53 | // AssetLoader returns the ILoader created once added. 54 | var videoLoader : ILoader = _assetloader.addLazy('vid-asset', "sampleVIDEO.flv"); 55 | videoLoader.setParam(Param.PREVENT_CACHE, false); 56 | videoLoader.setParam(Param.PRIORITY, 1); 57 | 58 | // Fail on error flag. 59 | //_assetloader.failOnError = true; 60 | 61 | // This is a sample error, the AssetLoader's onComplete will still fire. 62 | _assetloader.addLazy('err-asset', "fileThatDoesNotExist.php"); 63 | 64 | // Add listeners 65 | addListenersToLoader(_assetloader); 66 | 67 | // Start! 68 | _assetloader.start(); 69 | } 70 | 71 | // --------------------------------------------------------------------------------------------------------------------------------// 72 | // HANDLERS 73 | // --------------------------------------------------------------------------------------------------------------------------------// 74 | protected function onChildOpen_handler(signal : LoaderSignal, child : ILoader) : void 75 | { 76 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\topened \tLatency\t: " + Math.floor(child.stats.latency) + "\tms"); 77 | } 78 | 79 | protected function onChildError_handler(signal : ErrorSignal, child : ILoader) : void 80 | { 81 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\terror \tType\t: " + signal.type + " | Message: " + signal.message); 82 | } 83 | 84 | protected function onChildComplete_handler(signal : LoaderSignal, child : ILoader) : void 85 | { 86 | append("[" + signal.loader.id + "]\t[" + child.id + "]\t\tcomplete\tSpeed\t: " + Math.floor(child.stats.averageSpeed) + "\tkbps"); 87 | } 88 | 89 | protected function onComplete_handler(signal : LoaderSignal, assets : Dictionary) : void 90 | { 91 | var loader : IAssetLoader = IAssetLoader(signal.loader); 92 | 93 | // Do your clean up! 94 | removeListenersFromLoader(loader); 95 | 96 | // Our Primary AssetLoader's stats. 97 | var stats : ILoadStats = loader.stats; 98 | 99 | append("\n[" + loader.id + "]"); 100 | append("LOADING COMPLETE:"); 101 | append("Total Time: " + stats.totalTime + " ms"); 102 | append("Average Latency: " + Math.floor(stats.latency) + " ms"); 103 | append("Average Speed: " + Math.floor(stats.averageSpeed) + " kbps"); 104 | append("Total Bytes: " + stats.bytesTotal); 105 | append(""); 106 | } 107 | 108 | // --------------------------------------------------------------------------------------------------------------------------------// 109 | // ADD / REMOVE LISTENERS 110 | // --------------------------------------------------------------------------------------------------------------------------------// 111 | protected function addListenersToLoader(loader : IAssetLoader) : void 112 | { 113 | loader.onChildOpen.add(onChildOpen_handler); 114 | loader.onChildError.add(onChildError_handler); 115 | loader.onChildComplete.add(onChildComplete_handler); 116 | 117 | loader.onComplete.add(onComplete_handler); 118 | } 119 | 120 | protected function removeListenersFromLoader(loader : IAssetLoader) : void 121 | { 122 | loader.onChildOpen.remove(onChildOpen_handler); 123 | loader.onChildError.remove(onChildError_handler); 124 | loader.onChildComplete.remove(onChildComplete_handler); 125 | 126 | loader.onComplete.remove(onComplete_handler); 127 | } 128 | 129 | // --------------------------------------------------------------------------------------------------------------------------------// 130 | // CONSOLE 131 | // --------------------------------------------------------------------------------------------------------------------------------// 132 | protected function initConsole() : void 133 | { 134 | _field = new TextField(); 135 | _field.defaultTextFormat = new TextFormat("Courier New", 12); 136 | _field.multiline = true; 137 | _field.selectable = true; 138 | _field.wordWrap = false; 139 | _field.width = stage.stageWidth; 140 | _field.height = stage.stageHeight; 141 | 142 | stage.addEventListener(Event.RESIZE, resize_handler); 143 | 144 | addChild(_field); 145 | } 146 | 147 | protected function append(text : String) : void 148 | { 149 | _field.appendText(text + "\n"); 150 | } 151 | 152 | protected function resize_handler(event : Event) : void 153 | { 154 | _field.width = stage.stageWidth; 155 | _field.height = stage.stageHeight; 156 | } 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /src_examples/org/assetloader/example/SoundLoaderOnReadyExample.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.example 2 | { 3 | import flash.media.Sound; 4 | 5 | import org.assetloader.signals.LoaderSignal; 6 | import org.assetloader.loaders.SoundLoader; 7 | import org.assetloader.AssetLoader; 8 | import org.assetloader.base.Param; 9 | import org.assetloader.core.IAssetLoader; 10 | import org.assetloader.utils.ALLogger; 11 | 12 | import flash.display.Sprite; 13 | import flash.display.StageAlign; 14 | import flash.display.StageScaleMode; 15 | import flash.events.Event; 16 | import flash.text.TextField; 17 | import flash.text.TextFormat; 18 | 19 | /** 20 | * @author Matan Uberstein 21 | */ 22 | public class SoundLoaderOnReadyExample extends Sprite 23 | { 24 | protected var _assetloader : IAssetLoader; 25 | protected var _field : TextField; 26 | protected var _logger : ALLogger; 27 | 28 | public function SoundLoaderOnReadyExample() 29 | { 30 | stage.scaleMode = StageScaleMode.NO_SCALE; 31 | stage.align = StageAlign.TOP_LEFT; 32 | 33 | initConsole(); 34 | 35 | _assetloader = new AssetLoader("pr-group"); 36 | 37 | _assetloader.setParam(Param.BASE, "http://www.matan.co.za/AudioMixer/"); 38 | //_assetloader.setParam(Param.PREVENT_CACHE, true); 39 | 40 | var sndLoader : SoundLoader = SoundLoader(_assetloader.addLazy("sn-asset", "AquoVisit.mp3")); 41 | sndLoader.onReady.add(snd_onReady_handler); 42 | 43 | // AssetLoader Logger, will output trace statements. 44 | _logger = new ALLogger(); 45 | _logger.attach(_assetloader, 2); 46 | _logger.onLog.add(append); 47 | 48 | // Sample swapping out of indent char. 49 | _logger.indentChar = "--> "; 50 | 51 | _assetloader.start(); 52 | } 53 | 54 | protected function snd_onReady_handler(signal : LoaderSignal, sound : Sound) : void 55 | { 56 | append("READY!!!"); 57 | } 58 | 59 | // --------------------------------------------------------------------------------------------------------------------------------// 60 | // CONSOLE 61 | // --------------------------------------------------------------------------------------------------------------------------------// 62 | protected function initConsole() : void 63 | { 64 | _field = new TextField(); 65 | _field.defaultTextFormat = new TextFormat("Courier New", 12); 66 | _field.multiline = true; 67 | _field.selectable = true; 68 | _field.wordWrap = false; 69 | _field.width = stage.stageWidth; 70 | _field.height = stage.stageHeight; 71 | 72 | stage.addEventListener(Event.RESIZE, resize_handler); 73 | 74 | addChild(_field); 75 | } 76 | 77 | protected function append(text : String) : void 78 | { 79 | _field.appendText(text + "\n"); 80 | } 81 | 82 | protected function resize_handler(event : Event) : void 83 | { 84 | _field.width = stage.stageWidth; 85 | _field.height = stage.stageHeight; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src_unit/FlexUnitRunner.mxml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/AssetLoaderTestSuite.as: -------------------------------------------------------------------------------- 1 | package org.assetloader 2 | { 3 | 4 | import org.assetloader.utils.UtilsTestSuite; 5 | import org.assetloader.base.BaseTestSuite; 6 | import org.assetloader.loaders.LoadersTestSuite; 7 | import org.assetloader.parsers.ParsersTestSuite; 8 | 9 | [Suite] 10 | [RunWith("org.flexunit.runners.Suite")] 11 | public class AssetLoaderTestSuite 12 | { 13 | public var baseTestSuite : BaseTestSuite; 14 | public var loadersTestSuite : LoadersTestSuite; 15 | public var assetLoaderlTest : AssetLoaderTest; 16 | public var parsersTestSuite : ParsersTestSuite; 17 | public var utilsTestSuite : UtilsTestSuite; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/AbstractLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | import org.assetloader.core.ILoader; 5 | import org.flexunit.asserts.assertEquals; 6 | import org.flexunit.asserts.assertNotNull; 7 | import org.flexunit.asserts.assertTrue; 8 | 9 | public class AbstractLoaderTest 10 | { 11 | protected var _loaderName : String; 12 | 13 | protected var _id : String = "test-id"; 14 | protected var _type : String; 15 | 16 | protected var _hadRequest : Boolean = false; 17 | 18 | protected var _loader : ILoader; 19 | 20 | [BeforeClass] 21 | public static function runBeforeEntireSuite() : void 22 | { 23 | } 24 | 25 | [AfterClass] 26 | public static function runAfterEntireSuite() : void 27 | { 28 | } 29 | 30 | [Before] 31 | public function runBeforeEachTest() : void 32 | { 33 | _type = AssetType.IMAGE; 34 | 35 | _loader = new AbstractLoader(_id, _type); 36 | } 37 | 38 | [After] 39 | public function runAfterEachTest() : void 40 | { 41 | _loader = null; 42 | } 43 | 44 | [Test] 45 | public function implementing() : void 46 | { 47 | assertTrue(_loaderName + " should implement ILoader", _loader is ILoader); 48 | } 49 | 50 | [Test] 51 | public function idAndTypeMatchValuesPassed() : void 52 | { 53 | assertEquals(_loaderName + "#id must match the id passed via constructor", _id, _loader.id); 54 | assertEquals(_loaderName + "#type must match the type passed via constructor", _type, _loader.type); 55 | } 56 | 57 | [Test] 58 | public function signalsReadyOnConstruction() : void 59 | { 60 | assertNotNull(_loaderName + "#onComplete should NOT be null after construction", _loader.onComplete); 61 | assertNotNull(_loaderName + "#onError should NOT be null after construction", _loader.onError); 62 | assertNotNull(_loaderName + "#onHttpStatus should NOT be null after construction", _loader.onHttpStatus); 63 | assertNotNull(_loaderName + "#onOpen should NOT be null after construction", _loader.onOpen); 64 | assertNotNull(_loaderName + "#onProgress should NOT be null after construction", _loader.onProgress); 65 | assertNotNull(_loaderName + "#onAddedToParent should NOT be null after construction", _loader.onAddedToParent); 66 | assertNotNull(_loaderName + "#onRemovedFromParent should NOT be null after construction", _loader.onRemovedFromParent); 67 | assertNotNull(_loaderName + "#onStart should NOT be null after construction", _loader.onStart); 68 | assertNotNull(_loaderName + "#onStop should NOT be null after construction", _loader.onStop); 69 | } 70 | 71 | [Test] 72 | public function statsReadyOnConstruction() : void 73 | { 74 | assertNotNull(_loader + "#stats should NOT be null after construction", _loader.stats); 75 | } 76 | 77 | [Test] 78 | public function statsImplementILoadStats() : void 79 | { 80 | assertTrue(_loaderName + "#stats should implement ILoadStats", (_loader.stats is ILoadStats)); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/AssetLoaderErrorTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.core.IAssetLoader; 5 | import org.assetloader.core.ILoader; 6 | import org.assetloader.loaders.ImageLoader; 7 | import org.assetloader.loaders.TextLoader; 8 | import org.flexunit.asserts.assertEquals; 9 | import org.flexunit.asserts.assertTrue; 10 | import org.flexunit.asserts.fail; 11 | 12 | import flash.net.URLRequest; 13 | 14 | /** 15 | * @author Matan Uberstein 16 | */ 17 | public class AssetLoaderErrorTest 18 | { 19 | [BeforeClass] 20 | public static function runBeforeEntireSuite() : void 21 | { 22 | } 23 | 24 | [AfterClass] 25 | public static function runAfterEntireSuite() : void 26 | { 27 | } 28 | 29 | [Before] 30 | public function runBeforeEachTest() : void 31 | { 32 | } 33 | 34 | [After] 35 | public function runAfterEachTest() : void 36 | { 37 | } 38 | 39 | [Test] 40 | public function invalidUrl_EmptyUrl() : void 41 | { 42 | var factory : LoaderFactory = new LoaderFactory(); 43 | try 44 | { 45 | factory.produce("test-id", AssetType.IMAGE, new URLRequest("")); 46 | } 47 | catch(error : AssetLoaderError) 48 | { 49 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 50 | assertEquals("error message should be", new AssetLoaderError(AssetLoaderError.INVALID_URL).message, error.message); 51 | return; 52 | } 53 | fail("Error was NOT catched."); 54 | } 55 | 56 | [Test] 57 | public function invalidUrl_NullUrl() : void 58 | { 59 | var factory : LoaderFactory = new LoaderFactory(); 60 | try 61 | { 62 | factory.produce("test-id", AssetType.IMAGE, new URLRequest()); 63 | } 64 | catch(error : AssetLoaderError) 65 | { 66 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 67 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.INVALID_URL).message, error.message); 68 | return; 69 | } 70 | fail("Error was NOT catched."); 71 | } 72 | 73 | [Test] 74 | public function assetAutoTypeRecognized() : void 75 | { 76 | var factory : LoaderFactory = new LoaderFactory(); 77 | try 78 | { 79 | factory.produce("test-id", "HERP-DERP-ASSET-TYPE", new URLRequest("someFile.jpg")); 80 | } 81 | catch(error : AssetLoaderError) 82 | { 83 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 84 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.ASSET_TYPE_NOT_RECOGNIZED).message, error.message); 85 | return; 86 | } 87 | fail("Error was NOT catched."); 88 | } 89 | 90 | [Test] 91 | public function assetAutoTypeNotFound_WeirdExtension() : void 92 | { 93 | var factory : LoaderFactory = new LoaderFactory(); 94 | try 95 | { 96 | factory.produce("test-id", AssetType.AUTO, new URLRequest("someFileWith.weirdExtension")); 97 | } 98 | catch(error : AssetLoaderError) 99 | { 100 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 101 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.ASSET_AUTO_TYPE_NOT_FOUND).message, error.message); 102 | return; 103 | } 104 | fail("Error was NOT catched."); 105 | } 106 | 107 | [Test] 108 | public function couldNotParseConfig() : void 109 | { 110 | var assetloader : IAssetLoader = new AssetLoader(); 111 | try 112 | { 113 | assetloader.addConfig(""); 114 | } 115 | catch(error : AssetLoaderError) 116 | { 117 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 118 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.COULD_NOT_PARSE_CONFIG(assetloader.id, 'Error #1085: The element type "loader" must be terminated by the matching end-tag "".')).message, error.message); 119 | return; 120 | } 121 | fail("Error was NOT catched."); 122 | } 123 | 124 | [Test] 125 | public function alreadyContainsLoaderWithId() : void 126 | { 127 | var assetloader : IAssetLoader = new AssetLoader(); 128 | try 129 | { 130 | assetloader.addLazy("test-id", "sampleTXT.txt"); 131 | assetloader.addLazy("test-id", "sampleTXT2.txt"); 132 | } 133 | catch(error : AssetLoaderError) 134 | { 135 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 136 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.ALREADY_CONTAINS_LOADER_WITH_ID(assetloader.id, "test-id")).message, error.message); 137 | return; 138 | } 139 | fail("Error was NOT catched."); 140 | } 141 | 142 | [Test] 143 | public function circularReferenceFound_00() : void 144 | { 145 | var g1 : IAssetLoader = new AssetLoader("g1"); 146 | 147 | try 148 | { 149 | g1.addLoader(g1); 150 | } 151 | catch(error : AssetLoaderError) 152 | { 153 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 154 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.CIRCULAR_REFERENCE_FOUND(g1.id)).message, error.message); 155 | return; 156 | } 157 | fail("Error was NOT catched."); 158 | } 159 | 160 | [Test] 161 | public function circularReferenceFound_01() : void 162 | { 163 | var g1 : IAssetLoader = new AssetLoader("g1"); 164 | var g2 : IAssetLoader = new AssetLoader("g2"); 165 | 166 | g1.addLoader(g2); 167 | 168 | try 169 | { 170 | g2.addLoader(g1); 171 | } 172 | catch(error : AssetLoaderError) 173 | { 174 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 175 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.CIRCULAR_REFERENCE_FOUND(g1.id)).message, error.message); 176 | return; 177 | } 178 | fail("Error was NOT catched."); 179 | } 180 | 181 | [Test] 182 | public function circularReferenceFound_02() : void 183 | { 184 | var g1 : IAssetLoader = new AssetLoader("g1"); 185 | var g2 : IAssetLoader = new AssetLoader("g2"); 186 | var g3 : IAssetLoader = new AssetLoader("g3"); 187 | 188 | g1.addLoader(g2); 189 | g2.addLoader(g3); 190 | 191 | try 192 | { 193 | g3.addLoader(g1); 194 | } 195 | catch(error : AssetLoaderError) 196 | { 197 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 198 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.CIRCULAR_REFERENCE_FOUND(g1.id)).message, error.message); 199 | return; 200 | } 201 | fail("Error was NOT catched."); 202 | } 203 | 204 | [Test] 205 | public function alreadyContainedByOther() : void 206 | { 207 | var g1 : IAssetLoader = new AssetLoader("g1"); 208 | var g2 : IAssetLoader = new AssetLoader("g2"); 209 | var l1 : ILoader = new TextLoader(new URLRequest("sampleTXT.txt")); 210 | 211 | g1.addLoader(l1); 212 | 213 | try 214 | { 215 | g2.addLoader(l1); 216 | } 217 | catch(error : AssetLoaderError) 218 | { 219 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 220 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.ALREADY_CONTAINED_BY_OTHER(l1.id, g1.id)).message, error.message); 221 | return; 222 | } 223 | fail("Error was NOT catched."); 224 | } 225 | 226 | [Test] 227 | public function alreadyContainsLoader() : void 228 | { 229 | var monitor : StatsMonitor = new StatsMonitor(); 230 | var l1 : ILoader = new TextLoader(new URLRequest("assets/test/testTXT.txt")); 231 | var l2 : ILoader = new ImageLoader(new URLRequest("assets/test/testIMAGE.png")); 232 | try 233 | { 234 | monitor.add(l1); 235 | monitor.add(l2); 236 | // Adding l2 twice to produce error. 237 | monitor.add(l2); 238 | } 239 | catch(error : AssetLoaderError) 240 | { 241 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 242 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.ALREADY_CONTAINS_LOADER).message, error.message); 243 | return; 244 | } 245 | fail("Error was NOT catched."); 246 | } 247 | 248 | [Test] 249 | public function doesNotContainLoader() : void 250 | { 251 | var monitor : StatsMonitor = new StatsMonitor(); 252 | var l1 : ILoader = new TextLoader(new URLRequest("assets/test/testTXT.txt")); 253 | var l2 : ILoader = new ImageLoader(new URLRequest("assets/test/testIMAGE.png")); 254 | 255 | monitor.add(l1); 256 | try 257 | { 258 | //Remove l2 which was never added. 259 | monitor.remove(l2); 260 | } 261 | catch(error : AssetLoaderError) 262 | { 263 | assertTrue("error is AssetLoaderError", (error is AssetLoaderError)); 264 | assertEquals("error message", new AssetLoaderError(AssetLoaderError.DOESNT_CONTAIN_LOADER).message, error.message); 265 | return; 266 | } 267 | fail("Error was NOT catched."); 268 | } 269 | } 270 | } 271 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/AssetLoaderQueueTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.loaders.TextLoader; 5 | import org.flexunit.asserts.assertEquals; 6 | import org.flexunit.asserts.assertFalse; 7 | import org.flexunit.asserts.assertNotNull; 8 | import org.flexunit.asserts.assertNull; 9 | import org.flexunit.asserts.assertTrue; 10 | 11 | import flash.net.URLRequest; 12 | 13 | public class AssetLoaderQueueTest 14 | { 15 | protected var _path : String = "test/testTXT.txt"; 16 | protected var _id : String = "test-id-"; 17 | 18 | protected var _assetloader : AssetLoader; 19 | 20 | [BeforeClass] 21 | public static function runBeforeEntireSuite() : void 22 | { 23 | } 24 | 25 | [AfterClass] 26 | public static function runAfterEntireSuite() : void 27 | { 28 | } 29 | 30 | [Before] 31 | public function runBeforeEachTest() : void 32 | { 33 | _assetloader = new AssetLoader(); 34 | } 35 | 36 | [After] 37 | public function runAfterEachTest() : void 38 | { 39 | _assetloader = null; 40 | } 41 | 42 | [Test] 43 | public function addingToQueue() : void 44 | { 45 | _assetloader.addLoader(new TextLoader(new URLRequest(_path), _id + 1)); 46 | 47 | assertNotNull("AssetLoader#add should return the ILoader produced", _assetloader.add(_id + 2, new URLRequest(_path))); 48 | 49 | assertNotNull("AssetLoader#addLazy should return the ILoader produced", _assetloader.addLazy(_id + 3, _path)); 50 | 51 | assertEquals("AssetLoader#numLoaders should be equal to 3", _assetloader.numLoaders, 3); 52 | assertEquals("AssetLoader#ids length should be equal to 3", _assetloader.ids.length, 3); 53 | 54 | assertTrue("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 1))); assertTrue("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 2))); assertTrue("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 3))); 55 | 56 | assertNotNull("AssetLoader#getLoader should NOT be null", (_assetloader.getLoader(_id + 1))); assertNotNull("AssetLoader#getLoader should NOT be null", (_assetloader.getLoader(_id + 2))); assertNotNull("AssetLoader#getLoader should NOT be null", (_assetloader.getLoader(_id + 3))); 57 | } 58 | 59 | [Test] 60 | public function removingFromQueue() : void 61 | { 62 | buildQueue(); 63 | 64 | assertNotNull("AssetLoader#remove should return the loader removed from the queue", _assetloader.remove(_id + 1)); 65 | assertEquals("AssetLoader#numLoaders should be equal to 2", _assetloader.numLoaders, 2); 66 | assertEquals("AssetLoader#ids length should be equal to 2", _assetloader.ids.length, 2); 67 | assertFalse("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 1))); 68 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 1))); 69 | 70 | assertNotNull("AssetLoader#remove should return the loader removed from the queue", _assetloader.remove(_id + 2)); 71 | assertEquals("AssetLoader#numLoaders should be equal to 1", _assetloader.numLoaders, 1); 72 | assertEquals("AssetLoader#ids length should be equal to 1", _assetloader.ids.length, 1); 73 | assertFalse("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 1))); 74 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 1))); 75 | 76 | assertNotNull("AssetLoader#remove should return the loader removed from the queue", _assetloader.remove(_id + 3)); 77 | assertEquals("AssetLoader#numLoaders should be equal to 0", _assetloader.numLoaders, 0); 78 | assertEquals("AssetLoader#ids length should be equal to 0", _assetloader.ids.length, 0); 79 | assertFalse("AssetLoader#hasLoader should be true", (_assetloader.hasLoader(_id + 3))); 80 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 3))); 81 | } 82 | 83 | [Test] 84 | public function destroyQueue() : void 85 | { 86 | buildQueue(); 87 | 88 | _assetloader.destroy(); 89 | 90 | assertFalse("AssetLoader#hasLoader should be false", (_assetloader.hasLoader(_id + 1))); 91 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 1))); 92 | 93 | assertFalse("AssetLoader#hasLoader should be false", (_assetloader.hasLoader(_id + 1))); 94 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 1))); 95 | 96 | assertFalse("AssetLoader#hasLoader should be false", (_assetloader.hasLoader(_id + 3))); 97 | assertNull("AssetLoader#getLoader should be null", (_assetloader.getLoader(_id + 3))); 98 | } 99 | 100 | protected function buildQueue() : void 101 | { 102 | _assetloader.addLoader(new TextLoader(new URLRequest(_path), _id + 1)); 103 | _assetloader.add(_id + 2, new URLRequest(_path)); 104 | _assetloader.addLazy(_id + 3, _path); 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/BaseTestSuite.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | [Suite] 4 | [RunWith("org.flexunit.runners.Suite")] 5 | public class BaseTestSuite 6 | { 7 | public var abstractLoaderTest : AbstractLoaderTest; 8 | public var assetLoaderQueueTest : AssetLoaderQueueTest; 9 | public var assetLoaderErrorTest : AssetLoaderErrorTest; 10 | public var loaderFactoryTest : LoaderFactoryTest; 11 | public var loaderStatsTest : LoaderStatsTest; 12 | 13 | public var statsMonitorTest : StatsMonitorTest; 14 | public var paramTest : ParamTest; } 15 | } 16 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/LoaderFactoryTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.AssetLoader; 4 | import org.assetloader.core.IAssetLoader; 5 | import org.assetloader.core.ILoader; 6 | import org.assetloader.loaders.BinaryLoader; 7 | import org.assetloader.loaders.CSSLoader; 8 | import org.assetloader.loaders.DisplayObjectLoader; 9 | import org.assetloader.loaders.ImageLoader; 10 | import org.assetloader.loaders.JSONLoader; 11 | import org.assetloader.loaders.SWFLoader; 12 | import org.assetloader.loaders.SoundLoader; 13 | import org.assetloader.loaders.TextLoader; 14 | import org.assetloader.loaders.VideoLoader; 15 | import org.assetloader.loaders.XMLLoader; 16 | import org.flexunit.asserts.assertNotNull; 17 | import org.flexunit.asserts.assertTrue; 18 | 19 | import flash.net.URLRequest; 20 | 21 | public class LoaderFactoryTest 22 | { 23 | protected var _path : String = "http://www.matan.co.za/AssetLoader/testAssets/"; 24 | protected var _id : String = "test-id"; 25 | protected var _factory : LoaderFactory; 26 | 27 | protected var _producedLoader : ILoader; 28 | 29 | [BeforeClass] 30 | public static function runBeforeEntireSuite() : void 31 | { 32 | } 33 | 34 | [AfterClass] 35 | public static function runAfterEntireSuite() : void 36 | { 37 | } 38 | 39 | [Before] 40 | public function runBeforeEachTest() : void 41 | { 42 | _factory = new LoaderFactory(); 43 | } 44 | 45 | [After] 46 | public function runAfterEachTest() : void 47 | { 48 | assertNotNull("Produced loader should NOT be null", _producedLoader); assertTrue("Produced loader should implement ILoader", (_producedLoader is ILoader)); 49 | 50 | _factory = null; 51 | _producedLoader = null; 52 | } 53 | 54 | [Test] 55 | public function produceTextType() : void 56 | { 57 | _producedLoader = _factory.produce(_id, AssetType.TEXT, new URLRequest(_path + "sampleTXT.txt")); 58 | assertTrue("Produced loader should be an instance of TextLoader", (_producedLoader is TextLoader)); 59 | } 60 | 61 | [Test] 62 | public function produceJsonType() : void 63 | { 64 | _producedLoader = _factory.produce(_id, AssetType.JSON, new URLRequest(_path + "sampleJSON.json")); 65 | assertTrue("Produced loader should be an instance of JSONLoader", (_producedLoader is JSONLoader)); 66 | } 67 | 68 | [Test] 69 | public function produceXmlType() : void 70 | { 71 | _producedLoader = _factory.produce(_id, AssetType.XML, new URLRequest(_path + "sampleXML.xml")); 72 | assertTrue("Produced loader should be an instance of XMLLoader", (_producedLoader is XMLLoader)); 73 | } 74 | 75 | [Test] 76 | public function produceCssType() : void 77 | { 78 | _producedLoader = _factory.produce(_id, AssetType.CSS, new URLRequest(_path + "sampleCSS.css")); 79 | assertTrue("Produced loader should be an instance of CSSLoader", (_producedLoader is CSSLoader)); 80 | } 81 | 82 | [Test] 83 | public function produceBinaryType() : void 84 | { 85 | _producedLoader = _factory.produce(_id, AssetType.BINARY, new URLRequest(_path + "sampleZIP.zip")); 86 | assertTrue("Produced loader should be an instance of BinaryLoader", (_producedLoader is BinaryLoader)); 87 | } 88 | 89 | [Test] 90 | public function produceDisplayObjectType() : void 91 | { 92 | _producedLoader = _factory.produce(_id, AssetType.DISPLAY_OBJECT, new URLRequest(_path + "sampleSWF.swf")); 93 | assertTrue("Produced loader should be an instance of DisplayObjectLoader", (_producedLoader is DisplayObjectLoader)); 94 | } 95 | 96 | [Test] 97 | public function produceSwfType() : void 98 | { 99 | _producedLoader = _factory.produce(_id, AssetType.SWF, new URLRequest(_path + "sampleSWF.swf")); 100 | assertTrue("Produced loader should be an instance of SWFLoader", (_producedLoader is SWFLoader)); 101 | } 102 | 103 | [Test] 104 | public function produceImageType() : void 105 | { 106 | _producedLoader = _factory.produce(_id, AssetType.IMAGE, new URLRequest(_path + "sampleIMAGE.jpg")); 107 | assertTrue("Produced loader should be an instance of ImageLoader", (_producedLoader is ImageLoader)); 108 | } 109 | 110 | [Test] 111 | public function produceSoundType() : void 112 | { 113 | _producedLoader = _factory.produce(_id, AssetType.SOUND, new URLRequest(_path + "sampleSOUND.mp3")); 114 | assertTrue("Produced loader should be an instance of SoundLoader", (_producedLoader is SoundLoader)); 115 | } 116 | 117 | [Test] 118 | public function produceVideoType() : void 119 | { 120 | _producedLoader = _factory.produce(_id, AssetType.VIDEO, new URLRequest(_path + "sampleVIDEO.mp4")); 121 | assertTrue("Produced loader should be an instance of VideoLoader", (_producedLoader is VideoLoader)); 122 | } 123 | 124 | [Test] 125 | public function produceGroupType() : void 126 | { 127 | _producedLoader = _factory.produce(_id, AssetType.GROUP); 128 | assertTrue("Produced loader should implement IAssetLoader", (_producedLoader is IAssetLoader)); 129 | assertTrue("Produced loader should be an instance of AssetLoader", (_producedLoader is AssetLoader)); 130 | } 131 | 132 | //--------------------------------------------------------------------------------------------------------------------------------// 133 | // AUTO TYPE 134 | //--------------------------------------------------------------------------------------------------------------------------------// 135 | 136 | [Test] 137 | public function autoProduceTextType() : void 138 | { 139 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleTXT.txt")); 140 | assertTrue("Produced loader should be an instance of TextLoader", (_producedLoader is TextLoader)); 141 | } 142 | 143 | [Test] 144 | public function autoProduceJsonType() : void 145 | { 146 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleJSON.json")); 147 | assertTrue("Produced loader should be an instance of JSONLoader", (_producedLoader is JSONLoader)); 148 | } 149 | 150 | [Test] 151 | public function autoProduceXmlType() : void 152 | { 153 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleXML.xml")); 154 | assertTrue("Produced loader should be an instance of XMLLoader", (_producedLoader is XMLLoader)); 155 | } 156 | 157 | [Test] 158 | public function autoProduceCssType() : void 159 | { 160 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleCSS.css")); 161 | assertTrue("Produced loader should be an instance of CSSLoader", (_producedLoader is CSSLoader)); 162 | } 163 | 164 | [Test] 165 | public function autoProduceBinaryType() : void 166 | { 167 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleZIP.zip")); 168 | assertTrue("Produced loader should be an instance of BinaryLoader", (_producedLoader is BinaryLoader)); 169 | } 170 | 171 | [Test] 172 | public function autoProduceSwfType() : void 173 | { 174 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleSWF.swf")); 175 | assertTrue("Produced loader should be an instance of SWFLoader", (_producedLoader is SWFLoader)); 176 | } 177 | 178 | [Test] 179 | public function autoProduceImageType() : void 180 | { 181 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleIMAGE.jpg")); 182 | assertTrue("Produced loader should be an instance of ImageLoader", (_producedLoader is ImageLoader)); 183 | } 184 | 185 | [Test] 186 | public function autoProduceSoundType() : void 187 | { 188 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleSOUND.mp3")); 189 | assertTrue("Produced loader should be an instance of SoundLoader", (_producedLoader is SoundLoader)); 190 | } 191 | 192 | [Test] 193 | public function autoProduceVideoType() : void 194 | { 195 | _producedLoader = _factory.produce(_id, AssetType.AUTO, new URLRequest(_path + "sampleVIDEO.mp4")); 196 | assertTrue("Produced loader should be an instance of VideoLoader", (_producedLoader is VideoLoader)); 197 | } 198 | 199 | [Test] 200 | public function autoProduceGroupType() : void 201 | { 202 | _producedLoader = _factory.produce(_id); 203 | assertTrue("Produced loader should implement IAssetLoader", (_producedLoader is IAssetLoader)); 204 | assertTrue("Produced loader should be an instance of AssetLoader", (_producedLoader is AssetLoader)); 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/LoaderStatsTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | import org.flexunit.asserts.assertEquals; 5 | import org.flexunit.asserts.assertTrue; 6 | import org.flexunit.async.Async; 7 | 8 | import flash.events.TimerEvent; 9 | import flash.utils.Timer; 10 | 11 | public class LoaderStatsTest 12 | { 13 | protected var _stats : LoaderStats; 14 | 15 | [BeforeClass] 16 | public static function runBeforeEntireSuite() : void 17 | { 18 | } 19 | 20 | [AfterClass] 21 | public static function runAfterEntireSuite() : void 22 | { 23 | } 24 | 25 | [Before] 26 | public function runBeforeEachTest() : void 27 | { 28 | _stats = new LoaderStats(); 29 | } 30 | 31 | [After] 32 | public function runAfterEachTest() : void 33 | { 34 | _stats = null; 35 | } 36 | 37 | [Test] 38 | public function implementsILoadStats() : void 39 | { 40 | assertTrue("LoaderStats should implement ILoadStats", _stats is ILoadStats); 41 | } 42 | 43 | [Test (async)] 44 | public function delayedOpen() : void 45 | { 46 | _stats.start(); 47 | var timer : Timer = new Timer(250, 1); 48 | timer.addEventListener(TimerEvent.TIMER_COMPLETE, Async.asyncHandler(this, open, 500), false, 0, true); 49 | timer.start(); 50 | } 51 | 52 | protected function open(event : TimerEvent, data : Object) : void 53 | { 54 | _stats.open(); 55 | assertTrue("LoaderStats#latency should be more than 250", (_stats.latency > 250)); 56 | } 57 | 58 | [Test] 59 | public function update() : void 60 | { 61 | _stats.start(); 62 | _stats.open(); 63 | _stats.update(100, 1000); 64 | assertEquals("LoaderStats#bytesLoaded should be equal to 100", _stats.bytesLoaded, 100); 65 | assertEquals("LoaderStats#bytesTotal should be equal to 1000", _stats.bytesTotal, 1000); 66 | assertEquals("LoaderStats#progress should be equal to 10%", _stats.progress, 10); 67 | assertEquals("LoaderStats#totalTime should be equal to 0", _stats.totalTime, 0); 68 | 69 | assertTrue("LoaderStats#speed should be more than 0", (_stats.speed > 0)); 70 | assertTrue("LoaderStats#averageSpeed should be more than 0", (_stats.averageSpeed > 0)); 71 | } 72 | 73 | [Test (async)] 74 | public function delayedDone() : void 75 | { 76 | _stats.start(); 77 | _stats.open(); 78 | _stats.update(100, 1000); 79 | 80 | var timer : Timer = new Timer(250, 1); 81 | timer.addEventListener(TimerEvent.TIMER_COMPLETE, Async.asyncHandler(this, done, 500), false, 0, true); 82 | timer.start(); 83 | } 84 | 85 | protected function done(event : TimerEvent, data : Object) : void 86 | { 87 | _stats.done(); 88 | assertEquals("LoaderStats#bytesLoaded should be equal to 1000", _stats.bytesLoaded, 1000); 89 | assertEquals("LoaderStats#bytesTotal should be equal to 1000", _stats.bytesTotal, 1000); 90 | assertEquals("LoaderStats#progress should be equal to 100%", _stats.progress, 100); 91 | assertTrue("LoaderStats#totalTime should more than 250", _stats.totalTime > 250); 92 | } 93 | 94 | [Test] 95 | public function reset() : void 96 | { 97 | _stats.start(); 98 | _stats.open(); 99 | _stats.update(100, 1000); 100 | _stats.done(); 101 | _stats.reset(); 102 | assertEquals("LoaderStats#bytesLoaded should be equal to 0", _stats.bytesLoaded, 0); 103 | assertEquals("LoaderStats#bytesTotal should be equal to 0", _stats.bytesTotal, 0); 104 | assertEquals("LoaderStats#progress should be equal to 0%", _stats.progress, 0); 105 | assertEquals("LoaderStats#latency should be equal to 0", _stats.latency, 0); 106 | assertEquals("LoaderStats#speed should be equal to 0", _stats.speed, 0); 107 | assertEquals("LoaderStats#averageSpeed should be equal to 0", _stats.averageSpeed, 0); 108 | assertEquals("LoaderStats#totalTime should be equal to 0", _stats.totalTime, 0); 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/ParamTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.IParam; 4 | import org.flexunit.asserts.assertEquals; 5 | import org.flexunit.asserts.assertTrue; 6 | 7 | import flash.system.LoaderContext; 8 | 9 | public class ParamTest 10 | { 11 | protected var _param : Param; 12 | protected var _id : String = "test-id"; 13 | protected var _value : LoaderContext = new LoaderContext(); 14 | 15 | [BeforeClass] 16 | public static function runBeforeEntireSuite() : void 17 | { 18 | } 19 | 20 | [AfterClass] 21 | public static function runAfterEntireSuite() : void 22 | { 23 | } 24 | 25 | [Before] 26 | public function runBeforeEachTest() : void 27 | { 28 | _param = new Param(_id, _value); 29 | } 30 | 31 | [After] 32 | public function runAfterEachTest() : void 33 | { 34 | _param = null; 35 | } 36 | 37 | [Test] 38 | public function implementsIParam() : void 39 | { 40 | assertTrue("Param should implement IParam", _param is IParam); 41 | } 42 | 43 | [Test] 44 | public function retainsId() : void 45 | { 46 | assertEquals("Param should retain id passed", _param.id, _id); 47 | } 48 | 49 | [Test] 50 | public function retainsValue() : void 51 | { 52 | assertEquals("Param should retain value passed", _param.value, _value); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/base/StatsMonitorTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.base 2 | { 3 | import org.assetloader.core.ILoadStats; 4 | import org.assetloader.core.ILoader; 5 | import org.assetloader.loaders.ImageLoader; 6 | import org.assetloader.loaders.TextLoader; 7 | import org.assetloader.signals.LoaderSignal; 8 | import org.assetloader.signals.ProgressSignal; 9 | import org.flexunit.asserts.assertEquals; 10 | import org.flexunit.asserts.assertNotNull; 11 | import org.flexunit.asserts.assertNull; 12 | import org.flexunit.asserts.assertTrue; 13 | import org.osflash.signals.utils.SignalAsyncEvent; 14 | import org.osflash.signals.utils.failOnSignal; 15 | import org.osflash.signals.utils.handleSignal; 16 | 17 | import flash.net.URLRequest; 18 | 19 | public class StatsMonitorTest 20 | { 21 | protected var _monitor : StatsMonitor; 22 | protected var _className : String = "StatsMonitor"; 23 | protected var _path : String = "assets/test/"; 24 | 25 | [BeforeClass] 26 | public static function runBeforeEntireSuite() : void 27 | { 28 | } 29 | 30 | [AfterClass] 31 | public static function runAfterEntireSuite() : void 32 | { 33 | } 34 | 35 | [Before] 36 | public function runBeforeEachTest() : void 37 | { 38 | _monitor = new StatsMonitor(); 39 | } 40 | 41 | [After] 42 | public function runAfterEachTest() : void 43 | { 44 | _monitor.destroy(); 45 | _monitor = null; 46 | } 47 | 48 | [Test] 49 | public function signalsReadyOnConstruction() : void 50 | { 51 | assertNotNull(_className + "#onOpen should NOT be null after construction", _monitor.onOpen); 52 | assertNotNull(_className + "#onProgress should NOT be null after construction", _monitor.onProgress); 53 | assertNotNull(_className + "#onComplete should NOT be null after construction", _monitor.onComplete); 54 | } 55 | 56 | [Test] 57 | public function adding() : void 58 | { 59 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 60 | _monitor.add(l1); 61 | assertEquals(_className + "#numLoaders should equal", 1, _monitor.numLoaders); 62 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 63 | 64 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 65 | _monitor.add(l2); 66 | assertEquals(_className + "#numLoaders should equal", 2, _monitor.numLoaders); 67 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 68 | } 69 | 70 | [Test] 71 | public function removing() : void 72 | { 73 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 74 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 75 | 76 | _monitor.add(l1); 77 | _monitor.add(l2); 78 | 79 | _monitor.remove(l1); 80 | assertEquals(_className + "#numLoaders should equal", 1, _monitor.numLoaders); 81 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 82 | 83 | _monitor.remove(l2); 84 | assertEquals(_className + "#numLoaders should equal", 0, _monitor.numLoaders); 85 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 86 | } 87 | 88 | [Test] 89 | public function destroying() : void 90 | { 91 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 92 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 93 | 94 | _monitor.add(l1); 95 | _monitor.add(l2); 96 | 97 | _monitor.onOpen.add(dummy_onOpen_handler); 98 | _monitor.onProgress.add(dummy_onProgress_handler); 99 | _monitor.onComplete.add(dummy_onComplete_handler); 100 | 101 | _monitor.destroy(); 102 | assertEquals(_className + "#numLoaders should equal", 0, _monitor.numLoaders); 103 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 104 | 105 | assertEquals(_className + "#onOpen#numListeners should equal", 0, _monitor.onOpen.numListeners); 106 | assertEquals(_className + "#onProgress#numListeners should equal", 0, _monitor.onProgress.numListeners); 107 | assertEquals(_className + "#onComplete#numListeners should equal", 0, _monitor.onComplete.numListeners); 108 | 109 | // Should still be usable, thus test adding again after destroy. 110 | 111 | _monitor.add(l1); 112 | assertEquals(_className + "#numLoaders should equal", 1, _monitor.numLoaders); 113 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 114 | 115 | _monitor.add(l2); 116 | assertEquals(_className + "#numLoaders should equal", 2, _monitor.numLoaders); 117 | assertEquals(_className + "#numComplete should equal", 0, _monitor.numComplete); 118 | } 119 | 120 | [Test (async)] 121 | public function onOpenSignal() : void 122 | { 123 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 124 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 125 | 126 | _monitor.add(l1); 127 | _monitor.add(l2); 128 | 129 | handleSignal(this, _monitor.onOpen, onOpen_handler, 500, {l1:l1, l2:l2}); 130 | failOnSignal(this, _monitor.onComplete); 131 | 132 | //only tell the one loader to start, because we are checking the passed loader's value within handler. 133 | l1.start(); 134 | } 135 | 136 | protected function onOpen_handler(event : SignalAsyncEvent, data : Object) : void 137 | { 138 | var values : Array = event.args; 139 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 140 | 141 | var signal : LoaderSignal = values[0]; 142 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 143 | assertEquals("LoaderSignal#loader should equal", data.l1, signal.loader); 144 | } 145 | 146 | [Test (async)] 147 | public function onProgressSignal() : void 148 | { 149 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 150 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 151 | 152 | _monitor.add(l1); 153 | _monitor.add(l2); 154 | 155 | handleSignal(this, _monitor.onProgress, onProgress_handler, 500, {l1:l1, l2:l2}); 156 | failOnSignal(this, _monitor.onComplete); 157 | 158 | //only tell the one loader to start, because we are checking the passed loader's value within handler. 159 | l1.start(); 160 | } 161 | 162 | protected function onProgress_handler(event : SignalAsyncEvent, data : Object) : void 163 | { 164 | var values : Array = event.args; 165 | assertTrue("Argument 1 should be ProgressSignal", (values[0] is ProgressSignal)); 166 | 167 | var signal : ProgressSignal = values[0]; 168 | assertNotNull("ProgressSignal#loader should NOT be null", signal.loader); 169 | assertEquals("ProgressSignal#loader should equal", data.l1, signal.loader); 170 | 171 | assertTrue("ProgressSignal#latency should be more or equal than 0", signal.latency >= 0); 172 | assertTrue("ProgressSignal#speed should be more or equal than 0", signal.speed >= 0); 173 | assertTrue("ProgressSignal#averageSpeed should be more or equal than 0", signal.averageSpeed >= 0); 174 | 175 | assertTrue("ProgressSignal#progress should be more or equal than 0", signal.progress >= 0); 176 | assertTrue("ProgressSignal#bytesLoaded should be more or equal than 0", signal.bytesLoaded >= 0); 177 | assertTrue("ProgressSignal#bytesTotal should be more than 0", signal.bytesTotal); 178 | } 179 | 180 | [Test (async)] 181 | public function onCompleteSignal() : void 182 | { 183 | var l1 : ILoader = new TextLoader(new URLRequest(_path + "testTXT.txt")); 184 | var l2 : ILoader = new ImageLoader(new URLRequest(_path + "testIMAGE.png")); 185 | 186 | _monitor.add(l1); 187 | _monitor.add(l2); 188 | 189 | handleSignal(this, _monitor.onComplete, onComplete_handler, 500, {l1:l1, l2:l2}); 190 | 191 | //Tell both to start, otherwise onComplete will not fire. 192 | l1.start(); 193 | l2.start(); 194 | } 195 | 196 | protected function onComplete_handler(event : SignalAsyncEvent, data : Object) : void 197 | { 198 | var values : Array = event.args; 199 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 200 | 201 | var signal : LoaderSignal = values[0]; 202 | assertNull("LoaderSignal#loader should be null", signal.loader); 203 | assertNotNull("Second argument should NOT be null", values[1]); 204 | assertTrue("Second argument should be ILoadStats", (values[1] is ILoadStats)); 205 | } 206 | 207 | // --------------------------------------------------------------------------------------------------------------------------------// 208 | // INTERNAL 209 | // --------------------------------------------------------------------------------------------------------------------------------// 210 | protected function dummy_onOpen_handler(signal : LoaderSignal) : void 211 | { 212 | } 213 | 214 | protected function dummy_onProgress_handler(signal : ProgressSignal) : void 215 | { 216 | } 217 | 218 | protected function dummy_onComplete_handler(signal : LoaderSignal, stats : ILoadStats) : void 219 | { 220 | } 221 | } 222 | } 223 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/BinaryLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import flash.net.URLRequest; 5 | import flash.utils.ByteArray; 6 | 7 | public class BinaryLoaderTest extends BaseLoaderTest 8 | { 9 | [Before] 10 | override public function runBeforeEachTest() : void 11 | { 12 | super.runBeforeEachTest(); 13 | 14 | _loaderName = "BinaryLoader"; 15 | _payloadType = ByteArray; 16 | _payloadTypeName = "ByteArray"; 17 | _payloadPropertyName = "bytes"; 18 | _path += "testZIP.zip"; 19 | _type = AssetType.BINARY; 20 | 21 | _loader = new BinaryLoader(new URLRequest(_path), _id); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/CSSLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.net.URLRequest; 6 | import flash.text.StyleSheet; 7 | 8 | public class CSSLoaderTest extends BaseLoaderTest 9 | { 10 | 11 | [Before] 12 | override public function runBeforeEachTest() : void 13 | { 14 | super.runBeforeEachTest(); 15 | 16 | _loaderName = "CSSLoader"; 17 | _payloadType = StyleSheet; 18 | _payloadTypeName = "StyleSheet"; 19 | _payloadPropertyName = "styleSheet"; 20 | _path += "testCSS.css"; 21 | _type = AssetType.CSS; 22 | 23 | _loader = new CSSLoader(new URLRequest(_path), _id); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/DisplayObjectLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.display.DisplayObject; 6 | import flash.net.URLRequest; 7 | 8 | public class DisplayObjectLoaderTest extends BaseLoaderTest 9 | { 10 | [Before] 11 | override public function runBeforeEachTest() : void 12 | { 13 | super.runBeforeEachTest(); 14 | 15 | _loaderName = "DisplayObjectLoader"; 16 | _payloadType = DisplayObject; 17 | _payloadTypeName = "DisplayObject"; 18 | _payloadPropertyName = "displayObject"; 19 | _path += "testSWF.swf"; 20 | _type = AssetType.DISPLAY_OBJECT; 21 | 22 | _loader = new DisplayObjectLoader(new URLRequest(_path), _id); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/ImageLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.display.Bitmap; 6 | import flash.net.URLRequest; 7 | 8 | public class ImageLoaderTest extends BaseLoaderTest 9 | { 10 | [Before] 11 | override public function runBeforeEachTest() : void 12 | { 13 | super.runBeforeEachTest(); 14 | 15 | _loaderName = "ImageLoader"; 16 | _payloadType = Bitmap; 17 | _payloadTypeName = "Bitmap"; 18 | _payloadPropertyName = "bitmap"; 19 | _path += "testIMAGE.png"; 20 | _type = AssetType.IMAGE; 21 | 22 | _loader = new ImageLoader(new URLRequest(_path), _id); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/JSONLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.net.URLRequest; 6 | 7 | public class JSONLoaderTest extends BaseLoaderTest 8 | { 9 | [Before] 10 | override public function runBeforeEachTest() : void 11 | { 12 | super.runBeforeEachTest(); 13 | 14 | _loaderName = "ImageLoader"; 15 | _payloadType = Object; 16 | _payloadTypeName = "Object"; 17 | _payloadPropertyName = "jsonObject"; 18 | _path += "testJSON.json"; 19 | _type = AssetType.JSON; 20 | 21 | _loader = new JSONLoader(new URLRequest(_path), _id); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/LoadersTestSuite.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | [Suite] 4 | [RunWith("org.flexunit.runners.Suite")] 5 | public class LoadersTestSuite 6 | { 7 | public var binaryLoaderTest : BinaryLoaderTest; public var cssLoaderTest : CSSLoaderTest; public var displayObjectLoaderTest : DisplayObjectLoaderTest; public var imageLoaderTest : ImageLoaderTest; public var jsonLoaderTest : JSONLoaderTest; public var soundLoaderTest : SoundLoaderTest; public var swfLoaderTest : SWFLoaderTest; public var textLoaderTest : TextLoaderTest; public var videoLoaderTest : VideoLoaderTest; public var xmlLoaderTest : XMLLoaderTest; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/SWFLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | import org.flexunit.asserts.assertEquals; 6 | import org.flexunit.asserts.assertNotNull; 7 | import org.flexunit.asserts.assertTrue; 8 | import org.osflash.signals.utils.SignalAsyncEvent; 9 | import org.osflash.signals.utils.handleSignal; 10 | 11 | import flash.display.Sprite; 12 | import flash.net.URLRequest; 13 | 14 | public class SWFLoaderTest extends BaseLoaderTest 15 | { 16 | [Before] 17 | override public function runBeforeEachTest() : void 18 | { 19 | super.runBeforeEachTest(); 20 | 21 | _loaderName = "SWFLoader"; 22 | _payloadType = Sprite; 23 | _payloadTypeName = "Sprite"; 24 | _payloadPropertyName = "swf"; 25 | _path += "testSWF.swf"; 26 | _type = AssetType.SWF; 27 | 28 | _loader = new SWFLoader(new URLRequest(_path), _id); 29 | } 30 | 31 | // NON - STANDARD - LOADER - TESTS -------------------------------------------------------------------------------------------// 32 | [Test] 33 | override public function signalsReadyOnConstruction() : void 34 | { 35 | super.signalsReadyOnConstruction(); 36 | assertNotNull(_loaderName + "#onInit should NOT be null after construction", SWFLoader(_loader).onInit); 37 | } 38 | 39 | [Test (async)] 40 | public function onInitSignal() : void 41 | { 42 | // Make sure that the mp3 loaded has ID3 data, otherwise this test will fail. 43 | handleSignal(this, SWFLoader(_loader).onInit, onInit_handler); 44 | _loader.start(); 45 | } 46 | 47 | protected function onInit_handler(event : SignalAsyncEvent, data : Object) : void 48 | { 49 | var values : Array = event.args; 50 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 51 | 52 | var signal : LoaderSignal = values[0]; 53 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 54 | } 55 | 56 | override protected function assertPostDestroy() : void 57 | { 58 | super.assertPostDestroy(); 59 | assertEquals(_loaderName + "#onInit#numListeners should be equal to 0", SWFLoader(_loader).onInit.numListeners, 0); 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/SoundLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | import org.flexunit.asserts.assertEquals; 6 | import org.flexunit.asserts.assertNotNull; 7 | import org.flexunit.asserts.assertTrue; 8 | import org.osflash.signals.utils.SignalAsyncEvent; 9 | import org.osflash.signals.utils.failOnSignal; 10 | import org.osflash.signals.utils.handleSignal; 11 | 12 | import flash.media.Sound; 13 | import flash.net.URLRequest; 14 | 15 | public class SoundLoaderTest extends BaseLoaderTest 16 | { 17 | [Before] 18 | override public function runBeforeEachTest() : void 19 | { 20 | super.runBeforeEachTest(); 21 | 22 | _loaderName = "SoundLoader"; 23 | _payloadType = Sound; 24 | _payloadTypeName = "Sound"; 25 | _payloadPropertyName = "sound"; 26 | _path += "testSOUND.mp3"; 27 | _type = AssetType.SOUND; 28 | 29 | _loader = new SoundLoader(new URLRequest(_path), _id); 30 | } 31 | 32 | // NON - STANDARD - LOADER - TESTS -------------------------------------------------------------------------------------------// 33 | [Test] 34 | override public function signalsReadyOnConstruction() : void 35 | { 36 | super.signalsReadyOnConstruction(); 37 | assertNotNull(_loaderName + "#onReady should NOT be null after construction", SoundLoader(_loader).onId3); 38 | assertNotNull(_loaderName + "#onId3 should NOT be null after construction", SoundLoader(_loader).onReady ); 39 | } 40 | 41 | [Test (async)] 42 | public function onId3Signal() : void 43 | { 44 | // Make sure that the mp3 loaded has ID3 data, otherwise this test will fail. 45 | handleSignal(this, SoundLoader(_loader).onId3, onId3_handler); 46 | _loader.start(); 47 | } 48 | 49 | protected function onId3_handler(event : SignalAsyncEvent, data : Object) : void 50 | { 51 | var values : Array = event.args; 52 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 53 | 54 | var signal : LoaderSignal = values[0]; 55 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 56 | } 57 | 58 | [Test (async)] 59 | public function onReadySignal() : void 60 | { 61 | handleSignal(this, SoundLoader(_loader).onReady, onReady_handler); 62 | _loader.start(); 63 | } 64 | 65 | protected function onReady_handler(event : SignalAsyncEvent, data : Object) : void 66 | { 67 | var values : Array = event.args; 68 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 69 | assertTrue("Argument 2 should be Sound", (values[1] is Sound)); 70 | 71 | var signal : LoaderSignal = values[0]; 72 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 73 | 74 | assertTrue(_loaderName + "#isReady should be true", SoundLoader(_loader).isReady); 75 | } 76 | 77 | override protected function assertPostDestroy() : void 78 | { 79 | super.assertPostDestroy(); 80 | assertEquals(_loaderName + "#onId3#numListeners should be equal to 0", SoundLoader(_loader).onId3.numListeners, 0); 81 | assertEquals(_loaderName + "#onReady#numListeners should be equal to 0", SoundLoader(_loader).onReady.numListeners, 0); 82 | } 83 | 84 | // SOUND LOADER DOES NOT DISPATCH HTTP STATUS SIGNAL 85 | [Test (async)] 86 | override public function onHttpStatusSignal() : void 87 | { 88 | failOnSignal(this, _loader.onHttpStatus); 89 | _loader.start(); 90 | } 91 | 92 | [Test (async)] 93 | override public function stop() : void 94 | { 95 | super.stop(); 96 | failOnSignal(this, SoundLoader(_loader).onId3); 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/TextLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.net.URLRequest; 6 | 7 | public class TextLoaderTest extends BaseLoaderTest 8 | { 9 | [Before] 10 | override public function runBeforeEachTest() : void 11 | { 12 | super.runBeforeEachTest(); 13 | 14 | _loaderName = "TextLoader"; 15 | _payloadType = String; 16 | _payloadTypeName = "String"; 17 | _payloadPropertyName = "text"; 18 | _path += "testTXT.txt"; 19 | _type = AssetType.TEXT; 20 | 21 | _loader = new TextLoader(new URLRequest(_path), _id); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/VideoLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | import org.assetloader.signals.LoaderSignal; 5 | import org.assetloader.signals.NetStatusSignal; 6 | import org.flexunit.asserts.assertEquals; 7 | import org.flexunit.asserts.assertNotNull; 8 | import org.flexunit.asserts.assertTrue; 9 | import org.osflash.signals.utils.SignalAsyncEvent; 10 | import org.osflash.signals.utils.failOnSignal; 11 | import org.osflash.signals.utils.handleSignal; 12 | 13 | import flash.net.NetStream; 14 | import flash.net.URLRequest; 15 | 16 | public class VideoLoaderTest extends BaseLoaderTest 17 | { 18 | [Before] 19 | override public function runBeforeEachTest() : void 20 | { 21 | super.runBeforeEachTest(); 22 | 23 | _loaderName = "VideoLoader"; 24 | _payloadType = NetStream; 25 | _payloadTypeName = "NetStream"; 26 | _payloadPropertyName = "netStream"; 27 | // Make sure video is an FLV, flash player does not allow local loading of mp4 file format. 28 | _path += "testVIDEO.flv"; 29 | _type = AssetType.VIDEO; 30 | 31 | _loader = new VideoLoader(new URLRequest(_path), _id); 32 | } 33 | 34 | // NON - STANDARD - LOADER - TESTS -------------------------------------------------------------------------------------------// 35 | [Test] 36 | override public function signalsReadyOnConstruction() : void 37 | { 38 | assertNotNull(_loaderName + "#onNetStatus should NOT be null after construction", VideoLoader(_loader).onNetStatus); 39 | assertNotNull(_loaderName + "#onReady should NOT be null after construction", VideoLoader(_loader).onReady); 40 | assertNotNull(_loaderName + "#onMetaData should NOT be null after construction", VideoLoader(_loader).onMetaData); 41 | } 42 | 43 | [Test (async)] 44 | public function onNetStatusSignal() : void 45 | { 46 | handleSignal(this, VideoLoader(_loader).onNetStatus, onNetStatus_handler); 47 | _loader.start(); 48 | } 49 | 50 | protected function onNetStatus_handler(event : SignalAsyncEvent, data : Object) : void 51 | { 52 | var values : Array = event.args; 53 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is NetStatusSignal)); 54 | 55 | var signal : NetStatusSignal = values[0]; 56 | assertNotNull("NetStatusSignal#loader should NOT be null", signal.loader); 57 | assertNotNull("NetStatusSignal#info should NOT be null", signal.info); 58 | } 59 | 60 | [Test (async)] 61 | public function onReadySignal() : void 62 | { 63 | handleSignal(this, VideoLoader(_loader).onReady, onReady_handler); 64 | _loader.start(); 65 | } 66 | 67 | protected function onReady_handler(event : SignalAsyncEvent, data : Object) : void 68 | { 69 | var values : Array = event.args; 70 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 71 | assertTrue("Argument 2 should be NetStream", values[1] is NetStream); 72 | 73 | var signal : LoaderSignal = values[0]; 74 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 75 | 76 | 77 | assertTrue(_loaderName + "#isReady should be true", VideoLoader(_loader).isReady); 78 | } 79 | 80 | [Test (async)] 81 | public function onMetaDataSignal() : void 82 | { 83 | handleSignal(this, VideoLoader(_loader).onMetaData, onMetaData_handler); 84 | _loader.start(); 85 | } 86 | 87 | protected function onMetaData_handler(event : SignalAsyncEvent, data : Object) : void 88 | { 89 | var values : Array = event.args; 90 | assertTrue("Argument 1 should be LoaderSignal", (values[0] is LoaderSignal)); 91 | assertTrue("Argument 2 should be Object", values[1] is Object); 92 | 93 | var signal : LoaderSignal = values[0]; 94 | assertNotNull("LoaderSignal#loader should NOT be null", signal.loader); 95 | 96 | } 97 | 98 | override protected function assertPostDestroy() : void 99 | { 100 | super.assertPostDestroy(); 101 | assertEquals(_loaderName + "#onNetStatus#numListeners should be equal to 0", VideoLoader(_loader).onNetStatus.numListeners, 0); 102 | assertEquals(_loaderName + "#onReady#numListeners should be equal to 0", VideoLoader(_loader).onReady.numListeners, 0); 103 | } 104 | 105 | // VIDEO LOADER DOES NOT DISPATCH HTTP STATUS SIGNAL 106 | [Test (async)] 107 | override public function onHttpStatusSignal() : void 108 | { 109 | failOnSignal(this, _loader.onHttpStatus); 110 | _loader.start(); 111 | } 112 | 113 | [Test (async)] 114 | override public function stop() : void 115 | { 116 | super.stop(); 117 | failOnSignal(this, VideoLoader(_loader).onNetStatus); failOnSignal(this, VideoLoader(_loader).onReady); 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/loaders/XMLLoaderTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.loaders 2 | { 3 | import org.assetloader.base.AssetType; 4 | 5 | import flash.net.URLRequest; 6 | 7 | public class XMLLoaderTest extends BaseLoaderTest 8 | { 9 | [Before] 10 | override public function runBeforeEachTest() : void 11 | { 12 | super.runBeforeEachTest(); 13 | 14 | _loaderName = "XMLLoader"; 15 | _payloadType = XML; 16 | _payloadTypeName = "XML"; 17 | _payloadPropertyName = "xml"; 18 | _path += "testXML.xml"; 19 | _type = AssetType.XML; 20 | 21 | _loader = new XMLLoader(new URLRequest(_path), _id); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/parsers/ParsersTestSuite.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.parsers 2 | { 3 | 4 | [Suite] 5 | [RunWith("org.flexunit.runners.Suite")] 6 | public class ParsersTestSuite 7 | { 8 | public var xmlConfigParserTest : XmlConfigParserTest; public var urlParserTest : URLParserTest; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/utils/InspectorTest.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.utils 2 | { 3 | import org.assetloader.loaders.SWFLoader; 4 | import org.flexunit.asserts.assertEquals; 5 | import org.flexunit.asserts.assertNotNull; 6 | import org.flexunit.asserts.assertNull; 7 | import org.flexunit.asserts.assertTrue; 8 | import org.osflash.signals.utils.SignalAsyncEvent; 9 | import org.osflash.signals.utils.handleSignal; 10 | 11 | import flash.display.Bitmap; 12 | import flash.display.BitmapData; 13 | import flash.display.MovieClip; 14 | import flash.display.Sprite; 15 | import flash.media.Sound; 16 | import flash.net.URLRequest; 17 | import flash.text.Font; 18 | 19 | public class InspectorTest 20 | { 21 | protected var _loader : SWFLoader; 22 | protected var _inspector : Inspector; 23 | protected var _basePackage : String = "org.assetloader.assets"; 24 | 25 | [BeforeClass] 26 | public static function runBeforeEntireSuite() : void 27 | { 28 | } 29 | 30 | [AfterClass] 31 | public static function runAfterEntireSuite() : void 32 | { 33 | } 34 | 35 | [Before(async)] 36 | public function runBeforeEachTest() : void 37 | { 38 | _loader = new SWFLoader(new URLRequest("assets/InspectorTestAssets.swf")); 39 | handleSignal(this, _loader.onComplete, loader_onComplete_handler); 40 | _loader.start(); 41 | } 42 | 43 | protected function loader_onComplete_handler(event : SignalAsyncEvent, data : Object) : void 44 | { 45 | _inspector = new Inspector(_loader.data); 46 | _inspector.basePackage = _basePackage; 47 | } 48 | 49 | [After] 50 | public function runAfterEachTest() : void 51 | { 52 | _loader.destroy(); 53 | _loader = null; 54 | } 55 | 56 | [Test] 57 | public function retainsBasePackage() : void 58 | { 59 | assertEquals("Should retain #basePackage", _basePackage, _inspector.basePackage); 60 | } 61 | 62 | [Test] 63 | public function getClass() : void 64 | { 65 | var data : * = _inspector.getClass("FontAsset"); 66 | assertNotNull(_basePackage + ".FontAsset should not be null.", data); 67 | assertTrue(_basePackage + ".FontAsset should be of type Class.", data is Class); 68 | } 69 | 70 | [Test] 71 | public function getClassInvalid() : void 72 | { 73 | var data : * = _inspector.getClass("asset.FontAsset"); 74 | assertNull(_basePackage + "assets.FontAsset should be null.", data); 75 | } 76 | 77 | [Test] 78 | public function getClassOverride() : void 79 | { 80 | var data : * = _inspector.getClass("DoesFlashAsset", "com.doesflash.assets"); 81 | assertNotNull("com.doesflash.assets.DoesFlashAsset should not be null.", data); 82 | assertTrue("com.doesflash.assets.DoesFlashAsset should be of type Sprite.", data is Class); 83 | } 84 | 85 | [Test] 86 | public function getClassInvalidOverride() : void 87 | { 88 | var data : * = _inspector.getClass("assets.DoesFlashAsset", "com.doesflash.assets"); 89 | assertNull("com.doesflash.assets.DoesFlashAsset should be null.", data); 90 | } 91 | 92 | [Test] 93 | public function getSprite() : void 94 | { 95 | var data : * = _inspector.getSprite("SpriteAsset"); 96 | assertNotNull(_basePackage + ".SpriteAsset should not be null.", data); 97 | assertTrue(_basePackage + ".SpriteAsset should be of type Sprite.", data is Sprite); 98 | } 99 | 100 | [Test] 101 | public function getMovieClip() : void 102 | { 103 | var data : * = _inspector.getMovieClip("MovieClipAsset"); 104 | assertNotNull(_basePackage + ".MovieClipAsset should not be null.", data); 105 | assertTrue(_basePackage + ".MovieClipAsset should be of type MovieClip.", data is MovieClip); 106 | } 107 | 108 | [Test] 109 | public function getFont() : void 110 | { 111 | var data : * = _inspector.getFont("FontAsset"); 112 | assertNotNull(_basePackage + ".FontAsset should not be null.", data); 113 | assertTrue(_basePackage + ".FontAsset should be of type Font.", data is Font); 114 | } 115 | 116 | [Test] 117 | public function getSound() : void 118 | { 119 | var data : * = _inspector.getSound("SoundAsset"); 120 | assertNotNull(_basePackage + ".SoundAsset should not be null.", data); 121 | assertTrue(_basePackage + ".SoundAsset should be of type Sound.", data is Sound); 122 | } 123 | 124 | [Test] 125 | public function getBitmapData() : void 126 | { 127 | var data : * = _inspector.getBitmapData("BitmapDataAsset"); 128 | assertNotNull(_basePackage + ".BitmapDataAsset should not be null.", data); 129 | assertTrue(_basePackage + ".BitmapDataAsset should be of type BitmapData.", data is BitmapData); 130 | } 131 | 132 | [Test] 133 | public function getBitmap() : void 134 | { 135 | var data : * = _inspector.getBitmap("BitmapDataAsset"); 136 | assertNotNull(_basePackage + ".BitmapDataAsset should not be null.", data); 137 | assertTrue(_basePackage + ".BitmapDataAsset should be of type Bitmap.", data is Bitmap); 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src_unit/org/assetloader/utils/UtilsTestSuite.as: -------------------------------------------------------------------------------- 1 | package org.assetloader.utils 2 | { 3 | 4 | [Suite] 5 | [RunWith("org.flexunit.runners.Suite")] 6 | public class UtilsTestSuite 7 | { 8 | public var inspectorTest : InspectorTest; 9 | } 10 | } 11 | --------------------------------------------------------------------------------