front_idill/extern/fajran-npTuioClient/TuioClient/TuioClient.cpp
changeset 28 9ccef81f02ab
parent 27 6c08d4d7219e
equal deleted inserted replaced
27:6c08d4d7219e 28:9ccef81f02ab
     1 /*
     1 /*
     2 	TUIO C++ Library - part of the reacTIVision project
     2     TUIO C++ Library - part of the reacTIVision project
     3 	http://reactivision.sourceforge.net/
     3     http://reactivision.sourceforge.net/
     4 
     4 
     5 	Copyright (c) 2005-2008 Martin Kaltenbrunner <mkalten@iua.upf.edu>
     5     Copyright (c) 2005-2008 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.
    15     GNU General Public License for more details.
    15     GNU General Public License for more details.
    16 
    16 
    17     You should have received a copy of the GNU General Public License
    17     You should have received a copy of the GNU General Public License
    18     along with this program; if not, write to the Free Software
    18     along with this program; if not, write to the Free Software
    19     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    19     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    20 */
       
    21 
       
    22 /*
       
    23     Modified by alexandre.bastien@iri.centrepompidou.fr to manage TUIO strings.
    20 */
    24 */
    21 
    25 
    22 #include "TuioClient.h"
    26 #include "TuioClient.h"
    23 
    27 
    24 #ifndef WIN32
    28 #ifndef WIN32
    25 static void* ThreadFunc( void* obj )
    29 static void* ThreadFunc( void* obj )
    26 #else
    30 #else
    27 static DWORD WINAPI ThreadFunc( LPVOID obj )
    31 static DWORD WINAPI ThreadFunc( LPVOID obj )
    28 #endif
    32 #endif
    29 {
    33 {
    30 	static_cast<TuioClient*>(obj)->socket->Run();
    34     static_cast<TuioClient*>(obj)->socket->Run();
    31 	return 0;
    35     return 0;
    32 };
    36 };
    33 
    37 
    34 using namespace std;
    38 using namespace std;
    35 	
    39     
    36 TuioClient::TuioClient() {
    40 TuioClient::TuioClient() {
    37 	TuioClient(3333);
    41     TuioClient(3333);
    38 }
    42 }
    39 
    43 
    40 TuioClient::TuioClient(int port) {
    44 TuioClient::TuioClient(int port) {
    41 	try {
    45     try {
    42 		socket = new UdpListeningReceiveSocket(IpEndpointName( IpEndpointName::ANY_ADDRESS, port ), this );
    46         socket = new UdpListeningReceiveSocket(IpEndpointName( IpEndpointName::ANY_ADDRESS, port ), this );
    43 	} catch (std::exception &e) { 
    47     } catch (std::exception &e) { 
    44 		std::cout << "could not bind to UDP port " << port << std::endl;
    48         std::cout << "could not bind to UDP port " << port << std::endl;
    45 		socket = NULL;
    49         socket = NULL;
    46 	}
    50     }
    47 	
    51     
    48 	if (socket!=NULL) {
    52     if (socket!=NULL) {
    49 		if (!socket->IsBound()) {
    53         if (!socket->IsBound()) {
    50 			delete socket;
    54             delete socket;
    51 			socket = NULL;
    55             socket = NULL;
    52 		} else std::cout << "listening to TUIO messages on UDP port " << port << std::endl;
    56         } else std::cout << "listening to TUIO messages on UDP port " << port << std::endl;
    53 	}
    57     }
    54 
    58 
    55 	locked = false;
    59     locked = false;
    56 	running = false;
    60     running = false;
    57 	currentFrame = lastFrame = maxFingerID = maxStringID = -1;
    61     currentFrame = lastFrame = maxFingerID = maxStringID = -1;
    58 }
    62 }
    59 
    63 
    60 TuioClient::~TuioClient() {
    64 TuioClient::~TuioClient() {
    61 	delete socket;
    65     delete socket;
    62 }
    66 }
    63 
    67 
    64 void TuioClient::ProcessBundle( const ReceivedBundle& b, const IpEndpointName& remoteEndpoint) {
    68 void TuioClient::ProcessBundle( const ReceivedBundle& b, const IpEndpointName& remoteEndpoint) {
    65 	for( ReceivedBundle::const_iterator i = b.ElementsBegin(); i != b.ElementsEnd(); ++i ){
    69     for( ReceivedBundle::const_iterator i = b.ElementsBegin(); i != b.ElementsEnd(); ++i ){
    66 		if( i->IsBundle() )
    70         if( i->IsBundle() )
    67 			ProcessBundle( ReceivedBundle(*i), remoteEndpoint);
    71             ProcessBundle( ReceivedBundle(*i), remoteEndpoint);
    68 		else
    72         else
    69 			ProcessMessage( ReceivedMessage(*i), remoteEndpoint);
    73             ProcessMessage( ReceivedMessage(*i), remoteEndpoint);
    70 	}
    74     }
    71 }
    75 }
    72 
    76 
    73 void TuioClient::ProcessMessage( const ReceivedMessage& msg, const IpEndpointName& remoteEndpoint)
    77 void TuioClient::ProcessMessage( const ReceivedMessage& msg, const IpEndpointName& remoteEndpoint)
    74 {
    78 {
    75 	try
    79     try
    76 	{
    80     {
    77 		ReceivedMessageArgumentStream args = msg.ArgumentStream();
    81         ReceivedMessageArgumentStream args = msg.ArgumentStream();
    78 		ReceivedMessage::const_iterator arg = msg.ArgumentsBegin();
    82         ReceivedMessage::const_iterator arg = msg.ArgumentsBegin();
    79 
    83 
    80 		if( strcmp( msg.AddressPattern(), "/tuio/2Dobj" ) == 0 )
    84         if( strcmp( msg.AddressPattern(), "/tuio/2Dobj" ) == 0 )
    81 		{
    85         {
    82 			const char* cmd;
    86             const char* cmd;
    83 			args >> cmd;
    87             args >> cmd;
    84 			
    88             
    85 			if( strcmp( cmd, "set" ) == 0 )
    89             if( strcmp( cmd, "set" ) == 0 )
    86 			{
    90             {
    87 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
    91                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
    88 
    92 
    89 				int32 s_id, f_id;
    93                 int32 s_id, f_id;
    90 				float xpos, ypos, angle, xspeed, yspeed, rspeed, maccel, raccel;
    94                 float xpos, ypos, angle, xspeed, yspeed, rspeed, maccel, raccel;
    91 
    95 
    92 				args >> s_id >> f_id >> xpos >> ypos >> angle >> xspeed >> yspeed >> rspeed >> maccel >> raccel >> EndMessage;
    96                 args >> s_id >> f_id >> xpos >> ypos >> angle >> xspeed >> yspeed >> rspeed >> maccel >> raccel >> EndMessage;
    93 
    97 
    94 				std::list<TuioObject*>::iterator tobj;
    98                 std::list<TuioObject*>::iterator tobj;
    95 				for (tobj=objectList.begin(); tobj!= objectList.end(); tobj++)
    99                 for (tobj=objectList.begin(); tobj!= objectList.end(); tobj++)
    96 					if((*tobj)->getSessionID()==(long)s_id) break;
   100                     if((*tobj)->getSessionID()==(long)s_id) break;
    97 
   101 
    98 				if (tobj == objectList.end())
   102                 if (tobj == objectList.end())
    99 				{
   103                 {
   100 
   104 
   101 					TuioObject *addObject = new TuioObject((long)s_id,(int)f_id,xpos,ypos,angle);
   105                     TuioObject *addObject = new TuioObject((long)s_id,(int)f_id,xpos,ypos,angle);
   102 					objectList.push_back(addObject);
   106                     objectList.push_back(addObject);
   103 					
   107                     
   104 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   108                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   105 						(*listener)->addTuioObject(addObject);
   109                         (*listener)->addTuioObject(addObject);
   106 
   110 
   107 				}
   111                 }
   108 				else if ( ((*tobj)->getX()!=xpos) || ((*tobj)->getY()!=ypos) || ((*tobj)->getAngle()!=angle) || ((*tobj)->getXSpeed()!=xspeed) || ((*tobj)->getYSpeed()!=yspeed) || ((*tobj)->getRotationSpeed()!=rspeed) || ((*tobj)->getMotionAccel()!=maccel) || ((*tobj)->getRotationAccel()!=raccel) )
   112                 else if ( ((*tobj)->getX()!=xpos) || ((*tobj)->getY()!=ypos) || ((*tobj)->getAngle()!=angle) || ((*tobj)->getXSpeed()!=xspeed) || ((*tobj)->getYSpeed()!=yspeed) || ((*tobj)->getRotationSpeed()!=rspeed) || ((*tobj)->getMotionAccel()!=maccel) || ((*tobj)->getRotationAccel()!=raccel) )
   109 				{
   113                 {
   110 					(*tobj)->update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
   114                     (*tobj)->update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
   111 
   115 
   112 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   116                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   113 						(*listener)->updateTuioObject((*tobj));
   117                         (*listener)->updateTuioObject((*tobj));
   114 				}
   118                 }
   115 			}
   119             }
   116 			else if( strcmp( cmd, "alive" ) == 0 )
   120             else if( strcmp( cmd, "alive" ) == 0 )
   117 			{
   121             {
   118 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   122                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   119 
   123 
   120 				int32 s_id;
   124                 int32 s_id;
   121 				while(!args.Eos())
   125                 while(!args.Eos())
   122 				{
   126                 {
   123 					args >> s_id;
   127                     args >> s_id;
   124 					objectBuffer.push_back((long)s_id);
   128                     objectBuffer.push_back((long)s_id);
   125 					std::list<long>::iterator iter;
   129                     std::list<long>::iterator iter;
   126 					iter = find(aliveObjectList.begin(), aliveObjectList.end(), (long)s_id); 
   130                     iter = find(aliveObjectList.begin(), aliveObjectList.end(), (long)s_id); 
   127 					if (iter != aliveObjectList.end()) aliveObjectList.erase(iter);
   131                     if (iter != aliveObjectList.end()) aliveObjectList.erase(iter);
   128 				}
   132                 }
   129 				args >> EndMessage;
   133                 args >> EndMessage;
   130 				
   134                 
   131 				std::list<long>::iterator alive_iter;
   135                 std::list<long>::iterator alive_iter;
   132 				for (alive_iter=aliveObjectList.begin(); alive_iter != aliveObjectList.end(); alive_iter++)
   136                 for (alive_iter=aliveObjectList.begin(); alive_iter != aliveObjectList.end(); alive_iter++)
   133 				{
   137                 {
   134 					std::list<TuioObject*>::iterator tobj;
   138                     std::list<TuioObject*>::iterator tobj;
   135 					for (tobj=objectList.begin(); tobj!=objectList.end(); tobj++)
   139                     for (tobj=objectList.begin(); tobj!=objectList.end(); tobj++)
   136 					{
   140                     {
   137 						TuioObject *deleteObject = (*tobj);
   141                         TuioObject *deleteObject = (*tobj);
   138 						if(deleteObject->getSessionID()==*alive_iter)
   142                         if(deleteObject->getSessionID()==*alive_iter)
   139 						{
   143                         {
   140 							deleteObject->remove();
   144                             deleteObject->remove();
   141 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   145                             for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   142 								(*listener)->removeTuioObject(deleteObject);
   146                                 (*listener)->removeTuioObject(deleteObject);
   143 							objectList.erase(tobj);
   147                             objectList.erase(tobj);
   144 							delete deleteObject;
   148                             delete deleteObject;
   145 							break;
   149                             break;
   146 						}
   150                         }
   147 					}
   151                     }
   148 				}
   152                 }
   149 				aliveObjectList = objectBuffer;
   153                 aliveObjectList = objectBuffer;
   150 				objectBuffer.clear();
   154                 objectBuffer.clear();
   151 			}
   155             }
   152 			else if( strcmp( cmd, "fseq" ) == 0 )
   156             else if( strcmp( cmd, "fseq" ) == 0 )
   153 			{
   157             {
   154 				if(currentFrame>0) lastFrame = currentFrame;
   158                 if(currentFrame>0) lastFrame = currentFrame;
   155 				args >> currentFrame  >> EndMessage;
   159                 args >> currentFrame  >> EndMessage;
   156 
   160 
   157 				if ((currentFrame>=lastFrame) || (currentFrame<0))
   161                 if ((currentFrame>=lastFrame) || (currentFrame<0))
   158 				{
   162                 {
   159 					long currentTime = lastTime;
   163                     long currentTime = lastTime;
   160 					if (currentFrame>lastFrame)
   164                     if (currentFrame>lastFrame)
   161 					{
   165                     {
   162 						currentTime = getCurrentTime()-startTime;
   166                         currentTime = getCurrentTime()-startTime;
   163 						lastTime = currentTime;
   167                         lastTime = currentTime;
   164 					}
   168                     }
   165 					
   169                     
   166 					for (std::list<TuioObject*>::iterator refreshObject=objectList.begin(); refreshObject!=objectList.end(); refreshObject++)
   170                     for (std::list<TuioObject*>::iterator refreshObject=objectList.begin(); refreshObject!=objectList.end(); refreshObject++)
   167 						if ((*refreshObject)->getUpdateTime()==TUIO_UNDEFINED) (*refreshObject)->setUpdateTime(currentTime);
   171                         if ((*refreshObject)->getUpdateTime()==TUIO_UNDEFINED) (*refreshObject)->setUpdateTime(currentTime);
   168 					
   172                     
   169 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener!=listenerList.end(); listener++)
   173                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener!=listenerList.end(); listener++)
   170 						(*listener)->refresh(currentTime);
   174                         (*listener)->refresh(currentTime);
   171 				}
   175                 }
   172 			}
   176             }
   173 		}
   177         }
   174 		else if( strcmp( msg.AddressPattern(), "/tuio/3Dcur" ) == 0 )
   178         else if( strcmp( msg.AddressPattern(), "/tuio/3Dcur" ) == 0 )
   175 		{
   179         {
   176 			const char* cmd;
   180             const char* cmd;
   177 			args >> cmd;
   181             args >> cmd;
   178 			
   182             
   179 			if( strcmp( cmd, "set" ) == 0 )
   183             if( strcmp( cmd, "set" ) == 0 )
   180 			{
   184             {
   181 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   185                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   182 
   186 
   183 				int32 s_id;
   187                 int32 s_id;
   184 				float xpos, ypos, zpos, xspeed, yspeed, maccel;
   188                 float xpos, ypos, zpos, xspeed, yspeed, maccel;
   185 				//Modifié par alexandre.bastien@iri.centrepompidou.fr
   189                 //Modifié par alexandre.bastien@iri.centrepompidou.fr
   186 				args >> s_id >> xpos >> ypos >> zpos >> xspeed >> yspeed >> maccel >> EndMessage;
   190                 args >> s_id >> xpos >> ypos >> zpos >> xspeed >> yspeed >> maccel >> EndMessage;
   187 				std::list<TuioCursor*>::iterator tcur;
   191                 std::list<TuioCursor*>::iterator tcur;
   188 				for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
   192                 for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
   189 					if((*tcur)->getSessionID()==(long)s_id) break;
   193                     if((*tcur)->getSessionID()==(long)s_id) break;
   190 
   194 
   191 				if (tcur == cursorList.end())
   195                 if (tcur == cursorList.end())
   192 				{
   196                 {
   193 					int f_id = (int)cursorList.size();
   197                     int f_id = (int)cursorList.size();
   194 					if ((int)(cursorList.size())<=maxFingerID)
   198                     if ((int)(cursorList.size())<=maxFingerID)
   195 					{
   199                     {
   196 						std::list<TuioCursor*>::iterator closestCursor = freeCursorList.begin();
   200                         std::list<TuioCursor*>::iterator closestCursor = freeCursorList.begin();
   197 						//Modifié par alexandre.bastien@iri.centrepompidou.fr
   201                         //Modifié par alexandre.bastien@iri.centrepompidou.fr
   198 						for(std::list<TuioCursor*>::iterator testCursor = freeCursorList.begin();testCursor!= freeCursorList.end(); testCursor++)
   202                         for(std::list<TuioCursor*>::iterator testCursor = freeCursorList.begin();testCursor!= freeCursorList.end(); testCursor++)
   199 						{
   203                         {
   200 							if((*testCursor)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
   204                             if((*testCursor)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
   201 						}
   205                         }
   202 						f_id = (*closestCursor)->getFingerID();
   206                         f_id = (*closestCursor)->getFingerID();
   203 						freeCursorList.erase(closestCursor);
   207                         freeCursorList.erase(closestCursor);
   204 						delete *closestCursor;
   208                         delete *closestCursor;
   205 					}
   209                     }
   206 					else maxFingerID = f_id;	
   210                     else maxFingerID = f_id;    
   207 					//Modifié par alexandre.bastien@iri.centrepompidou.fr
   211                     //Modifié par alexandre.bastien@iri.centrepompidou.fr
   208 					TuioCursor *addCursor = new TuioCursor((long)s_id,f_id,xpos,ypos,zpos);
   212                     TuioCursor *addCursor = new TuioCursor((long)s_id,f_id,xpos,ypos,zpos);
   209 					cursorList.push_back(addCursor);
   213                     cursorList.push_back(addCursor);
   210 					
   214                     
   211 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   215                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   212 						(*listener)->addTuioCursor(addCursor);
   216                         (*listener)->addTuioCursor(addCursor);
   213 					
   217                     
   214 				//Modifié par alexandre.bastien@iri.centrepompidou.fr
   218                 //Modifié par alexandre.bastien@iri.centrepompidou.fr
   215 				}
   219                 }
   216 				else if ( ((*tcur)->getX()!=xpos) || ((*tcur)->getY()!=ypos) || ((*tcur)->getZ()!=zpos) || ((*tcur)->getXSpeed()!=xspeed) || ((*tcur)->getYSpeed()!=yspeed) || ((*tcur)->getMotionAccel()!=maccel) )
   220                 else if ( ((*tcur)->getX()!=xpos) || ((*tcur)->getY()!=ypos) || ((*tcur)->getZ()!=zpos) || ((*tcur)->getXSpeed()!=xspeed) || ((*tcur)->getYSpeed()!=yspeed) || ((*tcur)->getMotionAccel()!=maccel) )
   217 				{
   221                 {
   218 					(*tcur)->update(xpos,ypos,zpos,xspeed,yspeed,maccel);
   222                     (*tcur)->update(xpos,ypos,zpos,xspeed,yspeed,maccel);
   219 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   223                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   220 						(*listener)->updateTuioCursor((*tcur));
   224                         (*listener)->updateTuioCursor((*tcur));
   221 				}
   225                 }
   222 			}
   226             }
   223 			else if( strcmp( cmd, "alive" ) == 0 )
   227             else if( strcmp( cmd, "alive" ) == 0 )
   224 			{
   228             {
   225 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   229                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   226 
   230 
   227 				int32 s_id;
   231                 int32 s_id;
   228 				while(!args.Eos())
   232                 while(!args.Eos())
   229 				{
   233                 {
   230 					args >> s_id;
   234                     args >> s_id;
   231 					cursorBuffer.push_back((long)s_id);
   235                     cursorBuffer.push_back((long)s_id);
   232 					std::list<long>::iterator iter;
   236                     std::list<long>::iterator iter;
   233 					iter = find(aliveCursorList.begin(), aliveCursorList.end(), (long)s_id); 
   237                     iter = find(aliveCursorList.begin(), aliveCursorList.end(), (long)s_id); 
   234 					if (iter != aliveCursorList.end()) aliveCursorList.erase(iter);
   238                     if (iter != aliveCursorList.end()) aliveCursorList.erase(iter);
   235 				}
   239                 }
   236 				args >> EndMessage;
   240                 args >> EndMessage;
   237 				std::list<long>::iterator alive_iter;
   241                 std::list<long>::iterator alive_iter;
   238 				for (alive_iter=aliveCursorList.begin(); alive_iter != aliveCursorList.end(); alive_iter++)
   242                 for (alive_iter=aliveCursorList.begin(); alive_iter != aliveCursorList.end(); alive_iter++)
   239 				{
   243                 {
   240 					std::list<TuioCursor*>::iterator tcur;
   244                     std::list<TuioCursor*>::iterator tcur;
   241 					for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
   245                     for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
   242 					{
   246                     {
   243 						TuioCursor *deleteCursor = (*tcur);
   247                         TuioCursor *deleteCursor = (*tcur);
   244 						if(deleteCursor->getSessionID()==*alive_iter)
   248                         if(deleteCursor->getSessionID()==*alive_iter)
   245 						{
   249                         {
   246 							cursorList.erase(tcur);
   250                             cursorList.erase(tcur);
   247 							deleteCursor->remove();
   251                             deleteCursor->remove();
   248 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   252                             for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   249 								(*listener)->removeTuioCursor(deleteCursor);
   253                                 (*listener)->removeTuioCursor(deleteCursor);
   250 							
   254                             
   251 							if (deleteCursor->getFingerID()==maxFingerID)
   255                             if (deleteCursor->getFingerID()==maxFingerID)
   252 							{
   256                             {
   253 								maxFingerID = -1;
   257                                 maxFingerID = -1;
   254 								delete deleteCursor;
   258                                 delete deleteCursor;
   255 								
   259                                 
   256 								if (cursorList.size()>0)
   260                                 if (cursorList.size()>0)
   257 								{
   261                                 {
   258 									std::list<TuioCursor*>::iterator clist;
   262                                     std::list<TuioCursor*>::iterator clist;
   259 									for (clist=cursorList.begin(); clist != cursorList.end(); clist++)
   263                                     for (clist=cursorList.begin(); clist != cursorList.end(); clist++)
   260 									{
   264                                     {
   261 										int f_id = (*clist)->getFingerID();
   265                                         int f_id = (*clist)->getFingerID();
   262 										if (f_id>maxFingerID) maxFingerID=f_id;
   266                                         if (f_id>maxFingerID) maxFingerID=f_id;
   263 									}
   267                                     }
   264 									std::list<TuioCursor*>::iterator flist;
   268                                     std::list<TuioCursor*>::iterator flist;
   265 									for (flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++)
   269                                     for (flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++)
   266 									{
   270                                     {
   267 										TuioCursor *freeCursor = (*flist);
   271                                         TuioCursor *freeCursor = (*flist);
   268 										if (freeCursor->getFingerID()>maxFingerID) delete freeCursor;
   272                                         if (freeCursor->getFingerID()>maxFingerID) delete freeCursor;
   269 										else freeCursorBuffer.push_back(freeCursor);
   273                                         else freeCursorBuffer.push_back(freeCursor);
   270 									}
   274                                     }
   271 									freeCursorList = freeCursorBuffer;
   275                                     freeCursorList = freeCursorBuffer;
   272 									freeCursorBuffer.clear();
   276                                     freeCursorBuffer.clear();
   273 								}
   277                                 }
   274 							}
   278                             }
   275 							else if (deleteCursor->getFingerID()<maxFingerID) freeCursorList.push_back(deleteCursor);
   279                             else if (deleteCursor->getFingerID()<maxFingerID) freeCursorList.push_back(deleteCursor);
   276 							break;
   280                             break;
   277 						}
   281                         }
   278 					}
   282                     }
   279 				}
   283                 }
   280 				aliveCursorList = cursorBuffer;
   284                 aliveCursorList = cursorBuffer;
   281 				cursorBuffer.clear();
   285                 cursorBuffer.clear();
   282 			}
   286             }
   283 			else if( strcmp( cmd, "fseq" ) == 0 )
   287             else if( strcmp( cmd, "fseq" ) == 0 )
   284 			{
   288             {
   285 				if(currentFrame>0) lastFrame = currentFrame;
   289                 if(currentFrame>0) lastFrame = currentFrame;
   286 				args >> currentFrame  >> EndMessage;
   290                 args >> currentFrame  >> EndMessage;
   287 
   291 
   288 				if ((currentFrame>=lastFrame) || (currentFrame<0))
   292                 if ((currentFrame>=lastFrame) || (currentFrame<0))
   289 				{
   293                 {
   290 					long currentTime = lastTime;
   294                     long currentTime = lastTime;
   291 					if (currentFrame>lastFrame)
   295                     if (currentFrame>lastFrame)
   292 					{
   296                     {
   293 						currentTime = getCurrentTime()-startTime;
   297                         currentTime = getCurrentTime()-startTime;
   294 						lastTime = currentTime;
   298                         lastTime = currentTime;
   295 					}
   299                     }
   296 					for (std::list<TuioCursor*>::iterator refreshCursor=cursorList.begin(); refreshCursor!=cursorList.end(); refreshCursor++)
   300                     for (std::list<TuioCursor*>::iterator refreshCursor=cursorList.begin(); refreshCursor!=cursorList.end(); refreshCursor++)
   297 						if ((*refreshCursor)->getUpdateTime()==TUIO_UNDEFINED) (*refreshCursor)->setUpdateTime(currentTime);
   301                         if ((*refreshCursor)->getUpdateTime()==TUIO_UNDEFINED) (*refreshCursor)->setUpdateTime(currentTime);
   298 
   302 
   299 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   303                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   300 						(*listener)->refresh(currentTime);
   304                         (*listener)->refresh(currentTime);
   301 				}
   305                 }
   302 			}
   306             }
   303 		}
   307         }
   304 		else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
   308         else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
   305 		{
   309         {
   306 			const char* cmd;
   310             const char* cmd;
   307 			args >> cmd;
   311             args >> cmd;
   308 			
   312             
   309 			if( strcmp( cmd, "set" ) == 0 )
   313             if( strcmp( cmd, "set" ) == 0 )
   310 			{
   314             {
   311 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   315                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   312 
   316 
   313 				int32 s_id;
   317                 int32 s_id;
   314 				const char* code;
   318                 const char* code;
   315 				args >> s_id >> code >> EndMessage;
   319                 args >> s_id >> code >> EndMessage;
   316 				std::list<TuioString*>::iterator tstr;
   320                 std::list<TuioString*>::iterator tstr;
   317 				for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   321                 for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   318 					if((*tstr)->getSessionID()==(long)s_id) break;
   322                     if((*tstr)->getSessionID()==(long)s_id) break;
   319 
   323 
   320 				if (tstr == stringList.end())
   324                 if (tstr == stringList.end())
   321 				{
   325                 {
   322 					int s_id = (int)stringList.size();//
   326                     int s_id = (int)stringList.size();//
   323 					if ((int)(stringList.size())<=maxStringID)//
   327                     if ((int)(stringList.size())<=maxStringID)//
   324 					{//
   328                     {//
   325 						std::list<TuioString*>::iterator closestString = freeStringList.begin();//
   329                         std::list<TuioString*>::iterator closestString = freeStringList.begin();//
   326 						//Modifié par alexandre.bastien@iri.centrepompidou.fr
   330                         //Modifié par alexandre.bastien@iri.centrepompidou.fr
   327 
   331 
   328 						//for(std::list<TuioString*>::iterator testString = freeStringList.begin();testString!= freeStringList.end(); testString++)
   332                         //for(std::list<TuioString*>::iterator testString = freeStringList.begin();testString!= freeStringList.end(); testString++)
   329 						//{
   333                         //{
   330 							//if((*testString)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
   334                             //if((*testString)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
   331 						//}
   335                         //}
   332 						s_id = (*closestString)->getStringID();//
   336                         s_id = (*closestString)->getStringID();//
   333 						freeStringList.erase(closestString);//
   337                         freeStringList.erase(closestString);//
   334 						delete *closestString;//
   338                         delete *closestString;//
   335 					}//
   339                     }//
   336 					else maxStringID = s_id;//
   340                     else maxStringID = s_id;//
   337 					//Modifié par alexandre.bastien@iri.centrepompidou.fr
   341                     //Modifié par alexandre.bastien@iri.centrepompidou.fr
   338 					TuioString *addString = new TuioString((long)s_id,-1,code);
   342                     TuioString *addString = new TuioString((long)s_id,-1,code);
   339 					stringList.push_back(addString);
   343                     stringList.push_back(addString);
   340 					
   344                     
   341 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   345                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   342 						(*listener)->addTuioString(addString);
   346                         (*listener)->addTuioString(addString);
   343 					
   347                     
   344 				//Modifié par alexandre.bastien@iri.centrepompidou.fr
   348                 //Modifié par alexandre.bastien@iri.centrepompidou.fr
   345 				}
   349                 }
   346 				else if ( ((*tstr)->getCode()!=code) )
   350                 else if ( ((*tstr)->getCode()!=code) )
   347 				{
   351                 {
   348 					(*tstr)->update(code);
   352                     (*tstr)->update(code);
   349 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   353                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   350 						(*listener)->updateTuioString((*tstr));
   354                         (*listener)->updateTuioString((*tstr));
   351 				}
   355                 }
   352 			}
   356             }
   353 			else if( strcmp( cmd, "alive" ) == 0 )
   357             else if( strcmp( cmd, "alive" ) == 0 )
   354 			{
   358             {
   355 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   359                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   356 
   360 
   357 				int32 s_id;
   361                 int32 s_id;
   358 				while(!args.Eos())
   362                 while(!args.Eos())
   359 				{
   363                 {
   360 					args >> s_id;
   364                     args >> s_id;
   361 					stringBuffer.push_back((long)s_id);
   365                     stringBuffer.push_back((long)s_id);
   362 					std::list<long>::iterator iter;
   366                     std::list<long>::iterator iter;
   363 					iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
   367                     iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
   364 					if (iter != aliveStringList.end()) aliveStringList.erase(iter);
   368                     if (iter != aliveStringList.end()) aliveStringList.erase(iter);
   365 				}
   369                 }
   366 				args >> EndMessage;
   370                 args >> EndMessage;
   367 				std::list<long>::iterator alive_iter;
   371                 std::list<long>::iterator alive_iter;
   368 				for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
   372                 for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
   369 				{
   373                 {
   370 					std::list<TuioString*>::iterator tstr;
   374                     std::list<TuioString*>::iterator tstr;
   371 					for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   375                     for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   372 					{
   376                     {
   373 						TuioString *deleteString = (*tstr);
   377                         TuioString *deleteString = (*tstr);
   374 						if(deleteString->getSessionID()==*alive_iter)
   378                         if(deleteString->getSessionID()==*alive_iter)
   375 						{
   379                         {
   376 							stringList.erase(tstr);
   380                             stringList.erase(tstr);
   377 							deleteString->remove();
   381                             deleteString->remove();
   378 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   382                             for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   379 								(*listener)->removeTuioString(deleteString);
   383                                 (*listener)->removeTuioString(deleteString);
   380 							
   384                             
   381 							if (deleteString->getStringID()==maxStringID)//
   385                             if (deleteString->getStringID()==maxStringID)//
   382 							{//
   386                             {//
   383 								maxStringID = -1;//
   387                                 maxStringID = -1;//
   384 								delete deleteString;
   388                                 delete deleteString;
   385 								
   389                                 
   386 								if (stringList.size()>0)
   390                                 if (stringList.size()>0)
   387 								{
   391                                 {
   388 									std::list<TuioString*>::iterator clist;//
   392                                     std::list<TuioString*>::iterator clist;//
   389 									for (clist=stringList.begin(); clist != stringList.end(); clist++)//
   393                                     for (clist=stringList.begin(); clist != stringList.end(); clist++)//
   390 									{//
   394                                     {//
   391 										int s_id = (*clist)->getStringID();//
   395                                         int s_id = (*clist)->getStringID();//
   392 										if (s_id>maxStringID) maxStringID=s_id;//
   396                                         if (s_id>maxStringID) maxStringID=s_id;//
   393 									}//
   397                                     }//
   394 									std::list<TuioString*>::iterator flist;
   398                                     std::list<TuioString*>::iterator flist;
   395 									for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
   399                                     for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
   396 									{
   400                                     {
   397 										TuioString *freeString = (*flist);
   401                                         TuioString *freeString = (*flist);
   398 										if (freeString->getStringID()>maxStringID) delete freeString;//
   402                                         if (freeString->getStringID()>maxStringID) delete freeString;//
   399 										else freeStringBuffer.push_back(freeString);//
   403                                         else freeStringBuffer.push_back(freeString);//
   400 										freeStringBuffer.push_back(freeString);
   404                                         freeStringBuffer.push_back(freeString);
   401 									}
   405                                     }
   402 									freeStringList = freeStringBuffer;
   406                                     freeStringList = freeStringBuffer;
   403 									freeStringBuffer.clear();
   407                                     freeStringBuffer.clear();
   404 								}
   408                                 }
   405 							}//
   409                             }//
   406 							else if (deleteString->getStringID()<maxStringID) freeStringList.push_back(deleteString);//
   410                             else if (deleteString->getStringID()<maxStringID) freeStringList.push_back(deleteString);//
   407 							break;
   411                             break;
   408 						}
   412                         }
   409 					}
   413                     }
   410 				}
   414                 }
   411 				aliveStringList = stringBuffer;
   415                 aliveStringList = stringBuffer;
   412 				stringBuffer.clear();
   416                 stringBuffer.clear();
   413 			}
   417             }
   414 			else if( strcmp( cmd, "fseq" ) == 0 )
   418             else if( strcmp( cmd, "fseq" ) == 0 )
   415 			{
   419             {
   416 				if(currentFrame>0) lastFrame = currentFrame;
   420                 if(currentFrame>0) lastFrame = currentFrame;
   417 				args >> currentFrame  >> EndMessage;
   421                 args >> currentFrame  >> EndMessage;
   418 
   422 
   419 				if ((currentFrame>=lastFrame) || (currentFrame<0))
   423                 if ((currentFrame>=lastFrame) || (currentFrame<0))
   420 				{
   424                 {
   421 					long currentTime = lastTime;
   425                     long currentTime = lastTime;
   422 					if (currentFrame>lastFrame)
   426                     if (currentFrame>lastFrame)
   423 					{
   427                     {
   424 						currentTime = getCurrentTime()-startTime;
   428                         currentTime = getCurrentTime()-startTime;
   425 						lastTime = currentTime;
   429                         lastTime = currentTime;
   426 					}
   430                     }
   427 					for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
   431                     for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
   428 						if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
   432                         if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
   429 
   433 
   430 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   434                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   431 						(*listener)->refresh(currentTime);
   435                         (*listener)->refresh(currentTime);
   432 				}
   436                 }
   433 			}
   437             }
   434 		}
   438         }
   435 		//Ajouté par alexandre.bastien@iri.centrepompidou.fr
   439         //Ajouté par alexandre.bastien@iri.centrepompidou.fr
   436 		/*else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
   440         /*else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
   437 		{
   441         {
   438 			const char* cmd;
   442             const char* cmd;
   439 			args >> cmd;
   443             args >> cmd;
   440 			
   444             
   441 			if( strcmp( cmd, "set" ) == 0 )
   445             if( strcmp( cmd, "set" ) == 0 )
   442 			{
   446             {
   443 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   447                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   444 				int32 s_id;
   448                 int32 s_id;
   445 				const char* code;
   449                 const char* code;
   446 				args >> s_id >> code >> EndMessage;
   450                 args >> s_id >> code >> EndMessage;
   447 				std::list<TuioString*>::iterator tstr;
   451                 std::list<TuioString*>::iterator tstr;
   448 				for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   452                 for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   449 					if((*tstr)->getSessionID()==(long)s_id) break;
   453                     if((*tstr)->getSessionID()==(long)s_id) break;
   450 
   454 
   451 				if (tstr == stringList.end())
   455                 if (tstr == stringList.end())
   452 				{
   456                 {
   453 					TuioString *addString = new TuioString((long)s_id,code);
   457                     TuioString *addString = new TuioString((long)s_id,code);
   454 					stringList.push_back(addString);
   458                     stringList.push_back(addString);
   455 					
   459                     
   456 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   460                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   457 						(*listener)->addTuioString(addString);
   461                         (*listener)->addTuioString(addString);
   458 					
   462                     
   459 					
   463                     
   460 				}
   464                 }
   461 				else if ( ((*tstr)->getCode()!=code) )
   465                 else if ( ((*tstr)->getCode()!=code) )
   462 				{
   466                 {
   463 					(*tstr)->update(code);
   467                     (*tstr)->update(code);
   464 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   468                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   465 						(*listener)->updateTuioString((*tstr));
   469                         (*listener)->updateTuioString((*tstr));
   466 				}
   470                 }
   467 			}
   471             }
   468 			else if( strcmp( cmd, "alive" ) == 0 )
   472             else if( strcmp( cmd, "alive" ) == 0 )
   469 			{
   473             {
   470 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   474                 if ((currentFrame<lastFrame) && (currentFrame>0)) return;
   471 					
   475                     
   472 				int32 s_id;
   476                 int32 s_id;
   473 				while(!args.Eos())
   477                 while(!args.Eos())
   474 				{
   478                 {
   475 					args >> s_id;
   479                     args >> s_id;
   476 					stringBuffer.push_back((long)s_id);
   480                     stringBuffer.push_back((long)s_id);
   477 					std::list<long>::iterator iter;
   481                     std::list<long>::iterator iter;
   478 					iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
   482                     iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
   479 					if (iter != aliveStringList.end()) aliveStringList.erase(iter);
   483                     if (iter != aliveStringList.end()) aliveStringList.erase(iter);
   480 				}
   484                 }
   481 				args >> EndMessage;
   485                 args >> EndMessage;
   482 				
   486                 
   483 				std::list<long>::iterator alive_iter;
   487                 std::list<long>::iterator alive_iter;
   484 				for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
   488                 for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
   485 				{
   489                 {
   486 					std::list<TuioString*>::iterator tstr;
   490                     std::list<TuioString*>::iterator tstr;
   487 					for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   491                     for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
   488 					{
   492                     {
   489 						TuioString *deleteString = (*tstr);
   493                         TuioString *deleteString = (*tstr);
   490 						if(deleteString->getSessionID()==*alive_iter)
   494                         if(deleteString->getSessionID()==*alive_iter)
   491 						{
   495                         {
   492 							stringList.erase(tstr);
   496                             stringList.erase(tstr);
   493 							deleteString->remove();
   497                             deleteString->remove();
   494 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   498                             for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   495 								(*listener)->removeTuioString(deleteString);
   499                                 (*listener)->removeTuioString(deleteString);
   496 								
   500                                 
   497 							if (stringList.size()>0)
   501                             if (stringList.size()>0)
   498 							{
   502                             {
   499 								std::list<TuioString*>::iterator flist;
   503                                 std::list<TuioString*>::iterator flist;
   500 								for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
   504                                 for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
   501 								{
   505                                 {
   502 									TuioString *freeString = (*flist);
   506                                     TuioString *freeString = (*flist);
   503 								}
   507                                 }
   504 								freeStringList = freeStringBuffer;
   508                                 freeStringList = freeStringBuffer;
   505 								freeStringBuffer.clear();
   509                                 freeStringBuffer.clear();
   506 							}
   510                             }
   507 						}
   511                         }
   508 						break;
   512                         break;
   509 					}
   513                     }
   510 				}
   514                 }
   511 				aliveStringList = stringBuffer;
   515                 aliveStringList = stringBuffer;
   512 				stringBuffer.clear();
   516                 stringBuffer.clear();
   513 			}
   517             }
   514 			else if( strcmp( cmd, "fseq" ) == 0 )
   518             else if( strcmp( cmd, "fseq" ) == 0 )
   515 			{
   519             {
   516 				if(currentFrame>0) lastFrame = currentFrame;
   520                 if(currentFrame>0) lastFrame = currentFrame;
   517 				args >> currentFrame  >> EndMessage;
   521                 args >> currentFrame  >> EndMessage;
   518 
   522 
   519 				if ((currentFrame>=lastFrame) || (currentFrame<0))
   523                 if ((currentFrame>=lastFrame) || (currentFrame<0))
   520 				{
   524                 {
   521 					long currentTime = lastTime;
   525                     long currentTime = lastTime;
   522 					if (currentFrame>lastFrame)
   526                     if (currentFrame>lastFrame)
   523 					{
   527                     {
   524 						currentTime = getCurrentTime()-startTime;
   528                         currentTime = getCurrentTime()-startTime;
   525 						lastTime = currentTime;
   529                         lastTime = currentTime;
   526 					}
   530                     }
   527 					
   531                     
   528 					for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
   532                     for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
   529 						if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
   533                         if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
   530 
   534 
   531 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   535                     for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
   532 						(*listener)->refresh(currentTime);
   536                         (*listener)->refresh(currentTime);
   533 				}
   537                 }
   534 			}
   538             }
   535 		}*/
   539         }*/
   536 	}
   540     }
   537 	catch( Exception& e )
   541     catch( Exception& e )
   538 	{
   542     {
   539 		std::cout << "error while parsing message: "<< msg.AddressPattern() << ": " << e.what() << "\n";
   543         std::cout << "error while parsing message: "<< msg.AddressPattern() << ": " << e.what() << "\n";
   540 	}
   544     }
   541 }
   545 }
   542 
   546 
   543 void TuioClient::ProcessPacket( const char *data, int size, const IpEndpointName& remoteEndpoint ) {
   547 void TuioClient::ProcessPacket( const char *data, int size, const IpEndpointName& remoteEndpoint ) {
   544 	if (listenerList.size()==0) return;
   548     if (listenerList.size()==0) return;
   545 	ReceivedPacket p( data, size );
   549     ReceivedPacket p( data, size );
   546 	if(p.IsBundle()) ProcessBundle( ReceivedBundle(p), remoteEndpoint);
   550     if(p.IsBundle()) ProcessBundle( ReceivedBundle(p), remoteEndpoint);
   547         else ProcessMessage( ReceivedMessage(p), remoteEndpoint);
   551         else ProcessMessage( ReceivedMessage(p), remoteEndpoint);
   548 }
   552 }
   549 
   553 
   550 void TuioClient::start(bool lk) {
   554 void TuioClient::start(bool lk) {
   551 
   555 
   552 	if (socket==NULL) return;
   556     if (socket==NULL) return;
   553 
   557 
   554 	locked = lk;
   558     locked = lk;
   555 	if (!locked) {
   559     if (!locked) {
   556 		#ifndef WIN32
   560         #ifndef WIN32
   557 		pthread_create(&thread , NULL, ThreadFunc, this);
   561         pthread_create(&thread , NULL, ThreadFunc, this);
   558 		#else
   562         #else
   559 		DWORD threadId;
   563         DWORD threadId;
   560 		thread = CreateThread( 0, 0, ThreadFunc, this, 0, &threadId );
   564         thread = CreateThread( 0, 0, ThreadFunc, this, 0, &threadId );
   561 		#endif
   565         #endif
   562 	} else socket->Run();
   566     } else socket->Run();
   563 	
   567     
   564 	startTime = getCurrentTime();
   568     startTime = getCurrentTime();
   565 	lastTime = 0;
   569     lastTime = 0;
   566 
   570 
   567 	running = true;
   571     running = true;
   568 }
   572 }
   569 
   573 
   570 void TuioClient::stop() {
   574 void TuioClient::stop() {
   571 
   575 
   572 	if (socket==NULL) return;
   576     if (socket==NULL) return;
   573 	socket->Break();
   577     socket->Break();
   574 
   578 
   575 	if (!locked) {
   579     if (!locked) {
   576 		#ifdef WIN32
   580         #ifdef WIN32
   577 		if( thread ) CloseHandle( thread );
   581         if( thread ) CloseHandle( thread );
   578 		#endif
   582         #endif
   579 		thread = 0;
   583         thread = 0;
   580 		locked = false;
   584         locked = false;
   581 	}
   585     }
   582 	running = false;
   586     running = false;
   583 }
   587 }
   584 
   588 
   585 void TuioClient::addTuioListener(TuioListener *listener) {
   589 void TuioClient::addTuioListener(TuioListener *listener) {
   586 	listenerList.push_back(listener);
   590     listenerList.push_back(listener);
   587 }
   591 }
   588 
   592 
   589 void TuioClient::removeTuioListener(TuioListener *listener) {
   593 void TuioClient::removeTuioListener(TuioListener *listener) {
   590 	std::list<TuioListener*>::iterator result = find(listenerList.begin(),listenerList.end(),listener);
   594     std::list<TuioListener*>::iterator result = find(listenerList.begin(),listenerList.end(),listener);
   591 	if (result!=listenerList.end()) listenerList.remove(listener);
   595     if (result!=listenerList.end()) listenerList.remove(listener);
   592 }
   596 }
   593 
   597 
   594 TuioObject* TuioClient::getTuioObject(long s_id) {
   598 TuioObject* TuioClient::getTuioObject(long s_id) {
   595 	for (std::list<TuioObject*>::iterator iter=objectList.begin(); iter != objectList.end(); iter++)
   599     for (std::list<TuioObject*>::iterator iter=objectList.begin(); iter != objectList.end(); iter++)
   596 		if((*iter)->getSessionID()==s_id) return (*iter);
   600         if((*iter)->getSessionID()==s_id) return (*iter);
   597 		
   601         
   598 	return NULL;
   602     return NULL;
   599 }
   603 }
   600 
   604 
   601 TuioCursor* TuioClient::getTuioCursor(long s_id) {
   605 TuioCursor* TuioClient::getTuioCursor(long s_id) {
   602 	for (std::list<TuioCursor*>::iterator iter=cursorList.begin(); iter != cursorList.end(); iter++)
   606     for (std::list<TuioCursor*>::iterator iter=cursorList.begin(); iter != cursorList.end(); iter++)
   603 		if((*iter)->getSessionID()==s_id) return (*iter);
   607         if((*iter)->getSessionID()==s_id) return (*iter);
   604 		
   608         
   605 	return NULL;
   609     return NULL;
   606 }
   610 }
   607 
   611 
   608 TuioString* TuioClient::getTuioString(long s_id) {
   612 TuioString* TuioClient::getTuioString(long s_id) {
   609 	for (std::list<TuioString*>::iterator iter=stringList.begin(); iter != stringList.end(); iter++)
   613     for (std::list<TuioString*>::iterator iter=stringList.begin(); iter != stringList.end(); iter++)
   610 		if((*iter)->getSessionID()==s_id) return (*iter);
   614         if((*iter)->getSessionID()==s_id) return (*iter);
   611 		
   615         
   612 	return NULL;
   616     return NULL;
   613 }
   617 }
   614 
   618 
   615 std::list<TuioObject*> TuioClient::getTuioObjects() {
   619 std::list<TuioObject*> TuioClient::getTuioObjects() {
   616 	return objectList;
   620     return objectList;
   617 }
   621 }
   618 
   622 
   619 std::list<TuioCursor*> TuioClient::getTuioCursors() {
   623 std::list<TuioCursor*> TuioClient::getTuioCursors() {
   620 	return cursorList;
   624     return cursorList;
   621 }
   625 }
   622 
   626 
   623 std::list<TuioString*> TuioClient::getTuioStrings() {
   627 std::list<TuioString*> TuioClient::getTuioStrings() {
   624 	return stringList;
   628     return stringList;
   625 }
   629 }
   626 
   630 
   627 long TuioClient::getCurrentTime() {
   631 long TuioClient::getCurrentTime() {
   628 	
   632     
   629 	#ifdef WIN32
   633     #ifdef WIN32
   630 		long timestamp = GetTickCount();
   634         long timestamp = GetTickCount();
   631 	#else
   635     #else
   632 		struct timeval tv;
   636         struct timeval tv;
   633 		struct timezone tz;
   637         struct timezone tz;
   634 		gettimeofday(&tv,&tz);
   638         gettimeofday(&tv,&tz);
   635 		long timestamp = (tv.tv_sec*1000)+(tv.tv_usec/1000);
   639         long timestamp = (tv.tv_sec*1000)+(tv.tv_usec/1000);
   636 	#endif
   640     #endif
   637 		
   641         
   638 		return timestamp;
   642         return timestamp;
   639 }
   643 }