<?xml version="1.0" encoding="UTF-8" ?>
<!--
  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.

-->
<library>

<class name="PortAvailabilityTest" extends="NetworkTest">

    <switch>
        <when property="$as3">
            <passthrough>
                import flash.events.*;
                import flash.net.*;
                import flash.system.*;
            </passthrough>
        </when>
    </switch>

    <rtmpconnection name="rtmp" autoconnect="false" />

    <handler name="oninit">
        this.setAttribute("testName", "Port test");
    </handler>

    <method name="start">
        rtmp.setAttribute("src", "rtmp://"+host+":"+port+"/openmeetings/hibernate");
        if($debug) Debug.write(testName + ": start test... ", rtmp.src);

        rtmp.connect();
    </method>

    <handler name="onconnect" reference="rtmp">
        if($debug) Debug.write(testName + ": port is available");
    </handler>

    <handler name="onerror" args="e" reference="rtmp">
        if($debug) Debug.write(testName + ": connection error - ", e);
    </handler>

    <handler name="onstatus" args="e" reference="rtmp">
        if($debug) Debug.write(testName + ": RTMP connect status - ", e);
    </handler>

</class>

</library>
