logger.cpp

来自「2009 ROBOCUP 仿真2DSERVER 源码」· C++ 代码 · 共 1,363 行 · 第 1/3 页

CPP
1,363
字号
// -*-c++-*-/***************************************************************************                                logger.cpp                         Classes for game logging                             -------------------    begin                : 2008-02-15    copyright            : (C) 2008 by The RoboCup Soccer Simulator                           Maintenance Group.    email                : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU LGPL as published by the Free Software  * *   Foundation; either version 2 of the License, or (at your option) any  * *   later version.                                                        * *                                                                         * ***************************************************************************/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "logger.h"#include "player.h"#include "clangmsg.h"#include "coach.h"#include "field.h"#include "heteroplayer.h"#include "monitor.h"#include "playerparam.h"#include "serverparam.h"#include "team.h"#include "xpmholder.h"#include "dispsender.h"#include "initsenderlogger.h"#include "serializermonitor.h"#include "serializercommonstdv8.h"#include <boost/lexical_cast.hpp>#include <boost/filesystem/path.hpp>#include <boost/filesystem/operations.hpp>#include <sstream>#ifdef HAVE_SYS_TIME_H#include <sys/time.h>#endif#ifdef HAVE_NETINET_IN_H#include <netinet/in.h>#endif#ifdef HAVE_WINDOWS_H#include <windows.h>#endifconst std::string Logger::DEF_TEXT_NAME = "incomplete";const std::string Logger::DEF_TEXT_SUFFIX = ".rcl";const std::string Logger::DEF_GAME_NAME = "incomplete";const std::string Logger::DEF_GAME_SUFFIX = ".rcg";const std::string Logger::DEF_KAWAY_NAME = "incomplete";const std::string Logger::DEF_KAWAY_SUFFIX = ".kwy";Logger::Logger( Stadium & stadium )    : M_init_observer( new rcss::InitObserverLogger )    , M_observer( new rcss::ObserverLogger )    , M_stadium( stadium )    , M_game_log( static_cast< std::ostream * >( 0 ) )    , M_text_log( static_cast< std::ostream * >( 0 ) )    , M_playmode( PM_Null )    , M_team_l_score( 0 )    , M_team_r_score( 0 )    , M_team_l_pen_taken( 0 )    , M_team_r_pen_taken( 0 ){}Logger::~Logger(){    this->close();}boolLogger::setSenders(){    if ( ! isGameLogOpen() )    {        return true;    }    int log_version = ServerParam::instance().gameLogVersion();    int monitor_version = 3;    switch ( log_version ) {    case REC_VERSION_5:        monitor_version = 4;        break;    case REC_VERSION_4:        monitor_version = 3;        break;    case REC_VERSION_3:        monitor_version = 2;        break;    case REC_VERSION_2:    case REC_OLD_VERSION:        monitor_version = 1;        break;    default:        monitor_version = log_version - 1;        break;    }    rcss::SerializerMonitor::Creator ser_cre;    if ( ! rcss::SerializerMonitor::factory().getCreator( ser_cre, monitor_version ) )    {        return false;    }    const rcss::SerializerMonitor * ser = ser_cre();    if ( ! ser )    {        return false;    }    //    // init sender    //    {        rcss::InitSenderLogger::Params init_params( *M_game_log,                                                    *this,                                                    *ser,                                                    M_stadium );        rcss::InitSenderLogger::Creator init_cre;        if ( ! rcss::InitSenderLogger::factory().getCreator( init_cre, log_version ) )        {            return false;        }        M_init_observer->setInitSender( init_cre( init_params ) );    }    // disp sender    {        rcss::DispSenderLogger::Params disp_params( *M_game_log,                                                    *this,                                                    *ser,                                                    M_stadium );        rcss::DispSenderLogger::Creator disp_cre;        if ( ! rcss::DispSenderLogger::factory().getCreator( disp_cre, log_version ) )        {            return false;        }        M_observer->setDispSender( disp_cre( disp_params ) );    }    return true;}boolLogger::open(){    if ( ServerParam::instance().gameLogging() )    {        if ( ! openGameLog() )        {            return false;        }    }    if ( ServerParam::instance().textLogging() )    {        if ( ! openTextLog() )        {            return false;        }    }    if ( ServerParam::instance().keepAwayMode()         && ServerParam::instance().kawayLogging() )    {        if ( ! openKawayLog() )        {            return false;        }    }    return true;}voidLogger::close(){    renameLogs();    closeGameLog();    closeTextLog();    closeKawayLog();}boolLogger::openGameLog(){    boost::filesystem::path dir( ServerParam::instance().gameLogDir(),                                 boost::filesystem::portable_posix_name );    if ( ! boost::filesystem::exists( dir )         && ! boost::filesystem::create_directory( dir ) )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't create game log dir. game_log_dir = ["                  << ServerParam::instance().gameLogDir() << ']'                  << std::endl;        return false;    }    M_game_log_name = ServerParam::instance().gameLogDir();#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) || defined (__CYGWIN__)    if ( *M_game_log_name.rbegin() != '\\' )    {        M_game_log_name += '\\';    }#else    if ( *M_game_log_name.rbegin() != '/' )    {        M_game_log_name += '/';    }#endif    if ( ServerParam::instance().gameLogFixed() )    {        M_game_log_name += ServerParam::instance().gameLogFixedName();    }    else    {        M_game_log_name += Logger::DEF_GAME_NAME;    }    M_game_log_name += Logger::DEF_GAME_SUFFIX;    if ( ServerParam::instance().gameLogCompression() > 0 )    {        M_game_log_name += ".gz";        rcss::gz::gzofstream * f            = new rcss::gz::gzofstream( M_game_log_name.c_str(),                                        ServerParam::instance().gameLogCompression() );        M_game_log = f;    }    else    {        std::ofstream * f            = new std::ofstream( M_game_log_name.c_str(),                                 ( std::ofstream::binary                                   | std::ofstream::out                                   | std::ofstream::trunc ) );        M_game_log = f;    }    if ( ! isGameLogOpen() )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't open the game log file " << M_game_log_name << std::endl;        return false;    }    if ( ! setSenders() )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't set senders " << M_game_log_name << std::endl;        return false;    }    M_init_observer->sendHeader();    M_init_observer->sendServerParams();    M_init_observer->sendPlayerParams();    M_init_observer->sendPlayerTypes();    M_game_log->flush();    return true;}boolLogger::openTextLog(){    boost::filesystem::path dir( ServerParam::instance().textLogDir(),                                 boost::filesystem::portable_posix_name );    if ( ! boost::filesystem::exists( dir )         && ! boost::filesystem::create_directory( dir ) )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't create text log dir. text_log_dir = ["                  << ServerParam::instance().textLogDir() << ']'                  << std::endl;        return false;    }    M_text_log_name = ServerParam::instance().textLogDir();#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) || defined (__CYGWIN__)    if ( *M_text_log_name.rbegin() != '\\' )    {        M_text_log_name += '\\';    }#else    if ( *M_text_log_name.rbegin() != '/' )    {        M_text_log_name += '/';    }#endif    if ( ServerParam::instance().textLogFixed() )    {        M_text_log_name += ServerParam::instance().textLogFixedName();    }    else    {        M_text_log_name += Logger::DEF_TEXT_NAME;    }    M_text_log_name += Logger::DEF_TEXT_SUFFIX;    if ( ServerParam::instance().textLogCompression() > 0 )    {        M_text_log_name += std::string ( ".gz" );        rcss::gz::gzofstream * f            = new rcss::gz::gzofstream( M_text_log_name.c_str(),                                        ServerParam::instance().textLogCompression() );        M_text_log = f;    }    else    {        std::ofstream * f = new std::ofstream( M_text_log_name.c_str() );        M_text_log = f;    }    if ( ! isTextLogOpen() )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't open the text log file " << M_text_log_name << std::endl;        return false;    }    return true;}boolLogger::openKawayLog(){    boost::filesystem::path dir( ServerParam::instance().kawayLogDir(),                                 boost::filesystem::portable_posix_name );    if ( ! boost::filesystem::exists( dir )         && ! boost::filesystem::create_directory( dir ) )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't create keepaway log dir."                  << std::endl;        return false;    }    M_kaway_log_name = ServerParam::instance().kawayLogDir();#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) || defined (__CYGWIN__)    if ( *M_kaway_log_name.rbegin() != '\\' )    {        M_kaway_log_name += '\\';    }#else    if ( *M_kaway_log_name.rbegin() != '/' )    {        M_kaway_log_name += '/';    }#endif    if ( ServerParam::instance().kawayLogFixed() )    {        M_kaway_log_name += ServerParam::instance().kawayLogFixedName();    }    else    {        M_kaway_log_name += Logger::DEF_KAWAY_NAME;    }    M_kaway_log_name += Logger::DEF_KAWAY_SUFFIX;    M_kaway_log.open( M_kaway_log_name.c_str() );    if ( ! M_kaway_log.is_open() )    {        std::cerr << __FILE__ << ": " << __LINE__                  << ": can't open keepaway_log_file " << M_kaway_log_name                  << std::endl;        return false;    }    return true;}voidLogger::closeGameLog(){    if ( M_game_log )    {        M_game_log->flush();        delete M_game_log;        M_game_log =  static_cast< std::ostream * >( 0 );    }}voidLogger::closeTextLog(){    if ( M_text_log )    {        M_text_log->flush();        delete M_text_log;        M_text_log =  static_cast< std::ostream * >( 0 );    }}voidLogger::closeKawayLog(){    if ( M_kaway_log.is_open() )    {        M_kaway_log.flush();        M_kaway_log.close();    }}voidLogger::renameLogs(){    if ( ! isGameLogOpen()         && ! isTextLogOpen()         && ! M_kaway_log.is_open() )    {        return;    }    // add penalty to logfile when penalties are score or was draw and one team won    bool bAddPenaltyScore = ( M_stadium.teamRight().point() == M_stadium.teamLeft().point()                              && M_stadium.teamLeft().penaltyTaken() > 0                              && M_stadium.teamRight().penaltyTaken() > 0 );    char time_str[32];    std::strftime( time_str, 32,                   ServerParam::instance().logDateFormat().c_str(),                   &( M_stadium.realTime() ) );    std::string team_name_score( "" );    if ( M_stadium.teamLeft().enabled() )    {        team_name_score += M_stadium.teamLeft().name();        team_name_score += "_";

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?