| 1 | /** |
|---|
| 2 | * Interface for javascript interaction. |
|---|
| 3 | **/ |
|---|
| 4 | package com.jeroenwijering.views { |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | import com.jeroenwijering.events.*; |
|---|
| 8 | import com.jeroenwijering.player.View; |
|---|
| 9 | import flash.external.ExternalInterface; |
|---|
| 10 | import flash.system.Capabilities; |
|---|
| 11 | import flash.system.Security; |
|---|
| 12 | |
|---|
| 13 | |
|---|
| 14 | public class ExternalView { |
|---|
| 15 | |
|---|
| 16 | |
|---|
| 17 | /** Reference to the MVC view. **/ |
|---|
| 18 | private var view:View; |
|---|
| 19 | /** List with all subscribers. **/ |
|---|
| 20 | private var listeners:Array; |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | public function ExternalView(vie:View) { |
|---|
| 24 | view = vie; |
|---|
| 25 | view.addControllerListener(ControllerEvent.CAPTION,setController); |
|---|
| 26 | view.addControllerListener(ControllerEvent.ERROR,setController); |
|---|
| 27 | view.addControllerListener(ControllerEvent.ITEM,setController); |
|---|
| 28 | view.addControllerListener(ControllerEvent.MUTE,setController); |
|---|
| 29 | view.addControllerListener(ControllerEvent.PLAY,setController); |
|---|
| 30 | view.addControllerListener(ControllerEvent.PLAYLIST,setController); |
|---|
| 31 | view.addControllerListener(ControllerEvent.QUALITY,setController); |
|---|
| 32 | view.addControllerListener(ControllerEvent.RESIZE,setController); |
|---|
| 33 | view.addControllerListener(ControllerEvent.SEEK,setController); |
|---|
| 34 | view.addControllerListener(ControllerEvent.STOP,setController); |
|---|
| 35 | view.addControllerListener(ControllerEvent.VOLUME,setController); |
|---|
| 36 | view.addModelListener(ModelEvent.BUFFER,setModel); |
|---|
| 37 | view.addModelListener(ModelEvent.ERROR,setModel); |
|---|
| 38 | view.addModelListener(ModelEvent.LOADED,setModel); |
|---|
| 39 | view.addModelListener(ModelEvent.META,setModel); |
|---|
| 40 | view.addModelListener(ModelEvent.STATE,setModel); |
|---|
| 41 | view.addModelListener(ModelEvent.TIME,setModel); |
|---|
| 42 | view.addViewListener(ViewEvent.CAPTION,setView); |
|---|
| 43 | view.addViewListener(ViewEvent.ERROR,setView); |
|---|
| 44 | view.addViewListener(ViewEvent.FULLSCREEN,setView); |
|---|
| 45 | view.addViewListener(ViewEvent.ITEM,setView); |
|---|
| 46 | view.addViewListener(ViewEvent.LINK,setView); |
|---|
| 47 | view.addViewListener(ViewEvent.LOAD,setView); |
|---|
| 48 | view.addViewListener(ViewEvent.MUTE,setView); |
|---|
| 49 | view.addViewListener(ViewEvent.NEXT,setView); |
|---|
| 50 | view.addViewListener(ViewEvent.PLAY,setView); |
|---|
| 51 | view.addViewListener(ViewEvent.PREV,setView); |
|---|
| 52 | view.addViewListener(ViewEvent.QUALITY,setView); |
|---|
| 53 | view.addViewListener(ViewEvent.SEEK,setView); |
|---|
| 54 | view.addViewListener(ViewEvent.STOP,setView); |
|---|
| 55 | view.addViewListener(ViewEvent.VOLUME,setView); |
|---|
| 56 | if(ExternalInterface.available) { |
|---|
| 57 | listeners = new Array(); |
|---|
| 58 | Security.allowDomain('*'); |
|---|
| 59 | ExternalInterface.addCallback("getConfig", getConfig); |
|---|
| 60 | ExternalInterface.addCallback("getPlaylist", getPlaylist); |
|---|
| 61 | ExternalInterface.addCallback("addControllerListener", addControllerListener); |
|---|
| 62 | ExternalInterface.addCallback("addModelListener", addModelListener); |
|---|
| 63 | ExternalInterface.addCallback("addViewListener", addViewListener); |
|---|
| 64 | ExternalInterface.addCallback("sendEvent", view.sendEvent); |
|---|
| 65 | } |
|---|
| 66 | }; |
|---|
| 67 | |
|---|
| 68 | |
|---|
| 69 | /** Manage subscriptions of events. **/ |
|---|
| 70 | public function addControllerListener(typ:String,fcn:String):Boolean { |
|---|
| 71 | listeners.push({target:'CONTROLLER',type:typ.toUpperCase(),callee:fcn}); |
|---|
| 72 | return true; |
|---|
| 73 | }; |
|---|
| 74 | public function addModelListener(typ:String,fcn:String):Boolean { |
|---|
| 75 | listeners.push({target:'MODEL',type:typ.toUpperCase(),callee:fcn}); |
|---|
| 76 | return true; |
|---|
| 77 | }; |
|---|
| 78 | public function addViewListener(typ:String,fcn:String):Boolean { |
|---|
| 79 | listeners.push({target:'VIEW',type:typ.toUpperCase(),callee:fcn}); |
|---|
| 80 | return true; |
|---|
| 81 | }; |
|---|
| 82 | |
|---|
| 83 | |
|---|
| 84 | /** Send event to listeners and tracers. **/ |
|---|
| 85 | private function forward(tgt:String,typ:String,dat:Object) { |
|---|
| 86 | var prm = ''; |
|---|
| 87 | for (var i in dat) { prm += i+':'+dat[i]+','; } |
|---|
| 88 | if(prm.length > 0) { |
|---|
| 89 | prm = '('+prm.substr(0,prm.length-1)+')'; |
|---|
| 90 | } |
|---|
| 91 | if(Capabilities.playerType == 'External') { |
|---|
| 92 | trace(tgt+': '+typ+' '+prm); |
|---|
| 93 | } else if(view.config['tracecall']) { |
|---|
| 94 | ExternalInterface.call(view.config['tracecall'],tgt+': '+typ+' '+prm); |
|---|
| 95 | } |
|---|
| 96 | if(!dat) { dat = new Object(); } |
|---|
| 97 | dat.id = ExternalInterface.objectID; |
|---|
| 98 | dat.version = view.config['version']; |
|---|
| 99 | for each (var itm in listeners) { |
|---|
| 100 | if(itm['target'] == tgt && itm['type'] == typ) { |
|---|
| 101 | ExternalInterface.call(itm['callee'],dat); |
|---|
| 102 | } |
|---|
| 103 | } |
|---|
| 104 | }; |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | /** Return the config and javascript objects to callers. **/ |
|---|
| 108 | public function getConfig():Object { return view.config; }; |
|---|
| 109 | public function getPlaylist():Array { return view.playlist; }; |
|---|
| 110 | |
|---|
| 111 | |
|---|
| 112 | /** Forward events to tracer and subscribers. **/ |
|---|
| 113 | private function setController(evt:ControllerEvent) { forward('CONTROLLER',evt.type,evt.data); }; |
|---|
| 114 | private function setModel(evt:ModelEvent) { forward('MODEL',evt.type,evt.data); }; |
|---|
| 115 | private function setView(evt:ViewEvent) { forward('VIEW',evt.type,evt.data); }; |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | }; |
|---|
| 119 | |
|---|
| 120 | |
|---|
| 121 | } |
|---|