Blame src/libbluray/bdj/java/org/videolan/BDJListeners.java

Packit 5e46da
/*
Packit 5e46da
 * This file is part of libbluray
Packit 5e46da
 * Copyright (C) 2013  VideoLAN
Packit 5e46da
 *
Packit 5e46da
 * This library is free software; you can redistribute it and/or
Packit 5e46da
 * modify it under the terms of the GNU Lesser General Public
Packit 5e46da
 * License as published by the Free Software Foundation; either
Packit 5e46da
 * version 2.1 of the License, or (at your option) any later version.
Packit 5e46da
 *
Packit 5e46da
 * This library is distributed in the hope that it will be useful,
Packit 5e46da
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5e46da
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 5e46da
 * Lesser General Public License for more details.
Packit 5e46da
 *
Packit 5e46da
 * You should have received a copy of the GNU Lesser General Public
Packit 5e46da
 * License along with this library. If not, see
Packit 5e46da
 * <http://www.gnu.org/licenses/>.
Packit 5e46da
 */
Packit 5e46da
package org.videolan;
Packit 5e46da
Packit 5e46da
import java.util.EventObject;
Packit 5e46da
import java.util.Iterator;
Packit 5e46da
import java.util.LinkedList;
Packit 5e46da
Packit 5e46da
import javax.media.ControllerEvent;
Packit 5e46da
import javax.media.ControllerListener;
Packit 5e46da
import javax.media.GainChangeEvent;
Packit 5e46da
import javax.media.GainChangeListener;
Packit 5e46da
import javax.tv.media.MediaSelectEvent;
Packit 5e46da
import javax.tv.media.MediaSelectListener;
Packit 5e46da
import javax.tv.service.selection.ServiceContextEvent;
Packit 5e46da
import javax.tv.service.selection.ServiceContextListener;
Packit 5e46da
Packit 5e46da
import org.bluray.bdplus.StatusListener;
Packit 5e46da
Packit 5e46da
import org.bluray.media.AngleChangeEvent;
Packit 5e46da
import org.bluray.media.AngleChangeListener;
Packit 5e46da
import org.bluray.media.PanningChangeListener;
Packit 5e46da
import org.bluray.media.PanningChangeEvent;
Packit 5e46da
import org.bluray.media.PiPStatusEvent;
Packit 5e46da
import org.bluray.media.PiPStatusListener;
Packit 5e46da
import org.bluray.media.PlaybackListener;
Packit 5e46da
import org.bluray.media.PlaybackMarkEvent;
Packit 5e46da
import org.bluray.media.PlaybackPlayItemEvent;
Packit 5e46da
import org.bluray.media.UOMaskTableListener;
Packit 5e46da
import org.bluray.media.UOMaskTableChangedEvent;
Packit 5e46da
import org.bluray.media.UOMaskedEvent;
Packit 5e46da
Packit 5e46da
import org.davic.resources.ResourceStatusEvent;
Packit 5e46da
import org.davic.resources.ResourceStatusListener;
Packit 5e46da
Packit 5e46da
import org.dvb.application.AppsDatabaseEvent;
Packit 5e46da
import org.dvb.application.AppsDatabaseEventListener;
Packit 5e46da
import org.dvb.media.SubtitleAvailableEvent;
Packit 5e46da
import org.dvb.media.SubtitleListener;
Packit 5e46da
import org.dvb.media.SubtitleNotAvailableEvent;
Packit 5e46da
import org.dvb.media.SubtitleNotSelectedEvent;
Packit 5e46da
import org.dvb.media.SubtitleSelectedEvent;
Packit 5e46da
import org.dvb.media.VideoFormatListener;
Packit 5e46da
import org.dvb.media.VideoFormatEvent;
Packit 5e46da
Packit 5e46da
public class BDJListeners {
Packit 5e46da
    private LinkedList listeners = new LinkedList();
Packit 5e46da
Packit 5e46da
    public void add(Object listener) {
Packit 5e46da
        if (listener != null) {
Packit 5e46da
            BDJXletContext ctx = BDJXletContext.getCurrentContext();
Packit 5e46da
            if (ctx == null) {
Packit 5e46da
                logger.error("Listener added from wrong thread: " + Logger.dumpStack());
Packit 5e46da
                return;
Packit 5e46da
            }
Packit 5e46da
            synchronized (listeners) {
Packit 5e46da
                remove(listener);
Packit 5e46da
                listeners.add(new BDJListener(ctx, listener));
Packit 5e46da
            }
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void remove(Object listener) {
Packit 5e46da
        synchronized (listeners) {
Packit 5e46da
            for (Iterator it = listeners.iterator(); it.hasNext(); ) {
Packit 5e46da
                BDJListener item = (BDJListener)it.next();
Packit 5e46da
                if (item.listener == listener)
Packit 5e46da
                    it.remove();
Packit 5e46da
            }
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void clear() {
Packit 5e46da
        if (null != BDJXletContext.getCurrentContext()) {
Packit 5e46da
            logger.error("clear() from wrong thread: " + Logger.dumpStack());
Packit 5e46da
            return;
Packit 5e46da
        }
Packit 5e46da
        synchronized (listeners) {
Packit 5e46da
            listeners.clear();
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void putCallback(Object event) {
Packit 5e46da
        boolean mediaQueue = true;
Packit 5e46da
        /*
Packit 5e46da
        if (event instanceof PlaybackMarkEvent) {
Packit 5e46da
        } else if (event instanceof PlaybackPlayItemEvent) {
Packit 5e46da
        } else if (event instanceof UOMaskTableChangedEvent) {
Packit 5e46da
        } else if (event instanceof UOMaskedEvent) {
Packit 5e46da
        } else if (event instanceof PiPStatusEvent) {
Packit 5e46da
        } else if (event instanceof PanningChangeEvent) {
Packit 5e46da
        } else if (event instanceof AngleChangeEvent) {
Packit 5e46da
        } else if (event instanceof MediaSelectEvent) {
Packit 5e46da
        } else if (event instanceof GainChangeEvent) {
Packit 5e46da
        } else if (event instanceof ControllerEvent) {
Packit 5e46da
        }
Packit 5e46da
        */
Packit 5e46da
        if (event instanceof ServiceContextEvent) {
Packit 5e46da
            mediaQueue = false;
Packit 5e46da
        } else if (event instanceof ResourceStatusEvent) {
Packit 5e46da
            mediaQueue = false;
Packit 5e46da
        } else if (event instanceof AppsDatabaseEvent) {
Packit 5e46da
            mediaQueue = false;
Packit 5e46da
        } else if (event instanceof PSR102Status) {
Packit 5e46da
            mediaQueue = false;
Packit 5e46da
        }
Packit 5e46da
        putCallback(event, mediaQueue);
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void putCallback(Object event, boolean mediaQueue) {
Packit 5e46da
        synchronized (listeners) {
Packit 5e46da
            for (Iterator it = listeners.iterator(); it.hasNext(); ) {
Packit 5e46da
                BDJListener item = (BDJListener)it.next();
Packit 5e46da
                if (item.ctx == null || item.ctx.isReleased()) {
Packit 5e46da
                    logger.info("Listener terminated: " + item.ctx);
Packit 5e46da
                    it.remove();
Packit 5e46da
                } else {
Packit 5e46da
                    if (mediaQueue) {
Packit 5e46da
                        item.ctx.putMediaCallback(new Callback(event, item.listener));
Packit 5e46da
                    } else {
Packit 5e46da
                        item.ctx.putCallback(new Callback(event, item.listener));
Packit 5e46da
                    }
Packit 5e46da
                }
Packit 5e46da
            }
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    private static class PSR102Status {
Packit 5e46da
        public int value;
Packit 5e46da
Packit 5e46da
        private PSR102Status(int value) {
Packit 5e46da
            this.value = value;
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    public void putPSR102Callback(int value) {
Packit 5e46da
        putCallback(new PSR102Status(value));
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    private static class BDJListener {
Packit 5e46da
        public BDJXletContext ctx;
Packit 5e46da
        public Object listener;
Packit 5e46da
Packit 5e46da
        BDJListener(BDJXletContext ctx, Object listener) {
Packit 5e46da
            this.ctx = ctx;
Packit 5e46da
            this.listener = listener;
Packit 5e46da
        }
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    private static class Callback extends BDJAction {
Packit 5e46da
        private Callback(Object event, Object listener) {
Packit 5e46da
            this.event = event;
Packit 5e46da
            this.listener = listener;
Packit 5e46da
        }
Packit 5e46da
Packit 5e46da
        public String toString() {
Packit 5e46da
            return this.getClass().getName() + "[event=" + event + ", listener=" + listener;
Packit 5e46da
        }
Packit 5e46da
Packit 5e46da
        protected void doAction() {
Packit 5e46da
            if (event instanceof PlaybackMarkEvent) {
Packit 5e46da
                ((PlaybackListener)listener).markReached((PlaybackMarkEvent)event);
Packit 5e46da
            } else if (event instanceof PlaybackPlayItemEvent) {
Packit 5e46da
                ((PlaybackListener)listener).playItemReached((PlaybackPlayItemEvent)event);
Packit 5e46da
            } else if (event instanceof ServiceContextEvent) {
Packit 5e46da
                ((ServiceContextListener)listener).receiveServiceContextEvent((ServiceContextEvent)event);
Packit 5e46da
            } else if (event instanceof UOMaskTableChangedEvent) {
Packit 5e46da
                ((UOMaskTableListener)listener).receiveUOMaskTableChangedEvent((UOMaskTableChangedEvent)event);
Packit 5e46da
            } else if (event instanceof UOMaskedEvent) {
Packit 5e46da
                ((UOMaskTableListener)listener).receiveUOMaskedEvent((UOMaskedEvent)event);
Packit 5e46da
            } else if (event instanceof PiPStatusEvent) {
Packit 5e46da
                ((PiPStatusListener)listener).piPStatusChange((PiPStatusEvent)event);
Packit 5e46da
            } else if (event instanceof PanningChangeEvent) {
Packit 5e46da
                ((PanningChangeListener)listener).panningChange((PanningChangeEvent)event);
Packit 5e46da
            } else if (event instanceof AngleChangeEvent) {
Packit 5e46da
                ((AngleChangeListener)listener).angleChange((AngleChangeEvent)event);
Packit 5e46da
            } else if (event instanceof MediaSelectEvent) {
Packit 5e46da
                ((MediaSelectListener)listener).selectionComplete((MediaSelectEvent)event);
Packit 5e46da
Packit 5e46da
            } else if (event instanceof GainChangeEvent) {
Packit 5e46da
                ((GainChangeListener)listener).gainChange((GainChangeEvent)event);
Packit 5e46da
            } else if (event instanceof ControllerEvent) {
Packit 5e46da
                ((ControllerListener)listener).controllerUpdate((ControllerEvent)event);
Packit 5e46da
Packit 5e46da
            } else if (event instanceof ResourceStatusEvent) {
Packit 5e46da
                ((ResourceStatusListener)listener).statusChanged((ResourceStatusEvent)event);
Packit 5e46da
Packit 5e46da
            } else if (event instanceof AppsDatabaseEvent) {
Packit 5e46da
                AppsDatabaseEvent dbevent = (AppsDatabaseEvent)event;
Packit 5e46da
                AppsDatabaseEventListener dblistener = (AppsDatabaseEventListener)listener;
Packit 5e46da
                switch (dbevent.getEventId()) {
Packit 5e46da
                case AppsDatabaseEvent.APP_ADDED:
Packit 5e46da
                    dblistener.entryAdded(dbevent);
Packit 5e46da
                    break;
Packit 5e46da
                case AppsDatabaseEvent.APP_CHANGED:
Packit 5e46da
                    dblistener.entryChanged(dbevent);
Packit 5e46da
                    break;
Packit 5e46da
                case AppsDatabaseEvent.APP_DELETED:
Packit 5e46da
                    dblistener.entryRemoved(dbevent);
Packit 5e46da
                    break;
Packit 5e46da
                case AppsDatabaseEvent.NEW_DATABASE:
Packit 5e46da
                    dblistener.newDatabase(dbevent);
Packit 5e46da
                    break;
Packit 5e46da
                }
Packit 5e46da
Packit 5e46da
            } else if (event instanceof SubtitleAvailableEvent || event instanceof SubtitleNotAvailableEvent ||
Packit 5e46da
                       event instanceof SubtitleNotSelectedEvent || event instanceof SubtitleSelectedEvent) {
Packit 5e46da
                ((SubtitleListener)listener).subtitleStatusChanged((EventObject)event);
Packit 5e46da
Packit 5e46da
            } else if (event instanceof VideoFormatEvent) {
Packit 5e46da
                ((VideoFormatListener)listener).receiveVideoFormatEvent((VideoFormatEvent)event);
Packit 5e46da
Packit 5e46da
            } else if (event instanceof PSR102Status) {
Packit 5e46da
                ((StatusListener)listener).receive(((PSR102Status)event).value);
Packit 5e46da
Packit 5e46da
            } else {
Packit 5e46da
                System.err.println("Unknown event type: " + event.getClass().getName());
Packit 5e46da
            }
Packit 5e46da
        }
Packit 5e46da
Packit 5e46da
        private Object listener;
Packit 5e46da
        private Object event;
Packit 5e46da
    }
Packit 5e46da
Packit 5e46da
    private static final Logger logger = Logger.getLogger(BDJListeners.class.getName());
Packit 5e46da
}