package com.jcumulus.server.rtmfp.application;

/**
 * jCumulus is a Java port of Cumulus OpenRTMP
 *
 * Copyright 2011 OpenRTMFP
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License received along this program for more
 * details (or else see http://www.gnu.org/licenses/).
 *
 *
 * This file is a part of jCumulus.
 */

import com.jcumulus.server.rtmfp.P;
import com.jcumulus.server.rtmfp.publisher.FlowWriter;
import java.util.*;
import org.apache.log4j.Logger;


public class Streams
{

    private static Logger A = Logger.getLogger(Streams.class);
    private List D;
    private Map C;
    Integer B;


    public Streams(Map map)
    {
        D = new ArrayList();
        B = Integer.valueOf(0);
        C = map;
    }

    public Integer A()
    {
        Integer integer = B;
        Integer integer1 = B = Integer.valueOf(B.intValue() + 1);
        Integer _tmp = integer;
        A.info((new StringBuilder()).append("New stream ").append(B).toString());
        D.add(B);
        return B;
    }

    public Publication A(String s)
    {
        Publication b = (Publication)C.get(s);
        if(b != null)
        {
            return b;
        } else
        {
            Publication b1 = new Publication(s);
            C.put(s, b1);
            return b1;
        }
    }

    public Publication A(P p, int i, String s, FlowWriter h)
        throws Exception
    {
        Publication b = A(s);
        try
        {
            b.A(p, i, h);
        }
        catch(Exception exception)
        {
            if(b.B() == 0 && b.A().size() == 0)
                A(b);
            throw exception;
        }
        return b;
    }

    public void A(P p, int i, String s)
    {
        Publication b = (Publication)C.get(s);
        if(b == null)
        {
            A.debug((new StringBuilder()).append("The stream '").append(s).append("' with a ").append(i).append(" id doesn't exist, unpublish useless").toString());
            return;
        }
        b.B(p, i);
        if(b.B() == 0 && b.A().size() == 0)
            A(b);
    }

    public boolean A(P p, int i, String s, FlowWriter h, double d)
    {
        Publication b = (Publication)C.get(s);
        boolean flag = false;
        if(b == null)
            b = A(s);
        if(b != null)
        {
            flag = b.A(p, i, h, d == -3000D);
            if(!flag && b.B() == 0 && b.A().size() == 0)
                A(b);
        }
        return flag;
    }

    public void B(P p, int i, String s)
    {
        Publication b = (Publication)C.get(s);
        if(b == null)
        {
            A.debug((new StringBuilder()).append("The stream '").append(s).append("' doesn't exists, unsubscribe useless").toString());
            return;
        }
        b.A(p, i);
        if(b.B() == 0 && b.A().size() == 0)
            A(b);
    }

    void A(Publication b)
    {
        C.remove(b.C());
    }

    public void A(Integer integer)
    {
        A.debug((new StringBuilder()).append("Stream ").append(integer).append(" deleted").toString());
        D.remove(integer);
    }

}
