diff options
Diffstat (limited to 'libraries/oscP5/src/netP5/NetPlug.java')
-rw-r--r-- | libraries/oscP5/src/netP5/NetPlug.java | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/libraries/oscP5/src/netP5/NetPlug.java b/libraries/oscP5/src/netP5/NetPlug.java new file mode 100644 index 0000000..f651fc2 --- /dev/null +++ b/libraries/oscP5/src/netP5/NetPlug.java @@ -0,0 +1,222 @@ +/** + * A network library for processing which supports UDP, TCP and Multicast. + * + * (c) 2004-2012 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + * + * @author Andreas Schlegel http://www.sojamo.de + * @modified 12/23/2012 + * @version 0.9.9 + */ + +package netP5; + +import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; +import java.net.DatagramPacket; +import java.util.Vector; + + + +class NetPlug { + + protected boolean isEventMethod = false; + + protected Method _myEventMethod; + + protected String _myEventMethodName = "netEvent"; + + protected boolean isStatusMethod = false; + + protected Method _myStatusMethod; + + protected String _myStatusMethodName = "netStatus"; + + protected Class _myParentClass; + + protected Object _myParent; + + protected Vector _myNetListeners; + + protected boolean isNetListener; + + protected NetPlug(Object theObject) { + _myParent = theObject; + _myNetListeners = new Vector(); + checkMethod(); + } + + protected void invoke(final Object theObject, final Method theMethod, + final Object[] theArgs) { + try { + theMethod.invoke(theObject, theArgs); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + System.out + .println("NetP5 ClassCastException. parsing failed for NetMessage " + + e); + } + } + + protected void checkMethod() { + try { + checkEventMethod(); + checkStatusMethod(); + } catch (Exception e) { + } + } + + private boolean checkEventMethod() { + _myParentClass = _myParent.getClass(); + if (_myEventMethodName != null) { + try { + _myEventMethod = _myParentClass.getDeclaredMethod( + _myEventMethodName, new Class[] { NetMessage.class }); + isEventMethod = true; + _myEventMethod.setAccessible(true); + return true; + } catch (SecurityException e1) { + e1.printStackTrace(); + } catch (NoSuchMethodException e1) { + System.out + .println("### NOTE. no netEvent(NetMessage theMessage) method available."); + } + } + if (_myEventMethod != null) { + return true; + } + return false; + } + + private boolean checkStatusMethod() { + _myParentClass = _myParent.getClass(); + if (_myStatusMethodName != null) { + try { + _myStatusMethod = _myParentClass.getDeclaredMethod( + _myStatusMethodName, new Class[] { NetStatus.class }); + isStatusMethod = true; + _myStatusMethod.setAccessible(true); + return true; + } catch (SecurityException e1) { + e1.printStackTrace(); + } catch (NoSuchMethodException e1) { + // System.out.println("### NOTE. no netStatus(NetStatus + // theMessage) method available."); + } + } + if (_myStatusMethod != null) { + return true; + } + return false; + } + + /** + * + * @param theDatagramPacket + * DatagramPacket + * @param thePort + * int + * @invisible + */ + public void process(final DatagramPacket theDatagramPacket, + final int thePort) { + if (isNetListener || isEventMethod) { + NetMessage n = new NetMessage(theDatagramPacket); + for (int i = 0; i < _myNetListeners.size(); i++) { + getListener(i).netEvent(n); + } + if (isEventMethod) { + try { + invoke(_myParent, _myEventMethod, new Object[] { n }); + } catch (ClassCastException e) { + System.out + .println("ChatP5.callMessage ClassCastException. failed to forward ChatMessage."); + } + } + } + } + + /** + * @invisible + * @param theIndex + */ + public void status(int theIndex) { + if (isNetListener || isEventMethod) { + NetStatus n = new NetStatus(theIndex); + for (int i = 0; i < _myNetListeners.size(); i++) { + getListener(i).netStatus(n); + } + if (isStatusMethod) { + try { + invoke(_myParent, _myStatusMethod, new Object[] { n }); + } catch (ClassCastException e) { + System.out + .println("ChatP5.callMessage ClassCastException. failed to forward ChatMessage."); + } + } + } + } + + /** + * + * @param theTcpPacket + * TcpPacket + * @param thePort + * int + * @invisible + */ + public void process(final TcpPacket theTcpPacket, final int thePort) { + + if (isNetListener || isEventMethod) { + NetMessage n = new NetMessage(theTcpPacket); + for (int i = 0; i < _myNetListeners.size(); i++) { + getListener(i).netEvent(n); + } + + if (isEventMethod) { + try { + invoke(_myParent, _myEventMethod, new Object[] { n }); + } catch (ClassCastException e) { + System.out + .println("NetP5.callMessage ClassCastException. failed to forward ChatMessage."); + } + } + } + } + + protected void addListener(NetListener theListener) { + _myNetListeners.add(theListener); + isNetListener = true; + } + + protected void removeListener(NetListener theListener) { + _myNetListeners.remove(theListener); + isNetListener = (_myNetListeners.size() > 0) ? true : false; + } + + protected NetListener getListener(int theIndex) { + return ((NetListener) _myNetListeners.get(theIndex)); + } + + protected Vector getListeners() { + return _myNetListeners; + } + +} |