front_idill/extern/fajran-npTuioClient/TuioClient/TuioClient.cpp
changeset 27 6c08d4d7219e
parent 25 a7b0e40bcab0
child 28 9ccef81f02ab
--- a/front_idill/extern/fajran-npTuioClient/TuioClient/TuioClient.cpp	Fri Apr 06 18:36:40 2012 +0200
+++ b/front_idill/extern/fajran-npTuioClient/TuioClient/TuioClient.cpp	Thu Apr 12 13:09:46 2012 +0200
@@ -30,6 +30,8 @@
 	static_cast<TuioClient*>(obj)->socket->Run();
 	return 0;
 };
+
+using namespace std;
 	
 TuioClient::TuioClient() {
 	TuioClient(3333);
@@ -52,7 +54,7 @@
 
 	locked = false;
 	running = false;
-	currentFrame = lastFrame = maxFingerID = -1;
+	currentFrame = lastFrame = maxFingerID = maxStringID = -1;
 }
 
 TuioClient::~TuioClient() {
@@ -68,17 +70,20 @@
 	}
 }
 
-void TuioClient::ProcessMessage( const ReceivedMessage& msg, const IpEndpointName& remoteEndpoint) {
-	try {
+void TuioClient::ProcessMessage( const ReceivedMessage& msg, const IpEndpointName& remoteEndpoint)
+{
+	try
+	{
 		ReceivedMessageArgumentStream args = msg.ArgumentStream();
 		ReceivedMessage::const_iterator arg = msg.ArgumentsBegin();
 
-		if( strcmp( msg.AddressPattern(), "/tuio/2Dobj" ) == 0 ){
-
+		if( strcmp( msg.AddressPattern(), "/tuio/2Dobj" ) == 0 )
+		{
 			const char* cmd;
 			args >> cmd;
 			
-			if( strcmp( cmd, "set" ) == 0 ){	
+			if( strcmp( cmd, "set" ) == 0 )
+			{
 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
 
 				int32 s_id, f_id;
@@ -90,7 +95,8 @@
 				for (tobj=objectList.begin(); tobj!= objectList.end(); tobj++)
 					if((*tobj)->getSessionID()==(long)s_id) break;
 
-				if (tobj == objectList.end()) {
+				if (tobj == objectList.end())
+				{
 
 					TuioObject *addObject = new TuioObject((long)s_id,(int)f_id,xpos,ypos,angle);
 					objectList.push_back(addObject);
@@ -98,21 +104,24 @@
 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
 						(*listener)->addTuioObject(addObject);
 
-				} 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) ) {
+				}
+				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) )
+				{
 					(*tobj)->update(xpos,ypos,angle,xspeed,yspeed,rspeed,maccel,raccel);
 
 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
 						(*listener)->updateTuioObject((*tobj));
 				}
-
-			} else if( strcmp( cmd, "alive" ) == 0 ){
+			}
+			else if( strcmp( cmd, "alive" ) == 0 )
+			{
 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
 
 				int32 s_id;
-				while(!args.Eos()) {
+				while(!args.Eos())
+				{
 					args >> s_id;
 					objectBuffer.push_back((long)s_id);
-					
 					std::list<long>::iterator iter;
 					iter = find(aliveObjectList.begin(), aliveObjectList.end(), (long)s_id); 
 					if (iter != aliveObjectList.end()) aliveObjectList.erase(iter);
@@ -120,11 +129,14 @@
 				args >> EndMessage;
 				
 				std::list<long>::iterator alive_iter;
-				for (alive_iter=aliveObjectList.begin(); alive_iter != aliveObjectList.end(); alive_iter++) {
+				for (alive_iter=aliveObjectList.begin(); alive_iter != aliveObjectList.end(); alive_iter++)
+				{
 					std::list<TuioObject*>::iterator tobj;
-					for (tobj=objectList.begin(); tobj!=objectList.end(); tobj++) {
+					for (tobj=objectList.begin(); tobj!=objectList.end(); tobj++)
+					{
 						TuioObject *deleteObject = (*tobj);
-						if(deleteObject->getSessionID()==*alive_iter) {
+						if(deleteObject->getSessionID()==*alive_iter)
+						{
 							deleteObject->remove();
 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
 								(*listener)->removeTuioObject(deleteObject);
@@ -133,20 +145,20 @@
 							break;
 						}
 					}
-					
 				}
-			
 				aliveObjectList = objectBuffer;
 				objectBuffer.clear();
-			} else if( strcmp( cmd, "fseq" ) == 0 ){
-				
+			}
+			else if( strcmp( cmd, "fseq" ) == 0 )
+			{
 				if(currentFrame>0) lastFrame = currentFrame;
 				args >> currentFrame  >> EndMessage;
 
-				if ((currentFrame>=lastFrame) || (currentFrame<0)) {
-					
+				if ((currentFrame>=lastFrame) || (currentFrame<0))
+				{
 					long currentTime = lastTime;
-					if (currentFrame>lastFrame) {
+					if (currentFrame>lastFrame)
+					{
 						currentTime = getCurrentTime()-startTime;
 						lastTime = currentTime;
 					}
@@ -158,36 +170,40 @@
 						(*listener)->refresh(currentTime);
 				}
 			}
-		} else if( strcmp( msg.AddressPattern(), "/tuio/3Dcur" ) == 0 ) {
+		}
+		else if( strcmp( msg.AddressPattern(), "/tuio/3Dcur" ) == 0 )
+		{
 			const char* cmd;
 			args >> cmd;
 			
-			if( strcmp( cmd, "set" ) == 0 ){	
+			if( strcmp( cmd, "set" ) == 0 )
+			{
 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
 
 				int32 s_id;
 				float xpos, ypos, zpos, xspeed, yspeed, maccel;
 				//Modifié par alexandre.bastien@iri.centrepompidou.fr
 				args >> s_id >> xpos >> ypos >> zpos >> xspeed >> yspeed >> maccel >> EndMessage;
-
 				std::list<TuioCursor*>::iterator tcur;
 				for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
 					if((*tcur)->getSessionID()==(long)s_id) break;
 
-				if (tcur == cursorList.end()) {
-
+				if (tcur == cursorList.end())
+				{
 					int f_id = (int)cursorList.size();
-					if ((int)(cursorList.size())<=maxFingerID) {
+					if ((int)(cursorList.size())<=maxFingerID)
+					{
 						std::list<TuioCursor*>::iterator closestCursor = freeCursorList.begin();
 						//Modifié par alexandre.bastien@iri.centrepompidou.fr
-						for(std::list<TuioCursor*>::iterator testCursor = freeCursorList.begin();testCursor!= freeCursorList.end(); testCursor++) {
+						for(std::list<TuioCursor*>::iterator testCursor = freeCursorList.begin();testCursor!= freeCursorList.end(); testCursor++)
+						{
 							if((*testCursor)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
 						}
-						
 						f_id = (*closestCursor)->getFingerID();
 						freeCursorList.erase(closestCursor);
 						delete *closestCursor;
-					} else maxFingerID = f_id;	
+					}
+					else maxFingerID = f_id;	
 					//Modifié par alexandre.bastien@iri.centrepompidou.fr
 					TuioCursor *addCursor = new TuioCursor((long)s_id,f_id,xpos,ypos,zpos);
 					cursorList.push_back(addCursor);
@@ -196,82 +212,87 @@
 						(*listener)->addTuioCursor(addCursor);
 					
 				//Modifié par alexandre.bastien@iri.centrepompidou.fr
-				} else if ( ((*tcur)->getX()!=xpos) || ((*tcur)->getY()!=ypos) || ((*tcur)->getZ()!=zpos) || ((*tcur)->getXSpeed()!=xspeed) || ((*tcur)->getYSpeed()!=yspeed) || ((*tcur)->getMotionAccel()!=maccel) ) {
+				}
+				else if ( ((*tcur)->getX()!=xpos) || ((*tcur)->getY()!=ypos) || ((*tcur)->getZ()!=zpos) || ((*tcur)->getXSpeed()!=xspeed) || ((*tcur)->getYSpeed()!=yspeed) || ((*tcur)->getMotionAccel()!=maccel) )
+				{
 					(*tcur)->update(xpos,ypos,zpos,xspeed,yspeed,maccel);
 					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
 						(*listener)->updateTuioCursor((*tcur));
 				}
-
-			} else if( strcmp( cmd, "alive" ) == 0 ){
+			}
+			else if( strcmp( cmd, "alive" ) == 0 )
+			{
 				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
 
 				int32 s_id;
-				while(!args.Eos()) {
+				while(!args.Eos())
+				{
 					args >> s_id;
 					cursorBuffer.push_back((long)s_id);
-					
 					std::list<long>::iterator iter;
 					iter = find(aliveCursorList.begin(), aliveCursorList.end(), (long)s_id); 
 					if (iter != aliveCursorList.end()) aliveCursorList.erase(iter);
 				}
 				args >> EndMessage;
-				
 				std::list<long>::iterator alive_iter;
-				for (alive_iter=aliveCursorList.begin(); alive_iter != aliveCursorList.end(); alive_iter++) {
+				for (alive_iter=aliveCursorList.begin(); alive_iter != aliveCursorList.end(); alive_iter++)
+				{
 					std::list<TuioCursor*>::iterator tcur;
-					for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++) {
+					for (tcur=cursorList.begin(); tcur != cursorList.end(); tcur++)
+					{
 						TuioCursor *deleteCursor = (*tcur);
-						if(deleteCursor->getSessionID()==*alive_iter) {
-							
+						if(deleteCursor->getSessionID()==*alive_iter)
+						{
 							cursorList.erase(tcur);
 							deleteCursor->remove();
 							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
 								(*listener)->removeTuioCursor(deleteCursor);
 							
-							if (deleteCursor->getFingerID()==maxFingerID) {
+							if (deleteCursor->getFingerID()==maxFingerID)
+							{
 								maxFingerID = -1;
 								delete deleteCursor;
 								
-								if (cursorList.size()>0) {
+								if (cursorList.size()>0)
+								{
 									std::list<TuioCursor*>::iterator clist;
-									for (clist=cursorList.begin(); clist != cursorList.end(); clist++) {
+									for (clist=cursorList.begin(); clist != cursorList.end(); clist++)
+									{
 										int f_id = (*clist)->getFingerID();
 										if (f_id>maxFingerID) maxFingerID=f_id;
 									}
-									
-									
 									std::list<TuioCursor*>::iterator flist;
-									for (flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++) {
+									for (flist=freeCursorList.begin(); flist != freeCursorList.end(); flist++)
+									{
 										TuioCursor *freeCursor = (*flist);
 										if (freeCursor->getFingerID()>maxFingerID) delete freeCursor;
 										else freeCursorBuffer.push_back(freeCursor);
 									}
-
 									freeCursorList = freeCursorBuffer;
 									freeCursorBuffer.clear();
-								} 
-							} else if (deleteCursor->getFingerID()<maxFingerID) freeCursorList.push_back(deleteCursor);
-							
+								}
+							}
+							else if (deleteCursor->getFingerID()<maxFingerID) freeCursorList.push_back(deleteCursor);
 							break;
 						}
 					}
-					
 				}
-			
 				aliveCursorList = cursorBuffer;
 				cursorBuffer.clear();
-			} else if( strcmp( cmd, "fseq" ) == 0 ){
-				
+			}
+			else if( strcmp( cmd, "fseq" ) == 0 )
+			{
 				if(currentFrame>0) lastFrame = currentFrame;
 				args >> currentFrame  >> EndMessage;
 
-				if ((currentFrame>=lastFrame) || (currentFrame<0)) {
+				if ((currentFrame>=lastFrame) || (currentFrame<0))
+				{
 					long currentTime = lastTime;
-					if (currentFrame>lastFrame) {
+					if (currentFrame>lastFrame)
+					{
 						currentTime = getCurrentTime()-startTime;
 						lastTime = currentTime;
 					}
-
 					for (std::list<TuioCursor*>::iterator refreshCursor=cursorList.begin(); refreshCursor!=cursorList.end(); refreshCursor++)
 						if ((*refreshCursor)->getUpdateTime()==TUIO_UNDEFINED) (*refreshCursor)->setUpdateTime(currentTime);
 
@@ -280,7 +301,241 @@
 				}
 			}
 		}
-	} catch( Exception& e ){
+		else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
+		{
+			const char* cmd;
+			args >> cmd;
+			
+			if( strcmp( cmd, "set" ) == 0 )
+			{
+				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
+
+				int32 s_id;
+				const char* code;
+				args >> s_id >> code >> EndMessage;
+				std::list<TuioString*>::iterator tstr;
+				for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
+					if((*tstr)->getSessionID()==(long)s_id) break;
+
+				if (tstr == stringList.end())
+				{
+					int s_id = (int)stringList.size();//
+					if ((int)(stringList.size())<=maxStringID)//
+					{//
+						std::list<TuioString*>::iterator closestString = freeStringList.begin();//
+						//Modifié par alexandre.bastien@iri.centrepompidou.fr
+
+						//for(std::list<TuioString*>::iterator testString = freeStringList.begin();testString!= freeStringList.end(); testString++)
+						//{
+							//if((*testString)->getDistance(xpos,ypos,zpos)<(*closestCursor)->getDistance(xpos,ypos,zpos)) closestCursor = testCursor;
+						//}
+						s_id = (*closestString)->getStringID();//
+						freeStringList.erase(closestString);//
+						delete *closestString;//
+					}//
+					else maxStringID = s_id;//
+					//Modifié par alexandre.bastien@iri.centrepompidou.fr
+					TuioString *addString = new TuioString((long)s_id,-1,code);
+					stringList.push_back(addString);
+					
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->addTuioString(addString);
+					
+				//Modifié par alexandre.bastien@iri.centrepompidou.fr
+				}
+				else if ( ((*tstr)->getCode()!=code) )
+				{
+					(*tstr)->update(code);
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->updateTuioString((*tstr));
+				}
+			}
+			else if( strcmp( cmd, "alive" ) == 0 )
+			{
+				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
+
+				int32 s_id;
+				while(!args.Eos())
+				{
+					args >> s_id;
+					stringBuffer.push_back((long)s_id);
+					std::list<long>::iterator iter;
+					iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
+					if (iter != aliveStringList.end()) aliveStringList.erase(iter);
+				}
+				args >> EndMessage;
+				std::list<long>::iterator alive_iter;
+				for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
+				{
+					std::list<TuioString*>::iterator tstr;
+					for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
+					{
+						TuioString *deleteString = (*tstr);
+						if(deleteString->getSessionID()==*alive_iter)
+						{
+							stringList.erase(tstr);
+							deleteString->remove();
+							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+								(*listener)->removeTuioString(deleteString);
+							
+							if (deleteString->getStringID()==maxStringID)//
+							{//
+								maxStringID = -1;//
+								delete deleteString;
+								
+								if (stringList.size()>0)
+								{
+									std::list<TuioString*>::iterator clist;//
+									for (clist=stringList.begin(); clist != stringList.end(); clist++)//
+									{//
+										int s_id = (*clist)->getStringID();//
+										if (s_id>maxStringID) maxStringID=s_id;//
+									}//
+									std::list<TuioString*>::iterator flist;
+									for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
+									{
+										TuioString *freeString = (*flist);
+										if (freeString->getStringID()>maxStringID) delete freeString;//
+										else freeStringBuffer.push_back(freeString);//
+										freeStringBuffer.push_back(freeString);
+									}
+									freeStringList = freeStringBuffer;
+									freeStringBuffer.clear();
+								}
+							}//
+							else if (deleteString->getStringID()<maxStringID) freeStringList.push_back(deleteString);//
+							break;
+						}
+					}
+				}
+				aliveStringList = stringBuffer;
+				stringBuffer.clear();
+			}
+			else if( strcmp( cmd, "fseq" ) == 0 )
+			{
+				if(currentFrame>0) lastFrame = currentFrame;
+				args >> currentFrame  >> EndMessage;
+
+				if ((currentFrame>=lastFrame) || (currentFrame<0))
+				{
+					long currentTime = lastTime;
+					if (currentFrame>lastFrame)
+					{
+						currentTime = getCurrentTime()-startTime;
+						lastTime = currentTime;
+					}
+					for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
+						if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
+
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->refresh(currentTime);
+				}
+			}
+		}
+		//Ajouté par alexandre.bastien@iri.centrepompidou.fr
+		/*else if( strcmp( msg.AddressPattern(), "/tuio/_siP" ) == 0 )
+		{
+			const char* cmd;
+			args >> cmd;
+			
+			if( strcmp( cmd, "set" ) == 0 )
+			{
+				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
+				int32 s_id;
+				const char* code;
+				args >> s_id >> code >> EndMessage;
+				std::list<TuioString*>::iterator tstr;
+				for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
+					if((*tstr)->getSessionID()==(long)s_id) break;
+
+				if (tstr == stringList.end())
+				{
+					TuioString *addString = new TuioString((long)s_id,code);
+					stringList.push_back(addString);
+					
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->addTuioString(addString);
+					
+					
+				}
+				else if ( ((*tstr)->getCode()!=code) )
+				{
+					(*tstr)->update(code);
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->updateTuioString((*tstr));
+				}
+			}
+			else if( strcmp( cmd, "alive" ) == 0 )
+			{
+				if ((currentFrame<lastFrame) && (currentFrame>0)) return;
+					
+				int32 s_id;
+				while(!args.Eos())
+				{
+					args >> s_id;
+					stringBuffer.push_back((long)s_id);
+					std::list<long>::iterator iter;
+					iter = find(aliveStringList.begin(), aliveStringList.end(), (long)s_id); 
+					if (iter != aliveStringList.end()) aliveStringList.erase(iter);
+				}
+				args >> EndMessage;
+				
+				std::list<long>::iterator alive_iter;
+				for (alive_iter=aliveStringList.begin(); alive_iter != aliveStringList.end(); alive_iter++)
+				{
+					std::list<TuioString*>::iterator tstr;
+					for (tstr=stringList.begin(); tstr != stringList.end(); tstr++)
+					{
+						TuioString *deleteString = (*tstr);
+						if(deleteString->getSessionID()==*alive_iter)
+						{
+							stringList.erase(tstr);
+							deleteString->remove();
+							for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+								(*listener)->removeTuioString(deleteString);
+								
+							if (stringList.size()>0)
+							{
+								std::list<TuioString*>::iterator flist;
+								for (flist=freeStringList.begin(); flist != freeStringList.end(); flist++)
+								{
+									TuioString *freeString = (*flist);
+								}
+								freeStringList = freeStringBuffer;
+								freeStringBuffer.clear();
+							}
+						}
+						break;
+					}
+				}
+				aliveStringList = stringBuffer;
+				stringBuffer.clear();
+			}
+			else if( strcmp( cmd, "fseq" ) == 0 )
+			{
+				if(currentFrame>0) lastFrame = currentFrame;
+				args >> currentFrame  >> EndMessage;
+
+				if ((currentFrame>=lastFrame) || (currentFrame<0))
+				{
+					long currentTime = lastTime;
+					if (currentFrame>lastFrame)
+					{
+						currentTime = getCurrentTime()-startTime;
+						lastTime = currentTime;
+					}
+					
+					for (std::list<TuioString*>::iterator refreshString=stringList.begin(); refreshString!=stringList.end(); refreshString++)
+						if ((*refreshString)->getUpdateTime()==TUIO_UNDEFINED) (*refreshString)->setUpdateTime(currentTime);
+
+					for (std::list<TuioListener*>::iterator listener=listenerList.begin(); listener != listenerList.end(); listener++)
+						(*listener)->refresh(currentTime);
+				}
+			}
+		}*/
+	}
+	catch( Exception& e )
+	{
 		std::cout << "error while parsing message: "<< msg.AddressPattern() << ": " << e.what() << "\n";
 	}
 }
@@ -350,6 +605,13 @@
 	return NULL;
 }
 
+TuioString* TuioClient::getTuioString(long s_id) {
+	for (std::list<TuioString*>::iterator iter=stringList.begin(); iter != stringList.end(); iter++)
+		if((*iter)->getSessionID()==s_id) return (*iter);
+		
+	return NULL;
+}
+
 std::list<TuioObject*> TuioClient::getTuioObjects() {
 	return objectList;
 }
@@ -358,6 +620,10 @@
 	return cursorList;
 }
 
+std::list<TuioString*> TuioClient::getTuioStrings() {
+	return stringList;
+}
+
 long TuioClient::getCurrentTime() {
 	
 	#ifdef WIN32