    001    /**
    002     * Copyright (C) 2010, Skype Limited
    003     *
    004     * All intellectual property rights, including but not limited to copyrights,
    005     * trademarks and patents, as well as know how and trade secrets contained in,
    006     * relating to, or arising from the internet telephony software of
    007     * Skype Limited (including its affiliates, "Skype"), including without
    008     * limitation this source code, Skype API and related material of such
    009     * software proprietary to Skype and/or its licensors ("IP Rights") are and
    010     * shall remain the exclusive property of Skype and/or its licensors.
    011     * The recipient hereby acknowledges and agrees that any unauthorized use of
    012     * the IP Rights is a violation of intellectual property laws.
    013     *
    014     * Skype reserves all rights and may take legal action against infringers of
    015     * IP Rights.
    016     *
    017     * The recipient agrees not to remove, obscure, make illegible or alter any
    018     * notices or indications of the IP Rights and/or Skype's rights and
    019     * ownership thereof.
    020     */
    021
    022    package com.skype.ipc;
    023
    024    import java.util.concurrent.BlockingQueue;
    025    import java.util.concurrent.LinkedBlockingQueue;
    026
    027    import com.skype.ipc.Event;
    028    import com.skype.ipc.PropertyChange;
    029
    030    import com.skype.util.Log;
    031
    032    public class EventDispatcher extends Thread {
    033      private static final String TAG = "EventDispatcher";
    034      private final BlockingQueue<AbstractDecoder> event_queue;
    035      private boolean die;
    036      private Thread my_thread;
    037      private EventHandler myHandler;
    038
    039      public EventDispatcher(EventHandler inHandler) {
    040        setName("EventDispatcher thread");
    041        myHandler=inHandler;
    042        die=false;
    043            event_queue=new LinkedBlockingQueue<AbstractDecoder>(); // does not need to be fair
    044      }
    045
    046      public void Die() {
    047              die=true;
    048              my_thread.interrupt(); // trigger interrupt in case of waiting
    049      }
    050
    051      public void run() {
    052            my_thread=Thread.currentThread();
    053            Log.d(TAG,"Running! Threadid="+my_thread.getId());
    054            AbstractDecoder event;
    055        while(!die) {
    056            event=null;
    057                    try {
    058                            event=event_queue.take();
    059                    } catch (InterruptedException e) {
    060                            if(die)
    061                            {
    062                                    Log.d(TAG,"EventDispatcher eventQueue.take() interrupted and die=true.");
    063                                    break;
    064                            }
    065                            else
    066                            {
    067                                    Log.d(TAG,"EventDispatcher eventQueue.take() interrupted but die=false. Ignoring.");
    068                            }
    069                    }
    070                    if(event==null) {}
    071                    else if(event instanceof Event)
    072                    {
    073                            int eid=((Event)event).getEventId();
    074                            //Log.d(TAG,"Dispatching an event id="+eid);
    075                            try
    076                            {
    077                                    myHandler.HandleEvent((Event)event);
    078                            }
    079                            catch(Exception e)
    080                            {
    081                                    Log.e(TAG,"Skype.HandleEvent threw unhandled exception. Event (id="+eid+") probably lost. Stack trace follows.");
    082                                    e.printStackTrace();
    083                            }
    084                            //Log.d(TAG,"Dispatched an event id="+eid);
    085                    }
    086                    else if(event instanceof PropertyChange)
    087                    {
    088                            int prid=((PropertyChange)event).propid;
    089                            //Log.d(TAG,"Dispatching a propertychange propid="+prid);
    090                            try
    091                            {
    092                                    myHandler.HandlePropertyChange((PropertyChange)event);
    093                            }
    094                            catch(Exception e)
    095                            {
    096                                    Log.e(TAG,"Skype.HandlePropertyChange threw unhandled exception. Property change (id="+prid+") probably lost. Stack trace follows."); e.printStackTrace();
    097                            }
    098
    099                            //Log.d(TAG,"Dispatched a propertychange propid="+prid);
    100                    }
    101                    else
    102                    {
    103                            Log.e(TAG,"Event queue entry is of unknown type! - discarding");
    104                    }
    105        }
    106        Log.d(TAG,"Exiting!");
    107      }
    108
    109            // These are called from response listener
    110            public void AddPropertyChange(PropertyChange c) throws InterruptedException
    111            {
    112                    event_queue.put(c);
    113            }
    114
    115            public void AddEvent(Event e) throws InterruptedException
    116            {
    117                    event_queue.put(e);
    118            }
    119    }
    120