Skip to content

Commit 304a6c3

Browse files
committed
Corrected ConnectManager.as and TraceOut.as line endings.
1 parent c6cef4d commit 304a6c3

2 files changed

Lines changed: 359 additions & 2 deletions

File tree

Lines changed: 296 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,296 @@
1-
/* * jPlayer Plugin for jQuery JavaScript Library * http://www.jplayer.org * * Copyright (c) 2009 - 2013 Happyworm Ltd * Dual licensed under the MIT and GPL licenses. * - http://www.opensource.org/licenses/mit-license.php * - http://www.gnu.org/copyleft/gpl.html * * Author: Robert M. Hall * Date: 7th August 2012 * Custom NetConnection Manager for more robust RTMP support * Based in part on work by Will Law for the old Akamai NCManager.as * and some of Will's new work in the OVP base classes (Open Video Player) * as well as similar approaches by many other NetConnection managers * */ /* TODO LIST 08/18/2011: 1. Wired up errors to dispatch events to Jplayer events to allow them to bubble up to JS 2. Rework event dispatch to handoff netconnection instead of a passed in reference 3. Allow a customizeable list of protocols and ports to be used instead of entire list 4. Allow a specific port/protocol (1 connect type) to be used first, and then optionally fallback on a custom list or the default list 5. Remove some traces and check a few other items below where I've made notes */package happyworm.jPlayer { import flash.events.*; import flash.net.*; import flash.utils.Timer; import flash.utils.getTimer; import flash.utils.clearInterval; import flash.utils.setInterval; public class ConnectManager extends Object { private var protocols_arr:Array = new Array("rtmp","rtmpt","rtmpe","rtmpte","rtmps"); private var ports_arr:Array = new Array("",":1935",":80",":443"); private const protCount:Number = 5; private const portCount:Number = 4; private var _ncRef:Object; private var _aNC:Array; private var k_TIMEOUT:Number = 30000; private var k_startConns:Number; private var m_connList:Array = []; private var m_serverName:String; private var m_appName:String; private var m_streamName:String; private var m_connListCounter:Number; private var m_flashComConnectTimeOut:Number; private var m_validNetConnection:NetConnection; private var connectSuccess:Boolean=false; private var negotiating:Boolean=false; private var idleTimeOut:Boolean=false; public function ConnectManager() { trace ("ConnectManager Initialized Version: 1.00 DT"); createPortsProtocolsArray(); } private function createPortsProtocolsArray():void { var outerLoop:Number=0; var innerLoop:Number=0; for (outerLoop=0; outerLoop<protocols_arr.length; outerLoop++) { for (innerLoop=0; innerLoop<ports_arr.length; innerLoop++) { m_connList.push( { protocol: protocols_arr[outerLoop], port: ports_arr[innerLoop] } ); } } } public function negotiateConnect(ncRef:Object,p_serverName:String,p_appName:String):void { negotiating=true; _ncRef=ncRef; trace("*** SERVER NAME: "+p_serverName); trace("*** APP NAME: "+p_serverName); k_startConns = getTimer(); m_serverName = p_serverName; m_appName = p_appName; // Set a timeout function, just in case we never connect successfully clearInterval(m_flashComConnectTimeOut); m_flashComConnectTimeOut = setInterval(onFlashComConnectTimeOut,k_TIMEOUT,k_TIMEOUT); // Createe a NetConnection for each of the protocols/ports listed in the m_connList list. // Connection attempts occur at intervals of 1.5 seconds. // The first connection to succeed will be used, all the others will be closed. _aNC = new Array(); for (var i:uint = 0; i < m_connList.length; i++) { _aNC[i] = new NetConnection(); _aNC[i].addEventListener(NetStatusEvent.NET_STATUS,netStatus); _aNC[i].addEventListener(SecurityErrorEvent.SECURITY_ERROR,netSecurityError); _aNC[i].addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError); _aNC[i].client = new Object; _aNC[i].client.owner = this; _aNC[i].client.connIndex = i; _aNC[i].client.id = i; _aNC[i].client.pending = true; /* Revisit this chunk - not needed at the moment as NC is handed off and this // is handled elsewhere // Need to put in some event dispatching as a more elegant solution and leave it here _aNC[i].client.onBWDone = function (p_bw, deltaDown, deltaTime, latency) { //this.owner.dispatchEvent ({type:"ncBandWidth", kbps:p_bw, latency:latency}); }; _aNC[i].client.onBWCheck = function (counter) { return ++counter; }; _aNC[i].client.onStatus = function (info) { // }; */ } m_connListCounter = 0; nextConnect (); } private function nextConnect():void { trace("*** Connection: "+ m_connListCounter + ": "+m_connList[m_connListCounter].protocol + "://" + m_serverName + m_connList[m_connListCounter].port + "/" + m_appName); try { _aNC[m_connListCounter].connect(m_connList[m_connListCounter].protocol + "://" + m_serverName + m_connList[m_connListCounter].port + "/" + m_appName); } catch (error:Error) { // statements trace("*** Caught an error condition: "+error); m_connListCounter = m_connList.length+1; } // statements clearInterval(_aNC["ncInt" + m_connListCounter]); if ((m_connListCounter < m_connList.length - 1)) { m_connListCounter++; _aNC["ncInt" + m_connListCounter] = setInterval(nextConnect,1500); } } // Cleans up all connections if none have succeeded by the timeout interval private function onFlashComConnectTimeOut(timeout:Number):void { stopAll(); } private function handleGoodConnect(_nc:NetConnection):void { negotiating=false; trace("Handing OFF NetConnection"); clearInterval(m_flashComConnectTimeOut); _ncRef.connectStream(); _ncRef.onBWDone(null,_nc); //dispatchEvent(event); // Need to enable and pass to Jplayer event system- revisit // right now handing back a hardcoded reference that is passed in // Should come up with a more loosely coupled way via event dispatch } public function getNegotiating():Boolean { return negotiating; } public function setNegotiating(bool:Boolean):void { negotiating=bool; } public function stopAll(bool:Boolean=false):void { //this.dispatchEvent ({type:"ncFailedToConnect", timeout:timeout}); // Need to enable and pass to Jplayer event system- revisit // trace(_aNC+":"+m_flashComConnectTimeOut+":"+m_connList.length) if(_aNC!=null && !isNaN(m_flashComConnectTimeOut) ) { clearInterval(m_flashComConnectTimeOut); for (var i:uint = 0; i < m_connList.length; i++) { if (_aNC[i]!=null) { clearInterval(_aNC["ncInt" + i]); _aNC[i].close(); if(bool==false) { _aNC[i].client = null; } _aNC[i] = null; delete _aNC[i]; } } } } private function netStatus(event:NetStatusEvent):void { trace(event.info.code); if(event.info.description != undefined) { trace(event.info.description); } _aNC[event.target.client.id].client.pending = true; // this.owner.m_validNetConnection = this.client.owner[this.client.connIndex]; // if (info.description == "[ License.Limit.Exceeded ]") { switch (event.info.code) { case "NetConnection.Connect.IdleTimeOut": trace("IDLE TIMEOUT OCCURRED!") negotiating=true; idleTimeOut=true; _ncRef.shutDownNcNs(); break; case "NetConnection.Connect.Closed": if(!negotiating && !idleTimeOut) { idleTimeOut = false; _ncRef.doneYet(); } break; case "NetConnection.Connect.InvalidApp": case "NetConnection.Connect.Rejected": //handleRejectedOrInvalid(event) break; case "NetConnection.Call.Failed": /* if (event.info.description.indexOf("_checkbw") != -1) { event.target.expectBWDone = true; event.target.call("checkBandwidth",null); } */ break; case "NetConnection.Connect.Success": var i:uint=0; for ( i = 0; i<_aNC.length; i++) { if (_aNC[i] && (i != event.target.client.id)) { _aNC[i].close(); _aNC[i] = null; } } var _nc:NetConnection = NetConnection(event.target); var connID:Number = event.target.client.id; var _actualPort:String = m_connList[m_connListCounter].port; var _actualProtocol:String = m_connList[m_connListCounter].protocol; // See if we have version info var _serverVersion:String = "UNKNOWN"; if (event.info.data && event.info.data.version) { _serverVersion = event.info.data.version; } trace("Connect ID: "+connID+" - PORT: "+_actualPort+" - PROTOCOL: "+_actualProtocol+" - FMS Version: "+_serverVersion); clearInterval(_aNC["ncInt" + connID]); clearInterval(_aNC["ncInt" + m_connListCounter]); handleGoodConnect(_nc); break; } } /** Catches any netconnection net security errors * @private */ private function netSecurityError(event:SecurityErrorEvent):void { trace("SECURITY ERROR:"+event); //dispatchEvent(event); // Need to enable and pass to Jplayer event system- revisit } /** Catches any async errors * @private */ private function asyncError(event:AsyncErrorEvent):void { trace("ASYNC ERROR:"+event.error); //dispatchEvent(event); // Need to enable and pass to Jplayer event system- revisit } }// class } //package
1+
/*
2+
* jPlayer Plugin for jQuery JavaScript Library
3+
* http://www.jplayer.org
4+
*
5+
* Copyright (c) 2009 - 2013 Happyworm Ltd
6+
* Dual licensed under the MIT and GPL licenses.
7+
* - http://www.opensource.org/licenses/mit-license.php
8+
* - http://www.gnu.org/copyleft/gpl.html
9+
*
10+
* Author: Robert M. Hall
11+
* Date: 7th August 2012
12+
* Custom NetConnection Manager for more robust RTMP support
13+
* Based in part on work by Will Law for the old Akamai NCManager.as
14+
* and some of Will's new work in the OVP base classes (Open Video Player)
15+
* as well as similar approaches by many other NetConnection managers
16+
*
17+
*/
18+
19+
/*
20+
TODO LIST 08/18/2011:
21+
1. Wired up errors to dispatch events to Jplayer events to allow them to bubble up to JS
22+
2. Rework event dispatch to handoff netconnection instead of a passed in reference
23+
3. Allow a customizeable list of protocols and ports to be used instead of entire list
24+
4. Allow a specific port/protocol (1 connect type) to be used first, and then optionally fallback on a custom list or the default list
25+
5. Remove some traces and check a few other items below where I've made notes
26+
*/
27+
28+
package happyworm.jPlayer {
29+
30+
import flash.events.*;
31+
import flash.net.*;
32+
33+
import flash.utils.Timer;
34+
import flash.utils.getTimer;
35+
import flash.utils.clearInterval;
36+
import flash.utils.setInterval;
37+
38+
public class ConnectManager extends Object {
39+
40+
private var protocols_arr:Array = new Array("rtmp","rtmpt","rtmpe","rtmpte","rtmps");
41+
private var ports_arr:Array = new Array("",":1935",":80",":443");
42+
private const protCount:Number = 5;
43+
private const portCount:Number = 4;
44+
45+
private var _ncRef:Object;
46+
47+
private var _aNC:Array;
48+
49+
private var k_TIMEOUT:Number = 30000;
50+
private var k_startConns:Number;
51+
private var m_connList:Array = [];
52+
private var m_serverName:String;
53+
private var m_appName:String;
54+
private var m_streamName:String;
55+
private var m_connListCounter:Number;
56+
private var m_flashComConnectTimeOut:Number;
57+
private var m_validNetConnection:NetConnection;
58+
59+
private var connectSuccess:Boolean=false;
60+
61+
private var negotiating:Boolean=false;
62+
private var idleTimeOut:Boolean=false;
63+
64+
public function ConnectManager() {
65+
trace ("ConnectManager Initialized Version: 1.00 DT");
66+
createPortsProtocolsArray();
67+
}
68+
69+
private function createPortsProtocolsArray():void {
70+
var outerLoop:Number=0;
71+
var innerLoop:Number=0;
72+
for (outerLoop=0; outerLoop<protocols_arr.length; outerLoop++) {
73+
74+
for (innerLoop=0; innerLoop<ports_arr.length; innerLoop++) {
75+
m_connList.push( { protocol: protocols_arr[outerLoop], port: ports_arr[innerLoop] } );
76+
}
77+
78+
}
79+
}
80+
81+
public function negotiateConnect(ncRef:Object,p_serverName:String,p_appName:String):void
82+
{
83+
negotiating=true;
84+
_ncRef=ncRef;
85+
trace("*** SERVER NAME: "+p_serverName);
86+
trace("*** APP NAME: "+p_serverName);
87+
k_startConns = getTimer();
88+
m_serverName = p_serverName;
89+
m_appName = p_appName;
90+
91+
// Set a timeout function, just in case we never connect successfully
92+
clearInterval(m_flashComConnectTimeOut);
93+
m_flashComConnectTimeOut = setInterval(onFlashComConnectTimeOut,k_TIMEOUT,k_TIMEOUT);
94+
95+
// Createe a NetConnection for each of the protocols/ports listed in the m_connList list.
96+
// Connection attempts occur at intervals of 1.5 seconds.
97+
// The first connection to succeed will be used, all the others will be closed.
98+
_aNC = new Array();
99+
for (var i:uint = 0; i < m_connList.length; i++)
100+
{
101+
_aNC[i] = new NetConnection();
102+
_aNC[i].addEventListener(NetStatusEvent.NET_STATUS,netStatus);
103+
_aNC[i].addEventListener(SecurityErrorEvent.SECURITY_ERROR,netSecurityError);
104+
_aNC[i].addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError);
105+
_aNC[i].client = new Object;
106+
_aNC[i].client.owner = this;
107+
_aNC[i].client.connIndex = i;
108+
_aNC[i].client.id = i;
109+
_aNC[i].client.pending = true;
110+
111+
/* Revisit this chunk - not needed at the moment as NC is handed off and this
112+
// is handled elsewhere
113+
// Need to put in some event dispatching as a more elegant solution and leave it here
114+
115+
_aNC[i].client.onBWDone = function (p_bw, deltaDown, deltaTime, latency) {
116+
//this.owner.dispatchEvent ({type:"ncBandWidth", kbps:p_bw, latency:latency});
117+
};
118+
119+
_aNC[i].client.onBWCheck = function (counter) {
120+
return ++counter;
121+
};
122+
123+
_aNC[i].client.onStatus = function (info) {
124+
//
125+
};
126+
*/
127+
128+
}
129+
m_connListCounter = 0;
130+
nextConnect ();
131+
}
132+
133+
private function nextConnect():void
134+
{
135+
trace("*** Connection: "+ m_connListCounter + ": "+m_connList[m_connListCounter].protocol + "://" + m_serverName + m_connList[m_connListCounter].port + "/" + m_appName);
136+
137+
try {
138+
_aNC[m_connListCounter].connect(m_connList[m_connListCounter].protocol + "://" + m_serverName + m_connList[m_connListCounter].port + "/" + m_appName);
139+
140+
} catch (error:Error) {
141+
// statements
142+
trace("*** Caught an error condition: "+error);
143+
m_connListCounter = m_connList.length+1;
144+
}
145+
// statements
146+
clearInterval(_aNC["ncInt" + m_connListCounter]);
147+
148+
if ((m_connListCounter < m_connList.length - 1))
149+
{
150+
m_connListCounter++;
151+
_aNC["ncInt" + m_connListCounter] = setInterval(nextConnect,1500);
152+
}
153+
154+
}
155+
156+
// Cleans up all connections if none have succeeded by the timeout interval
157+
private function onFlashComConnectTimeOut(timeout:Number):void
158+
{
159+
stopAll();
160+
}
161+
162+
private function handleGoodConnect(_nc:NetConnection):void {
163+
negotiating=false;
164+
trace("Handing OFF NetConnection");
165+
clearInterval(m_flashComConnectTimeOut);
166+
_ncRef.connectStream();
167+
_ncRef.onBWDone(null,_nc);
168+
//dispatchEvent(event);
169+
// Need to enable and pass to Jplayer event system- revisit
170+
// right now handing back a hardcoded reference that is passed in
171+
// Should come up with a more loosely coupled way via event dispatch
172+
173+
}
174+
175+
public function getNegotiating():Boolean {
176+
return negotiating;
177+
}
178+
179+
public function setNegotiating(bool:Boolean):void {
180+
negotiating=bool;
181+
}
182+
183+
184+
public function stopAll(bool:Boolean=false):void {
185+
186+
//this.dispatchEvent ({type:"ncFailedToConnect", timeout:timeout});
187+
// Need to enable and pass to Jplayer event system- revisit
188+
// trace(_aNC+":"+m_flashComConnectTimeOut+":"+m_connList.length)
189+
if(_aNC!=null && !isNaN(m_flashComConnectTimeOut) ) {
190+
clearInterval(m_flashComConnectTimeOut);
191+
for (var i:uint = 0; i < m_connList.length; i++)
192+
{
193+
if (_aNC[i]!=null)
194+
{
195+
clearInterval(_aNC["ncInt" + i]);
196+
_aNC[i].close();
197+
if(bool==false) {
198+
_aNC[i].client = null;
199+
}
200+
_aNC[i] = null;
201+
delete _aNC[i];
202+
}
203+
}
204+
}
205+
206+
}
207+
208+
209+
private function netStatus(event:NetStatusEvent):void {
210+
211+
trace(event.info.code);
212+
if(event.info.description != undefined) {
213+
trace(event.info.description);
214+
}
215+
_aNC[event.target.client.id].client.pending = true;
216+
217+
// this.owner.m_validNetConnection = this.client.owner[this.client.connIndex];
218+
// if (info.description == "[ License.Limit.Exceeded ]") {
219+
220+
switch (event.info.code) {
221+
case "NetConnection.Connect.IdleTimeOut":
222+
trace("IDLE TIMEOUT OCCURRED!")
223+
negotiating=true;
224+
idleTimeOut=true;
225+
_ncRef.shutDownNcNs();
226+
break;
227+
case "NetConnection.Connect.Closed":
228+
if(!negotiating && !idleTimeOut) {
229+
idleTimeOut = false;
230+
_ncRef.doneYet();
231+
}
232+
break;
233+
case "NetConnection.Connect.InvalidApp":
234+
case "NetConnection.Connect.Rejected":
235+
//handleRejectedOrInvalid(event)
236+
break;
237+
case "NetConnection.Call.Failed":
238+
/*
239+
if (event.info.description.indexOf("_checkbw") != -1) {
240+
event.target.expectBWDone = true;
241+
event.target.call("checkBandwidth",null);
242+
}
243+
*/
244+
break;
245+
case "NetConnection.Connect.Success":
246+
var i:uint=0;
247+
for ( i = 0; i<_aNC.length; i++) {
248+
if (_aNC[i] && (i != event.target.client.id)) {
249+
_aNC[i].close();
250+
_aNC[i] = null;
251+
}
252+
}
253+
var _nc:NetConnection = NetConnection(event.target);
254+
var connID:Number = event.target.client.id;
255+
var _actualPort:String = m_connList[m_connListCounter].port;
256+
var _actualProtocol:String = m_connList[m_connListCounter].protocol;
257+
258+
// See if we have version info
259+
var _serverVersion:String = "UNKNOWN";
260+
if (event.info.data && event.info.data.version) {
261+
_serverVersion = event.info.data.version;
262+
}
263+
trace("Connect ID: "+connID+" - PORT: "+_actualPort+" - PROTOCOL: "+_actualProtocol+" - FMS Version: "+_serverVersion);
264+
265+
clearInterval(_aNC["ncInt" + connID]);
266+
clearInterval(_aNC["ncInt" + m_connListCounter]);
267+
268+
handleGoodConnect(_nc);
269+
break;
270+
}
271+
}
272+
273+
274+
/** Catches any netconnection net security errors
275+
* @private
276+
*/
277+
private function netSecurityError(event:SecurityErrorEvent):void {
278+
trace("SECURITY ERROR:"+event);
279+
//dispatchEvent(event);
280+
// Need to enable and pass to Jplayer event system- revisit
281+
}
282+
283+
/** Catches any async errors
284+
* @private
285+
*/
286+
private function asyncError(event:AsyncErrorEvent):void {
287+
trace("ASYNC ERROR:"+event.error);
288+
//dispatchEvent(event);
289+
// Need to enable and pass to Jplayer event system- revisit
290+
}
291+
292+
293+
294+
}// class
295+
296+
} //package

0 commit comments

Comments
 (0)