Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 3198


Ignore:
Timestamp:
Jun 20, 2009, 4:27:38 PM (15 years ago)
Author:
scheusso
Message:

merged netp4 back to trunk

Location:
code/trunk/src
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/core/ConfigFileManager.cc

    r3196 r3198  
    4040namespace orxonox
    4141{
    42     const int CONFIG_FILE_MAX_LINELENGHT  = 1024;
    4342    const char* const DEFAULT_CONFIG_FILE = "default.ini";
    4443
     
    244243        if (file.is_open())
    245244        {
    246 
    247             char linearray[CONFIG_FILE_MAX_LINELENGHT];
    248 
    249245            ConfigFileSection* newsection = 0;
    250246
    251247            while (file.good() && !file.eof())
    252248            {
    253                 file.getline(linearray, CONFIG_FILE_MAX_LINELENGHT);
    254 
    255                 std::string line = std::string(linearray);
     249                std::string line;
     250                std::getline(file, line);
    256251
    257252                std::string temp = getStripped(line);
  • code/trunk/src/core/ConsoleCommandCompilation.cc

    r3196 r3198  
    7373
    7474        // Iterate through the file and put the lines into the CommandExecutor
    75         char line[1024];
    7675        while (file.good() && !file.eof())
    7776        {
    78             file.getline(line, 1024);
     77            std::string line;
     78            std::getline(file, line);
    7979            CommandExecutor::execute(line);
    8080        }
     
    144144
    145145        std::string output = "";
    146         char line[1024];
    147146        while (file.good() && !file.eof())
    148147        {
    149             file.getline(line, 1024);
     148            std::string line;
     149            std::getline(file, line);
    150150            output += line;
    151151            output += "\n";
  • code/trunk/src/core/Language.cc

    r3196 r3198  
    224224        }
    225225
    226         char line[1024];
    227 
    228226        // Iterate through the file and create the LanguageEntries
    229227        while (file.good() && !file.eof())
    230228        {
    231             file.getline(line, 1024);
    232             std::string lineString = std::string(line);
     229            std::string lineString;
     230            std::getline(file, lineString);
    233231
    234232            // Check if the line is empty
     
    272270        }
    273271
    274         char line[1024];
    275 
    276272        // Iterate through the file and create the LanguageEntries
    277273        while (file.good() && !file.eof())
    278274        {
    279             file.getline(line, 1024);
    280             std::string lineString = std::string(line);
     275            std::string lineString;
     276            std::getline(file, lineString);
    281277
    282278            // Check if the line is empty
  • code/trunk/src/core/LuaBind.cc

    r3196 r3198  
    9595    }
    9696
    97     char line[1024*32];
    9897    std::string levelString = "";
    9998
    10099    while (file.good() && !file.eof())
    101100    {
    102       file.getline(line, 1024*32);
     101      std::string line;
     102      std::getline(file, line);
    103103      levelString += line;
    104104      levelString += "\n";
  • code/trunk/src/network/Client.cc

    r3084 r3198  
    169169      bool b = packet->process();
    170170      assert(b);
     171      delete event;
    171172    }
    172173    if(gamestate.processGamestates())
  • code/trunk/src/network/ClientConnection.cc

    r3084 r3198  
    169169//              assert(0);
    170170          printf("ClientConnection: ENet returned with an error!\n");
    171           quit_=true;
    172           break;
     171//           quit_=true;
     172          continue;
    173173          // add some error handling here ========================
    174174        }
     
    197197      }
    198198    }
     199    delete event;
    199200    // now disconnect
    200201
    201202    if(!disconnectConnection())
     203    {
     204      printf("could not disconnect properly\n");
    202205      // if disconnecting failed destroy conn.
    203206      boost::recursive_mutex::scoped_lock lock(enet_mutex_g);
    204207      enet_peer_reset(server);
     208    }
     209    else
     210      printf("properly disconnected\n");
    205211    return;
    206212  }
     
    221227        break;
    222228      case ENET_EVENT_TYPE_DISCONNECT:
     229        printf("received disconnect confirmation from server");
    223230        return true;
    224231      }
  • code/trunk/src/network/ClientInformation.h

    r2773 r3198  
    9191    bool getSynched();
    9292
    93 
    9493  private:
    9594    static ClientInformation *head_;
  • code/trunk/src/network/ConnectionManager.cc

    r3093 r3198  
    132132    quit_=true;
    133133    receiverThread_->join();
     134    delete receiverThread_;
    134135    return true;
    135136  }
     
    206207          // we should never reach this point
    207208          printf("ConnectionManager: ENet returned with an error\n");
    208           quit_=true;
    209           printf("waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhh\n");
     209//           quit_=true;
     210//           printf("waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhh\n");
    210211          continue;
    211212          // add some error handling here ========================
     
    218219//             printf("====================================================================");
    219220        case ENET_EVENT_TYPE_DISCONNECT:
     221//           printf("====================================================================");
    220222        case ENET_EVENT_TYPE_RECEIVE:
    221             processData(event);
    222             event = new ENetEvent;
     223          processData(event);
     224          event = new ENetEvent;
    223225          break;
    224226        case ENET_EVENT_TYPE_NONE:
    225227          //receiverThread_->yield();
    226           msleep(10);
     228          msleep(1);
    227229          break;
    228230      }
  • code/trunk/src/network/ConnectionManager.h

    r3093 r3198  
    5555    const int NETWORK_PORT = 55556;
    5656    const int NETWORK_MAX_CONNECTIONS = 50;
    57     const int NETWORK_WAIT_TIMEOUT = 10;
     57    const int NETWORK_WAIT_TIMEOUT = 1;
    5858    const int NETWORK_DEFAULT_CHANNEL = 0;
    5959
  • code/trunk/src/network/GamestateManager.cc

    r3102 r3198  
    6363  GamestateManager::~GamestateManager()
    6464  {
     65    if( this->reference )
     66      delete this->reference;
     67    for( std::map<unsigned int, packet::Gamestate*>::iterator it = gamestateQueue.begin(); it != gamestateQueue.end(); it++ )
     68      delete (*it).second;
    6569    delete trafficControl_;
    6670  }
     
    133137//       COUT(3) << "diffing" << std::endl;
    134138//       packet::Gamestate* gs1  = gs;
    135       gs = gs->diff(client);
     139      packet::Gamestate *diffed = gs->diff(client);
     140      //packet::Gamestate *gs2 = diffed->undiff(gs);
     141//       assert(*gs == *gs2);
     142      gs = diffed;
    136143//       packet::Gamestate* gs2 = gs->undiff(client);
    137144//       gs = new packet::Gamestate(*gs);
  • code/trunk/src/network/Server.cc

    r3196 r3198  
    128128  */
    129129  void Server::close() {
     130    ClientInformation *temp = ClientInformation::getBegin();
     131    ClientInformation *temp2;
     132    // disconnect all connected clients
     133    while( temp )
     134    {
     135      temp2 = temp;
     136      temp = temp->next();
     137      disconnectClient( temp2 );
     138    }
    130139    connection->quitListener();
    131140    return;
     
    198207      switch( event->type ) {
    199208      case ENET_EVENT_TYPE_CONNECT:
    200         COUT(3) << "processing event_Type_connect" << std::endl;
     209        COUT(4) << "processing event_Type_connect" << std::endl;
    201210        addClient(event);
    202211        break;
     
    304313      // gs gets automatically deleted by enet callback
    305314    }
     315    delete del;
    306316    return true;
    307317  }
     
    381391    if(!client)
    382392      return false;
     393    else
     394      disconnectClient( client );
     395    return true;
     396  }
     397
     398  void Server::disconnectClient(int clientID){
     399    ClientInformation *client = ClientInformation::findClient(clientID);
     400    if(client)
     401      disconnectClient(client);
     402  }
     403 
     404  void Server::disconnectClient( ClientInformation *client){
     405    connection->disconnectClient(client);
    383406    gamestates_->removeClient(client);
    384 
    385407// inform all the listeners
    386408    ObjectList<ClientConnectionListener>::iterator listener = ObjectList<ClientConnectionListener>::begin();
    387409    while(listener){
    388410      listener->clientDisconnected(client->getID());
    389       listener++;
    390     }
    391 
    392     return ClientInformation::removeClient(event->peer);
    393   }
    394 
    395   void Server::disconnectClient(int clientID){
    396     ClientInformation *client = ClientInformation::findClient(clientID);
    397     if(client)
    398       disconnectClient(client);
    399   }
    400   void Server::disconnectClient( ClientInformation *client){
    401     connection->disconnectClient(client);
    402     gamestates_->removeClient(client);
     411      ++listener;
     412    }
     413    delete client; //remove client from list
    403414  }
    404415
  • code/trunk/src/network/TrafficControl.cc

    r3084 r3198  
    137137        void TrafficControl::ack(unsigned int clientID, unsigned int gamestateID)
    138138        {
     139    if ( !this->bActive_ )
     140      return;
    139141          std::list<obj>::iterator itvec;  // iterator to iterate through the acked objects
    140142
     
    189191  void TrafficControl::updateClientListTemp(std::list<obj>& list)
    190192  {
    191     clientListTemp_[currentClientID][currentGamestateID] = std::list<obj>(list);
     193    clientListTemp_[currentClientID][currentGamestateID] = list;
    192194  }
    193195
     
    227229        {
    228230
    229           //now the sorting
    230 
    231           //compare listToProcess vs clientListPerm
    232     //if listToProcess contains new Objects, add them to clientListPerm
    233     std::list<obj>::iterator itvec;
     231    if( bActive_ )
     232    {
     233      //now the sorting
     234
     235      //compare listToProcess vs clientListPerm
     236      //if listToProcess contains new Objects, add them to clientListPerm
     237      std::list<obj>::iterator itvec;
    234238   
    235     std::map<unsigned int, objInfo >& objectListPerm = clientListPerm_[clientID];
     239      std::map<unsigned int, objInfo >& objectListPerm = clientListPerm_[clientID];
    236240   
    237           for( itvec=list.begin(); itvec != list.end(); itvec++)
    238           {
    239             if ( objectListPerm.find( (*itvec).objID) != objectListPerm.end() )
    240       {
     241      for( itvec=list.begin(); itvec != list.end(); itvec++)
     242      {
     243        if ( objectListPerm.find( (*itvec).objID) != objectListPerm.end() )
     244        {
    241245        // we already have the object in our map
    242246        //obj bleibt in liste und permanente prio wird berechnet
    243         objectListPerm[(*itvec).objID].objDiffGS = currentGamestateID - objectListPerm[(*itvec).objID].objCurGS;
    244         continue;//check next objId
    245       }
    246       else
    247       {
     247          objectListPerm[(*itvec).objID].objDiffGS = currentGamestateID - objectListPerm[(*itvec).objID].objCurGS;
     248          continue;//check next objId
     249        }
     250        else
     251        {
    248252        // insert the object into clientListPerm
    249         insertinClientListPerm(clientID,*itvec);
    250         continue;//check next objId
    251       }
    252     }
    253           //end compare listToProcess vs clientListPerm
    254 
    255     if( bActive_ )
    256     {
     253          insertinClientListPerm(clientID,*itvec);
     254          continue;//check next objId
     255        }
     256      }
     257    //end compare listToProcess vs clientListPerm
     258     
    257259      //sort copied list according to priorities
    258260      // use boost bind here because we need to pass a memberfunction to stl sort
     
    275277//       sort(list.begin(), list.end(), boost::bind(&TrafficControl::dataSort, this, _1, _2) );
    276278      list.sort( boost::bind(&TrafficControl::dataSort, this, _1, _2) );
     279     
     280      //diese Funktion updateClientList muss noch gemacht werden
     281      updateClientListTemp(list);
     282      //end of sorting
    277283    }
    278     //diese Funktion updateClientList muss noch gemacht werden
    279     updateClientListTemp(list);
    280     //end of sorting
    281284  }
    282285
  • code/trunk/src/network/packet/Acknowledgement.cc

    r2710 r3198  
    6464
    6565bool Acknowledgement::process(){
    66 COUT(6) << "processing ACK with ID: " << getAckID() << endl;
     66  COUT(5) << "processing ACK with ID: " << getAckID() << endl;
    6767  bool b = GamestateHandler::ackGamestate(getAckID(), clientID_);
    6868  delete this;
  • code/trunk/src/network/packet/Gamestate.cc

    r3196 r3198  
    7979Gamestate::~Gamestate()
    8080{
     81  if( header_ )
     82    delete header_;
    8183}
    8284
     
    98100 
    99101  // create the header object
     102  assert( header_ == 0 );
    100103  header_ = new GamestateHeader(data_);
    101104
     
    137140  header_->setDataSize( currentsize );
    138141  header_->setID( id );
     142  header_->setBaseID( GAMESTATEID_INITIAL );
    139143  header_->setDiffed( false );
    140144  header_->setComplete( true );
     
    207211  }
    208212#endif
    209 
    210213  return true;
    211214}
     
    320323}
    321324
    322 Gamestate *Gamestate::diff(Gamestate *base)
     325/*Gamestate *Gamestate::diff(Gamestate *base)
    323326{
    324327  assert(data_);
     
    355358  g->packetDirection_ = packetDirection_;
    356359  return g;
    357 }
     360}*/
     361
     362Gamestate *Gamestate::diff(Gamestate *base)
     363{
     364  assert(this && base); assert(data_ && base->data_);
     365  assert(!header_->isCompressed() && !base->header_->isCompressed());
     366  assert(!header_->isDiffed());
     367 
     368  uint8_t *basep = GAMESTATE_START(base->data_);
     369  uint8_t *gs = GAMESTATE_START(this->data_);
     370  uint32_t dest_length = header_->getDataSize();
     371 
     372  if(dest_length==0)
     373    return NULL;
     374 
     375  uint8_t *ndata = new uint8_t[dest_length*sizeof(uint8_t)+GamestateHeader::getSize()];
     376  uint8_t *dest = GAMESTATE_START(ndata);
     377 
     378  rawDiff( dest, gs, basep, header_->getDataSize(), base->header_->getDataSize() );
     379#ifndef NDEBUG
     380  uint8_t *dest2 = new uint8_t[dest_length];
     381  rawDiff( dest2, dest, basep, header_->getDataSize(), base->header_->getDataSize() );
     382  assert( memcmp( dest2, gs, dest_length) == 0 );
     383#endif
     384
     385  Gamestate *g = new Gamestate(ndata, getClientID());
     386  assert(g->header_);
     387  *(g->header_) = *header_;
     388  g->header_->setDiffed( true );
     389  g->header_->setBaseID( base->getID() );
     390  g->flags_=flags_;
     391  g->packetDirection_ = packetDirection_;
     392  assert(g->isDiffed());
     393  assert(!g->isCompressed());
     394  return g;
     395}
     396
     397Gamestate *Gamestate::undiff(Gamestate *base)
     398{
     399  assert(this && base); assert(data_ && base->data_);
     400  assert(!header_->isCompressed() && !base->header_->isCompressed());
     401  assert(header_->isDiffed());
     402 
     403  uint8_t *basep = GAMESTATE_START(base->data_);
     404  uint8_t *gs = GAMESTATE_START(this->data_);
     405  uint32_t dest_length = header_->getDataSize();
     406 
     407  if(dest_length==0)
     408    return NULL;
     409 
     410  uint8_t *ndata = new uint8_t[dest_length*sizeof(uint8_t)+GamestateHeader::getSize()];
     411  uint8_t *dest = ndata + GamestateHeader::getSize();
     412 
     413  rawDiff( dest, gs, basep, header_->getDataSize(), base->header_->getDataSize() );
     414 
     415  Gamestate *g = new Gamestate(ndata, getClientID());
     416  assert(g->header_);
     417  *(g->header_) = *header_;
     418  g->header_->setDiffed( false );
     419  g->flags_=flags_;
     420  g->packetDirection_ = packetDirection_;
     421  assert(!g->isDiffed());
     422  assert(!g->isCompressed());
     423  return g;
     424}
     425
    358426
    359427// Gamestate *Gamestate::diff(Gamestate *base)
     
    409477// }
    410478
     479
     480void Gamestate::rawDiff( uint8_t* newdata, uint8_t* data, uint8_t* basedata, uint32_t datalength, uint32_t baselength)
     481{
     482  uint64_t* gd = (uint64_t*)data;
     483  uint64_t* bd = (uint64_t*)basedata;
     484  uint64_t* nd = (uint64_t*)newdata;
     485 
     486  unsigned int i;
     487  for( i=0; i<datalength/8; i++ )
     488  {
     489    if( i<baselength/8 )
     490      *(nd+i) = *(gd+i) ^ *(bd+i);  // xor the data
     491    else
     492      *(nd+i) = *(gd+i); // just copy over the data
     493  }
     494  unsigned int j;
     495  // now process the rest (when datalength isn't a multiple of 4)
     496  for( j = 8*(datalength/8); j<datalength; j++ )
     497  {
     498    if( j<baselength )
     499      *(newdata+j) = *(data+j) ^ *(basedata+j); // xor
     500    else
     501      *(newdata+j) = *(data+j); // just copy
     502  }
     503  assert(j==datalength);
     504}
     505
    411506Gamestate* Gamestate::doSelection(unsigned int clientID, unsigned int targetSize){
    412507  assert(data_);
     
    478573
    479574
    480 Gamestate *Gamestate::undiff(Gamestate *base)
     575/*Gamestate *Gamestate::undiff(Gamestate *base)
    481576{
    482577  assert(this && base);assert(data_);
     
    514609  assert(!g->isCompressed());
    515610  return g;
    516 }
    517 
     611}*/
    518612
    519613uint32_t Gamestate::calcGamestateSize(int32_t id, uint8_t mode)
  • code/trunk/src/network/packet/Gamestate.h

    r3084 r3198  
    124124    // Packet functions
    125125  private:
     126    void rawDiff( uint8_t* newdata, uint8_t* data, uint8_t* basedata, uint32_t datalength, uint32_t baselength);
    126127    virtual uint32_t getSize() const;
    127128    virtual inline bool process();
  • code/trunk/src/network/synchronisable/Synchronisable.cc

    r3088 r3198  
    9898    // delete callback function objects
    9999    if(!Identifier::isCreatingHierarchy()){
     100      // remove object from the static objectMap
     101      if (this->objectMode_ != 0x0 && (Host::running() && Host::isServer()))
     102        deletedObjects_.push(objectID);
     103      // delete all Synchronisable Variables from syncList ( which are also in stringList )
    100104      for(std::vector<SynchronisableVariableBase*>::iterator it = syncList.begin(); it!=syncList.end(); it++)
    101105        delete (*it);
    102       if (this->objectMode_ != 0x0 && (Host::running() && Host::isServer()))
    103         deletedObjects_.push(objectID);
     106      syncList.clear();
     107      stringList.clear();
    104108    }
    105109    std::map<uint32_t, Synchronisable*>::iterator it;
     
    174178    COUT(4) << "fabricate objectID: " << no->objectID << " classID: " << no->classID << std::endl;
    175179          // update data and create object/entity...
     180    assert( Synchronisable::objectMap_.find(header.getObjectID()) == Synchronisable::objectMap_.end() );
     181    Synchronisable::objectMap_[header.getObjectID()] = no;
    176182    bool b = no->updateData(mem, mode, true);
    177183    assert(b);
     
    213219      return it1->second;
    214220
    215     ObjectList<Synchronisable>::iterator it;
    216     for(it = ObjectList<Synchronisable>::begin(); it; ++it){
    217       if( it->getObjectID()==objectID ){
    218         objectMap_[objectID] = *it;
    219         return *it;
    220       }
    221     }
     221//     ObjectList<Synchronisable>::iterator it;
     222//     for(it = ObjectList<Synchronisable>::begin(); it; ++it){
     223//       if( it->getObjectID()==objectID ){
     224//         objectMap_[objectID] = *it;
     225//         return *it;
     226//       }
     227//     }
     228    // if the objects not in the map it should'nt exist at all anymore
    222229    return NULL;
    223230  }
  • code/trunk/src/orxonox/gamestates/GSDedicated.cc

    r3196 r3198  
    3333#include "core/Clock.h"
    3434#include "core/CommandLine.h"
     35#include "core/CommandExecutor.h"
    3536#include "core/Game.h"
    3637#include "core/GameMode.h"
    3738#include "network/Server.h"
    3839
     40#include <iostream>
     41#include <iomanip>
     42#include <boost/bind.hpp>
     43
     44#ifndef ORXONOX_PLATFORM_WINDOWS
     45#include <termios.h>
     46#endif
     47
     48
    3949namespace orxonox
    4050{
     51    const unsigned int MAX_COMMAND_LENGTH = 255;
     52   
    4153    AddGameState(GSDedicated, "dedicated");
     54   
     55    termios* GSDedicated::originalTerminalSettings_;
    4256
    4357    GSDedicated::GSDedicated(const std::string& name)
     
    4559        , server_(0)
    4660        , timeSinceLastUpdate_(0)
    47     {
     61        , closeThread_(false)
     62        , inputIterator_(0)
     63        , cleanLine_(true)
     64        , cursorX_(0)
     65        , cursorY_(0)
     66    {
     67        this->commandLine_ = new unsigned char[MAX_COMMAND_LENGTH];
     68//         memset( this->commandLine_, 0, MAX_COMMAND_LENGTH );
    4869    }
    4970
     
    5576    {
    5677        GameMode::setHasServer(true);
     78       
     79        this->inputThread_ = new boost::thread(boost::bind(&GSDedicated::inputThread, this));
     80       
     81#ifndef ORXONOX_PLATFORM_WINDOWS
     82        this->originalTerminalSettings_ = new termios;
     83        this->setTerminalMode();
     84#endif
    5785
    5886        this->server_ = new Server(CommandLine::getValue("port"));
     
    6694        this->server_->close();
    6795        delete this->server_;
     96       
     97        closeThread_ = true;
     98#ifndef ORXONOX_PLATFORM_WINDOWS
     99        std::cout << "\033[0G\033[K";
     100        std::cout.flush();
     101        resetTerminalMode();
     102        delete this->originalTerminalSettings_;
     103#endif
     104        //inputThread_->join();
    68105
    69106        GameMode::setHasServer(false);
     
    72109    void GSDedicated::update(const Clock& time)
    73110    {
    74 //        static float startTime = time.getSecondsPrecise();
    75 //        static int nrOfTicks = 0;
    76111        timeSinceLastUpdate_ += time.getDeltaTime();
    77112        if (timeSinceLastUpdate_ >= NETWORK_PERIOD)
    78113        {
    79 //            ++nrOfTicks;
    80 //            COUT(0) << "estimated ticks/sec: " << nrOfTicks/(time.getSecondsPrecise()-startTime) << endl;
    81114            timeSinceLastUpdate_ -= static_cast<unsigned int>(timeSinceLastUpdate_ / NETWORK_PERIOD) * NETWORK_PERIOD;
    82115            server_->update(time);
     
    84117        else
    85118        {
    86             usleep((int)((NETWORK_PERIOD - timeSinceLastUpdate_) * 1000 * 1000));
     119            usleep((unsigned int)((NETWORK_PERIOD - timeSinceLastUpdate_)*1000*1000 ));
     120            usleep(NETWORK_PERIOD*1000*1000); // NOTE: this is to throttle the non-network framerate
    87121//            COUT(0) << "sleeping for " << (int)((NETWORK_PERIOD - timeSinceLastUpdate_) * 1000 * 1000) << " usec" << endl;
    88122        }
    89     }
     123        processQueue();
     124        printLine();
     125    }
     126   
     127    void GSDedicated::inputThread()
     128    {
     129        unsigned char c;
     130        unsigned int  escapeChar=0;
     131        while(!closeThread_)
     132        {
     133            c = getchar();
     134            {
     135//                 boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     136                if ( inputIterator_>=MAX_COMMAND_LENGTH-1 && c!='\n' )
     137                    continue;
     138                if( escapeChar > 0 )
     139                {
     140                    if( c == '[' )
     141                    {
     142                        escapeChar = 2;
     143                        continue;
     144                    }
     145                    else if ( escapeChar == 2 )
     146                    {
     147                        switch (c)
     148                        {
     149                            case 'A': //keyup
     150                               
     151                                break;
     152                            case 'B': //keydown
     153                               
     154                                break;
     155                            case 'C': //keyright
     156                                if(cursorX_<inputIterator_)
     157                                    ++cursorX_;
     158                                break;
     159                            case 'D': //keyleft
     160                                if(cursorX_>0)
     161                                    --cursorX_;
     162                                break;
     163                            default: //not supported...
     164//                                 std::cout << endl << c << endl;
     165                                break;
     166                        }
     167                        escapeChar = 0;
     168                    }
     169                }
     170                else // not in escape sequence mode
     171                {
     172                    switch (c)
     173                    {
     174                        case '\n':
     175                            this->cleanLine_ = true;
     176                            {
     177                                boost::recursive_mutex::scoped_lock(this->inputQueueMutex_);
     178                                boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     179                                this->commandQueue_.push( std::string((const char*)this->commandLine_,inputIterator_) );
     180                            }
     181                            memset( this->commandLine_, 0, inputIterator_ );
     182                            inputIterator_ = 0;
     183                            this->cursorX_ = 0;
     184                            this->cursorY_ = 0;
     185                            std::cout << endl;
     186                            break;
     187                        case 127: // backspace
     188                        case '\b':
     189                            deleteCharacter( this->cursorX_ );
     190                            break;
     191                        case '\t':
     192                        {
     193//                             boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     194                            std::cout << endl << CommandExecutor::hint( std::string((const char*)this->commandLine_,inputIterator_) ) << endl;
     195                            strncpy((char*)this->commandLine_, CommandExecutor::complete( std::string((const char*)this->commandLine_,inputIterator_) ).c_str(), MAX_COMMAND_LENGTH);
     196                            inputIterator_ = strlen((const char*)this->commandLine_);
     197                            break;
     198                        }
     199                        case '\033': // 1. escape character
     200                            escapeChar = 1;
     201                            break;
     202                        default:
     203                            insertCharacter( this->cursorX_, c );
     204                            break;
     205                    }
     206                }
     207            }
     208        }
     209    }
     210   
     211    void GSDedicated::printLine()
     212    {
     213#ifndef ORXONOX_PLATFORM_WINDOWS
     214        // set cursor to the begining of the line and erase the line
     215        std::cout << "\033[0G\033[K";
     216//         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     217        // print status line
     218        std::cout << std::fixed << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgFPS() << " fps, " << std::setprecision(2) << std::setw(5) << Game::getInstance().getAvgTickTime() << " ms avg ticktime # ";
     219        //save cursor position
     220        std::cout << "\033[s";
     221        //print commandLine buffer
     222        std::cout << std::string((const char*)this->commandLine_, inputIterator_);
     223        //restore cursor position and move it cursorX_ to the right
     224        std::cout << "\033[u";
     225        if( this->cursorX_ > 0 )
     226            std::cout << "\033[" << this->cursorX_ << "C";
     227        std::cout.flush();
     228#endif
     229    }
     230   
     231    void GSDedicated::processQueue()
     232    {
     233        std::string tempstr;
     234        {
     235            boost::recursive_mutex::scoped_lock lock1(this->inputQueueMutex_);
     236            while(true)
     237            {
     238                if ( !this->commandQueue_.empty() )
     239                {
     240                    tempstr = this->commandQueue_.front();
     241                    this->commandQueue_.pop();
     242                    lock1.unlock();
     243                }
     244                else
     245                    break;
     246                CommandExecutor::execute(tempstr, true);
     247            }
     248        }
     249    }
     250   
     251    void GSDedicated::setTerminalMode()
     252    {
     253#ifndef ORXONOX_PLATFORM_WINDOWS
     254        termios new_settings;
     255     
     256        tcgetattr(0,this->originalTerminalSettings_);
     257        new_settings = *this->originalTerminalSettings_;
     258        new_settings.c_lflag &= ~( ICANON | ECHO );
     259//         new_settings.c_lflag |= ( ISIG | IEXTEN );
     260        new_settings.c_cc[VTIME] = 0;
     261        new_settings.c_cc[VMIN] = 1;
     262        tcsetattr(0,TCSANOW,&new_settings);
     263        COUT(0) << endl;
     264//       atexit(&GSDedicated::resetTerminalMode);
     265#endif
     266    }
     267   
     268    void GSDedicated::resetTerminalMode()
     269    {
     270#ifndef ORXONOX_PLATFORM_WINDOWS
     271        tcsetattr(0, TCSANOW, GSDedicated::originalTerminalSettings_);
     272#endif
     273    }
     274   
     275    void GSDedicated::insertCharacter( unsigned int position, char c )
     276    {
     277//         std::cout << endl << (unsigned int)c << endl;
     278        // check that we do not exceed MAX_COMMAND_LENGTH
     279        if( inputIterator_+1 < MAX_COMMAND_LENGTH )
     280        {
     281            // if cursor not at end of line then move the rest of the line
     282            if( position != this->inputIterator_ )
     283                    memmove( this->commandLine_+position+1, this->commandLine_+position, this->inputIterator_-position);
     284//             boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     285            this->commandLine_[position] = c;
     286            ++this->cursorX_;
     287            ++this->inputIterator_;
     288        }
     289    }
     290    void GSDedicated::deleteCharacter( unsigned int position )
     291    {
     292//         boost::recursive_mutex::scoped_lock(this->inputLineMutex_);
     293        if ( this->inputIterator_>0 && position>0 )
     294        {
     295            if ( position != this->inputIterator_ )
     296                memmove( this->commandLine_+position-1, this->commandLine_+position, this->inputIterator_-position);
     297            --this->cursorX_;
     298            --this->inputIterator_;
     299        }
     300    }
     301   
    90302}
  • code/trunk/src/orxonox/gamestates/GSDedicated.h

    r3196 r3198  
    3434#include "core/GameState.h"
    3535#include "network/NetworkPrereqs.h"
     36#include <queue>
     37#include <cstring>
     38#include <boost/thread/thread.hpp>
     39#include <boost/thread/mutex.hpp>
     40#include <boost/thread/recursive_mutex.hpp>
     41
     42struct termios;
    3643
    3744namespace orxonox
    3845{
     46   
    3947    class _OrxonoxExport GSDedicated : public GameState
    4048    {
     
    4856
    4957    private:
    50         Server* server_;
    51         float   timeSinceLastUpdate_;
     58        void inputThread();
     59        void printLine();
     60        void processQueue();
     61        void setTerminalMode();
     62        static void resetTerminalMode();
     63       
     64        void insertCharacter( unsigned int position, char c );
     65        void deleteCharacter( unsigned int position );
     66       
     67        Server*                 server_;
     68        float                   timeSinceLastUpdate_;
     69       
     70        boost::thread           *inputThread_;
     71        boost::recursive_mutex  inputLineMutex_;
     72        boost::recursive_mutex  inputQueueMutex_;
     73        bool                    closeThread_;
     74        bool                    cleanLine_;
     75        unsigned char*          commandLine_;
     76        unsigned int            inputIterator_;
     77        std::queue<std::string> commandQueue_;
     78        static termios*         originalTerminalSettings_;
     79       
     80        unsigned int            cursorX_;
     81        unsigned int            cursorY_;
    5282    };
    5383}
  • code/trunk/src/util/OutputBuffer.cc

    r3196 r3198  
    3636namespace orxonox
    3737{
    38     const int OUTPUTBUFFER_MAX_LINE_LENGTH = 16384; //! The maximal number of lines that can be stored within the OutputBuffer.
    39 
    4038    /**
    4139        @brief Adds a new listener to the list.
     
    105103    bool OutputBuffer::getLine(std::string* output)
    106104    {
    107         char line[OUTPUTBUFFER_MAX_LINE_LENGTH];
    108 
    109         this->stream_.getline(line, OUTPUTBUFFER_MAX_LINE_LENGTH);
    110         (*output) = std::string(line);
     105        std::getline(this->stream_, *output);
    111106
    112107        bool eof = this->stream_.eof();
  • code/trunk/src/util/SignalHandler.cc

    r3196 r3198  
    107107    void SignalHandler::sigHandler( int sig )
    108108    {
    109       for ( SignalCallbackList::iterator it = SignalHandler::getInstance().callbackList.begin(); it != SignalHandler::getInstance().callbackList.end(); it++  )
    110       {
    111         (*(it->cb))( it->someData );
    112       }
    113 
    114109      std::string sigName = "UNKNOWN";
    115110
     
    126121          break;
    127122      }
     123      // if the signalhandler has already been destroyed then don't do anything
     124      if( SignalHandler::singletonRef_s == 0 )
     125      {
     126        COUT(0) << "recieved signal " << sigName.c_str() << std::endl << "can't write backtrace because SignalHandler already destroyed" << std::endl;
     127        exit(EXIT_FAILURE);
     128      }
     129
     130      for ( SignalCallbackList::iterator it = SignalHandler::getInstance().callbackList.begin(); it != SignalHandler::getInstance().callbackList.end(); it++  )
     131      {
     132        (*(it->cb))( it->someData );
     133      }
     134
    128135
    129136      COUT(0) << "recieved signal " << sigName.c_str() << std::endl << "try to write backtrace to file orxonox_crash.log" << std::endl;
Note: See TracChangeset for help on using the changeset viewer.