front_processing/extern/TUIO_JAVA/src/TUIO/TuioClient.java
changeset 9 0f44b7360c8d
parent 3 92f19af39024
child 10 925b7ee746e3
equal deleted inserted replaced
8:e4e7db2435f8 9:0f44b7360c8d
     1 /*
     1 /*
     2 	TUIO Java backend - part of the reacTIVision project
     2     TUIO Java backend - part of the reacTIVision project
     3 	http://reactivision.sourceforge.net/
     3     http://reactivision.sourceforge.net/
     4 
     4 
     5 	Copyright (c) 2005-2009 Martin Kaltenbrunner <mkalten@iua.upf.edu>
     5     Copyright (c) 2005-2009 Martin Kaltenbrunner <mkalten@iua.upf.edu>
     6 
     6 
     7     This program is free software; you can redistribute it and/or modify
     7     This program is free software; you can redistribute it and/or modify
     8     it under the terms of the GNU General Public License as published by
     8     it under the terms of the GNU General Public License as published by
     9     the Free Software Foundation; either version 2 of the License, or
     9     the Free Software Foundation; either version 2 of the License, or
    10     (at your option) any later version.
    10     (at your option) any later version.
    35  *
    35  *
    36  * @author Martin Kaltenbrunner
    36  * @author Martin Kaltenbrunner
    37  * @version 1.4
    37  * @version 1.4
    38  */ 
    38  */ 
    39 public class TuioClient implements OSCListener {
    39 public class TuioClient implements OSCListener {
    40 	
    40     
    41 	public String comm;
    41     public String comm;
    42 	
    42     
    43 	private int port = 3333;
    43     private int port = 3333;
    44 	private OSCPortIn oscPort;
    44     private OSCPortIn oscPort;
    45 	private boolean connected = false;
    45     private boolean connected = false;
    46 	private Hashtable<Long,TuioObject> objectList = new Hashtable<Long,TuioObject>();
    46     private Hashtable<Long,TuioObject> objectList = new Hashtable<Long,TuioObject>();
    47 	private Vector<Long> aliveObjectList = new Vector<Long>();
    47     private Vector<Long> aliveObjectList = new Vector<Long>();
    48 	private Vector<Long> newObjectList = new Vector<Long>();
    48     private Vector<Long> newObjectList = new Vector<Long>();
    49 	private Hashtable<Long,TuioCursor> cursorList = new Hashtable<Long,TuioCursor>();
    49     private Hashtable<Long,TuioCursor> cursorList = new Hashtable<Long,TuioCursor>();
    50 	private Vector<Long> aliveCursorList = new Vector<Long>();
    50     private Vector<Long> aliveCursorList = new Vector<Long>();
    51 	private Vector<Long> newCursorList = new Vector<Long>();
    51     private Vector<Long> newCursorList = new Vector<Long>();
    52 	private Hashtable<Long,TuioString> stringList = new Hashtable<Long,TuioString>();
    52     private Hashtable<Long,TuioString> stringList = new Hashtable<Long,TuioString>();
    53 	private Vector<Long> aliveStringList = new Vector<Long>();
    53     private Vector<Long> aliveStringList = new Vector<Long>();
    54 	private Vector<Long> newStringList = new Vector<Long>();
    54     private Vector<Long> newStringList = new Vector<Long>();
    55 
    55 
    56 	private Vector<TuioObject> frameObjects = new Vector<TuioObject>();
    56     private Vector<TuioObject> frameObjects = new Vector<TuioObject>();
    57 	private Vector<TuioCursor> frameCursors = new Vector<TuioCursor>();
    57     private Vector<TuioCursor> frameCursors = new Vector<TuioCursor>();
    58 	private Vector<TuioString> frameStrings = new Vector<TuioString>();
    58     private Vector<TuioString> frameStrings = new Vector<TuioString>();
    59 
    59 
    60 	private Vector<TuioCursor> freeCursorList = new Vector<TuioCursor>();
    60     private Vector<TuioCursor> freeCursorList = new Vector<TuioCursor>();
    61 	private int maxCursorID = -1;
    61     private int maxCursorID = -1;
    62 	
    62     
    63 	private Vector<TuioString> freeStringList = new Vector<TuioString>();
    63     private Vector<TuioString> freeStringList = new Vector<TuioString>();
    64 	private int maxStringID = -1;
    64     private int maxStringID = -1;
    65 	
    65     
    66 	private long currentFrame = 0;
    66     private long currentFrame = 0;
    67 	private TuioTime currentTime;
    67     private TuioTime currentTime;
    68 
    68 
    69 	private Vector<TuioListener> listenerList = new Vector<TuioListener>();
    69     private Vector<TuioListener> listenerList = new Vector<TuioListener>();
    70 	
    70     
    71 	/**
    71     /**
    72 	 * The default constructor creates a client that listens to the default TUIO port 3333
    72      * The default constructor creates a client that listens to the default TUIO port 3333
    73 	 */
    73      */
    74 	public TuioClient() {}
    74     public TuioClient() {}
    75 
    75 
    76 	/**
    76     /**
    77 	 * This constructor creates a client that listens to the provided port
    77      * This constructor creates a client that listens to the provided port
    78 	 *
    78      *
    79 	 * @param  port  the listening port number
    79      * @param  port  the listening port number
    80 	 */
    80      */
    81 	public TuioClient(int port) {
    81     public TuioClient(int port) {
    82 		this.port = port;
    82         this.port = port;
    83 	}
    83     }
    84 		
    84         
    85 	/**
    85     /**
    86 	 * The TuioClient starts listening to TUIO messages on the configured UDP port
    86      * The TuioClient starts listening to TUIO messages on the configured UDP port
    87 	 * All reveived TUIO messages are decoded and the resulting TUIO events are broadcasted to all registered TuioListeners
    87      * All reveived TUIO messages are decoded and the resulting TUIO events are broadcasted to all registered TuioListeners
    88 	 */
    88      */
    89 	public void connect() {
    89     public void connect() {
    90 
    90 
    91 		TuioTime.initSession();
    91         TuioTime.initSession();
    92 		currentTime = new TuioTime();
    92         currentTime = new TuioTime();
    93 		currentTime.reset();
    93         currentTime.reset();
    94 		
    94         
    95 		try {
    95         try {
    96 			oscPort = new OSCPortIn(port);
    96             oscPort = new OSCPortIn(port);
    97 			oscPort.addListener("/tuio/2Dobj",this);
    97             oscPort.addListener("/tuio/2Dobj",this);
    98 			oscPort.addListener("/tuio/3Dcur",this);
    98             oscPort.addListener("/tuio/3Dcur",this);
    99 			oscPort.addListener("/tuio/_siP",this);
    99             oscPort.addListener("/tuio/_siP",this);
   100 			oscPort.startListening();
   100             oscPort.startListening();
   101 			connected = true;
   101             connected = true;
   102 		} catch (Exception e) {
   102         } catch (Exception e) {
   103 			System.out.println("TuioClient: failed to connect to port "+port);
   103             System.out.println("TuioClient: failed to connect to port "+port);
   104 			connected = false;
   104             connected = false;
   105 		}		
   105         }        
   106 	}
   106     }
   107 	
   107     
   108 	/**
   108     /**
   109 	 * The TuioClient stops listening to TUIO messages on the configured UDP port
   109      * The TuioClient stops listening to TUIO messages on the configured UDP port
   110 	 */
   110      */
   111 	public void disconnect() {
   111     public void disconnect() {
   112 		oscPort.stopListening();
   112         oscPort.stopListening();
   113 		try { Thread.sleep(100); }
   113         try { Thread.sleep(100); }
   114 		catch (Exception e) {};
   114         catch (Exception e) {};
   115 		oscPort.close();
   115         oscPort.close();
   116 		connected = false;
   116         connected = false;
   117 	}
   117     }
   118 
   118 
   119 	/**
   119     /**
   120 	 * Returns true if this TuioClient is currently connected.
   120      * Returns true if this TuioClient is currently connected.
   121 	 * @return	true if this TuioClient is currently connected
   121      * @return    true if this TuioClient is currently connected
   122 	 */
   122      */
   123 	public boolean isConnected() { return connected; }
   123     public boolean isConnected() { return connected; }
   124 
   124 
   125 	/**
   125     /**
   126 	 * Adds the provided TuioListener to the list of registered TUIO event listeners
   126      * Adds the provided TuioListener to the list of registered TUIO event listeners
   127 	 *
   127      *
   128 	 * @param  listener  the TuioListener to add
   128      * @param  listener  the TuioListener to add
   129 	 */
   129      */
   130 	public void addTuioListener(TuioListener listener) {
   130     public void addTuioListener(TuioListener listener) {
   131 		listenerList.addElement(listener);
   131         listenerList.addElement(listener);
   132 	}
   132     }
   133 	
   133     
   134 	/**
   134     /**
   135 	 * Removes the provided TuioListener from the list of registered TUIO event listeners
   135      * Removes the provided TuioListener from the list of registered TUIO event listeners
   136 	 *
   136      *
   137 	 * @param  listener  the TuioListener to remove
   137      * @param  listener  the TuioListener to remove
   138 	 */
   138      */
   139 	public void removeTuioListener(TuioListener listener) {	
   139     public void removeTuioListener(TuioListener listener) {    
   140 		listenerList.removeElement(listener);
   140         listenerList.removeElement(listener);
   141 	}
   141     }
   142 
   142 
   143 	/**
   143     /**
   144 	 * Removes all TuioListener from the list of registered TUIO event listeners
   144      * Removes all TuioListener from the list of registered TUIO event listeners
   145 	 */
   145      */
   146 	public void removeAllTuioListeners() {	
   146     public void removeAllTuioListeners() {    
   147 		listenerList.clear();
   147         listenerList.clear();
   148 	}
   148     }
   149 	
   149     
   150 	/**
   150     /**
   151 	 * Returns a Vector of all currently active TuioObjects
   151      * Returns a Vector of all currently active TuioObjects
   152 	 *
   152      *
   153 	 * @return  a Vector of all currently active TuioObjects
   153      * @return  a Vector of all currently active TuioObjects
   154 	 */
   154      */
   155 	public Vector<TuioObject> getTuioObjects() {
   155     public Vector<TuioObject> getTuioObjects() {
   156 		return new Vector<TuioObject>(objectList.values());
   156         return new Vector<TuioObject>(objectList.values());
   157 	}
   157     }
   158 	
   158     
   159 	/**
   159     /**
   160 	 * Returns a Vector of all currently active TuioCursors
   160      * Returns a Vector of all currently active TuioCursors
   161 	 *
   161      *
   162 	 * @return  a Vector of all currently active TuioCursors
   162      * @return  a Vector of all currently active TuioCursors
   163 	 */
   163      */
   164 	public Vector<TuioCursor> getTuioCursors() {
   164     public Vector<TuioCursor> getTuioCursors() {
   165 		return new Vector<TuioCursor>(cursorList.values());
   165         return new Vector<TuioCursor>(cursorList.values());
   166 	}
   166     }
   167 	
   167     
   168 	/**
   168     /**
   169 	 * Returns a Vector of all currently active TuioStrings
   169      * Returns a Vector of all currently active TuioStrings
   170 	 *
   170      *
   171 	 * @return  a Vector of all currently active TuioStrings
   171      * @return  a Vector of all currently active TuioStrings
   172 	 */
   172      */
   173 	public Vector<TuioString> getTuioStrings() {
   173     public Vector<TuioString> getTuioStrings() {
   174 		return new Vector<TuioString>(stringList.values());
   174         return new Vector<TuioString>(stringList.values());
   175 	}
   175     }
   176 
   176 
   177 	/**
   177     /**
   178 	 * Returns the TuioObject corresponding to the provided Session ID
   178      * Returns the TuioObject corresponding to the provided Session ID
   179 	 * or NULL if the Session ID does not refer to an active TuioObject
   179      * or NULL if the Session ID does not refer to an active TuioObject
   180 	 *
   180      *
   181 	 * @return  an active TuioObject corresponding to the provided Session ID or NULL
   181      * @return  an active TuioObject corresponding to the provided Session ID or NULL
   182 	 */
   182      */
   183 	public TuioObject getTuioObject(long s_id) {
   183     public TuioObject getTuioObject(long s_id) {
   184 		return objectList.get(s_id);
   184         return objectList.get(s_id);
   185 	}
   185     }
   186 	
   186     
   187 	/**
   187     /**
   188 	 * Returns the TuioCursor corresponding to the provided Session ID
   188      * Returns the TuioCursor corresponding to the provided Session ID
   189 	 * or NULL if the Session ID does not refer to an active TuioCursor
   189      * or NULL if the Session ID does not refer to an active TuioCursor
   190 	 *
   190      *
   191 	 * @return  an active TuioCursor corresponding to the provided Session ID or NULL
   191      * @return  an active TuioCursor corresponding to the provided Session ID or NULL
   192 	 */
   192      */
   193 	public TuioCursor getTuioCursor(long s_id) {
   193     public TuioCursor getTuioCursor(long s_id) {
   194 		return cursorList.get(s_id);
   194         return cursorList.get(s_id);
   195 	}
   195     }
   196 
   196 
   197 	/**
   197     /**
   198 	 * Returns the TuioString corresponding to the provided Session ID
   198      * Returns the TuioString corresponding to the provided Session ID
   199 	 * or NULL if the Session ID does not refer to an active TuioString
   199      * or NULL if the Session ID does not refer to an active TuioString
   200 	 *
   200      *
   201 	 * @return  an active TuioString corresponding to the provided Session ID or NULL
   201      * @return  an active TuioString corresponding to the provided Session ID or NULL
   202 	 */
   202      */
   203 	public TuioString getTuioString(long s_id) {
   203     public TuioString getTuioString(long s_id) {
   204 		return stringList.get(s_id);
   204         return stringList.get(s_id);
   205 	}	
   205     }    
   206 
   206 
   207 	/**
   207     /**
   208 	 * The OSC callback method where all TUIO messages are received and decoded
   208      * The OSC callback method where all TUIO messages are received and decoded
   209 	 * and where the TUIO event callbacks are dispatched
   209      * and where the TUIO event callbacks are dispatched
   210 	 *
   210      *
   211 	 * @param  date	the time stamp of the OSC bundle
   211      * @param  date    the time stamp of the OSC bundle
   212 	 * @param  message	the received OSC message
   212      * @param  message    the received OSC message
   213 	 */
   213      */
   214 	public void acceptMessage(Date date, OSCMessage message) {
   214     public void acceptMessage(Date date, OSCMessage message) {
   215 	
   215     
   216 		Object[] args = message.getArguments();
   216         Object[] args = message.getArguments();
   217 		String command = (String)args[0];
   217         String command = (String)args[0];
   218 		String address = message.getAddress();
   218         String address = message.getAddress();
   219 
   219 
   220 		if (address.equals("/tuio/2Dobj")) {
   220         if (address.equals("/tuio/2Dobj")) {
   221 
   221 
   222 			if (command.equals("set")) {
   222             if (command.equals("set")) {
   223 				
   223                 
   224 				long s_id  = ((Integer)args[1]).longValue();
   224                 long s_id  = ((Integer)args[1]).longValue();
   225 				int c_id  = ((Integer)args[2]).intValue();
   225                 int c_id  = ((Integer)args[2]).intValue();
   226 				float xpos = ((Float)args[3]).floatValue();
   226                 float xpos = ((Float)args[3]).floatValue();
   227 				float ypos = ((Float)args[4]).floatValue();
   227                 float ypos = ((Float)args[4]).floatValue();
   228 				float angle = ((Float)args[5]).floatValue();
   228                 float angle = ((Float)args[5]).floatValue();
   229 				float xspeed = ((Float)args[6]).floatValue();
   229                 float xspeed = ((Float)args[6]).floatValue();
   230 				float yspeed = ((Float)args[7]).floatValue();
   230                 float yspeed = ((Float)args[7]).floatValue();
   231 				float rspeed = ((Float)args[8]).floatValue();
   231                 float rspeed = ((Float)args[8]).floatValue();
   232 				float maccel = ((Float)args[9]).floatValue();
   232                 float maccel = ((Float)args[9]).floatValue();
   233 				float raccel = ((Float)args[10]).floatValue();
   233                 float raccel = ((Float)args[10]).floatValue();
   234 				
   234                 
   235 				if (objectList.get(s_id) == null) {
   235                 if (objectList.get(s_id) == null) {
   236 				
   236                 
   237 					TuioObject addObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
   237                     TuioObject addObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
   238 					frameObjects.addElement(addObject);
   238                     frameObjects.addElement(addObject);
   239 					
   239                     
   240 				} else {
   240                 } else {
   241 				
   241                 
   242 					TuioObject tobj = objectList.get(s_id);
   242                     TuioObject tobj = objectList.get(s_id);
   243 					if (tobj==null) return;
   243                     if (tobj==null) return;
   244 					if ((tobj.xpos!=xpos) || (tobj.ypos!=ypos) || (tobj.angle!=angle) || (tobj.x_speed!=xspeed) || (tobj.y_speed!=yspeed) || (tobj.rotation_speed!=rspeed) || (tobj.motion_accel!=maccel) || (tobj.rotation_accel!=raccel)) {
   244                     if ((tobj.xpos!=xpos) || (tobj.ypos!=ypos) || (tobj.angle!=angle) || (tobj.x_speed!=xspeed) || (tobj.y_speed!=yspeed) || (tobj.rotation_speed!=rspeed) || (tobj.motion_accel!=maccel) || (tobj.rotation_accel!=raccel)) {
   245 						
   245                         
   246 						TuioObject updateObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
   246                         TuioObject updateObject = new TuioObject(s_id,c_id,xpos,ypos,angle);
   247 						updateObject.update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
   247                         updateObject.update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
   248 						frameObjects.addElement(updateObject);
   248                         frameObjects.addElement(updateObject);
   249 					}
   249                     }
   250 				
   250                 
   251 				}
   251                 }
   252 				
   252                 
   253 			} else if (command.equals("alive")) {
   253             } else if (command.equals("alive")) {
   254 	
   254     
   255 				newObjectList.clear();
   255                 newObjectList.clear();
   256 				for (int i=1;i<args.length;i++) {
   256                 for (int i=1;i<args.length;i++) {
   257 					// get the message content
   257                     // get the message content
   258 					long s_id = ((Integer)args[i]).longValue();
   258                     long s_id = ((Integer)args[i]).longValue();
   259 					newObjectList.addElement(s_id);
   259                     newObjectList.addElement(s_id);
   260 					// reduce the object list to the lost objects
   260                     // reduce the object list to the lost objects
   261 					if (aliveObjectList.contains(s_id))
   261                     if (aliveObjectList.contains(s_id))
   262 						 aliveObjectList.removeElement(s_id);
   262                          aliveObjectList.removeElement(s_id);
   263 				}
   263                 }
   264 				
   264                 
   265 				// remove the remaining objects
   265                 // remove the remaining objects
   266 				for (int i=0;i<aliveObjectList.size();i++) {
   266                 for (int i=0;i<aliveObjectList.size();i++) {
   267 					TuioObject removeObject = objectList.get(aliveObjectList.elementAt(i));
   267                     TuioObject removeObject = objectList.get(aliveObjectList.elementAt(i));
   268 					if (removeObject==null) continue;
   268                     if (removeObject==null) continue;
   269 					removeObject.remove(currentTime);
   269                     removeObject.remove(currentTime);
   270 					frameObjects.addElement(removeObject);
   270                     frameObjects.addElement(removeObject);
   271 				}
   271                 }
   272 					
   272                     
   273 			} else if (command.equals("fseq")) {
   273             } else if (command.equals("fseq")) {
   274 				
   274                 
   275 				long fseq = ((Integer)args[1]).longValue();
   275                 long fseq = ((Integer)args[1]).longValue();
   276 				boolean lateFrame = false;
   276                 boolean lateFrame = false;
   277 				
   277                 
   278 				if (fseq>0) {
   278                 if (fseq>0) {
   279 					if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   279                     if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   280 					if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame=fseq;
   280                     if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame=fseq;
   281 					else lateFrame = true;
   281                     else lateFrame = true;
   282 				} else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   282                 } else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   283 					currentTime = TuioTime.getSessionTime();
   283                     currentTime = TuioTime.getSessionTime();
   284 				}
   284                 }
   285 				
   285                 
   286 				if (!lateFrame) {
   286                 if (!lateFrame) {
   287 					Enumeration<TuioObject> frameEnum = frameObjects.elements();
   287                     Enumeration<TuioObject> frameEnum = frameObjects.elements();
   288 					while(frameEnum.hasMoreElements()) {
   288                     while(frameEnum.hasMoreElements()) {
   289 						TuioObject tobj = frameEnum.nextElement();
   289                         TuioObject tobj = frameEnum.nextElement();
   290 						
   290                         
   291 						switch (tobj.getTuioState()) {
   291                         switch (tobj.getTuioState()) {
   292 							case TuioObject.TUIO_REMOVED:
   292                             case TuioObject.TUIO_REMOVED:
   293 								TuioObject removeObject = tobj;
   293                                 TuioObject removeObject = tobj;
   294 								removeObject.remove(currentTime);
   294                                 removeObject.remove(currentTime);
   295 								for (int i=0;i<listenerList.size();i++) {
   295                                 for (int i=0;i<listenerList.size();i++) {
   296 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   296                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   297 									if (listener!=null) listener.removeTuioObject(removeObject);
   297                                     if (listener!=null) listener.removeTuioObject(removeObject);
   298 								}								
   298                                 }                                
   299 								objectList.remove(removeObject.getSessionID());
   299                                 objectList.remove(removeObject.getSessionID());
   300 								break;
   300                                 break;
   301 
   301 
   302 							case TuioObject.TUIO_ADDED:
   302                             case TuioObject.TUIO_ADDED:
   303 								TuioObject addObject = new TuioObject(currentTime,tobj.getSessionID(),tobj.getSymbolID(),tobj.getX(),tobj.getY(),tobj.getAngle());
   303                                 TuioObject addObject = new TuioObject(currentTime,tobj.getSessionID(),tobj.getSymbolID(),tobj.getX(),tobj.getY(),tobj.getAngle());
   304 								objectList.put(addObject.getSessionID(),addObject);
   304                                 objectList.put(addObject.getSessionID(),addObject);
   305 								for (int i=0;i<listenerList.size();i++) {
   305                                 for (int i=0;i<listenerList.size();i++) {
   306 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   306                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   307 									if (listener!=null) listener.addTuioObject(addObject);
   307                                     if (listener!=null) listener.addTuioObject(addObject);
   308 								}
   308                                 }
   309 								break;
   309                                 break;
   310 																
   310                                                                 
   311 							default:
   311                             default:
   312 								TuioObject updateObject = objectList.get(tobj.getSessionID());
   312                                 TuioObject updateObject = objectList.get(tobj.getSessionID());
   313 								if ( (tobj.getX()!=updateObject.getX() && tobj.getXSpeed()==0) || (tobj.getY()!=updateObject.getY() && tobj.getYSpeed()==0) )
   313                                 if ( (tobj.getX()!=updateObject.getX() && tobj.getXSpeed()==0) || (tobj.getY()!=updateObject.getY() && tobj.getYSpeed()==0) )
   314 									updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle());
   314                                     updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle());
   315 								else
   315                                 else
   316 									updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle(),tobj.getXSpeed(),tobj.getYSpeed(),tobj.getRotationSpeed(),tobj.getMotionAccel(),tobj.getRotationAccel());
   316                                     updateObject.update(currentTime,tobj.getX(),tobj.getY(),tobj.getAngle(),tobj.getXSpeed(),tobj.getYSpeed(),tobj.getRotationSpeed(),tobj.getMotionAccel(),tobj.getRotationAccel());
   317 
   317 
   318 								for (int i=0;i<listenerList.size();i++) {
   318                                 for (int i=0;i<listenerList.size();i++) {
   319 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   319                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   320 									if (listener!=null) listener.updateTuioObject(updateObject);
   320                                     if (listener!=null) listener.updateTuioObject(updateObject);
   321 								}
   321                                 }
   322 						}
   322                         }
   323 					}
   323                     }
   324 					
   324                     
   325 					for (int i=0;i<listenerList.size();i++) {
   325                     for (int i=0;i<listenerList.size();i++) {
   326 						TuioListener listener = (TuioListener)listenerList.elementAt(i);
   326                         TuioListener listener = (TuioListener)listenerList.elementAt(i);
   327 						if (listener!=null) listener.refresh(new TuioTime(currentTime));
   327                         if (listener!=null) listener.refresh(new TuioTime(currentTime));
   328 					}
   328                     }
   329 					
   329                     
   330 					Vector<Long> buffer = aliveObjectList;
   330                     Vector<Long> buffer = aliveObjectList;
   331 					aliveObjectList = newObjectList;
   331                     aliveObjectList = newObjectList;
   332 					// recycling the vector
   332                     // recycling the vector
   333 					newObjectList = buffer;					
   333                     newObjectList = buffer;                    
   334 				}
   334                 }
   335 				frameObjects.clear();
   335                 frameObjects.clear();
   336 			}
   336             }
   337 		} else if (address.equals("/tuio/3Dcur")) {
   337         } else if (address.equals("/tuio/3Dcur")) {
   338 
   338 
   339 			if (command.equals("set")) {
   339             if (command.equals("set")) {
   340 
   340 
   341 				long s_id  = ((Integer)args[1]).longValue();
   341                 long s_id  = ((Integer)args[1]).longValue();
   342 				float xpos = ((Float)args[2]).floatValue();
   342                 float xpos = ((Float)args[2]).floatValue();
   343 				float ypos = ((Float)args[3]).floatValue();
   343                 float ypos = ((Float)args[3]).floatValue();
   344 				float zpos = ((Float)args[4]).floatValue();
   344                 float zpos = ((Float)args[4]).floatValue();
   345 				float xspeed = ((Float)args[5]).floatValue();
   345                 float xspeed = ((Float)args[5]).floatValue();
   346 				float yspeed = ((Float)args[6]).floatValue();
   346                 float yspeed = ((Float)args[6]).floatValue();
   347 				float maccel = ((Float)args[7]).floatValue();
   347                 float maccel = ((Float)args[7]).floatValue();
   348 				
   348                 
   349 				if (cursorList.get(s_id) == null) {
   349                 if (cursorList.get(s_id) == null) {
   350 									
   350                                     
   351 					TuioCursor addCursor = new TuioCursor(s_id, -1 ,xpos,ypos,zpos);
   351                     TuioCursor addCursor = new TuioCursor(s_id, -1 ,xpos,ypos,zpos);
   352 					frameCursors.addElement(addCursor);
   352                     frameCursors.addElement(addCursor);
   353 					
   353                     
   354 				} else {
   354                 } else {
   355 				
   355                 
   356 					TuioCursor tcur = cursorList.get(s_id);
   356                     TuioCursor tcur = cursorList.get(s_id);
   357 					if (tcur==null) return;
   357                     if (tcur==null) return;
   358 					if ((tcur.xpos!=xpos) || (tcur.ypos!=ypos) || (tcur.zpos!=zpos) || (tcur.x_speed!=xspeed) || (tcur.y_speed!=yspeed) || (tcur.motion_accel!=maccel)) {
   358                     if ((tcur.xpos!=xpos) || (tcur.ypos!=ypos) || (tcur.zpos!=zpos) || (tcur.x_speed!=xspeed) || (tcur.y_speed!=yspeed) || (tcur.motion_accel!=maccel)) {
   359 
   359 
   360 						TuioCursor updateCursor = new TuioCursor(s_id,tcur.getCursorID(),xpos,ypos,zpos);
   360                         TuioCursor updateCursor = new TuioCursor(s_id,tcur.getCursorID(),xpos,ypos,zpos);
   361 						updateCursor.update(xpos,ypos,zpos,xspeed,yspeed,maccel);
   361                         updateCursor.update(xpos,ypos,zpos,xspeed,yspeed,maccel);
   362 						frameCursors.addElement(updateCursor);
   362                         frameCursors.addElement(updateCursor);
   363 					}
   363                     }
   364 				}
   364                 }
   365 				
   365                 
   366 				//System.out.println("set cur " + s_id+" "+xpos+" "+ypos+" "+xspeed+" "+yspeed+" "+maccel);
   366                 //System.out.println("set cur " + s_id+" "+xpos+" "+ypos+" "+xspeed+" "+yspeed+" "+maccel);
   367 				
   367                 
   368 			} else if (command.equals("alive")) {
   368             } else if (command.equals("alive")) {
   369 	
   369     
   370 				newCursorList.clear();
   370                 newCursorList.clear();
   371 				for (int i=1;i<args.length;i++) {
   371                 for (int i=1;i<args.length;i++) {
   372 					// get the message content
   372                     // get the message content
   373 					long s_id = ((Integer)args[i]).longValue();
   373                     long s_id = ((Integer)args[i]).longValue();
   374 					newCursorList.addElement(s_id);
   374                     newCursorList.addElement(s_id);
   375 					// reduce the cursor list to the lost cursors
   375                     // reduce the cursor list to the lost cursors
   376 					if (aliveCursorList.contains(s_id)) 
   376                     if (aliveCursorList.contains(s_id)) 
   377 						aliveCursorList.removeElement(s_id);
   377                         aliveCursorList.removeElement(s_id);
   378 				}
   378                 }
   379 				
   379                 
   380 				// remove the remaining cursors
   380                 // remove the remaining cursors
   381 				for (int i=0;i<aliveCursorList.size();i++) {
   381                 for (int i=0;i<aliveCursorList.size();i++) {
   382 					TuioCursor removeCursor = cursorList.get(aliveCursorList.elementAt(i));
   382                     TuioCursor removeCursor = cursorList.get(aliveCursorList.elementAt(i));
   383 					if (removeCursor==null) continue;
   383                     if (removeCursor==null) continue;
   384 					removeCursor.remove(currentTime);
   384                     removeCursor.remove(currentTime);
   385 					frameCursors.addElement(removeCursor);
   385                     frameCursors.addElement(removeCursor);
   386 				}
   386                 }
   387 								
   387                                 
   388 			} else if (command.equals("fseq")) {
   388             } else if (command.equals("fseq")) {
   389 				long fseq = ((Integer)args[1]).longValue();
   389                 long fseq = ((Integer)args[1]).longValue();
   390 				boolean lateFrame = false;
   390                 boolean lateFrame = false;
   391 				
   391                 
   392 				if (fseq>0) {
   392                 if (fseq>0) {
   393 					if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   393                     if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   394 					if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame = fseq;
   394                     if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame = fseq;
   395 					else lateFrame = true;
   395                     else lateFrame = true;
   396 				} else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   396                 } else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   397 					currentTime = TuioTime.getSessionTime();
   397                     currentTime = TuioTime.getSessionTime();
   398 				}
   398                 }
   399 				if (!lateFrame) {
   399                 if (!lateFrame) {
   400 
   400 
   401 					Enumeration<TuioCursor> frameEnum = frameCursors.elements();
   401                     Enumeration<TuioCursor> frameEnum = frameCursors.elements();
   402 					while(frameEnum.hasMoreElements()) {
   402                     while(frameEnum.hasMoreElements()) {
   403 						TuioCursor tcur = frameEnum.nextElement();
   403                         TuioCursor tcur = frameEnum.nextElement();
   404 						
   404                         
   405 						switch (tcur.getTuioState()) {
   405                         switch (tcur.getTuioState()) {
   406 							case TuioCursor.TUIO_REMOVED:
   406                             case TuioCursor.TUIO_REMOVED:
   407 							
   407                             
   408 								TuioCursor removeCursor = tcur;
   408                                 TuioCursor removeCursor = tcur;
   409 								removeCursor.remove(currentTime);
   409                                 removeCursor.remove(currentTime);
   410 								
   410                                 
   411 								for (int i=0;i<listenerList.size();i++) {
   411                                 for (int i=0;i<listenerList.size();i++) {
   412 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   412                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   413 									if (listener!=null) listener.removeTuioCursor(removeCursor);
   413                                     if (listener!=null) listener.removeTuioCursor(removeCursor);
   414 								}
   414                                 }
   415 
   415 
   416 								cursorList.remove(removeCursor.getSessionID());
   416                                 cursorList.remove(removeCursor.getSessionID());
   417 
   417 
   418 								if (removeCursor.getCursorID()==maxCursorID) {
   418                                 if (removeCursor.getCursorID()==maxCursorID) {
   419 									maxCursorID = -1;
   419                                     maxCursorID = -1;
   420 									if (cursorList.size()>0) {
   420                                     if (cursorList.size()>0) {
   421 										Enumeration<TuioCursor> clist = cursorList.elements();
   421                                         Enumeration<TuioCursor> clist = cursorList.elements();
   422 										while (clist.hasMoreElements()) {
   422                                         while (clist.hasMoreElements()) {
   423 											int c_id = clist.nextElement().getCursorID();
   423                                             int c_id = clist.nextElement().getCursorID();
   424 											if (c_id>maxCursorID) maxCursorID=c_id;
   424                                             if (c_id>maxCursorID) maxCursorID=c_id;
   425 										}
   425                                         }
   426 										
   426                                         
   427 										Enumeration<TuioCursor> flist = freeCursorList.elements();
   427                                         Enumeration<TuioCursor> flist = freeCursorList.elements();
   428 										while (flist.hasMoreElements()) {
   428                                         while (flist.hasMoreElements()) {
   429 											int c_id = flist.nextElement().getCursorID();
   429                                             int c_id = flist.nextElement().getCursorID();
   430 											if (c_id>=maxCursorID) freeCursorList.removeElement(c_id);
   430                                             if (c_id>=maxCursorID) freeCursorList.removeElement(c_id);
   431 										}
   431                                         }
   432 									} else freeCursorList.clear();
   432                                     } else freeCursorList.clear();
   433 								} else if (removeCursor.getCursorID()<maxCursorID) {
   433                                 } else if (removeCursor.getCursorID()<maxCursorID) {
   434 									freeCursorList.addElement(removeCursor);
   434                                     freeCursorList.addElement(removeCursor);
   435 								}
   435                                 }
   436 								
   436                                 
   437 								break;
   437                                 break;
   438 
   438 
   439 							case TuioCursor.TUIO_ADDED:
   439                             case TuioCursor.TUIO_ADDED:
   440 
   440 
   441 								int c_id = cursorList.size();
   441                                 int c_id = cursorList.size();
   442 								if ((cursorList.size()<=maxCursorID) && (freeCursorList.size()>0)) {
   442                                 if ((cursorList.size()<=maxCursorID) && (freeCursorList.size()>0)) {
   443 									TuioCursor closestCursor = freeCursorList.firstElement();
   443                                     TuioCursor closestCursor = freeCursorList.firstElement();
   444 									Enumeration<TuioCursor> testList = freeCursorList.elements();
   444                                     Enumeration<TuioCursor> testList = freeCursorList.elements();
   445 									while (testList.hasMoreElements()) {
   445                                     while (testList.hasMoreElements()) {
   446 										TuioCursor testCursor = testList.nextElement();
   446                                         TuioCursor testCursor = testList.nextElement();
   447 										if (testCursor.getDistance(tcur)<closestCursor.getDistance(tcur)) closestCursor = testCursor;
   447                                         if (testCursor.getDistance(tcur)<closestCursor.getDistance(tcur)) closestCursor = testCursor;
   448 									}
   448                                     }
   449 									c_id = closestCursor.getCursorID();
   449                                     c_id = closestCursor.getCursorID();
   450 									freeCursorList.removeElement(closestCursor);
   450                                     freeCursorList.removeElement(closestCursor);
   451 								} else maxCursorID = c_id;		
   451                                 } else maxCursorID = c_id;        
   452 								
   452                                 
   453 								TuioCursor addCursor = new TuioCursor(currentTime,tcur.getSessionID(),c_id,tcur.getX(),tcur.getY(),tcur.getZ());
   453                                 TuioCursor addCursor = new TuioCursor(currentTime,tcur.getSessionID(),c_id,tcur.getX(),tcur.getY(),tcur.getZ());
   454 								cursorList.put(addCursor.getSessionID(),addCursor);
   454                                 cursorList.put(addCursor.getSessionID(),addCursor);
   455 								
   455                                 
   456 								for (int i=0;i<listenerList.size();i++) {
   456                                 for (int i=0;i<listenerList.size();i++) {
   457 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   457                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   458 									if (listener!=null) listener.addTuioCursor(addCursor);
   458                                     if (listener!=null) listener.addTuioCursor(addCursor);
   459 								}
   459                                 }
   460 								break;
   460                                 break;
   461 								
   461                                 
   462 							default:
   462                             default:
   463 								
   463                                 
   464 								TuioCursor updateCursor = cursorList.get(tcur.getSessionID());
   464                                 TuioCursor updateCursor = cursorList.get(tcur.getSessionID());
   465 								if ( (tcur.getX()!=updateCursor.getX() && tcur.getXSpeed()==0) || (tcur.getY()!=updateCursor.getY() && tcur.getYSpeed()==0) || (tcur.getZ()!=updateCursor.getZ()) )
   465                                 if ( (tcur.getX()!=updateCursor.getX() && tcur.getXSpeed()==0) || (tcur.getY()!=updateCursor.getY() && tcur.getYSpeed()==0) || (tcur.getZ()!=updateCursor.getZ()) )
   466 									updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ());
   466                                     updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ());
   467 								else 
   467                                 else 
   468 									updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ(),tcur.getXSpeed(),tcur.getYSpeed(),tcur.getMotionAccel());
   468                                     updateCursor.update(currentTime,tcur.getX(),tcur.getY(),tcur.getZ(),tcur.getXSpeed(),tcur.getYSpeed(),tcur.getMotionAccel());
   469 									
   469                                     
   470 								for (int i=0;i<listenerList.size();i++) {
   470                                 for (int i=0;i<listenerList.size();i++) {
   471 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   471                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   472 									if (listener!=null) listener.updateTuioCursor(updateCursor);
   472                                     if (listener!=null) listener.updateTuioCursor(updateCursor);
   473 								}
   473                                 }
   474 						}
   474                         }
   475 					}
   475                     }
   476 					
   476                     
   477 					for (int i=0;i<listenerList.size();i++) {
   477                     for (int i=0;i<listenerList.size();i++) {
   478 						TuioListener listener = (TuioListener)listenerList.elementAt(i);
   478                         TuioListener listener = (TuioListener)listenerList.elementAt(i);
   479 						if (listener!=null) listener.refresh(new TuioTime(currentTime));
   479                         if (listener!=null) listener.refresh(new TuioTime(currentTime));
   480 					}
   480                     }
   481 					
   481                     
   482 					Vector<Long> buffer = aliveCursorList;
   482                     Vector<Long> buffer = aliveCursorList;
   483 					aliveCursorList = newCursorList;
   483                     aliveCursorList = newCursorList;
   484 					// recycling the vector
   484                     // recycling the vector
   485 					newCursorList = buffer;				
   485                     newCursorList = buffer;                
   486 				}
   486                 }
   487 				
   487                 
   488 				frameCursors.clear();
   488                 frameCursors.clear();
   489 			} 
   489             } 
   490 		} else if (address.equals("/tuio/_siP")) {
   490         } else if (address.equals("/tuio/_siP")) {
   491 
   491 
   492 			if (command.equals("set")) {
   492             if (command.equals("set")) {
   493 
   493 
   494 				long s_id  = ((Integer)args[1]).longValue();
   494                 long s_id  = ((Integer)args[1]).longValue();
   495 				String msg = args[2].toString();
   495                 String msg = args[2].toString();
   496 				
   496                 
   497 				if (stringList.get(s_id) == null) {
   497                 if (stringList.get(s_id) == null) {
   498 									
   498                                     
   499 					TuioString addString = new TuioString(s_id, -1, msg);
   499                     TuioString addString = new TuioString(s_id, -1, msg);
   500 					frameStrings.addElement(addString);
   500                     frameStrings.addElement(addString);
   501 					
   501                     
   502 				} else {
   502                 } else {
   503 				
   503                 
   504 					TuioString tstr = stringList.get(s_id);
   504                     TuioString tstr = stringList.get(s_id);
   505 					if (tstr==null) return;
   505                     if (tstr==null) return;
   506 					if (!tstr.getMessage().equals(msg)) {
   506                     if (!tstr.getMessage().equals(msg)) {
   507 
   507 
   508 						TuioString updateString = new TuioString(s_id,tstr.getStringID(),msg);
   508                         TuioString updateString = new TuioString(s_id,tstr.getStringID(),msg);
   509 						updateString.update(msg);
   509                         updateString.update(msg);
   510 						frameStrings.addElement(updateString);
   510                         frameStrings.addElement(updateString);
   511 					}
   511                     }
   512 				}
   512                 }
   513 				
   513                 
   514 				//System.out.println("set cur " + s_id+" "+xpos+" "+ypos+" "+xspeed+" "+yspeed+" "+maccel);
   514                 //System.out.println("set cur " + s_id+" "+xpos+" "+ypos+" "+xspeed+" "+yspeed+" "+maccel);
   515 				
   515                 
   516 			} else if (command.equals("alive")) {
   516             } else if (command.equals("alive")) {
   517 	
   517     
   518 				newStringList.clear();
   518                 newStringList.clear();
   519 				for (int i=1;i<args.length;i++) {
   519                 for (int i=1;i<args.length;i++) {
   520 					// get the message content
   520                     // get the message content
   521 					long s_id = ((Integer)args[i]).longValue();
   521                     long s_id = ((Integer)args[i]).longValue();
   522 					newStringList.addElement(s_id);
   522                     newStringList.addElement(s_id);
   523 					// reduce the cursor list to the lost cursors
   523                     // reduce the cursor list to the lost cursors
   524 					if (aliveStringList.contains(s_id)) 
   524                     if (aliveStringList.contains(s_id)) 
   525 						aliveStringList.removeElement(s_id);
   525                         aliveStringList.removeElement(s_id);
   526 				}
   526                 }
   527 				
   527                 
   528 				// remove the remaining cursors
   528                 // remove the remaining cursors
   529 				for (int i=0;i<aliveStringList.size();i++) {
   529                 for (int i=0;i<aliveStringList.size();i++) {
   530 					TuioString removeString = stringList.get(aliveStringList.elementAt(i));
   530                     TuioString removeString = stringList.get(aliveStringList.elementAt(i));
   531 					if (removeString==null) continue;
   531                     if (removeString==null) continue;
   532 					removeString.remove(currentTime);
   532                     removeString.remove(currentTime);
   533 					frameStrings.addElement(removeString);
   533                     frameStrings.addElement(removeString);
   534 				}
   534                 }
   535 								
   535                                 
   536 			} else if (command.equals("fseq")) {
   536             } else if (command.equals("fseq")) {
   537 				long fseq = ((Integer)args[1]).longValue();
   537                 long fseq = ((Integer)args[1]).longValue();
   538 				boolean lateFrame = false;
   538                 boolean lateFrame = false;
   539 				
   539                 
   540 				if (fseq>0) {
   540                 if (fseq>0) {
   541 					if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   541                     if (fseq>currentFrame) currentTime = TuioTime.getSessionTime();
   542 					if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame = fseq;
   542                     if ((fseq>=currentFrame) || ((currentFrame-fseq)>100)) currentFrame = fseq;
   543 					else lateFrame = true;
   543                     else lateFrame = true;
   544 				} else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   544                 } else if (TuioTime.getSessionTime().subtract(currentTime).getTotalMilliseconds()>100) {
   545 					currentTime = TuioTime.getSessionTime();
   545                     currentTime = TuioTime.getSessionTime();
   546 				}
   546                 }
   547 				if (!lateFrame) {
   547                 if (!lateFrame) {
   548 
   548 
   549 					Enumeration<TuioString> frameEnum = frameStrings.elements();
   549                     Enumeration<TuioString> frameEnum = frameStrings.elements();
   550 					while(frameEnum.hasMoreElements()) {
   550                     while(frameEnum.hasMoreElements()) {
   551 						TuioString tstr = frameEnum.nextElement();
   551                         TuioString tstr = frameEnum.nextElement();
   552 						
   552                         
   553 						switch (tstr.getTuioState()) {
   553                         switch (tstr.getTuioState()) {
   554 							case TuioString.TUIO_REMOVED:
   554                             case TuioString.TUIO_REMOVED:
   555 							
   555                             
   556 								TuioString removeString = tstr;
   556                                 TuioString removeString = tstr;
   557 								removeString.remove(currentTime);
   557                                 removeString.remove(currentTime);
   558 								
   558                                 
   559 								for (int i=0;i<listenerList.size();i++) {
   559                                 for (int i=0;i<listenerList.size();i++) {
   560 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   560                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   561 									if (listener!=null) listener.removeTuioString(removeString);
   561                                     if (listener!=null) listener.removeTuioString(removeString);
   562 								}
   562                                 }
   563 
   563 
   564 								stringList.remove(removeString.getSessionID());
   564                                 stringList.remove(removeString.getSessionID());
   565 
   565 
   566 								if (removeString.getStringID()==maxStringID) {
   566                                 if (removeString.getStringID()==maxStringID) {
   567 									maxStringID = -1;
   567                                     maxStringID = -1;
   568 									if (stringList.size()>0) {
   568                                     if (stringList.size()>0) {
   569 										Enumeration<TuioString> slist = stringList.elements();
   569                                         Enumeration<TuioString> slist = stringList.elements();
   570 										while (slist.hasMoreElements()) {
   570                                         while (slist.hasMoreElements()) {
   571 											int sl_id = slist.nextElement().getStringID();
   571                                             int sl_id = slist.nextElement().getStringID();
   572 											if (sl_id>maxStringID) maxStringID=sl_id;
   572                                             if (sl_id>maxStringID) maxStringID=sl_id;
   573 										}
   573                                         }
   574 										
   574                                         
   575 										Enumeration<TuioString> flist = freeStringList.elements();
   575                                         Enumeration<TuioString> flist = freeStringList.elements();
   576 										while (flist.hasMoreElements()) {
   576                                         while (flist.hasMoreElements()) {
   577 											int sl_id = flist.nextElement().getStringID();
   577                                             int sl_id = flist.nextElement().getStringID();
   578 											if (sl_id>=maxStringID) freeStringList.removeElement(sl_id);
   578                                             if (sl_id>=maxStringID) freeStringList.removeElement(sl_id);
   579 										}
   579                                         }
   580 									} else freeStringList.clear();
   580                                     } else freeStringList.clear();
   581 								} else if (removeString.getStringID()<maxStringID) {
   581                                 } else if (removeString.getStringID()<maxStringID) {
   582 									freeStringList.addElement(removeString);
   582                                     freeStringList.addElement(removeString);
   583 								}
   583                                 }
   584 								
   584                                 
   585 								break;
   585                                 break;
   586 
   586 
   587 							case TuioString.TUIO_ADDED:
   587                             case TuioString.TUIO_ADDED:
   588 
   588 
   589 								int sl_id = stringList.size();
   589                                 int sl_id = stringList.size();
   590 								if ((stringList.size()<=maxStringID) && (freeStringList.size()>0)) {
   590                                 if ((stringList.size()<=maxStringID) && (freeStringList.size()>0)) {
   591 									TuioString closestString = freeStringList.firstElement();
   591                                     TuioString closestString = freeStringList.firstElement();
   592 									Enumeration<TuioString> testList = freeStringList.elements();
   592                                     Enumeration<TuioString> testList = freeStringList.elements();
   593 									while (testList.hasMoreElements()) {
   593                                     while (testList.hasMoreElements()) {
   594 										TuioString testString = testList.nextElement();
   594                                         TuioString testString = testList.nextElement();
   595 										//if (testString.getDistance(tstr)<closestString.getDistance(tstr))
   595                                         //if (testString.getDistance(tstr)<closestString.getDistance(tstr))
   596 										closestString = testString;
   596                                         closestString = testString;
   597 									}
   597                                     }
   598 									sl_id = closestString.getStringID();
   598                                     sl_id = closestString.getStringID();
   599 									freeStringList.removeElement(closestString);
   599                                     freeStringList.removeElement(closestString);
   600 								} else maxStringID = sl_id;		
   600                                 } else maxStringID = sl_id;        
   601 								
   601                                 
   602 								TuioString addString = new TuioString(currentTime,tstr.getSessionID(),sl_id,tstr.getMessage());
   602                                 TuioString addString = new TuioString(currentTime,tstr.getSessionID(),sl_id,tstr.getMessage());
   603 								stringList.put(addString.getSessionID(),addString);
   603                                 stringList.put(addString.getSessionID(),addString);
   604 								
   604                                 
   605 								for (int i=0;i<listenerList.size();i++) {
   605                                 for (int i=0;i<listenerList.size();i++) {
   606 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   606                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   607 									if (listener!=null) listener.addTuioString(addString);
   607                                     if (listener!=null) listener.addTuioString(addString);
   608 								}
   608                                 }
   609 								break;
   609                                 break;
   610 								
   610                                 
   611 							default:
   611                             default:
   612 								
   612                                 
   613 								TuioString updateString = stringList.get(tstr.getSessionID());
   613                                 TuioString updateString = stringList.get(tstr.getSessionID());
   614 								if ( tstr.getMessage()!=updateString.getMessage() )
   614                                 if ( tstr.getMessage()!=updateString.getMessage() )
   615 									updateString.update(currentTime,tstr.getMessage());
   615                                     updateString.update(currentTime,tstr.getMessage());
   616 								else 
   616                                 else 
   617 									updateString.update(currentTime,tstr.getMessage());
   617                                     updateString.update(currentTime,tstr.getMessage());
   618 									
   618                                     
   619 								for (int i=0;i<listenerList.size();i++) {
   619                                 for (int i=0;i<listenerList.size();i++) {
   620 									TuioListener listener = (TuioListener)listenerList.elementAt(i);
   620                                     TuioListener listener = (TuioListener)listenerList.elementAt(i);
   621 									if (listener!=null) listener.updateTuioString(updateString);
   621                                     if (listener!=null) listener.updateTuioString(updateString);
   622 								}
   622                                 }
   623 						}
   623                         }
   624 					}
   624                     }
   625 					
   625                     
   626 					for (int i=0;i<listenerList.size();i++) {
   626                     for (int i=0;i<listenerList.size();i++) {
   627 						TuioListener listener = (TuioListener)listenerList.elementAt(i);
   627                         TuioListener listener = (TuioListener)listenerList.elementAt(i);
   628 						if (listener!=null) listener.refresh(new TuioTime(currentTime));
   628                         if (listener!=null) listener.refresh(new TuioTime(currentTime));
   629 					}
   629                     }
   630 					
   630                     
   631 					Vector<Long> buffer = aliveStringList;
   631                     Vector<Long> buffer = aliveStringList;
   632 					aliveStringList = newStringList;
   632                     aliveStringList = newStringList;
   633 					// recycling the vector
   633                     // recycling the vector
   634 					newStringList = buffer;				
   634                     newStringList = buffer;                
   635 				}
   635                 }
   636 				
   636                 
   637 				frameStrings.clear();
   637                 frameStrings.clear();
   638 			} 
   638             } 
   639 		}
   639         }
   640 		
   640         
   641 		
   641         
   642 	}
   642     }
   643 }
   643 }