source: trunk/fl5/src/com/longtailvideo/jwplayer/view/skins/ZIPSkin.as @ 1165

Revision 1165, 2.9 KB checked in by pablo, 3 years ago (diff)

Searches into Zip files if skin XML manifest is incorrectly named (972)

Line 
1package com.longtailvideo.jwplayer.view.skins {
2        import com.longtailvideo.jwplayer.utils.AssetLoader;
3        import com.longtailvideo.jwplayer.utils.Strings;
4        import com.nochump.util.zip.ZipEntry;
5        import com.nochump.util.zip.ZipFile;
6       
7        import flash.events.ErrorEvent;
8        import flash.events.Event;
9        import flash.events.IOErrorEvent;
10        import flash.events.SecurityErrorEvent;
11        import flash.net.URLRequest;
12        import flash.net.URLStream;
13
14
15        public class ZIPSkin extends PNGSkin {
16                private var _zipFile:ZipFile;
17
18
19                public function ZIPSkin() {
20                        super();
21                }
22
23
24                public override function load(url:String=null):void {
25                        if (Strings.extension(url) == "zip") {
26                                _urlPrefix = url.substring(url.lastIndexOf('/') + 1, url.lastIndexOf('.'));
27
28                                var urlStream:URLStream = new URLStream();
29                                urlStream.addEventListener(Event.COMPLETE, loadComplete);
30                                urlStream.addEventListener(IOErrorEvent.IO_ERROR, loadError);
31                                urlStream.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loadError);
32                                urlStream.load(new URLRequest(url));
33                        } else if (_skin.numChildren == 0) {
34                                sendError("ZIP skin descriptor file must have a .zip extension");
35                        }
36                }
37
38
39                protected override function loadComplete(evt:Event):void {
40                        var data:URLStream = URLStream(evt.target);
41                        _zipFile = new ZipFile(data);
42                        try {
43                                var zipEntry:ZipEntry = getXMLEntry(_zipFile, _urlPrefix);
44                                if (!zipEntry) {
45                                        sendError("No XML file found in skin ZIP");
46                                        return;
47                                }
48                                _urlPrefix = zipEntry.name.substring(0, zipEntry.name.lastIndexOf('/'));
49                                _skinXML = XML(String(_zipFile.getInput(zipEntry)));
50                                parseSkin();
51                        } catch (e:Error) {
52                                sendError(e.message);
53                        }
54                }
55               
56                protected function getXMLEntry(file:ZipFile, prefix:String=""):ZipEntry {
57                        var entry:ZipEntry = file.getEntry(prefix + '.xml');
58                        if (entry) { return entry; }
59                       
60                        entry = file.getEntry(prefix + '/' + prefix + '.xml');
61                        if (entry) { return entry; }
62                       
63                        for each (entry in file.entries) {
64                                if (Strings.extension(entry.name) == "xml") {
65                                        if (XML(String(file.getInput(entry))).localName() == "skin") {
66                                                return entry;
67                                        }
68                                }
69                        }
70                       
71                        return null;
72                }
73
74
75                protected override function loadElements(component:String, elements:XMLList):void {
76                        if (!component)
77                                return;
78
79                        for each (var element:XML in elements) {
80                                var file:String = component + '/' + element.@src.toString();
81                                if (_urlPrefix){
82                                        file = _urlPrefix +'/'+file;
83                                }
84                                var zipEntry:ZipEntry = _zipFile.getEntry(file);
85                               
86                                if (zipEntry) {
87                                        try {
88                                                var newLoader:AssetLoader = new AssetLoader();
89                                                _loaders[newLoader] = {componentName: component, elementName: element.@name.toString()};
90                                                newLoader.addEventListener(Event.COMPLETE, elementHandler);
91                                                newLoader.addEventListener(ErrorEvent.ERROR, elementError);
92                                                newLoader.loadBytes(_zipFile.getInput(zipEntry));
93                                        } catch (err:Error) {
94                                                sendError("Error loading ZIP skin "+component+"'s "+element.toString()+": "+err.message);
95                                        }
96                                }
97                        }
98                }
99        }
100}
Note: See TracBrowser for help on using the repository browser.