summaryrefslogtreecommitdiffstats
path: root/libraries/oscP5/src/netP5/NetPlug.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/oscP5/src/netP5/NetPlug.java')
-rw-r--r--libraries/oscP5/src/netP5/NetPlug.java222
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;
+ }
+
+}