with Pipe;
package Connections is

    type Handle is private;

    type Mode is (Call, Answer, Listen_Call, Listen_Answer);

    function Establish (From_User : String;
                        From_Session : String;
                        To_User : String;
                        To_Session : String;
                        Kind : Mode) return Handle;

    Not_Established : exception;  -- trying to get answering connection
    Not_Available : exception;  -- connection not allowed
    Already_Exists : exception;

    procedure Break (From : in out Handle);

    Connection_Still_In_Use : exception;
    Connection_Already_Released : exception;

    function Convert (Connection : Handle) return Pipe.Handle;

    function Is_Available (From_User : String;
                           From_Session : String;
                           To_User : String;
                           To_Session : String;
                           Kind : Mode) return String;

private
    type Handle is
        record
            The_Pipe : Pipe.Handle;
            Kind : Mode;
        end record;
end Connections;