<library>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at
  
      http://www.apache.org/licenses/LICENSE-2.0
    	  
  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
  
-->


<class name="rtmpConnection" extends="node">

        <switch>
            <when property="$as3">
                <passthrough>
                    import flash.net.NetConnection;
                    import flash.events.NetStatusEvent;
                </passthrough>
            </when>
        </switch>

    	<attribute name="debug" value="false" type="boolean" />
    	
    	<event name="onconnect"/>
    	<event name="onerror"/>
        
        <!-- this attribute holds a reference to the current/last called netremoteCall,
        in case of error you can debug that way which call did fail -->
        <attribute name="lastCalled" value="null" />
    	
    	<attribute name="src" value="" type="string"/>

		<method name="connect">
            this._nc = new NetConnection();

            // local reference to rtmpconnection
            //this._nc.t = this;
            
            this._nc.proxyType = canvas.proxyType;
            
            var ok = this._nc.connect(src == "null" ? null : src, true); //isAVClient = true
            if (this.debug) {
            	if($debug) Debug.write("*** debug ***");
            }
            
            this._nc.addEventListener(NetStatusEvent.NET_STATUS, _onStatus);
            
    		if($debug) Debug.write("devRtmpConnection/registerMethods()");
    		var clientObj = {};
    		clientObj.setId = this.setId;
    		
    		this._nc.client = clientObj;
    		
			//Register Methods
			//this.registerMethods();
		</method>
		
		<method name="setId" args="tId">
			if ($debug) Debug.write("setId ", tId);
		</method>
		
        <method name="_onStatus" args="stats"><![CDATA[
            if ($debug) {
                Debug.write("devrtmpconnection", this, "_onStatus", stats.info.code);
            }

            var msg = "";
            var s;

            switch (stats.info.code) {

                case "NetConnection.Connect.Success": {
                    // The connection attempt succeeded.
                    //canvas.currentNC is the reference to the NetConnection that is used in the NetStream
                    msg = stats.info.code;
                    canvas.currentNC = this._nc;
                    s = 2;
                    break;
                }
                
                case "NetConnection.Connect.Closed": {
                    msg = stats.info.code;
                    this._nc = null;
                    canvas.currentNC = null;
                    s = 0;
                    break;
                }

                default: {
                    msg = stats.info.code;
                    s = 0;
                    break;
                }

            }

            this.setAttribute("status", msg);

            if (s == 2) {
                this.onconnect.sendEvent();
            } else {
            	this.onerror.sendEvent();
            }

          ]]>
        </method>	
        
        <method name="disconnect">
        	if ($debug) Debug.write(" DISCONNECT ");
        	if (this._nc != null) {
                this._nc.close();
            }
        </method>
    <!--- 
        With this function all methods are registered to the NetConnection
        A server can invoke this Method with a call for it from the Client
        Only subnodes of rtmpconnections which are a instance of netRemoteCallHib
        are registered, to add dynamically methods to the remotefunction you will
        have to invoke this method once again
        -swagner
     -->
    <method name="registerMethods">
        <![CDATA[
	        if (this.subnodes!=null){
	            var clientObj = {};
		        //Register all methods which are onstanceof netRemoteCallHib
		        for (var i=0;i<this.subnodes.length;i++){
		            //If it is of Type netRemoteCallHib then register it to the NetConnection
		            if (this.subnodes[i] instanceof lz.netRemoteCallHib){
		                clientObj[this.subnodes[i].funcname] = function( args ){
                            return canvas.thishib.remoteCallMethod(arguments.callee,arguments);
		                    //return hib.remoteCallMethod(arguments.callee,args);
		                }
		            }
		        }
		        this._nc.client = clientObj;
        	}
        ]]>
    </method>
    
    <!-- 
        Process the RemoteCall to the Right Funtion
        -swagner
     -->
    <method name="remoteCallMethod" args="callee,args">
        <![CDATA[
            for (var eg in this._nc){
                if (this._nc[eg]==callee){
                    if (this.debug) {
                        //_root.Debug.write.write("DEBUG invoked a function remotely: ",eg,args);
                    }    
                    if (args.length == 1) {
                        return this.callFuntion(eg,args[0]);
                    } else {
                        return this.callFuntion(eg,args);
                    }
                    //return this.callFuntion(eg,args);
                }
            }
        ]]>
    </method>
    
    <!-- 
        Map the Function to a netRemoteCallHib
        -swagner
     -->
    <method name="callFuntion" args="funcname,args">
        <![CDATA[
            for (var i=0;i<this.subnodes.length;i++){
                if (this.subnodes[i].funcname==funcname){
                    return this.subnodes[i].onResult(args);
                }
            }
        ]]>
    </method>		
    
    <method name="callRPC" args="func, obj, params">
    	//if ($debug) Debug.write("*** call: func, obj, params",func,obj, typeof (params) ,params.length);
    	if (params.length != 0){
	    	//does this really work?
	    	//ASSetPropFlags(_global, null, 8, 1);
            //setPropertyIsEnumerable(8, 1);
	    	//Debug.write("does it work?",arguments);
	    	<!--
	    	this._nc.call.apply(this._nc,arguments);
	    	 -->
			if (params.length==1){
			    this._nc.call(func, obj,params[0]);
			} else if (params.length==2){
			    this._nc.call(func, obj,params[0],params[1]);
			} else if (params.length==3){
			    this._nc.call(func, obj,params[0],params[1],params[2]);
			} else if (params.length==4){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3]);
			} else if (params.length==5){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4]);
			} else if (params.length==6){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5]);
			} else if (params.length==7){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6]);
			} else if (params.length==8){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]);
			} else if (params.length==9){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]);
			} else if (params.length==10){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]);
			} else if (params.length==11){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]);
			} else if (params.length==12){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]);
			} else if (params.length==13){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]);
			} else if (params.length==14){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]);
			} else if (params.length==15){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]);
			} else if (params.length==16){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15]);
			} else if (params.length==17){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16]);
			} else if (params.length==18){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17]);
			} else if (params.length==19){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18]);
			} else if (params.length==20){
			    this._nc.call(func, obj,params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14],params[15],params[16],params[17],params[18],params[19]);
			}	    	 
        } else {
            this._nc.call(func, obj);
        }
    </method>
    
