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