</class>


    <!---
        Net remote call. 
        @todo Document netremotecall class.
    -->
    <class name="netremotecall" extends="node">

        <switch>
            <when property="$as3">
                <passthrough>
                    import flash.net.Responder;
                </passthrough>
            </when>
        </switch>

        <!--- Name of the remote function. -->
        <attribute name="funcname" value="$once{null}" type="string" />
    
        <attribute name="remotecontext" value="null" />
    
        <attribute name="dataobject" value="null" />

        <attribute name="responder" value="null" />
		
        <!--- Data handling event. args="value"  -->
        <event name="ondata" />

        <!--- Error handling event. -->
        <event name="onerror"/>

        <!--- Call the remote method, passing the array of params. -->
        <method name="callRPC" args="params"><![CDATA[
            if (this.funcname == null) {
                //Debug.write("No funcname given");
                if (this.onerror) this.onerror.sendEvent("No funcname given");
                return;
            }

            if (params == null) {
                params = new Array();

                var subnodes = this.subnodes;
                if (subnodes != null) {
                    var i;
                    var n = subnodes.length;
                    for (i = 0; i < n; i++) {
                        // If getValue method is declared in param, call that
                        // instead to get value.
                        var tsi = subnodes[i];
                        //TODO: fixme
                        //if ((tsi["getValue"] != null) && (tsi.getValue["prototype"] != null)) {
                        //    params[i] = tsi.getValue();
                        //    Debug.write("tsi.getValue():", tsi.getValue());
                        //} else {
                        //    params[i] = tsi.value;
                        //}
                        params[i] = tsi.getValue();
                    }
                }

            } else if (params.__proto__ != Array.prototype) {
                //Debug.write(this.name, "error: first argument (params) is not an array");
                return -1;
            }

            //if ($debug) Debug.write("call", this, this.parent, this.parent.status);
            var rtmpObject = null;
            if (this.parent instanceof lz.rtmpConnection){
        	    rtmpObject = this.parent;
            } else if(this.remotecontext  instanceof lz.rtmpConnection){
        	    rtmpObject = this.remotecontext;
            } else {
        	    if ($debug) Debug.warn("ERROR: no remotecontext availible abort call", this.funcname, this);
        	    return;
            }
        	//Debug.write('call', this, rtmpObject, rtmpObject.status);
        	//Debug.write('call', this.remotecontext);
            if (rtmpObject.debug) Debug.write('call', this, rtmpObject, rtmpObject.status);
            rtmpObject.lastCalled = this;

            this.responder = new Responder(onResult);

            rtmpObject.callRPC(this.funcname, this.responder, params);

          ]]>
        </method>

        <!--- Handle the result returned from the remote method. -->
        <method name="onResult" args="value"><![CDATA[
            // Can be overriden.
            // Would be great if it can be used with dataobject,
            // but I don't know how to convert Array/primitive to LzDataset/LzDataPointer.
            ////Debug.write("netremotecall", this, "onResult", value);

            if (this.dataobject!=null) {
                if ( this.dataobject instanceof LzDataset ) {
                    //Debug.write("onResult: ",this,value,dataobject);
                    var element = LzDataElement.valueToElement(value);
                    this.dataobject.setData(element.childNodes);
                } else if ( this.dataobject instanceof LzDataElement ) {
                    var element = LzDataElement.valueToElement(value);
                    this.dataobject.appendChild( element );
                } else {
                    //TODO:fixme
                    //Debug.warn("dataobject is not LzDataset or LzDataElement: ",this,this.dataobject,delegate);
                }
            }
            this.ondata.sendEvent(value);		
          ]]>
        </method>


    </class>


    <!---
        Net parameter.
        Element to use inside netremotecall.
        @todo Document netparam class.
    -->
    <class name="netparam" extends="node">

        <!--- The value of the netparam. -->
        <attribute name="value" value="null"/>

    </class>


</library>
