Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 8858


Ignore:
Timestamp:
Aug 23, 2011, 12:45:53 AM (9 years ago)
Author:
landauf
Message:

merged output branch back to trunk.

Changes:

  • you have to include util/Output.h instead of util/Debug.h
  • COUT(x) is now called orxout(level)
  • output levels are now defined by an enum instead of numbers. see util/Output.h for the definition
  • it's possible to use output contexts with orxout(level, context). see util/Output.h for some common contexts. you can define more contexts
  • you must use 'endl' at the end of an output message, '\n' does not flush the message

Output levels:

  • instead of COUT(0) use orxout()
  • instead of COUT(1) use orxout(user_error) or orxout(internal_error)
  • instead of COUT(2) use orxout(user_warning) or orxout(internal_warning)
  • instead of COUT(3) use orxout(user_status/user_info) or orxout(internal_status/internal_info)
  • instead of COUT(4) use orxout(verbose)
  • instead of COUT(5) use orxout(verbose_more)
  • instead of COUT(6) use orxout(verbose_ultra)

Guidelines:

  • user_* levels are for the user, visible in the console and the log-file
  • internal_* levels are for developers, visible in the log-file
  • verbose_* levels are for debugging, only visible if the context of the output is activated

Usage in C++:

  • orxout() << "message" << endl;
  • orxout(level) << "message" << endl;
  • orxout(level, context) << "message" << endl;

Usage in Lua:

  • orxout("message")
  • orxout(orxonox.level.levelname, "message")
  • orxout(orxonox.level.levelname, "context", "message")

Usage in Tcl (and in the in-game-console):

  • orxout levelname message
  • orxout_context levelname context message
  • shortcuts: log message, error message, warning message, status message, info message, debug message
Location:
code/trunk
Files:
12 deleted
275 edited
30 copied

Legend:

Unmodified
Added
Removed
  • code/trunk

  • code/trunk/CMakeLists.txt

    r8474 r8858  
    2929ENDIF()
    3030
     31# Keep devs from using the root directory as binary directory (messes up the source tree)
     32IF(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
     33  MESSAGE(FATAL_ERROR "Please do not use the root directory as CMake output directory!
     34  mkdir build; cd build; cmake ..
     35  And you will have to clean the source directory by deleting CMakeCache.txt and the folder CMakeFiles")
     36ENDIF()
     37
     38PROJECT(Orxonox C CXX)
     39
     40# Check AFTER the PROJECT command because MSVC10 gets defined there
    3141IF(WIN32)
    3242  IF(MSVC10)
     
    3848  CMAKE_MINIMUM_REQUIRED(VERSION 2.6 FATAL_ERROR)
    3949ENDIF()
    40 
    41 # Keep devs from using the root directory as binary directory (messes up the source tree)
    42 IF(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
    43   MESSAGE(FATAL_ERROR "Please do not use the root directory as CMake output directory!
    44   mkdir build; cd build; cmake ..
    45   And you will have to clean the source directory by deleting CMakeCache.txt and the folder CMakeFiles")
    46 ENDIF()
    47 
    48 PROJECT(Orxonox C CXX)
    4950
    5051################ General Config #################
  • code/trunk/data/gui/scripts/GameplayMenu.lua

    r6746 r8858  
    1818function P.GameplayThemeCombobox_changed(e)
    1919    -- theme
    20     logMessage(0, "event: theme")
     20    orxout("event: theme")
    2121end
    2222
    2323function P.GameplayDifficultyEasyButton_clicked(e)
    2424    -- difficulty easy
    25     logMessage(0, "event: easy")
     25    orxout("event: easy")
    2626end
    2727
    2828function P.GameplayDifficultyNormalButton_clicked(e)
    2929    -- difficulty normal
    30     logMessage(0, "event: normal")
     30    orxout("event: normal")
    3131end
    3232
    3333function P.GameplayDifficultyHardButton_clicked(e)
    3434    -- difficulty hard
    35     logMessage(0, "event: hard")
     35    orxout("event: hard")
    3636end
    3737
  • code/trunk/data/gui/scripts/MultiplayerMenu.lua

    r8079 r8858  
    117117        local listbox = winMgr:getWindow("orxonox/MultiplayerListbox")
    118118        CEGUI.toListbox(listbox):resetList()
    119         local discovery = orxonox.WANDiscovery:getInstance()
    120         cout(0, "discovering.\n" )
     119        local discovery = orxonox.WANDiscovery()
     120        orxout("discovering." )
    121121        discovery:discover()
    122         cout(0, "discovered.\n" )
     122        orxout("discovered." )
    123123        P.serverList = {}
    124124        local index = 0
  • code/trunk/data/gui/scripts/NotificationLayer.lua

    r8729 r8858  
    136136    if index > queue.first then -- Move all older notifications up in the list.
    137137        for i=index-1,-1,queue.first do
    138             cout(0, i)
     138            orxout(i)
    139139            item = queue.items[i]
    140140            item:setYposition(CEGUI.UDim(0, itemHeight*(queue.last-i-1)))
  • code/trunk/data/gui/scripts/QuestGUI.lua

    r8706 r8858  
    220220function P.selectQuest(list, quest)
    221221    if quest == nil then -- If the input quest is nil, there is nothing to be selected, an error is output and the first quest is selected instead.
    222         cout(1, "Error in QuestGUI: selectQuest(), input quest is nil. Selecting first.")
     222        orxout(orxonox.level.internal_error, "Error in QuestGUI: selectQuest(), input quest is nil. Selecting first.")
    223223        list:setItemSelectState(list:getListboxItemFromIndex(0), true) -- Select first
    224224        return
     
    240240        list:setItemSelectState(list:getListboxItemFromIndex(index), true)
    241241    else -- If the quest isn't found an error is output and the first quest is selected instead.
    242         cout(1, "Error in QuestGUI: selectQuest(), input quest is not in list. Selecting first.")
     242        orxout(orxonox.level.internal_error, "Error in QuestGUI: selectQuest(), input quest is not in list. Selecting first.")
    243243        list:setItemSelectState(list:getListboxItemFromIndex(0), true) -- Select first
    244244    end
     
    313313            end
    314314        else
    315             cout(1, "Error in QuestGUI: changeToSubquest(), quest was nil. Ignoring...")
     315            orxout(orxonox.level.internal_error, "Error in QuestGUI: changeToSubquest(), quest was nil. Ignoring...")
    316316        end
    317317    end
  • code/trunk/data/levels/presentationDM.oxw

    r8706 r8858  
    1616 name         = "Presentation"
    1717 description  = "A simple testlevel"
     18 gametype     = Deathmatch
    1819>
    1920  <templates>
     
    4647      for i = 1, 100, 1 do
    4748        j = math.random()
     49        scale = j * 50 + 5
    4850    ?>
    49       <MovableEntity position="<?lua print(math.random() * 5000-2000) ?>,<?lua print(math.random() * 5000-2000) ?>,<?lua print(math.random() * 5000 - 2000) ?>" collisionType=dynamic linearDamping=0.8 angularDamping=0 mass="<?lua print(j * 50) ?>" scale="<?lua print(j * 5) ?>" rotationaxis="<?lua print(math.random()) ?>, <?lua print(math.random()) ?>, <?lua print(math.random()) ?>" rotationrate="<?lua print(math.random() * 30 + 5) ?>">
     51      <MovableEntity position="<?lua print(math.random() * 5000-2000) ?>,<?lua print(math.random() * 5000-2000) ?>,<?lua print(math.random() * 5000 - 2000) ?>" collisionType=dynamic linearDamping=0.8 angularDamping=0 mass="<?lua print(scale) ?>" rotationaxis="<?lua print(math.random()) ?>, <?lua print(math.random()) ?>, <?lua print(math.random()) ?>" rotationrate="<?lua print(math.random() * 30 + 5) ?>">
    5052        <attached>
    51           <Model position="0,0,0" scale="<?lua print(j * 10) ?>" mesh="ast<?lua print( math.mod(i,6) + 1) ?>.mesh" />
     53          <Model scale="<?lua print(scale) ?>" mesh="ast<?lua print( math.mod(i,6) + 1) ?>.mesh" />
    5254        </attached>
    5355        <collisionShapes>
    54           <SphereCollisionShape radius="<?lua print(j * 70) ?>" />
     56          <SphereCollisionShape radius="<?lua print(scale * 2.5) ?>" />
    5557        </collisionShapes>
    5658      </MovableEntity>
  • code/trunk/data/levels/templates/FPS.oxt

    r7679 r8858  
    3030   
    3131    <?lua
    32         include("includes/weaponSettingsFPS.oxi")
     32        include("../includes/weaponSettingsFPS.oxi")
    3333    ?>
    3434
  • code/trunk/data/levels/templates/spaceshipAssff.oxt

    r8857 r8858  
    5656    </collisionShapes>
    5757<?lua
    58   include("includes/weaponSettingsAssff.oxi")
     58  include("../includes/weaponSettingsAssff.oxi")
    5959?>
    6060  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipAssff2.oxt

    r8857 r8858  
    5656    </collisionShapes>
    5757<?lua
    58   include("includes/weaponSettingsAssff2.oxi")
     58  include("../includes/weaponSettingsAssff2.oxi")
    5959?>
    6060  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipGhost.oxt

    r8857 r8858  
    5353    </collisionShapes>
    5454<?lua
    55   include("includes/weaponSettingsGhost.oxi")
     55  include("../includes/weaponSettingsGhost.oxi")
    5656?>
    5757  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipH2.oxt

    r8706 r8858  
    2222
    2323<?lua
    24   include("includes/weaponSettingsH2.oxi")
     24  include("../includes/weaponSettingsH2.oxi")
    2525?>
    2626    <engines>
  • code/trunk/data/levels/templates/spaceshipHXY.oxt

    r8706 r8858  
    3737
    3838<?lua
    39   include("includes/weaponSettingsHXY.oxi")
     39  include("../includes/weaponSettingsHXY.oxi")
    4040?>
    4141  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipHXYSL.oxt

    r8706 r8858  
    3636
    3737<?lua
    38   include("includes/weaponSettingsHXY.oxi")
     38  include("../includes/weaponSettingsHXY.oxi")
    3939?>
    4040  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipPirate.oxt

    r8857 r8858  
    5555
    5656<?lua
    57   include("includes/weaponSettingsPirate.oxi")
     57  include("../includes/weaponSettingsPirate.oxi")
    5858?>
    5959  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipSwallow.oxt

    r8857 r8858  
    5050    </collisionShapes>
    5151<?lua
    52   include("includes/weaponSettingsSwallow.oxi")
     52  include("../includes/weaponSettingsSwallow.oxi")
    5353?>
    5454  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipTransporter.oxt

    r8706 r8858  
    3636
    3737<?lua
    38   include("includes/weaponSettingsTransporter.oxi")
     38  include("../includes/weaponSettingsTransporter.oxi")
    3939?>
    4040  </SpaceShip>
  • code/trunk/data/levels/templates/spaceshipTransporterSL.oxt

    r8706 r8858  
    3636
    3737<?lua
    38   include("includes/weaponSettingsTransporter.oxi")
     38  include("../includes/weaponSettingsTransporter.oxi")
    3939?>
    4040  </SpaceShip>
  • code/trunk/data/lua/LuaStateInit.lua

    r6746 r8858  
    77end
    88
    9 -- Create function to log text like COUT, but always prints a line!
    10 logMessage = function(level, message)
    11   luaState:luaLog(level, message)
     9-- Prints output to the console and the logfile
     10--
     11-- Accepts the following arguments:
     12--   orxout("message")
     13--   orxout(orxonox.level.levelname, "message")
     14--   orxout(orxonox.level.levelname, "context", "message)
     15orxout = function(arg1, arg2, arg3)
     16  if arg1 and arg2 and arg3 then
     17    luaState:luaOutput(arg1, arg2, arg3)
     18  elseif arg1 and arg2 then
     19    luaState:luaOutput(arg1, arg2)
     20  else
     21    luaState:luaOutput(arg1)
     22  end
    1223end
    13 cout = logMessage
    1424
    1525-- Redirect dofile in order to load with the resource manager
     
    4252require = function(moduleName)
    4353  if not luaState:fileExists(moduleName .. ".lua") then
    44     logMessage(2, "Warning: Lua function require() could not find file '" .. moduleName .. ".lua' ")
     54    orxout(orxonox.level.internal_warning, "Warning: Lua function require() could not find file '" .. moduleName .. ".lua' ")
    4555    return nil
    4656  end
     
    8595  -- Fallback pause function
    8696  pause = function()
    87     logMessage(2, [["Warning: debug() called in Lua, but Debugger is not active.
     97    orxout(orxonox.level.internal_warning, [["Warning: debug() called in Lua, but Debugger is not active.
    8898Do you have the IOConsole disabled and are you using Lua version 5.1?"]])
    8999  end
     
    98108    end
    99109    -- Display the error message
    100     logMessage(1, "Lua runtime error: "..err)
     110    orxout(orxonox.level.internal_error, "Lua runtime error: "..err)
    101111  end
    102112
     
    106116  else
    107117    -- Fallback: print stack trace
    108     logMessage(3, debug.traceback(""))
     118    orxout(orxonox.level.internal_error, debug.traceback(""))
    109119  end
    110120  return err -- Hello Lua debugger user! Please type 'set 2' to get to the
  • code/trunk/data/overlays/debug.oxo

    r8706 r8858  
    4040<Template name="defaultHUD">
    4141  <OverlayGroup name = "defaultHUD" scale = "1, 1">
    42     <ChatOverlay
    43      name     = "chat"
    44      position = "0.03, 0.08"
    45      font     = "VeraMono"
    46      caption  = ""
    47      textsize = 0.025
    48     />
    49 
    5042    <KillMessage
    5143     name     = "killmessage"
     
    8476    />
    8577
     78    <ChatOverlay
     79     name     = "chat"
     80     position = "0.03, 0.08"
     81     font     = "VeraMono"
     82     caption  = ""
     83     textsize = 0.025
     84    />
     85
    8686  </OverlayGroup>
    8787</Template>
  • code/trunk/data/tcl/init.tcl

    r7914 r8858  
    169169    foreach {channel s} $input break
    170170
    171     if {$channel == "stdout" || $channel == "stderr"} {
    172         execute puts $newline $s
     171    if {$channel == "stdout"} {
     172        execute log $s
     173    } elseif {$channel == "stderr"} {
     174        execute error $s
    173175    } else {
    174176        eval [concat ::tcl::puts $args]
  • code/trunk/src/Orxonox.cc

    r8351 r8858  
    4343#endif
    4444
    45 #include "util/Debug.h"
     45#include "util/Output.h"
    4646#include "util/Exception.h"
    4747#include "orxonox/Main.h"
     
    5959#endif
    6060{
     61    using namespace orxonox;
     62
     63    orxout(user_status) << "Welcome to Orxonox (v" << ORXONOX_VERSION_MAJOR << '.' << ORXONOX_VERSION_MINOR << '.' << ORXONOX_VERSION_PATCH << ' ' << ORXONOX_VERSION_NAME << ')' << endl;
     64    orxout(internal_status) << "Congratulations, you survived the static initialization. Entering main()" << endl;
     65    if (argc > 0)
     66        orxout(internal_info) << "argv[0]: " << argv[0] << endl;
     67
    6168    try
    6269    {
     
    7077        const int firstArgument = 1;
    7178#endif
    72    
     79
    7380        std::string strCmdLine;
    7481        for (int i = firstArgument; i < argc; ++i)
     
    7683#endif
    7784
    78         return orxonox::main(strCmdLine);
     85        int value = main(strCmdLine);
     86        orxout(internal_status) << "Terminating main() normally with value " << value << endl;
     87        return value;
    7988    }
    8089    catch (...)
    8190    {
    82         COUT(0) << "Orxonox failed to initialise: " << orxonox::Exception::handleMessage() << std::endl;
    83         COUT(0) << "Terminating program." << std::endl;
     91        orxout(user_error) << "Exception caught in main(): " << orxonox::Exception::handleMessage() << endl;
     92        orxout(user_error) << "Terminating program." << endl;
    8493        return 1;
    8594    }
  • code/trunk/src/OrxonoxConfig.h.in

    r8418 r8858  
    106106#  else
    107107#    define __FUNCTIONNAME__
     108#  endif
     109#endif
     110
     111// Declare a function deprecated
     112#ifndef __DEPRECATED__
     113#  if defined(ORXONOX_COMPILER_GCC)
     114#    define __DEPRECATED__(function) function __attribute__ ((deprecated))
     115#  elif defined(ORXONOX_COMPILER_MSVC)
     116#    define __DEPRECATED__(function) __declspec(deprecated) function
     117#  else
     118#    define __DEPRECATED__(function) function
    108119#  endif
    109120#endif
  • code/trunk/src/libraries/core/BaseObject.cc

    r8706 r8858  
    109109    void BaseObject::registerEventListener(BaseObject* object)
    110110    {
    111         COUT(4) << "New EventListener: " << object->getIdentifier()->getName() << " &(" << object << ")." << std::endl;
     111        orxout(verbose, context::events) << "New EventListener: " << object->getIdentifier()->getName() << " &(" << object << ")." << endl;
    112112        this->eventListeners_.insert(object);
    113113    }
     
    186186            this->addTemplate(temp);
    187187        else
    188             COUT(1) << "Error: \"" << name << "\" is not a valid Template name (in class: " << this->getIdentifier()->getName() << ", name: " << this->getName() << ")." << std::endl;
     188            orxout(internal_error) << "\"" << name << "\" is not a valid Template name (in class: " << this->getIdentifier()->getName() << ", name: " << this->getName() << ")." << endl;
    189189    }
    190190
     
    312312        if (it != this->eventStates_.end())
    313313        {
    314             COUT(2) << "Warning: Overwriting EventState in class " << this->getIdentifier()->getName() << '.' << std::endl;
     314            orxout(internal_warning, context::events) << "Overwriting EventState in class " << this->getIdentifier()->getName() << '.' << endl;
    315315            delete (it->second);
    316316        }
     
    379379        this->registerEventStates();
    380380
    381         COUT(4) << this->getIdentifier()->getName() << " (&" << this << ") processing event. originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << "." << std::endl;
     381        orxout(verbose, context::events) << this->getIdentifier()->getName() << " (&" << this << ") processing event. originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << "." << endl;
    382382
    383383        std::map<std::string, EventState*>::const_iterator it = this->eventStates_.find(event.statename_);
     
    385385            it->second->process(event, this);
    386386        else if (!event.statename_.empty())
    387             COUT(2) << "Warning: \"" << event.statename_ << "\" is not a valid state in object \"" << this->getName() << "\" of class " << this->getIdentifier()->getName() << "." << std::endl;
    388         else
    389             COUT(2) << "Warning: Event with invalid source sent to object \"" << this->getName() << "\" of class " << this->getIdentifier()->getName() << "." << std::endl;
     387            orxout(internal_warning, context::events) << "\"" << event.statename_ << "\" is not a valid state in object \"" << this->getName() << "\" of class " << this->getIdentifier()->getName() << "." << endl;
     388        else
     389            orxout(internal_warning, context::events) << "Event with invalid source sent to object \"" << this->getName() << "\" of class " << this->getIdentifier()->getName() << "." << endl;
    390390    }
    391391
     
    412412        }
    413413        else
    414             COUT(2) << "Warning: No MainState defined in object \"" << this->getName() << "\" (" << this->getIdentifier()->getName() << ")" << std::endl;
     414            orxout(internal_warning, context::events) << "No MainState defined in object \"" << this->getName() << "\" (" << this->getIdentifier()->getName() << ")" << endl;
    415415    }
    416416
     
    432432                    this->mainStateFunctor_ = it->second->getFunctor();
    433433                else
    434                     COUT(2) << "Warning: Can't use \"" << this->mainStateName_ << "\" as MainState because it needs a second argument." << std::endl;
     434                    orxout(internal_warning, context::events) << "Can't use \"" << this->mainStateName_ << "\" as MainState because it needs a second argument." << endl;
    435435            }
    436436            else
    437                 COUT(2) << "Warning: \"" << this->mainStateName_ << "\" is not a valid MainState." << std::endl;
     437                orxout(internal_warning, context::events) << "\"" << this->mainStateName_ << "\" is not a valid MainState." << endl;
    438438        }
    439439    }
  • code/trunk/src/libraries/core/CMakeLists.txt

    r8729 r8858  
    8686    input/KeyBinder.h
    8787    input/KeyBinderManager.h
     88    ../util/output/OutputDefinitions.h
    8889  PCH_FILE
    8990    CorePrecompiledHeaders.h
  • code/trunk/src/libraries/core/ClassFactory.h

    r7401 r8858  
    4242#include <string>
    4343
    44 #include "util/Debug.h"
     44#include "util/Output.h"
    4545#include "Identifier.h"
    4646
     
    7373            ClassFactory(const std::string& name, bool bLoadable = true)
    7474            {
    75                 COUT(4) << "*** ClassFactory: Create entry for " << name << " in Factory." << std::endl;
     75                orxout(verbose, context::misc::factory) << "Create entry for " << name << " in Factory." << endl;
    7676                ClassIdentifier<T>::getIdentifier(name)->addFactory(this);
    7777                ClassIdentifier<T>::getIdentifier()->setLoadable(bLoadable);
  • code/trunk/src/libraries/core/CommandLineParser.cc

    r8729 r8858  
    3333
    3434#include "util/Convert.h"
    35 #include "util/Debug.h"
     35#include "util/Output.h"
    3636#include "util/Exception.h"
    3737#include "util/StringUtils.h"
     
    229229        catch (const ArgumentException& ex)
    230230        {
    231             COUT(0) << "Could not parse command line: " << ex.what() << std::endl;
    232             COUT(0) << CommandLineParser::getUsageInformation() << std::endl;
     231            orxout(user_error) << "Could not parse command line: " << ex.what() << endl;
     232            orxout(user_error) << CommandLineParser::getUsageInformation() << endl;
    233233            throw GeneralException("");
    234234        }
     
    286286        }
    287287
    288         infoStr << std::endl;
    289         infoStr << "Usage: orxonox [options]" << std::endl;
    290         infoStr << "Available options:" << std::endl;
     288        infoStr << endl;
     289        infoStr << "Usage: orxonox [options]" << endl;
     290        infoStr << "Available options:" << endl;
    291291
    292292        for (std::map<std::string, CommandLineArgument*>::const_iterator it = inst.cmdLineArgs_.begin();
     
    305305            infoStr << std::string(maxNameSize - it->second->getName().size(), ' ');
    306306            infoStr << ": " << it->second->getInformation();
    307             infoStr << std::endl;
     307            infoStr << endl;
    308308        }
    309309        return infoStr.str();
  • code/trunk/src/libraries/core/CommandLineParser.h

    r8729 r8858  
    218218            "Cannot add a command line argument with name '" + name + "' twice.");
    219219        OrxAssert(MultiType(defaultValue).getType() != MT_Type::Bool || MultiType(defaultValue).getBool() != true,
    220                "Boolean command line arguments with positive default values are not supported." << std::endl
     220               "Boolean command line arguments with positive default values are not supported." << endl
    221221            << "Please use SetCommandLineSwitch and adjust your argument: " << name);
    222222
  • code/trunk/src/libraries/core/ConfigFileManager.cc

    r7401 r8858  
    123123        for (std::list<ConfigFileEntry*>::const_iterator it = this->entries_.begin(); it != this->entries_.end(); ++it)
    124124            if ((*it)->getName() == name)
    125                 if ((*it)->getIndex() > size)
    126                     size = (*it)->getIndex();
    127         if (size == 0)
    128             return 0;
    129         else
    130             return (size + 1);
     125                if ((*it)->getIndex() >= size)
     126                    size = (*it)->getIndex() + 1;
     127        return size;
    131128    }
    132129
     
    274271                        {
    275272                            boost::filesystem::copy_file(defaultFilepath, filepath);
    276                             COUT(3) << "Copied " << this->filename_ << " from the default config folder." << std::endl;
     273                            orxout(internal_info, context::config) << "Copied " << this->filename_ << " from the default config folder." << endl;
    277274                        }
    278275                        catch (const boost::filesystem::filesystem_error& ex)
    279                         { COUT(1) << "Error in ConfigFile: " << ex.what() << std::endl; }
     276                        { orxout(user_error, context::config) << "Error in ConfigFile: " << ex.what() << endl; }
    280277                    }
    281278                }
     
    375372            file.close();
    376373
    377             COUT(3) << "Loaded config file \"" << this->filename_ << "\"." << std::endl;
     374            orxout(internal_info, context::config) << "Loaded config file \"" << this->filename_ << "\"." << endl;
    378375
    379376            // DO NOT save the file --> we can open supposedly read only config files
     
    404401        if (!file.is_open())
    405402        {
    406             COUT(1) << "Error: Couldn't open config-file \"" << filename << "\"." << std::endl;
     403            orxout(user_error, context::config) << "Couldn't open config-file \"" << filename << "\"." << endl;
    407404            return;
    408405        }
     
    410407        for (std::list<ConfigFileSection*>::const_iterator it = this->sections_.begin(); it != this->sections_.end(); ++it)
    411408        {
    412             file << (*it)->getFileEntry() << std::endl;
     409            file << (*it)->getFileEntry() << endl;
    413410
    414411            for (std::list<ConfigFileEntry*>::const_iterator it_entries = (*it)->getEntriesBegin(); it_entries != (*it)->getEntriesEnd(); ++it_entries)
    415                 file << (*it_entries)->getFileEntry() << std::endl;
    416 
    417             file << std::endl;
     412                file << (*it_entries)->getFileEntry() << endl;
     413
     414            file << endl;
    418415        }
    419416
    420417        file.close();
    421418
    422         COUT(4) << "Saved config file \"" << filename << "\"." << std::endl;
     419        orxout(verbose, context::config) << "Saved config file \"" << filename << "\"." << endl;
    423420    }
    424421
     
    669666    {
    670667        if (!this->configImpl(section, entry, value, &ConfigValueContainer::set))
    671             COUT(1) << "Error: Config value \"" << entry << "\" in section \"" << section << "\" doesn't exist." << std::endl;
     668            orxout(user_error, context::config) << "Config value \"" << entry << "\" in section \"" << section << "\" doesn't exist." << endl;
    672669    }
    673670
     
    682679    {
    683680        if (!this->configImpl(section, entry, value, &ConfigValueContainer::tset))
    684             COUT(1) << "Error: Config value \"" << entry << "\" in section \"" << section << "\" doesn't exist." << std::endl;
     681            orxout(user_error, context::config) << "Config value \"" << entry << "\" in section \"" << section << "\" doesn't exist." << endl;
    685682    }
    686683
  • code/trunk/src/libraries/core/ConfigValueContainer.cc

    r8351 r8858  
    143143        else
    144144        {
    145             COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
     145            orxout(user_error, context::config) << "Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << endl;
    146146        }
    147147        return false;
     
    182182            if (index > MAX_VECTOR_INDEX)
    183183            {
    184                 COUT(1) << "Error: Index " << index << " is too large." << std::endl;
     184                orxout(user_error, context::config) << "Index " << index << " is too large." << endl;
    185185                return false;
    186186            }
     
    203203        else
    204204        {
    205             COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
     205            orxout(user_error, context::config) << "Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << endl;
    206206            return false;
    207207        }
     
    218218            return this->set(this->valueVector_.size(), input);
    219219
    220         COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
     220        orxout(user_error, context::config) << "Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << endl;
    221221        return false;
    222222    }
     
    241241                return true;
    242242            }
    243             COUT(1) << "Error: Invalid vector-index." << std::endl;
    244         }
    245 
    246         COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
     243            orxout(user_error, context::config) << "Invalid vector-index." << endl;
     244        }
     245
     246        orxout(user_error, context::config) << "Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << endl;
    247247        return false;
    248248    }
     
    312312            if (!success)
    313313            {
    314                 COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is a vector." << std::endl;
     314                orxout(user_error, context::config) << "Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is a vector." << endl;
    315315            }
    316316            else
    317317            {
    318                 COUT(1) << "Error: Invalid vector-index." << std::endl;
     318                orxout(user_error, context::config) << "Invalid vector-index." << endl;
    319319            }
    320320            return false;
  • code/trunk/src/libraries/core/ConfigValueIncludes.h

    r8729 r8858  
    8787    @code
    8888    MyObject orxonoxobject;
    89     std::cout << "Name:    " << orxonoxobject.getName() << std::endl;
    90     std::cout << "Version: " << orxonoxobject.getVersion() << std::endl;
     89    orxout() << "Name:    " << orxonoxobject.getName() << endl;
     90    orxout() << "Version: " << orxonoxobject.getVersion() << endl;
    9191    @endcode
    9292
     
    200200        else
    201201        {
    202             COUT(2) << "Warning: Couldn't reset config-value '" << entryName << "' in class '"
    203                     << ClassIdentifier<T>::getIdentifier()->getName() << "', corresponding container doesn't exist." << std::endl;
     202            orxout(user_warning, context::config) << "Couldn't reset config-value '" << entryName << "' in class '"
     203                                                  << ClassIdentifier<T>::getIdentifier()->getName() << "', corresponding container doesn't exist." << endl;
    204204        }
    205205    }
     
    238238    else \
    239239    { \
    240         COUT(2) << "Warning: Couln't modify config-value '" << entryName << "' in class '" \
    241                 << ClassByObjectType(object)->getName() << "', corresponding container doesn't exist." << std::endl; \
     240        orxout(user_warning, context::config) << "Couldn't modify config-value '" << entryName << "' in class '" \
     241                                              << ClassByObjectType(object)->getName() << "', corresponding container doesn't exist." << endl; \
    242242    }
    243243
  • code/trunk/src/libraries/core/Core.cc

    r8729 r8858  
    5252
    5353#include "util/Clock.h"
    54 #include "util/Debug.h"
     54#include "util/Output.h"
    5555#include "util/Exception.h"
     56#include "util/output/LogWriter.h"
    5657#include "util/Scope.h"
    5758#include "util/ScopedSingletonManager.h"
     
    111112        , destructionHelper_(this)
    112113    {
     114        orxout(internal_status) << "initializing Core object..." << endl;
     115
    113116        // Set the hard coded fixed paths
    114117        this->pathConfig_ = new PathConfig();
     
    118121
    119122        // Load modules
     123        orxout(internal_info) << "Loading modules:" << endl;
    120124        const std::vector<std::string>& modulePaths = this->pathConfig_->getModulePaths();
    121125        for (std::vector<std::string>::const_iterator it = modulePaths.begin(); it != modulePaths.end(); ++it)
     
    127131            catch (...)
    128132            {
    129                 COUT(1) << "Couldn't load module \"" << *it << "\": " << Exception::handleMessage() << std::endl;
     133                orxout(user_error) << "Couldn't load module \"" << *it << "\": " << Exception::handleMessage() << endl;
    130134            }
    131135        }
     
    136140        // Set configurable paths like log, config and media
    137141        this->pathConfig_->setConfigurablePaths();
     142
     143        orxout(internal_info) << "Root path:       " << PathConfig::getRootPathString() << endl;
     144        orxout(internal_info) << "Executable path: " << PathConfig::getExecutablePathString() << endl;
     145        orxout(internal_info) << "Data path:       " << PathConfig::getDataPathString() << endl;
     146        orxout(internal_info) << "Ext. data path:  " << PathConfig::getExternalDataPathString() << endl;
     147        orxout(internal_info) << "Config path:     " << PathConfig::getConfigPathString() << endl;
     148        orxout(internal_info) << "Log path:        " << PathConfig::getLogPathString() << endl;
     149        orxout(internal_info) << "Modules path:    " << PathConfig::getModulePathString() << endl;
    138150
    139151        // create a signal handler (only active for Linux)
     
    141153        this->signalHandler_ = new SignalHandler();
    142154        this->signalHandler_->doCatch(PathConfig::getExecutablePathString(), PathConfig::getLogPathString() + "orxonox_crash.log");
    143 
    144         // Set the correct log path. Before this call, /tmp (Unix) or %TEMP% (Windows) was used
    145         OutputHandler::getInstance().setLogPath(PathConfig::getLogPathString());
    146155
    147156#ifdef ORXONOX_PLATFORM_WINDOWS
     
    155164
    156165        // Manage ini files and set the default settings file (usually orxonox.ini)
     166        orxout(internal_info) << "Loading config:" << endl;
    157167        this->configFileManager_ = new ConfigFileManager();
    158168        this->configFileManager_->setFilename(ConfigFileType::Settings,
     
    160170
    161171        // Required as well for the config values
     172        orxout(internal_info) << "Loading language:" << endl;
    162173        this->languageInstance_ = new Language();
    163174
     
    165176        // possibility to configure everything below here
    166177        RegisterRootObject(Core);
     178        orxout(internal_info) << "configuring Core" << endl;
    167179        this->setConfigValues();
    168         // Rewrite the log file with the correct log levels
    169         OutputHandler::getInstance().rewriteLogFile();
     180
     181        // Set the correct log path and rewrite the log file with the correct log levels
     182        LogWriter::getInstance().setLogPath(PathConfig::getLogPathString());
    170183
    171184#if !defined(ORXONOX_PLATFORM_APPLE) && !defined(ORXONOX_USE_WINMAIN)
     
    176189        }
    177190        if (this->bStartIOConsole_)
     191        {
     192            orxout(internal_info) << "creating IO console" << endl;
    178193            this->ioConsole_ = new IOConsole();
     194        }
    179195#endif
    180196
    181197        // creates the class hierarchy for all classes with factories
     198        orxout(internal_info) << "creating class hierarchy" << endl;
    182199        Identifier::createClassHierarchy();
    183200
    184201        // Load OGRE excluding the renderer and the render window
     202        orxout(internal_info) << "creating GraphicsManager:" << endl;
    185203        this->graphicsManager_ = new GraphicsManager(false);
    186204
     
    190208
    191209        // Create singletons that always exist (in other libraries)
     210        orxout(internal_info) << "creating root scope:" << endl;
    192211        this->rootScope_ = new Scope<ScopeID::Root>();
    193212
     
    204223            }
    205224            else
    206                 COUT(0) << "Error: Could not open file for documentation writing" << endl;
    207         }
     225                orxout(internal_error) << "Could not open file for documentation writing" << endl;
     226        }
     227
     228        orxout(internal_status) << "finished initializing Core object" << endl;
    208229    }
    209230
    210231    void Core::destroy()
    211232    {
     233        orxout(internal_status) << "destroying Core object..." << endl;
     234
    212235        // Remove us from the object lists again to avoid problems when destroying them
    213236        this->unregisterObject();
     
    228251        safeObjectDelete(&dynLibManager_);
    229252        safeObjectDelete(&pathConfig_);
    230     }
    231 
    232     namespace DefaultLevelLogFile
    233     {
    234         const OutputLevel::Value Dev  = OutputLevel::Debug;
    235         const OutputLevel::Value User = OutputLevel::Info;
     253
     254        orxout(internal_status) << "finished destroying Core object" << endl;
    236255    }
    237256
     
    239258    void Core::setConfigValues()
    240259    {
    241         // Choose the default level according to the path Orxonox was started (build directory or not)
    242         OutputLevel::Value defaultLogLevel = (PathConfig::buildDirectoryRun() ? DefaultLevelLogFile::Dev : DefaultLevelLogFile::User);
    243 
    244         SetConfigValueExternal(debugLevelLogFile_, "OutputHandler", "debugLevelLogFile", defaultLogLevel)
    245             .description("The maximum level of debug output written to the log file");
    246         OutputHandler::getInstance().setSoftDebugLevel("LogFile", debugLevelLogFile_);
     260        SetConfigValueExternal(LogWriter::getInstance().configurableMaxLevel_,
     261                               LogWriter::getInstance().getConfigurableSectionName(),
     262                               LogWriter::getInstance().getConfigurableMaxLevelName(),
     263                               LogWriter::getInstance().configurableMaxLevel_)
     264            .description("The maximum level of output shown in the log file")
     265            .callback(static_cast<BaseWriter*>(&LogWriter::getInstance()), &BaseWriter::changedConfigurableLevel);
     266        SetConfigValueExternal(LogWriter::getInstance().configurableAdditionalContextsMaxLevel_,
     267                               LogWriter::getInstance().getConfigurableSectionName(),
     268                               LogWriter::getInstance().getConfigurableAdditionalContextsMaxLevelName(),
     269                               LogWriter::getInstance().configurableAdditionalContextsMaxLevel_)
     270            .description("The maximum level of output shown in the log file for additional contexts")
     271            .callback(static_cast<BaseWriter*>(&LogWriter::getInstance()), &BaseWriter::changedConfigurableAdditionalContextsLevel);
     272        SetConfigValueExternal(LogWriter::getInstance().configurableAdditionalContexts_,
     273                               LogWriter::getInstance().getConfigurableSectionName(),
     274                               LogWriter::getInstance().getConfigurableAdditionalContextsName(),
     275                               LogWriter::getInstance().configurableAdditionalContexts_)
     276            .description("Additional output contexts shown in the log file")
     277            .callback(static_cast<BaseWriter*>(&LogWriter::getInstance()), &BaseWriter::changedConfigurableAdditionalContexts);
    247278
    248279        SetConfigValue(bDevMode_, PathConfig::buildDirectoryRun())
     
    279310    void Core::devModeChanged()
    280311    {
    281         bool isNormal = (bDevMode_ == PathConfig::buildDirectoryRun());
    282         if (isNormal)
    283         {
    284             ModifyConfigValueExternal(debugLevelLogFile_, "debugLevelLogFile", update);
    285         }
    286         else
    287         {
    288             OutputLevel::Value level = (bDevMode_ ? DefaultLevelLogFile::Dev : DefaultLevelLogFile::User);
    289             ModifyConfigValueExternal(debugLevelLogFile_, "debugLevelLogFile", tset, level);
    290         }
    291 
    292312        // Inform listeners
    293313        ObjectList<DevModeListener>::iterator it = ObjectList<DevModeListener>::begin();
     
    316336    void Core::loadGraphics()
    317337    {
     338        orxout(internal_info) << "loading graphics in Core" << endl;
     339       
    318340        // Any exception should trigger this, even in upgradeToGraphics (see its remarks)
    319341        Loki::ScopeGuard unloader = Loki::MakeObjGuard(*this, &Core::unloadGraphics);
     
    327349        {
    328350            // Exit the application if the Ogre config dialog was canceled
    329             COUT(1) << Exception::handleMessage() << std::endl;
     351            orxout(user_error) << Exception::handleMessage() << endl;
    330352            exit(EXIT_FAILURE);
    331353        }
     
    338360            // and reloaded between throw and catch (access violation in MSVC).
    339361            // That's why we abort completely and only display the exception.
    340             COUT(1) << "An exception occurred during upgrade to graphics. "
    341                     << "That is unrecoverable. The message was:" << endl
    342                     << Exception::handleMessage() << endl;
     362            orxout(user_error) << "An exception occurred during upgrade to graphics. "
     363                               << "That is unrecoverable. The message was:" << endl
     364                               << Exception::handleMessage() << endl;
    343365            abort();
    344366        }
     
    357379
    358380        // Create singletons associated with graphics (in other libraries)
     381        orxout(internal_info) << "creating graphics scope:" << endl;
    359382        graphicsScope_ = new Scope<ScopeID::Graphics>();
    360383
    361384        unloader.Dismiss();
     385
     386        orxout(internal_info) << "finished loading graphics in Core" << endl;
    362387    }
    363388
    364389    void Core::unloadGraphics()
    365390    {
     391        orxout(internal_info) << "unloading graphics in Core" << endl;
     392
    366393        safeObjectDelete(&graphicsScope_);
    367394        safeObjectDelete(&guiManager_);
     
    374401        catch (...)
    375402        {
    376             COUT(0) << "An exception occurred during 'unloadGraphics':" << Exception::handleMessage() << std::endl
    377                     << "Another exception might be being handled which may lead to undefined behaviour!" << std::endl
    378                     << "Terminating the program." << std::endl;
     403            orxout(user_error) << "An exception occurred during 'unloadGraphics':" << Exception::handleMessage() << endl
     404                               << "Another exception might be being handled which may lead to undefined behaviour!" << endl
     405                               << "Terminating the program." << endl;
    379406            abort();
    380407        }
  • code/trunk/src/libraries/core/Core.h

    r8729 r8858  
    136136
    137137            bool                      bGraphicsLoaded_;
    138             int                       debugLevelLogFile_;          //!< The debug level for the log file (belongs to OutputHandler)
    139138            std::string               language_;                   //!< The language
    140139            bool                      bInitRandomNumberGenerator_; //!< If true, srand(time(0)) is called
  • code/trunk/src/libraries/core/CoreIncludes.h

    r8729 r8858  
    3434/**
    3535    @file
    36     @ingroup Object Factory
     36    @ingroup Object Factory Class Identifier
    3737    @brief Defines several very important macros used to register objects, create factories, and to work with identifiers.
    3838
     
    7878#include "CorePrereqs.h"
    7979
    80 #include "util/Debug.h"
     80#include "util/Output.h"
    8181#include "Identifier.h"
    8282#include "ClassFactory.h"
  • code/trunk/src/libraries/core/CorePrecompiledHeaders.h

    r7266 r8858  
    5151#include <set>      // 50
    5252
    53 #include "util/Debug.h" // 48
     53#include "util/Output.h" // 48
    5454
    5555#include <deque>    // 43
  • code/trunk/src/libraries/core/DynLib.cc

    r8351 r8858  
    6868    {
    6969        // Log library load
    70         COUT(2) << "Loading module " << mName << std::endl;
     70        orxout(internal_info) << "Loading module " << mName << endl;
    7171
    7272        std::string name = mName;
     
    9999    {
    100100        // Log library unload
    101         COUT(4) << "Unloading module " << mName << std::endl;
     101        orxout(internal_info) << "Unloading module " << mName << endl;
    102102
    103103        if (DYNLIB_UNLOAD( m_hInst ))
  • code/trunk/src/libraries/core/Event.cc

    r7401 r8858  
    4949        if (this->bProcessingEvent_)
    5050        {
    51             COUT(2) << "Warning: Detected Event loop in section \"" << event.statename_ << "\" of object \"" << object->getName() << "\" and fired by \"" << event.originator_->getName() << '"' << std::endl;
     51            orxout(internal_warning, context::events) << "Detected Event loop in section \"" << event.statename_ << "\" of object \"" << object->getName() << "\" and fired by \"" << event.originator_->getName() << '"' << endl;
    5252            return;
    5353        }
     
    5555        this->bProcessingEvent_ = true;
    5656
    57         COUT(4) << "Processing event (EventState) : originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << ", object: " << object->getIdentifier()->getName() << " (&" << object << ")" << "." << std::endl;
     57        orxout(verbose, context::events) << "Processing event (EventState) : originator: " << event.originator_->getIdentifier()->getName() << " (&" << event.originator_ << "), activate: " << event.activate_ << ", name: " << event.name_ << ", statename: " << event.statename_ << ", object: " << object->getIdentifier()->getName() << " (&" << object << ")" << "." << endl;
    5858
    5959        // check if the originator is an instance of the requested class
  • code/trunk/src/libraries/core/GUIManager.cc

    r8729 r8858  
    7373#include "util/Clock.h"
    7474#include "util/Convert.h"
    75 #include "util/Debug.h"
     75#include "util/Output.h"
    7676#include "util/Exception.h"
    7777#include "util/Math.h"
    7878#include "util/OrxAssert.h"
     79#include "util/output/BaseWriter.h"
    7980#include "ConfigValueIncludes.h"
    8081#include "Core.h"
     
    101102        void logEvent(const CEGUI::String& message, CEGUI::LoggingLevel level = CEGUI::Standard)
    102103        {
    103             int orxonoxLevel = CEGUI::Standard;
     104            OutputLevel orxonoxLevel = level::debug_output;
    104105            switch (level)
    105106            {
    106                 case CEGUI::Errors:      orxonoxLevel = 1; break;
    107                 case CEGUI::Warnings:    orxonoxLevel = 2; break;
    108                 case CEGUI::Standard:    orxonoxLevel = 4; break;
    109                 case CEGUI::Informative: orxonoxLevel = 5; break;
    110                 case CEGUI::Insane:      orxonoxLevel = 6; break;
     107                case CEGUI::Errors:      orxonoxLevel = level::internal_error; break;
     108                case CEGUI::Warnings:    orxonoxLevel = level::internal_warning; break;
     109                case CEGUI::Standard:    orxonoxLevel = level::verbose; break;
     110                case CEGUI::Informative: orxonoxLevel = level::verbose_more; break;
     111                case CEGUI::Insane:      orxonoxLevel = level::verbose_ultra; break;
    111112                default: OrxAssert(false, "CEGUI log level out of range, inspect immediately!");
    112113            }
    113             OutputHandler::getOutStream(orxonoxLevel)
    114                 << "CEGUI: " << message << std::endl;
     114
     115            orxout(orxonoxLevel, context::cegui) << message << endl;
    115116
    116117            CEGUI::DefaultLogger::logEvent(message, level);
     
    256257    {
    257258        RegisterRootObject(GUIManager);
     259
     260        orxout(internal_status) << "initializing GUIManager..." << endl;
     261
    258262        this->setConfigValues();
    259263
    260264        using namespace CEGUI;
    261265
    262         COUT(3) << "Initialising CEGUI." << std::endl;
     266        orxout(internal_info) << "Initialising CEGUI." << endl;
    263267
    264268        this->oldCEGUI_ = false;
    265        
     269
    266270        // Note: No SceneManager specified yet
    267271#ifdef ORXONOX_OLD_CEGUI
     
    300304        std::auto_ptr<CEGUILogger> ceguiLogger(new CEGUILogger());
    301305        ceguiLogger->setLogFilename(PathConfig::getLogPathString() + "cegui.log");
    302         // Set the log level according to ours (translate by subtracting 1)
    303         ceguiLogger->setLoggingLevel(
    304             static_cast<LoggingLevel>(OutputHandler::getInstance().getSoftDebugLevel("logFile") - 1));
     306        ceguiLogger->setLoggingLevel(static_cast<CEGUI::LoggingLevel>(this->outputLevelCeguiLog_));
    305307        this->ceguiLogger_ = ceguiLogger.release();
    306308
     
    336338        // Set up the sheet manager in the Lua framework
    337339        this->luaState_->doFile("SheetManager.lua");
     340
     341        orxout(internal_status) << "finished initializing GUIManager" << endl;
    338342    }
    339343
    340344    void GUIManager::destroy()
    341345    {
     346        orxout(internal_status) << "destroying GUIManager..." << endl;
     347
    342348        using namespace CEGUI;
    343349
     
    356362#endif
    357363        safeObjectDelete(&luaState_);
     364
     365        orxout(internal_status) << "finished destroying GUIManager" << endl;
    358366    }
    359367
    360368    void GUIManager::setConfigValues(void)
    361369    {
    362         SetConfigValue(guiScheme_, GUIManager::defaultScheme_) .description("Changes the current GUI scheme.") .callback(this, &GUIManager::changedGUIScheme);
     370        SetConfigValue(guiScheme_, GUIManager::defaultScheme_).description("Changes the current GUI scheme.").callback(this, &GUIManager::changedGUIScheme);
    363371        SetConfigValue(numScrollLines_, 1).description("How many lines to scroll in a list if the scroll wheel is used");
     372        SetConfigValueExternal(outputLevelCeguiLog_, BaseWriter::getConfigurableSectionName(), "outputLevelCeguiLog", CEGUI::Standard).description("The log level of the CEGUI log file").callback(this, &GUIManager::changedCeguiOutputLevel);
    364373    }
    365374
    366375    void GUIManager::changedGUIScheme(void)
    367376    {
     377    }
     378
     379    void GUIManager::changedCeguiOutputLevel()
     380    {
     381        if (this->ceguiLogger_)
     382            this->ceguiLogger_->setLoggingLevel(static_cast<CEGUI::LoggingLevel>(this->outputLevelCeguiLog_));
    368383    }
    369384
     
    670685        {
    671686            // Display the error and proceed. See @remarks why this can be dangerous.
    672             COUT(1) << ex.getMessage() << std::endl;
     687            orxout(internal_error) << ex.getMessage() << endl;
    673688            return true;
    674689        }
  • code/trunk/src/libraries/core/GUIManager.h

    r8729 r8858  
    152152        bool protectedCall(FunctionType function);
    153153
     154        void changedCeguiOutputLevel();
     155
    154156        // keyHandler functions
    155157        void buttonPressed (const KeyEvent& evt);
     
    168170
    169171#ifdef ORXONOX_OLD_CEGUI
    170         CEGUI::OgreCEGUIRenderer*            guiRenderer_;      //!< CEGUI's interface to the Ogre Engine
    171         CEGUI::ResourceProvider*             resourceProvider_; //!< CEGUI's resource provider
     172        CEGUI::OgreCEGUIRenderer*            guiRenderer_;          //!< CEGUI's interface to the Ogre Engine
     173        CEGUI::ResourceProvider*             resourceProvider_;     //!< CEGUI's resource provider
    172174#else
    173         CEGUI::OgreRenderer*                 guiRenderer_;      //!< CEGUI's interface to the Ogre Engine
    174         CEGUI::OgreResourceProvider*         resourceProvider_; //!< CEGUI's resource provider
    175         Ogre::RenderQueueListener*           rqListener_;       //!< RQ listener so we can draw UNDER Ogre overlays
     175        CEGUI::OgreRenderer*                 guiRenderer_;          //!< CEGUI's interface to the Ogre Engine
     176        CEGUI::OgreResourceProvider*         resourceProvider_;     //!< CEGUI's resource provider
     177        Ogre::RenderQueueListener*           rqListener_;           //!< RQ listener so we can draw UNDER Ogre overlays
    176178        CEGUI::OgreImageCodec*               imageCodec_;
    177179#endif
    178         LuaState*                            luaState_;         //!< LuaState, access point to the Lua engine
    179         CEGUI::LuaScriptModule*              scriptModule_;     //!< CEGUI's script module to use Lua
    180         CEGUI::System*                       guiSystem_;        //!< CEGUI's main system
    181         shared_ptr<ResourceInfo>             rootFileInfo_;     //!< Resource information about the root script
    182         CEGUI::Logger*                       ceguiLogger_;      //!< CEGUI's logger to be able to log CEGUI errors in our log
    183         CEGUI::Window*                       rootWindow_;       //!< Root node for all windows
    184         CEGUI::Window*                       hudRootWindow_;    //!< Root node for the HUD sheets
    185         CEGUI::Window*                       menuRootWindow_;   //!< Root node for the menu sheets (used by Lua)
    186         std::map<std::string, PlayerInfo*>   players_;          //!< Stores the player (owner) for each GUI
    187         Ogre::Camera*                        camera_;           //!< Camera used to render the scene with the GUI
     180        LuaState*                            luaState_;             //!< LuaState, access point to the Lua engine
     181        CEGUI::LuaScriptModule*              scriptModule_;         //!< CEGUI's script module to use Lua
     182        CEGUI::System*                       guiSystem_;            //!< CEGUI's main system
     183        shared_ptr<ResourceInfo>             rootFileInfo_;         //!< Resource information about the root script
     184        CEGUI::Logger*                       ceguiLogger_;          //!< CEGUI's logger to be able to log CEGUI errors in our log
     185        int                                  outputLevelCeguiLog_;  //!< CEGUI's log level
     186        CEGUI::Window*                       rootWindow_;           //!< Root node for all windows
     187        CEGUI::Window*                       hudRootWindow_;        //!< Root node for the HUD sheets
     188        CEGUI::Window*                       menuRootWindow_;       //!< Root node for the menu sheets (used by Lua)
     189        std::map<std::string, PlayerInfo*>   players_;              //!< Stores the player (owner) for each GUI
     190        Ogre::Camera*                        camera_;               //!< Camera used to render the scene with the GUI
    188191
    189192        /// Helper object that executes the surrogate destructor destroy()
    190193        DestructionHelper<GUIManager>        destructionHelper_;
    191194
    192         static GUIManager*                   singletonPtr_s;    //!< Singleton reference to GUIManager
     195        static GUIManager*                   singletonPtr_s;        //!< Singleton reference to GUIManager
    193196
    194197        // The used CEGUI scheme.
     
    196199        std::string guiScheme_;
    197200        bool oldCEGUI_;
    198        
     201
    199202        int numScrollLines_; ///< How many lines to scroll in a list if the scroll wheel is used
    200203
  • code/trunk/src/libraries/core/Game.cc

    r8729 r8858  
    4040
    4141#include "util/Clock.h"
    42 #include "util/Debug.h"
     42#include "util/Output.h"
    4343#include "util/Exception.h"
    4444#include "util/Sleep.h"
     
    6060    SetConsoleCommand("exit", &stop_game);
    6161    static void printFPS()
    62         { COUT(0) << Game::getInstance().getAvgFPS() << std::endl; }
     62        { orxout(message) << Game::getInstance().getAvgFPS() << endl; }
    6363    SetConsoleCommand("Stats", "printFPS", &printFPS);
    6464    static void printTickTime()
    65         { COUT(0) << Game::getInstance().getAvgTickTime() << std::endl; }
     65        { orxout(message) << Game::getInstance().getAvgTickTime() << endl; }
    6666    SetConsoleCommand("Stats", "printTickTime", &printTickTime);
    6767
     
    8484        , destructionHelper_(this)
    8585    {
     86        orxout(internal_status) << "initializing Game object..." << endl;
     87
    8688#ifdef ORXONOX_PLATFORM_WINDOWS
    8789        minimumSleepTime_ = 1000/*us*/;
     
    106108
    107109        // Create the Core
     110        orxout(internal_info) << "creating Core object:" << endl;
    108111        this->core_ = new Core(cmdLine);
    109112
     
    125128        this->loadedTopStateNode_ = this->rootStateNode_;
    126129        this->loadedStates_.push_back(this->getState(rootStateNode_->name_));
     130
     131        orxout(internal_status) << "finished initializing Game object" << endl;
    127132    }
    128133
    129134    void Game::destroy()
    130135    {
     136        orxout(internal_status) << "destroying Game object..." << endl;
     137
    131138        // Remove us from the object lists again to avoid problems when destroying them
    132139        this->unregisterObject();
     
    139146        safeObjectDelete(&core_);
    140147        safeObjectDelete(&gameClock_);
     148
     149        orxout(internal_status) << "finished destroying Game object..." << endl;
    141150    }
    142151
     
    163172    {
    164173        if (this->requestedStateNodes_.empty())
    165             COUT(0) << "Warning: Starting game without requesting GameState. This automatically terminates the program." << std::endl;
     174            orxout(user_error) << "Starting game without requesting GameState. This automatically terminates the program." << endl;
     175
     176        // Update the GameState stack if required. We do this already here to have a properly initialized game before entering the main loop
     177        this->updateGameStateStack();
     178
     179        orxout(user_status) << "Game loaded" << endl;
     180        orxout(internal_status) << "--------------------------------------------------" << endl;
     181        orxout(internal_status) << "starting main loop..." << endl;
    166182
    167183        // START GAME
     
    189205            catch (...)
    190206            {
    191                 COUT(0) << "An exception occurred in the Core preUpdate: " << Exception::handleMessage() << std::endl;
    192                 COUT(0) << "This should really never happen! Closing the program." << std::endl;
     207                orxout(user_error) << "An exception occurred in the Core preUpdate: " << Exception::handleMessage() << endl;
     208                orxout(user_error) << "This should really never happen! Closing the program." << endl;
    193209                this->stop();
    194210                break;
     
    203219            catch (...)
    204220            {
    205                 COUT(0) << "An exception occurred in the Core postUpdate: " << Exception::handleMessage() << std::endl;
    206                 COUT(0) << "This should really never happen! Closing the program." << std::endl;
     221                orxout(user_error) << "An exception occurred in the Core postUpdate: " << Exception::handleMessage() << endl;
     222                orxout(user_error) << "This should really never happen! Closing the program." << endl;
    207223                this->stop();
    208224                break;
     
    217233                this->updateFPSLimiter();
    218234        }
     235
     236        orxout(internal_status) << "finished main loop" << endl;
     237        orxout(internal_status) << "--------------------------------------------------" << endl;
    219238
    220239        // UNLOAD all remaining states
     
    241260                catch (...)
    242261                {
    243                     COUT(1) << "Error: Loading GameState '" << requestedStateNode->name_ << "' failed: " << Exception::handleMessage() << std::endl;
     262                    orxout(user_error) << "Loading GameState '" << requestedStateNode->name_ << "' failed: " << Exception::handleMessage() << endl;
    244263                    // All scheduled operations have now been rendered inert --> flush them and issue a warning
    245264                    if (this->requestedStateNodes_.size() > 1)
    246                         COUT(4) << "All " << this->requestedStateNodes_.size() - 1 << " scheduled transitions have been ignored." << std::endl;
     265                        orxout(internal_info) << "All " << this->requestedStateNodes_.size() - 1 << " scheduled transitions have been ignored." << endl;
    247266                    this->requestedStateNodes_.clear();
    248267                    break;
     
    272291            catch (...)
    273292            {
    274                 COUT(1) << "An exception occurred while updating '" << (*it)->getName() << "': " << Exception::handleMessage() << std::endl;
    275                 COUT(1) << "This should really never happen!" << std::endl;
    276                 COUT(1) << "Unloading all GameStates depending on the one that crashed." << std::endl;
     293                orxout(user_error) << "An exception occurred while updating '" << (*it)->getName() << "': " << Exception::handleMessage() << endl;
     294                orxout(user_error) << "This should really never happen!" << endl;
     295                orxout(user_error) << "Unloading all GameStates depending on the one that crashed." << endl;
    277296                shared_ptr<GameStateTreeNode> current = this->loadedTopStateNode_;
    278297                while (current->name_ != (*it)->getName() && current)
     
    338357    void Game::stop()
    339358    {
     359        orxout(user_status) << "Exit" << endl;
    340360        this->bAbort_ = true;
    341361    }
     
    355375        if (!this->checkState(name))
    356376        {
    357             COUT(2) << "Warning: GameState named '" << name << "' doesn't exist!" << std::endl;
     377            orxout(user_warning) << "GameState named '" << name << "' doesn't exist!" << endl;
    358378            return;
    359379        }
     
    361381        if (this->bChangingState_)
    362382        {
    363             COUT(2) << "Warning: Requesting GameStates while loading/unloading a GameState is illegal! Ignoring." << std::endl;
     383            orxout(user_warning) << "Requesting GameStates while loading/unloading a GameState is illegal! Ignoring." << endl;
    364384            return;
    365385        }
     
    372392        if (name == lastRequestedNode->name_)
    373393        {
    374             COUT(2) << "Warning: Requesting the currently active state! Ignoring." << std::endl;
     394            orxout(user_warning) << "Requesting the currently active state! Ignoring." << endl;
    375395            return;
    376396        }
     
    403423
    404424        if (requestedNodes.empty())
    405             COUT(1) << "Error: Requested GameState transition is not allowed. Ignoring." << std::endl;
     425            orxout(user_error) << "Requested GameState transition is not allowed. Ignoring." << endl;
    406426        else
    407427            this->requestedStateNodes_.insert(requestedStateNodes_.end(), requestedNodes.begin(), requestedNodes.end());
     
    425445            this->requestState(lastRequestedNode->parent_.lock()->name_);
    426446        else
    427             COUT(2) << "Warning: Can't pop the internal dummy root GameState" << std::endl;
     447            orxout(internal_warning) << "Can't pop the internal dummy root GameState" << endl;
    428448    }
    429449
     
    437457            std::map<std::string, GameStateInfo>::const_iterator it = gameStateDeclarations_s.find(name);
    438458            if (it != gameStateDeclarations_s.end())
    439                 COUT(1) << "Error: GameState '" << name << "' has not yet been loaded." << std::endl;
     459                orxout(internal_error) << "GameState '" << name << "' has not yet been loaded." << endl;
    440460            else
    441                 COUT(1) << "Error: Could not find GameState '" << name << "'." << std::endl;
     461                orxout(internal_error) << "Could not find GameState '" << name << "'." << endl;
    442462            return shared_ptr<GameState>();
    443463        }
     
    507527        if (!GameMode::showsGraphics())
    508528        {
     529            orxout(user_status) << "Loading graphics" << endl;
     530            orxout(internal_info) << "loading graphics in Game" << endl;
     531
    509532            core_->loadGraphics();
    510533            Loki::ScopeGuard graphicsUnloader = Loki::MakeObjGuard(*this, &Game::unloadGraphics);
     
    524547            }
    525548            graphicsUnloader.Dismiss();
     549
     550            orxout(internal_info) << "finished loading graphics in Game" << endl;
    526551        }
    527552    }
     
    531556        if (GameMode::showsGraphics())
    532557        {
     558            orxout(user_status) << "Unloading graphics" << endl;
     559            orxout(internal_info) << "unloading graphics in Game" << endl;
     560
    533561            // Destroy all the GameStates that require graphics
    534562            for (GameStateMap::iterator it = constructedStates_.begin(); it != constructedStates_.end();)
     
    555583    void Game::loadState(const std::string& name)
    556584    {
     585        orxout(internal_status) << "loading state '" << name << "'" << endl;
     586
    557587        this->bChangingState_ = true;
    558588        LOKI_ON_BLOCK_EXIT_OBJ(*this, &Game::resetChangingState); (void)LOKI_ANONYMOUS_VARIABLE(scopeGuard);
     
    577607    void Game::unloadState(const std::string& name)
    578608    {
     609        orxout(internal_status) << "unloading state '" << name << "'" << endl;
     610
    579611        this->bChangingState_ = true;
    580612        try
     
    589621        catch (...)
    590622        {
    591             COUT(2) << "Warning: Unloading GameState '" << name << "' threw an exception: " << Exception::handleMessage() << std::endl;
    592             COUT(2) << "         There might be potential resource leaks involved! To avoid this, improve exception-safety." << std::endl;
     623            orxout(internal_warning) << "Unloading GameState '" << name << "' threw an exception: " << Exception::handleMessage() << endl;
     624            orxout(internal_warning) << "There might be potential resource leaks involved! To avoid this, improve exception-safety." << endl;
    593625        }
    594626        // Check if graphics is still required
  • code/trunk/src/libraries/core/Game.h

    r8423 r8858  
    4747#include <boost/preprocessor/cat.hpp>
    4848
    49 #include "util/Debug.h"
     49#include "util/Output.h"
    5050#include "util/DestructionHelper.h"
    5151#include "util/Singleton.h"
     
    215215        else
    216216        {
    217             COUT(0) << "Error: Cannot declare two GameStates with the same name." << std::endl;
    218             COUT(0) << "       Ignoring second one ('" << stateName << "')." << std::endl;
     217            orxout(internal_warning) << "Cannot declare two GameStates with the same name." << endl;
     218            orxout(internal_warning) << "Ignoring second one ('" << stateName << "')." << endl;
    219219        }
    220220
  • code/trunk/src/libraries/core/GameState.cc

    r6417 r8858  
    3535#include "GameState.h"
    3636
    37 #include "util/Debug.h"
    3837#include "util/Exception.h"
    3938#include "util/OrxAssert.h"
  • code/trunk/src/libraries/core/GraphicsManager.cc

    r8423 r8858  
    104104        RegisterObject(GraphicsManager);
    105105
     106        orxout(internal_status) << "initializing GraphicsManager..." << endl;
    106107        this->setConfigValues();
    107108
     
    114115        resources_.reset(new XMLFile("DefaultResources.oxr"));
    115116        resources_->setLuaSupport(false);
    116         Loader::open(resources_.get());
     117        Loader::open(resources_.get(), ClassTreeMask(), false);
    117118
    118119        // Only for runs in the build directory (not installed)
     
    122123        extResources_.reset(new XMLFile("resources.oxr"));
    123124        extResources_->setLuaSupport(false);
    124         Loader::open(extResources_.get());
     125        Loader::open(extResources_.get(), ClassTreeMask(), false);
    125126
    126127        if (bLoadRenderer)
     
    129130            this->upgradeToGraphics();
    130131        }
     132
     133        orxout(internal_status) << "finished initializing GraphicsManager" << endl;
    131134    }
    132135
    133136    void GraphicsManager::destroy()
    134137    {
     138        orxout(internal_status) << "destroying GraphicsManager..." << endl;
     139
    135140        Loader::unload(debugOverlay_.get());
    136141
     
    148153        safeObjectDelete(&ogreLogger_);
    149154        safeObjectDelete(&ogreWindowEventListener_);
     155
     156        orxout(internal_status) << "finished destroying GraphicsManager" << endl;
    150157    }
    151158
     
    158165        SetConfigValue(ogreLogFile_,     "ogre.log")
    159166            .description("Logfile for messages from Ogre. Use \"\" to suppress log file creation.");
    160         SetConfigValue(ogreLogLevelTrivial_ , 5)
    161             .description("Corresponding orxonox debug level for ogre Trivial");
    162         SetConfigValue(ogreLogLevelNormal_  , 4)
    163             .description("Corresponding orxonox debug level for ogre Normal");
    164         SetConfigValue(ogreLogLevelCritical_, 2)
    165             .description("Corresponding orxonox debug level for ogre Critical");
    166167    }
    167168
     
    179180            return;
    180181
     182        orxout(internal_info) << "GraphicsManager upgrade to graphics" << endl;
     183
    181184        // load all the required plugins for Ogre
    182185        this->loadOgrePlugins();
     
    189192        // choose another resource group.
    190193        Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
     194
     195        orxout(internal_info) << "GraphicsManager finished upgrade to graphics" << endl;
    191196    }
    192197
     
    197202    void GraphicsManager::loadOgreRoot()
    198203    {
    199         COUT(3) << "Setting up Ogre..." << std::endl;
     204        orxout(internal_info) << "Setting up Ogre..." << endl;
    200205
    201206        if (ogreConfigFile_.empty())
    202207        {
    203             COUT(2) << "Warning: Ogre config file set to \"\". Defaulting to config.cfg" << std::endl;
     208            orxout(internal_warning) << "Ogre config file set to \"\". Defaulting to config.cfg" << endl;
    204209            ModifyConfigValue(ogreConfigFile_, tset, "config.cfg");
    205210        }
    206211        if (ogreLogFile_.empty())
    207212        {
    208             COUT(2) << "Warning: Ogre log file set to \"\". Defaulting to ogre.log" << std::endl;
     213            orxout(internal_warning) << "Ogre log file set to \"\". Defaulting to ogre.log" << endl;
    209214            ModifyConfigValue(ogreLogFile_, tset, "ogre.log");
    210215        }
     
    216221        // Ogre::Root will detect that we've already created a Log
    217222        ogreLogger_ = new Ogre::LogManager();
    218         COUT(4) << "Ogre LogManager created" << std::endl;
     223        orxout(internal_info) << "Ogre LogManager created" << endl;
    219224
    220225        // create our own log that we can listen to
    221226        Ogre::Log *myLog;
    222227        myLog = ogreLogger_->createLog(ogreLogFilepath.string(), true, false, false);
    223         COUT(4) << "Ogre Log created" << std::endl;
     228        orxout(internal_info) << "Ogre Log created" << endl;
    224229
    225230        myLog->setLogDetail(Ogre::LL_BOREME);
    226231        myLog->addListener(this);
    227232
    228         COUT(4) << "Creating Ogre Root..." << std::endl;
     233        orxout(internal_info) << "Creating Ogre Root..." << endl;
    229234
    230235        // check for config file existence because Ogre displays (caught) exceptions if not
     
    240245        ogreRoot_ = new Ogre::Root("", ogreConfigFilepath.string(), ogreLogFilepath.string());
    241246
    242         COUT(3) << "Ogre set up done." << std::endl;
     247        orxout(internal_info) << "Ogre set up done." << endl;
    243248    }
    244249
    245250    void GraphicsManager::loadOgrePlugins()
    246251    {
     252        orxout(internal_info) << "loading ogre plugins" << endl;
     253
    247254        // Plugin path can have many different locations...
    248255        std::string pluginPath = specialConfig::ogrePluginsDirectory;
     
    277284    void GraphicsManager::loadRenderer()
    278285    {
    279         CCOUT(4) << "Configuring Renderer" << std::endl;
     286        orxout(internal_info) << "GraphicsManager: Configuring Renderer" << endl;
    280287
    281288        bool updatedConfig = Core::getInstance().getOgreConfigTimestamp() > Core::getInstance().getLastLevelTimestamp();
    282289        if (updatedConfig)
    283             COUT(2) << "Ogre config file has changed, but no level was started since then. Displaying config dialogue again to verify the changes." << std::endl;
     290            orxout(user_info)<< "Ogre config file has changed, but no level was started since then. Displaying config dialogue again to verify the changes." << endl;
    284291
    285292        if (!ogreRoot_->restoreConfig() || updatedConfig)
     
    291298        }
    292299
    293         CCOUT(4) << "Creating render window" << std::endl;
     300        orxout(internal_info) << "Creating render window" << endl;
    294301
    295302        this->renderWindow_ = ogreRoot_->initialise(true, "Orxonox");
     
    317324    {
    318325        // Load debug overlay to show info about fps and tick time
    319         COUT(4) << "Loading Debug Overlay..." << std::endl;
     326        orxout(internal_info) << "Loading Debug Overlay..." << endl;
    320327        debugOverlay_.reset(new XMLFile("debug.oxo"));
    321         Loader::open(debugOverlay_.get());
     328        Loader::open(debugOverlay_.get(), ClassTreeMask(), false);
    322329    }
    323330
     
    396403        Ogre::LogMessageLevel lml, bool maskDebug, const std::string& logName)
    397404    {
    398         int orxonoxLevel;
     405        OutputLevel orxonoxLevel;
    399406        std::string introduction;
    400407        // Do not show caught OGRE exceptions in front
    401408        if (message.find("EXCEPTION") != std::string::npos)
    402409        {
    403             orxonoxLevel = OutputLevel::Debug;
     410            orxonoxLevel = level::internal_error;
    404411            introduction = "Ogre, caught exception: ";
    405412        }
     
    409416            {
    410417            case Ogre::LML_TRIVIAL:
    411                 orxonoxLevel = this->ogreLogLevelTrivial_;
     418                orxonoxLevel = level::verbose_more;
    412419                break;
    413420            case Ogre::LML_NORMAL:
    414                 orxonoxLevel = this->ogreLogLevelNormal_;
     421                orxonoxLevel = level::verbose;
    415422                break;
    416423            case Ogre::LML_CRITICAL:
    417                 orxonoxLevel = this->ogreLogLevelCritical_;
     424                orxonoxLevel = level::internal_warning;
    418425                break;
    419426            default:
    420                 orxonoxLevel = 0;
     427                orxonoxLevel = level::debug_output;
    421428            }
    422429            introduction = "Ogre: ";
    423430        }
    424         OutputHandler::getOutStream(orxonoxLevel)
    425             << introduction << message << std::endl;
     431
     432        orxout(orxonoxLevel, context::ogre) << introduction << message << endl;
    426433    }
    427434
  • code/trunk/src/libraries/core/GraphicsManager.h

    r8706 r8858  
    134134        std::string         ogrePlugins_;              //!< Comma separated list of all plugins to load
    135135        std::string         ogreLogFile_;              //!< log filename for Ogre log messages
    136         int                 ogreLogLevelTrivial_;      //!< Corresponding Orxonox debug level for LL_TRIVIAL
    137         int                 ogreLogLevelNormal_;       //!< Corresponding Orxonox debug level for LL_NORMAL
    138         int                 ogreLogLevelCritical_;     //!< Corresponding Orxonox debug level for LL_CRITICAL
    139136
    140137        /// Helper object that executes the surrogate destructor destroy()
  • code/trunk/src/libraries/core/Identifier.cc

    r8267 r8858  
    130130        {
    131131            // If no: We have to store the information and initialize the Identifier
    132             COUT(4) << "*** ClassIdentifier: Register Class in " << this->getName() << "-Singleton -> Initialize Singleton." << std::endl;
     132            orxout(verbose, context::identifier) << "Register Class in ClassIdentifier<" << this->getName() << ">-Singleton -> Initialize Singleton." << endl;
    133133            if (bRootClass)
    134134                this->initialize(0); // If a class is derived from two interfaces, the second interface might think it's derived from the first because of the order of constructor-calls. Thats why we set parents to zero in that case.
     
    144144    void Identifier::initialize(std::set<const Identifier*>* parents)
    145145    {
    146         COUT(4) << "*** Identifier: Initialize " << this->name_ << "-Singleton." << std::endl;
     146        orxout(verbose, context::identifier) << "Initialize ClassIdentifier<" << this->name_ << ">-Singleton." << endl;
    147147        this->bCreatedOneObject_ = true;
    148148
     
    191191    void Identifier::createClassHierarchy()
    192192    {
    193         COUT(3) << "*** Identifier: Create class-hierarchy" << std::endl;
     193        orxout(internal_status) << "Create class-hierarchy" << endl;
    194194        Identifier::startCreatingHierarchy();
    195195        for (std::map<std::string, Identifier*>::const_iterator it = Identifier::getStringIdentifierMap().begin(); it != Identifier::getStringIdentifierMap().end(); ++it)
     
    203203        }
    204204        Identifier::stopCreatingHierarchy();
    205         COUT(3) << "*** Identifier: Finished class-hierarchy creation" << std::endl;
     205        orxout(internal_status) << "Finished class-hierarchy creation" << endl;
    206206    }
    207207
     
    242242        else
    243243        {
    244             COUT(1) << "An error occurred in Identifier.cc:" << std::endl;
    245             COUT(1) << "Error: Cannot fabricate an object of type '" << this->name_ << "'. Class has no factory." << std::endl;
    246             COUT(1) << "Aborting..." << std::endl;
     244            orxout(user_error) << "An error occurred in Identifier.cc:" << endl;
     245            orxout(user_error) << "Cannot fabricate an object of type '" << this->name_ << "'. Class has no factory." << endl;
     246            orxout(user_error) << "Aborting..." << endl;
    247247            abort();
    248248            return 0;
     
    404404        if (it != this->configValues_.end())
    405405        {
    406             COUT(2) << "Warning: Overwriting config-value with name " << varname << " in class " << this->getName() << '.' << std::endl;
     406            orxout(internal_warning) << "Overwriting config-value with name " << varname << " in class " << this->getName() << '.' << endl;
    407407            delete (it->second);
    408408        }
     
    450450        if (it != this->xmlportParamContainers_.end())
    451451        {
    452             COUT(2) << "Warning: Overwriting XMLPortParamContainer in class " << this->getName() << '.' << std::endl;
     452            orxout(internal_warning) << "Overwriting XMLPortParamContainer in class " << this->getName() << '.' << endl;
    453453            delete (it->second);
    454454        }
     
    481481        if (it != this->xmlportObjectContainers_.end())
    482482        {
    483             COUT(2) << "Warning: Overwriting XMLPortObjectContainer in class " << this->getName() << '.' << std::endl;
     483            orxout(internal_warning) << "Overwriting XMLPortObjectContainer in class " << this->getName() << '.' << endl;
    484484            delete (it->second);
    485485        }
  • code/trunk/src/libraries/core/Identifier.h

    r8706 r8858  
    6464    for (Iterator<BaseObject> it = objects.begin(); it != objects.end(); ++it)  // iterate through the objects
    6565        ++count;
    66     COUT(0) << count << std::endl;                                              // prints "2" because we created 2 instances of MyClass so far
     66    orxout() << count << endl;                                                  // prints "2" because we created 2 instances of MyClass so far
    6767
    6868
     
    8989#include <loki/TypeTraits.h>
    9090
    91 #include "util/Debug.h"
     91#include "util/Output.h"
    9292#include "MetaObjectList.h"
    9393#include "ObjectList.h"
     
    405405        if (ClassIdentifier<T>::classIdentifier_s == proposal)
    406406        {
    407             COUT(4) << "*** Identifier: Requested Identifier for " << name << " was not yet existing and got created." << std::endl;
     407            orxout(verbose, context::identifier) << "Requested Identifier for " << name << " was not yet existing and got created." << endl;
    408408        }
    409409        else
    410410        {
    411             COUT(4) << "*** Identifier: Requested Identifier for " << name << " was already existing and got assigned." << std::endl;
     411            orxout(verbose, context::identifier) << "Requested Identifier for " << name << " was already existing and got assigned." << endl;
    412412        }
    413413    }
     
    423423    {
    424424        if (bRootClass)
    425             COUT(5) << "*** Register Root-Object: " << className << std::endl;
     425            orxout(verbose, context::object_list) << "Register Root-Object: " << className << endl;
    426426        else
    427             COUT(5) << "*** Register Object: " << className << std::endl;
     427            orxout(verbose, context::object_list) << "Register Object: " << className << endl;
    428428
    429429        object->identifier_ = this;
     
    444444        else
    445445        {
    446             COUT(5) << "*** ClassIdentifier: Added object to " << this->getName() << "-list." << std::endl;
     446            orxout(verbose, context::object_list) << "Added object to " << this->getName() << "-list." << endl;
    447447            object->metaList_->add(this->objects_, this->objects_->add(new ObjectListElement<T>(object)));
    448448
  • code/trunk/src/libraries/core/Language.cc

    r7401 r8858  
    3535
    3636#include <fstream>
    37 #include "util/Debug.h"
     37#include "util/Output.h"
    3838#include "util/StringUtils.h"
    3939#include "Core.h"
     
    131131        }
    132132
    133         COUT(2) << "Warning: Language entry " << label << " is duplicate in " << getFilename(this->defaultLanguage_) << '!' << std::endl;
     133        orxout(internal_warning, context::language) << "Language entry " << label << " is duplicate in " << getFilename(this->defaultLanguage_) << '!' << endl;
    134134        return it->second;
    135135    }
     
    142142    void Language::addEntry(const LanguageEntryLabel& label, const std::string& entry)
    143143    {
    144         COUT(5) << "Language: Called addEntry with\n  label: " << label << "\n  entry: " <<  entry << std::endl;
     144        orxout(verbose, context::language) << "Called addEntry with" << '\n' << "label: " << label << '\n' << "entry: " <<  entry << endl;
    145145        std::map<std::string, LanguageEntry*>::const_iterator it = this->languageEntries_.find(label);
    146146        if (it == this->languageEntries_.end())
     
    179179        {
    180180            // Uh, oh, an undefined entry was requested: return the default string
    181             COUT(2) << "Warning: Language entry \"" << label << "\" not found!" << std::endl;
     181            orxout(internal_warning, context::language) << "Language entry \"" << label << "\" not found!" << endl;
    182182            return this->defaultLocalisation_;
    183183        }
     
    201201    void Language::readDefaultLanguageFile()
    202202    {
    203         COUT(4) << "Read default language file." << std::endl;
     203        orxout(internal_info, context::language) << "Read default language file." << endl;
    204204
    205205        const std::string& filepath = PathConfig::getConfigPathString() + getFilename(this->defaultLanguage_);
     
    216216        if (!file.is_open())
    217217        {
    218             COUT(1) << "An error occurred in Language.cc:" << std::endl;
    219             COUT(1) << "Error: Couldn't open file " << getFilename(this->defaultLanguage_) << " to read the default language entries!" << std::endl;
     218            orxout(internal_error, context::language) << "An error occurred in Language.cc:" << endl;
     219            orxout(internal_error, context::language) << "Couldn't open file " << getFilename(this->defaultLanguage_) << " to read the default language entries!" << endl;
    220220            return;
    221221        }
     
    237237                else
    238238                {
    239                     COUT(2) << "Warning: Invalid language entry \"" << lineString << "\" in " << getFilename(this->defaultLanguage_) << std::endl;
     239                    orxout(internal_warning, context::language) << "Invalid language entry \"" << lineString << "\" in " << getFilename(this->defaultLanguage_) << endl;
    240240                }
    241241            }
     
    250250    void Language::readTranslatedLanguageFile()
    251251    {
    252         COUT(4) << "Read translated language file (" << Core::getInstance().getLanguage() << ")." << std::endl;
     252        orxout(internal_info, context::language) << "Read translated language file (" << Core::getInstance().getLanguage() << ")." << endl;
    253253
    254254        const std::string& filepath = PathConfig::getConfigPathString() + getFilename(Core::getInstance().getLanguage());
     
    260260        if (!file.is_open())
    261261        {
    262             COUT(1) << "An error occurred in Language.cc:" << std::endl;
    263             COUT(1) << "Error: Couldn't open file " << getFilename(Core::getInstance().getLanguage()) << " to read the translated language entries!" << std::endl;
     262            orxout(internal_error, context::language) << "An error occurred in Language.cc:" << endl;
     263            orxout(internal_error, context::language) << "Couldn't open file " << getFilename(Core::getInstance().getLanguage()) << " to read the translated language entries!" << endl;
    264264            Core::getInstance().resetLanguage();
    265             COUT(3) << "Info: Reset language to " << this->defaultLanguage_ << '.' << std::endl;
     265            orxout(internal_info, context::language) << "Reset language to " << this->defaultLanguage_ << '.' << endl;
    266266            return;
    267267        }
     
    291291                else
    292292                {
    293                     COUT(2) << "Warning: Invalid language entry \"" << lineString << "\" in " << getFilename(Core::getInstance().getLanguage()) << std::endl;
     293                    orxout(internal_warning, context::language) << "Invalid language entry \"" << lineString << "\" in " << getFilename(Core::getInstance().getLanguage()) << endl;
    294294                }
    295295            }
     
    304304    void Language::writeDefaultLanguageFile() const
    305305    {
    306         COUT(4) << "Language: Write default language file." << std::endl;
     306        orxout(verbose, context::language) << "Write default language file." << endl;
    307307
    308308        const std::string& filepath = PathConfig::getConfigPathString() + getFilename(this->defaultLanguage_);
     
    314314        if (!file.is_open())
    315315        {
    316             COUT(1) << "An error occurred in Language.cc:" << std::endl;
    317             COUT(1) << "Error: Couldn't open file " << getFilename(this->defaultLanguage_) << " to write the default language entries!" << std::endl;
     316            orxout(internal_error, context::language) << "An error occurred in Language.cc:" << endl;
     317            orxout(internal_error, context::language) << "Couldn't open file " << getFilename(this->defaultLanguage_) << " to write the default language entries!" << endl;
    318318            return;
    319319        }
     
    322322        for (std::map<std::string, LanguageEntry*>::const_iterator it = this->languageEntries_.begin(); it != this->languageEntries_.end(); ++it)
    323323        {
    324             file << it->second->getLabel() << '=' << it->second->getDefault() << std::endl;
     324            file << it->second->getLabel() << '=' << it->second->getDefault() << endl;
    325325        }
    326326
  • code/trunk/src/libraries/core/Language.h

    r7401 r8858  
    5151     - Get the localisation of the entry in the configured language:
    5252       @code
    53        std::cout << Language::getInstance()->getLocalisation("name of the entry") << std::endl;
     53       orxout() << Language::getInstance()->getLocalisation("name of the entry") << endl;
    5454       @endcode
    5555
     
    5858    int age = 20;
    5959    AddLanguageEntry("user_age", "Age");
    60     std::cout << GetLocalisation("user_age") << ": " << age << std::endl;
     60    orxout() << GetLocalisation("user_age") << ": " << age << endl;
    6161    @endcode
    6262
  • code/trunk/src/libraries/core/Loader.cc

    r8108 r8858  
    3333#include <boost/scoped_ptr.hpp>
    3434
    35 #include "util/Debug.h"
     35#include "util/Output.h"
    3636#include "util/Exception.h"
    3737#include "util/StringUtils.h"
     
    4949    ClassTreeMask Loader::currentMask_s;
    5050
    51     bool Loader::open(const XMLFile* file, const ClassTreeMask& mask)
     51    bool Loader::open(const XMLFile* file, const ClassTreeMask& mask, bool bVerbose)
    5252    {
    5353        Loader::add(file, mask);
    54         return Loader::load(file, mask);
     54        return Loader::load(file, mask, bVerbose);
    5555    }
    5656
     
    9393    @param mask
    9494        A ClassTreeMask, which defines which types of classes are loaded and which aren't.
    95     @param verbose
     95    @param bVerbose
    9696        Whether the loader is verbose (prints its progress in a low output level) or not.
    9797    @return
    9898        Returns true if successful.
    9999    */
    100     bool Loader::load(const ClassTreeMask& mask, bool verbose)
     100    bool Loader::load(const ClassTreeMask& mask, bool bVerbose)
    101101    {
    102102        bool success = true;
    103103        for (std::vector<std::pair<const XMLFile*, ClassTreeMask> >::iterator it = Loader::files_s.begin(); it != Loader::files_s.end(); ++it)
    104             if (!Loader::load(it->first, it->second * mask, verbose))
     104            if (!Loader::load(it->first, it->second * mask, bVerbose))
    105105                success = false;
    106106
     
    124124    @param mask
    125125        A ClassTreeMask, which defines which types of classes are reloaded and which aren't.
    126     @param verbose
     126    @param bVerbose
    127127        Whether the loader is verbose (prints its progress in a low output level) or not.
    128128    @return
    129129        Returns true if successful.
    130130    */
    131     bool Loader::reload(const ClassTreeMask& mask, bool verbose)
     131    bool Loader::reload(const ClassTreeMask& mask, bool bVerbose)
    132132    {
    133133        Loader::unload(mask);
    134         return Loader::load(mask, verbose);
     134        return Loader::load(mask, bVerbose);
    135135    }
    136136
     
    142142    @param mask
    143143        A ClassTreeMask, which defines which types of classes are loaded and which aren't.
    144     @param verbose
     144    @param bVerbose
    145145        Whether the loader is verbose (prints its progress in a low output level) or not.
    146146    @param bRemoveLuaTags
     
    149149        Returns true if successful.
    150150    */
    151     bool Loader::load(const XMLFile* file, const ClassTreeMask& mask, bool verbose, bool bRemoveLuaTags)
     151    bool Loader::load(const XMLFile* file, const ClassTreeMask& mask, bool bVerbose, bool bRemoveLuaTags)
    152152    {
    153153        if (!file)
     
    170170            if (info == NULL)
    171171            {
    172                 COUT(1) << "Error: Could not find XML file '" << file->getFilename() << "'." << std::endl;
     172                orxout(user_error, context::loader) << "Could not find XML file '" << file->getFilename() << "'." << endl;
    173173                return false;
    174174            }
     
    187187        try
    188188        {
    189             if(verbose)
    190             {
    191                 COUT(0) << "Start loading " << file->getFilename() << "..." << std::endl;
    192                 COUT(3) << "Mask: " << Loader::currentMask_s << std::endl;
    193             }
    194             else
    195             {
    196                 COUT(4) << "Start loading " << file->getFilename() << "..." << std::endl;
    197                 COUT(4) << "Mask: " << Loader::currentMask_s << std::endl;
     189            if(bVerbose)
     190            {
     191                orxout(user_info) << "Start loading " << file->getFilename() << "..." << endl;
     192                orxout(internal_info, context::loader) << "Mask: " << Loader::currentMask_s << endl;
     193            }
     194            else
     195            {
     196                orxout(verbose, context::loader) << "Start loading " << file->getFilename() << "..." << endl;
     197                orxout(verbose_more, context::loader) << "Mask: " << Loader::currentMask_s << endl;
    198198            }
    199199
     
    208208                rootElement.InsertEndChild(*child);
    209209
    210             COUT(4) << "  creating root-namespace..." << std::endl;
     210            orxout(verbose, context::loader) << "  creating root-namespace..." << endl;
    211211            Namespace* rootNamespace = new Namespace(0);
    212212            rootNamespace->setLoaderIndentation("    ");
     
    216216            rootNamespace->XMLPort(rootElement, XMLPort::LoadObject);
    217217
    218             if(verbose)
    219                 COUT(0) << "Finished loading " << file->getFilename() << '.' << std::endl;
    220             else
    221                 COUT(4) << "Finished loading " << file->getFilename() << '.' << std::endl;
    222 
    223             COUT(4) << "Namespace-tree:" << std::endl << rootNamespace->toString("  ") << std::endl;
     218            if(bVerbose)
     219                orxout(user_info) << "Finished loading " << file->getFilename() << '.' << endl;
     220            else
     221                orxout(verbose, context::loader) << "Finished loading " << file->getFilename() << '.' << endl;
     222
     223            orxout(verbose, context::loader) << "Namespace-tree:" << '\n' << rootNamespace->toString("  ") << endl;
    224224
    225225            return true;
     
    227227        catch (ticpp::Exception& ex)
    228228        {
    229             COUT(1) << std::endl;
    230             COUT(1) << "An XML-error occurred in Loader.cc while loading " << file->getFilename() << ':' << std::endl;
    231             COUT(1) << ex.what() << std::endl;
    232             COUT(1) << "Loading aborted." << std::endl;
     229            orxout(user_error, context::loader) << endl;
     230            orxout(user_error, context::loader) << "An XML-error occurred in Loader.cc while loading " << file->getFilename() << ':' << endl;
     231            orxout(user_error, context::loader) << ex.what() << endl;
     232            orxout(user_error, context::loader) << "Loading aborted." << endl;
    233233            return false;
    234234        }
    235235        catch (Exception& ex)
    236236        {
    237             COUT(1) << std::endl;
    238             COUT(1) << "A loading-error occurred in Loader.cc while loading " << file->getFilename() << ':' << std::endl;
    239             COUT(1) << ex.what() << std::endl;
    240             COUT(1) << "Loading aborted." << std::endl;
     237            orxout(user_error, context::loader) << endl;
     238            orxout(user_error, context::loader) << "A loading-error occurred in Loader.cc while loading " << file->getFilename() << ':' << endl;
     239            orxout(user_error, context::loader) << ex.what() << endl;
     240            orxout(user_error, context::loader) << "Loading aborted." << endl;
    241241            return false;
    242242        }
    243243        catch (...)
    244244        {
    245             COUT(1) << std::endl;
    246             COUT(1) << "An error occurred in Loader.cc while loading " << file->getFilename() << ':' << std::endl;
    247             COUT(1) << Exception::handleMessage() << std::endl;
    248             COUT(1) << "Loading aborted." << std::endl;
     245            orxout(user_error, context::loader) << endl;
     246            orxout(user_error, context::loader) << "An error occurred in Loader.cc while loading " << file->getFilename() << ':' << endl;
     247            orxout(user_error, context::loader) << Exception::handleMessage() << endl;
     248            orxout(user_error, context::loader) << "Loading aborted." << endl;
    249249            return false;
    250250        }
     
    271271    @param mask
    272272        A ClassTreeMask, which defines which types of classes are reloaded and which aren't.
    273     @param verbose
     273    @param bVerbose
    274274        Whether the loader is verbose (prints its progress in a low output level) or not.
    275275    @return
    276276        Returns true if successful.
    277277    */
    278     bool Loader::reload(const XMLFile* file, const ClassTreeMask& mask, bool verbose)
     278    bool Loader::reload(const XMLFile* file, const ClassTreeMask& mask, bool bVerbose)
    279279    {
    280280        Loader::unload(file, mask);
    281         return Loader::load(file, mask, verbose);
     281        return Loader::load(file, mask, bVerbose);
    282282    }
    283283
     
    337337            if (!expectedValue)
    338338            {
    339                 COUT(2) << "Warning: Error in level file" << std::endl;
     339                orxout(internal_error, context::loader) << "Error in level file" << endl;
    340340                // TODO: error handling
    341                 return false; 
     341                return false;
    342342            }
    343343        }
  • code/trunk/src/libraries/core/Loader.h

    r8079 r8858  
    5151    {
    5252        public:
    53             static bool open(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask());
     53            static bool open(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask(), bool bVerbose = true);
    5454            static void close();
    5555            static void close(const XMLFile* file);
     
    5858            static void remove(const XMLFile* file);
    5959
    60             static bool load(const ClassTreeMask& mask = ClassTreeMask(), bool verbose = true);
     60            static bool load(const ClassTreeMask& mask = ClassTreeMask(), bool bVerbose = true);
    6161            static void unload(const ClassTreeMask& mask = ClassTreeMask());
    62             static bool reload(const ClassTreeMask& mask = ClassTreeMask(), bool verbose = true);
     62            static bool reload(const ClassTreeMask& mask = ClassTreeMask(), bool bVerbose = true);
    6363
    6464            static bool load(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask(),
    65                              bool verbose = true, bool bRemoveLuaTags = false);
     65                             bool bVerbose = true, bool bRemoveLuaTags = false);
    6666            static void unload(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask());
    67             static bool reload(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask(), bool verbose = true);
     67            static bool reload(const XMLFile* file, const ClassTreeMask& mask = ClassTreeMask(), bool bVerbose = true);
    6868
    6969            static std::string replaceLuaTags(const std::string& text);
  • code/trunk/src/libraries/core/LuaState.cc

    r8729 r8858  
    3737#include <loki/ScopeGuard.h>
    3838
    39 #include "util/Debug.h"
     39#include "util/Output.h"
    4040#include "util/Exception.h"
    4141#include "Resource.h"
     
    9696        else
    9797        {
    98             COUT(2) << "LuaState: Cannot include file '" << filename << "' (not found)." << std::endl;
     98            orxout(internal_warning, context::lua) << "LuaState: Cannot include file '" << filename << "' (not found)." << endl;
    9999            return false;
    100100        }
     
    136136        else
    137137        {
    138             COUT(2) << "LuaState: Cannot do file '" << filename << "' (not found)." << std::endl;
     138            orxout(internal_warning, context::lua) << "LuaState: Cannot do file '" << filename << "' (not found)." << endl;
    139139            return false;
    140140        }
     
    176176        {
    177177        case LUA_ERRSYNTAX: // Syntax error
    178             COUT(1) << "Lua syntax error: " << lua_tostring(luaState_, -1) << std::endl;
     178            orxout(internal_error, context::lua) << "Lua syntax error: " << lua_tostring(luaState_, -1) << endl;
    179179            break;
    180180        case LUA_ERRMEM:    // Memory allocation error
    181             COUT(1) << "Lua memory allocation error: Consult your dentist immediately!" << std::endl;
     181            orxout(internal_error, context::lua) << "Lua memory allocation error: Consult your dentist immediately!" << endl;
    182182            break;
    183183        }
     
    200200                    std::string errorString = lua_tostring(this->luaState_, -1);
    201201                    if (errorString.find("Error propagation") == std::string::npos)
    202                         COUT(1) << "Lua runtime error: " << errorString << std::endl;
     202                        orxout(internal_error, context::lua) << "Lua runtime error: " << errorString << endl;
    203203                }
    204204                break;
    205205            case LUA_ERRERR: // Error in the error handler
    206                 COUT(1) << "Lua error in error handler. No message available." << std::endl;
     206                orxout(internal_error, context::lua) << "Lua error in error handler. No message available." << endl;
    207207                break;
    208208            case LUA_ERRMEM: // Memory allocation error
    209                 COUT(1) << "Lua memory allocation error: Consult your dentist immediately!" << std::endl;
     209                orxout(internal_error, context::lua) << "Lua memory allocation error: Consult your dentist immediately!" << endl;
    210210                break;
    211211            }
     
    236236    }
    237237
    238     void LuaState::luaLog(unsigned int level, const std::string& message)
    239     {
    240         OutputHandler::getOutStream(level) << message << std::endl;
     238    void LuaState::luaOutput(OutputLevel level, const std::string& context, const std::string& message)
     239    {
     240        orxout(level, registerContext(context)) << message << endl;
     241    }
     242
     243    void LuaState::luaOutput(OutputLevel level, const std::string& message)
     244    {
     245        orxout(level, context::lua) << message << endl;
     246    }
     247
     248    void LuaState::luaOutput(const std::string& message)
     249    {
     250        orxout(debug_output, context::lua) << message << endl;
    241251    }
    242252
     
    288298            if (it->first == name || it->second == function)
    289299            {
    290                 COUT(2) << "Warning: Trying to add a Tolua interface with the same name or function." << std::endl;
     300                orxout(internal_warning, context::lua) << "Trying to add a Tolua interface with the same name or function." << endl;
    291301                return true;
    292302            }
     
    307317        if (it == getToluaInterfaces().end())
    308318        {
    309             COUT(2) << "Warning: Cannot remove Tolua interface '" << name << "': Not found" << std::endl;
     319            orxout(internal_warning, context::lua) << "Cannot remove Tolua interface '" << name << "': Not found" << endl;
    310320            return true;
    311321        }
  • code/trunk/src/libraries/core/LuaState.h

    r8729 r8858  
    4949#include <boost/shared_ptr.hpp>
    5050
     51#include "util/Output.h"
     52
    5153namespace orxonox // tolua_export
    5254{ // tolua_export
     
    8385
    8486        void luaPrint(const std::string& str); // tolua_export
    85         void luaLog(unsigned int level, const std::string& message); // tolua_export
     87        void luaOutput(orxonox::level::OutputLevel level, const std::string& context, const std::string& message); // tolua_export
     88        void luaOutput(orxonox::level::OutputLevel level, const std::string& message); // tolua_export
     89        void luaOutput(const std::string& message); // tolua_export
    8690        bool fileExists(const std::string& filename); // tolua_export
    8791        std::string getSourceCode(const std::string& filename); // tolua_export
  • code/trunk/src/libraries/core/MetaObjectList.cc

    r5738 r8858  
    3434#include "MetaObjectList.h"
    3535
    36 #include "util/Debug.h"
     36#include "util/Output.h"
    3737#include "Identifier.h"
    3838#include "ObjectListBase.h"
     
    4848    MetaObjectListElement::~MetaObjectListElement()
    4949    {
    50         COUT(5) << "*** MetaObjectList: Removing Object from " << this->list_->getIdentifier()->getName() << "-list." << std::endl;
     50        orxout(verbose, context::object_list) << "Removing Object from " << this->list_->getIdentifier()->getName() << "-list." << endl;
    5151        this->list_->notifyIterators(this->element_->objectBase_);
    5252
  • code/trunk/src/libraries/core/NamespaceNode.cc

    r6417 r8858  
    2828
    2929#include "NamespaceNode.h"
    30 #include "util/Debug.h"
     30#include "util/Output.h"
    3131
    3232namespace orxonox
     
    7070                if (this->bRoot_)
    7171                {
    72                     COUT(2) << "Warning: Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", namespace is root." << std::endl;
     72                    orxout(internal_warning) << "Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", namespace is root." << endl;
    7373                    nodes = this->getNodeRelative(secondPart);
    7474                }
    7575                else if (!this->parent_)
    7676                {
    77                     COUT(2) << "Warning: Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", no parent namespace set." << std::endl;
     77                    orxout(internal_warning) << "Can't go to enclosing namespace with '..' operator in namespace " << this->name_ << ", no parent namespace set." << endl;
    7878                    nodes = this->getNodeRelative(secondPart);
    7979                }
     
    9191                if (it->second->isHidden())
    9292                {
    93                     COUT(2) << "Warning: Subnamespace '" << firstPart << "' in namespace '" << this->name_ << "' is hidden and can't be accessed." << std::endl;
     93                    orxout(internal_warning) << "Subnamespace '" << firstPart << "' in namespace '" << this->name_ << "' is hidden and can't be accessed." << endl;
    9494                    nodes.insert(this);
    9595                }
     
    115115                if (!bFoundMatchingNamespace)
    116116                {
    117                     COUT(2) << "Warning: No file included with name '" << firstPart.substr(1, std::string::npos) << "' at this part of the level file, using parent namespace instead." << std::endl;
     117                    orxout(internal_warning) << "No file included with name '" << firstPart.substr(1, std::string::npos) << "' at this part of the level file, using parent namespace instead." << endl;
    118118                    nodes = this->getNodeRelative(secondPart);
    119119                }
  • code/trunk/src/libraries/core/OrxonoxClass.cc

    r7849 r8858  
    6060    {
    6161//        if (!this->requestedDestruction_)
    62 //            COUT(2) << "Warning: Destroyed object without destroy() (" << this->getIdentifier()->getName() << ')' << std::endl;
     62//            orxout(internal_warning) << "Destroyed object without destroy() (" << this->getIdentifier()->getName() << ')' << endl;
    6363
    6464        assert(this->referenceCount_ <= 0);
  • code/trunk/src/libraries/core/OrxonoxClass.h

    r8729 r8858  
    4949#include <vector>
    5050#include "Super.h"
    51 
    52 /**
    53 @def CCOUT
    54     Acts almost exactly like COUT(x), but prepends "ClassName: "
    55 */
    56 #define CCOUT(level) \
    57     COUT(level) << this->getIdentifier()->getName() << ": "
    5851
    5952namespace orxonox
  • code/trunk/src/libraries/core/PathConfig.cc

    r8729 r8858  
    5151
    5252#include "SpecialConfig.h"
    53 #include "util/Debug.h"
     53#include "util/Output.h"
    5454#include "util/Exception.h"
    5555#include "CommandLineParser.h"
     
    137137        if (bf::exists(executablePath_ / "orxonox_dev_build.keep_me"))
    138138        {
    139             COUT(1) << "Running from the build tree." << std::endl;
     139            orxout(internal_info) << "Running from the build tree." << endl;
    140140            PathConfig::bBuildDirectoryRun_ = true;
    141141            modulePath_ = specialConfig::moduleDevDirectory;
     
    247247            if (bf::create_directories(it->first)) // function may not return true at all (bug?)
    248248            {
    249                 COUT(4) << "Created " << it->second << " directory" << std::endl;
     249                orxout(internal_info) << "Created " << it->second << " directory" << endl;
    250250            }
    251251        }
  • code/trunk/src/libraries/core/SubclassIdentifier.h

    r7401 r8858  
    6969
    7070#include <cstdlib>
    71 #include "util/Debug.h"
     71#include "util/Output.h"
    7272#include "Identifier.h"
    7373
     
    119119                if (!identifier || !identifier->isA(ClassIdentifier<T>::getIdentifier()))
    120120                {
    121                     COUT(1) << "An error occurred in SubclassIdentifier (Identifier.h):" << std::endl;
     121                    orxout(internal_error) << "An error occurred in SubclassIdentifier (Identifier.h):" << endl;
    122122                    if (identifier)
    123123                    {
    124                         COUT(1) << "Error: Class " << identifier->getName() << " is not a " << ClassIdentifier<T>::getIdentifier()->getName() << '!' << std::endl;
    125                         COUT(1) << "Error: SubclassIdentifier<" << ClassIdentifier<T>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden." << std::endl;
     124                        orxout(internal_error) << "Class " << identifier->getName() << " is not a " << ClassIdentifier<T>::getIdentifier()->getName() << '!' << endl;
     125                        orxout(internal_error) << "SubclassIdentifier<" << ClassIdentifier<T>::getIdentifier()->getName() << "> = Class(" << identifier->getName() << ") is forbidden." << endl;
    126126                    }
    127127                    else
    128128                    {
    129                         COUT(1) << "Error: Can't assign NULL identifier" << std::endl;
     129                        orxout(internal_error) << "Can't assign NULL identifier" << endl;
    130130                    }
    131131                }
     
    177177                    if (this->identifier_)
    178178                    {
    179                         COUT(1) << "An error occurred in SubclassIdentifier (Identifier.h):" << std::endl;
    180                         COUT(1) << "Error: Class " << this->identifier_->getName() << " is not a " << ClassIdentifier<T>::getIdentifier()->getName() << '!' << std::endl;
    181                         COUT(1) << "Error: Couldn't fabricate a new Object." << std::endl;
     179                        orxout(user_error) << "An error occurred in SubclassIdentifier (Identifier.h):" << endl;
     180                        orxout(user_error) << "Class " << this->identifier_->getName() << " is not a " << ClassIdentifier<T>::getIdentifier()->getName() << '!' << endl;
     181                        orxout(user_error) << "Couldn't fabricate a new Object." << endl;
    182182                    }
    183183                    else
    184184                    {
    185                         COUT(1) << "An error occurred in SubclassIdentifier (Identifier.h):" << std::endl;
    186                         COUT(1) << "Error: Couldn't fabricate a new Object - Identifier is undefined." << std::endl;
    187                     }
    188 
    189                     COUT(1) << "Aborting..." << std::endl;
     185                        orxout(user_error) << "An error occurred in SubclassIdentifier (Identifier.h):" << endl;
     186                        orxout(user_error) << "Couldn't fabricate a new Object - Identifier is undefined." << endl;
     187                    }
     188
     189                    orxout(user_error) << "Aborting..." << endl;
    190190                    abort();
    191191                    return 0;
  • code/trunk/src/libraries/core/Super.h

    r8729 r8858  
    7373
    7474#include "CorePrereqs.h"
    75 #include "util/Debug.h"
     75#include "util/Output.h"
    7676
    7777///////////////////////
     
    114114                    if (!((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_) \
    115115                    { \
    116                         COUT(5) << "Added SuperFunctionCaller for " << #functionname << ": " << ClassIdentifier<T>::getIdentifier()->getName() << " <- " << ((ClassIdentifier<T>*)(*it))->getName() << std::endl; \
     116                        orxout(verbose, context::super) << "Added SuperFunctionCaller for " << #functionname << ": " << ClassIdentifier<T>::getIdentifier()->getName() << " <- " << ((ClassIdentifier<T>*)(*it))->getName() << endl; \
    117117                        ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_##functionname <T>; \
    118118                    } \
     
    184184                    {
    185185                        // Add the SuperFunctionCaller
    186                         COUT(5) << "adding functionpointer to " << ((ClassIdentifier<T>*)(*it))->getName() << std::endl;
     186                        orxout(verbose, context::super) << "adding functionpointer to " << ((ClassIdentifier<T>*)(*it))->getName() << endl;
    187187                        ((ClassIdentifier<T>*)(*it))->superFunctionCaller_##functionname##_ = new SuperFunctionClassCaller_##functionname <T>;
    188188                    }
  • code/trunk/src/libraries/core/Template.cc

    r7163 r8858  
    3232#include <tinyxml/ticpp.h>
    3333
    34 #include "util/Debug.h"
     34#include "util/Output.h"
    3535#include "CoreIncludes.h"
    3636#include "XMLPort.h"
     
    8888            it = Template::getTemplateMap().find(this->getName());
    8989            if (it != Template::getTemplateMap().end())
    90                 COUT(2) << "Warning: Template with name \"" << this->getName() << "\" already exists." << std::endl;
     90                orxout(internal_warning, context::templates) << "Template with name \"" << this->getName() << "\" already exists." << endl;
    9191            else
    9292                Template::getTemplateMap()[this->getName()] = this;
     
    117117                else
    118118                {
    119                     COUT(2) << "Warning: Linking from " << this->getName() << " to " << this->link_ << " leads to an infinite loop. Returning own element." << std::endl;
     119                    orxout(internal_warning, context::templates) << "Linking from \"" << this->getName() << "\" to \"" << this->link_ << "\" leads to an infinite loop. Returning own element." << endl;
    120120                }
    121121            }
    122122            else
    123123            {
    124                 COUT(2) << "Warning: " << this->link_ << " is not an existing Template name. Returning own element." << std::endl;
     124                orxout(internal_warning, context::templates) << '"' << this->link_ << "\" is not an existing Template name. Returning own element." << endl;
    125125            }
    126126        }
     
    142142            if (!object->isA(this->baseclassIdentifier_))
    143143            {
    144                 COUT(1) << "Error: Can't apply template (name: " << this->getName() << "), object (name: " << object->getName() << ", class: " << object->getIdentifier()->getName() << ") is not a " << this->baseclassIdentifier_->getName() << std::endl;
     144                orxout(internal_error, context::templates) << "Can't apply template (name: " << this->getName() << "), object (name: " << object->getName() << ", class: " << object->getIdentifier()->getName() << ") is not a " << this->baseclassIdentifier_->getName() << endl;
    145145                return;
    146146            }
    147147        }
    148148
    149         COUT(4) << object->getLoaderIndentation() << " aplying Template \"" << this->getName() << "\"..." << std::endl;
     149        orxout(verbose, context::templates) << object->getLoaderIndentation() << " aplying Template \"" << this->getName() << "\"..." << endl;
    150150
    151151        Element temp = &const_cast<TiXmlElement&>(this->getXMLElement());
     
    170170        else
    171171        {
    172             COUT(2) << "Warning: Template with name " << name << " doesn't exist." << std::endl;
     172            orxout(internal_warning, context::templates) << "Template with name " << name << " doesn't exist." << endl;
    173173            return 0;
    174174        }
  • code/trunk/src/libraries/core/WeakPtr.h

    r8079 r8858  
    6565    void myCallback()                                   // definition of the callback function
    6666    {
    67         COUT(0) << "Object destroyed" << std::endl;
     67        orxout() << "Object destroyed" << endl;
    6868    }
    6969
  • code/trunk/src/libraries/core/XMLPort.cc

    r7163 r8858  
    6464                        if (!this->sectionname_.empty())
    6565                        {
    66                             COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a valid classname." << std::endl;
     66                            orxout(internal_warning, context::xml) << object->getLoaderIndentation() << "'" << child->Value() << "' is not a valid classname." << endl;
    6767                        }
    6868                        else
     
    7474                    if (!identifier->isA(objectIdentifier_))
    7575                    {
    76                         COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not a '" << objectIdentifier_->getName() << "'." << std::endl;
     76                        orxout(internal_warning, context::xml) << object->getLoaderIndentation() << "'" << child->Value() << "' is not a '" << objectIdentifier_->getName() << "'." << endl;
    7777                        continue;
    7878                    }
    7979                    if (!identifier->isLoadable())
    8080                    {
    81                         COUT(2) << object->getLoaderIndentation() << "Warning: '" << child->Value() << "' is not loadable." << std::endl;
     81                        orxout(internal_warning, context::xml) << object->getLoaderIndentation() << "'" << child->Value() << "' is not loadable." << endl;
    8282                        continue;
    8383                    }
     
    8787                    try
    8888                    {
    89                         COUT(4) << object->getLoaderIndentation() << "fabricating " << child->Value() << "..." << std::endl;
     89                        orxout(verbose, context::xml) << object->getLoaderIndentation() << "fabricating " << child->Value() << "..." << endl;
    9090
    9191                        BaseObject* newObject = identifier->fabricate(object);
     
    9595                        {
    9696                            newObject->XMLPort(*child, XMLPort::LoadObject);
    97                             COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl;
     97                            orxout(verbose, context::xml) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << endl;
    9898                        }
    9999                        else
    100100                        {
    101                             COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << std::endl;
     101                            orxout(verbose, context::xml) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->identifier_->getName() << " (objectname " << static_cast<BaseObject*>(object)->getName() << ')' << endl;
    102102                        }
    103 
    104                         COUT(5) << object->getLoaderIndentation();
    105103
    106104                        this->callLoadExecutor(object, newObject);
     
    109107                            newObject->XMLPort(*child, XMLPort::LoadObject);
    110108
    111                         COUT(5) << object->getLoaderIndentation() << "...fabricated " << child->Value() << " (objectname " << newObject->getName() << ")." << std::endl;
     109                        orxout(verbose, context::xml) << object->getLoaderIndentation() << "fabricated " << child->Value() << " (objectname " << newObject->getName() << ")." << endl;
    112110                    }
    113111                    catch (AbortLoadingException& ex)
    114112                    {
    115                         COUT(1) << "An error occurred while loading object, abort loading..." << std::endl;
     113                        orxout(internal_error, context::xml) << "An error occurred while loading object, abort loading..." << endl;
    116114                        throw ex;
    117115                    }
    118116                    catch (...)
    119117                    {
    120                         COUT(1) << "An error occurred while loading object:" << std::endl;
    121                         COUT(1) << Exception::handleMessage() << std::endl;
     118                        orxout(internal_error, context::xml) << "An error occurred while loading object:" << endl;
     119                        orxout(internal_error, context::xml) << Exception::handleMessage() << endl;
    122120                    }
    123121                }
     
    125123            catch (ticpp::Exception& ex)
    126124            {
    127                 COUT(1) << std::endl;
    128                 COUT(1) << "An error occurred in XMLPort.h while loading a '" << objectIdentifier_->getName() << "' in '" << this->sectionname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << object->getName() << ") in " << object->getFilename() << ':' << std::endl;
    129                 COUT(1) << ex.what() << std::endl;
     125                orxout(internal_error, context::xml) << endl;
     126                orxout(internal_error, context::xml) << "An error occurred in XMLPort.h while loading a '" << objectIdentifier_->getName() << "' in '" << this->sectionname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << object->getName() << ") in " << object->getFilename() << ':' << endl;
     127                orxout(internal_error, context::xml) << ex.what() << endl;
    130128            }
    131129        }
  • code/trunk/src/libraries/core/XMLPort.h

    r7851 r8858  
    5353#include <tinyxml/ticpp.h>
    5454
    55 #include "util/Debug.h"
     55#include "util/Output.h"
    5656#include "util/Exception.h"
    5757#include "util/MultiType.h"
     
    415415                        if ((!attributeValue.empty()) || ((mode != XMLPort::ExpandObject) && this->loadexecutor_->allDefaultValuesSet()))
    416416                        {
    417                             COUT(5) << this->owner_->getLoaderIndentation() << "Loading parameter " << this->paramname_ << " in " << this->identifier_->getName() << " (objectname " << this->owner_->getName() << ")." << std::endl << this->owner_->getLoaderIndentation();
     417                            orxout(verbose_more, context::xml) << this->owner_->getLoaderIndentation() << "Loading parameter " << this->paramname_ << " in " << this->identifier_->getName() << " (objectname " << this->owner_->getName() << ")." << endl;
    418418                            int error;
    419419                            this->loadexecutor_->parse(object, attributeValue, &error, ",");
     
    430430                    catch (ticpp::Exception& ex)
    431431                    {
    432                         COUT(1) << std::endl;
    433                         COUT(1) << "An error occurred in XMLPort.h while loading attribute '" << this->paramname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << this->owner_->getName() << ") in " << this->owner_->getFilename() << ':' << std::endl;
    434                         COUT(1) << ex.what() << std::endl;
     432                        orxout(internal_error, context::xml) << endl;
     433                        orxout(internal_error, context::xml) << "An error occurred in XMLPort.h while loading attribute '" << this->paramname_ << "' of '" << this->identifier_->getName() << "' (objectname: " << this->owner_->getName() << ") in " << this->owner_->getFilename() << ':' << endl;
     434                        orxout(internal_error, context::xml) << ex.what() << endl;
    435435                    }
    436436                }
  • code/trunk/src/libraries/core/command/ArgumentCompletionFunctions.cc

    r8351 r8858  
    9090            ArgumentCompletionList _groupsandcommands(const std::string& fragment, bool bOnlyShowHidden)
    9191            {
    92                 // note: this function returns only arguments that begin with "fragment", which would't be necessary for the
     92                // note: this function returns only arguments that begin with "fragment", which wouldn't be necessary for the
    9393                //       auto-completion, but it's necessary to place the line-break "\n" between groups and commands
    9494                //       only if both groups AND commands are in the list.
     
    100100                const std::map<std::string, std::map<std::string, ConsoleCommand*> >& commands = ConsoleCommand::getCommands();
    101101                for (std::map<std::string, std::map<std::string, ConsoleCommand*> >::const_iterator it_group = commands.begin(); it_group != commands.end(); ++it_group)
    102                     if (groupIsVisible(it_group->second, bOnlyShowHidden) && it_group->first != "" && (fragmentLC == "" || getLowercase(it_group->first).find_first_of(fragmentLC) == 0))
     102                    if (groupIsVisible(it_group->second, bOnlyShowHidden) && it_group->first != "" && (fragmentLC == "" || getLowercase(it_group->first).find(fragmentLC) == 0))
    103103                        groupList.push_back(ArgumentCompletionListElement(it_group->first, getLowercase(it_group->first)));
    104104
     
    113113                    // add the shortcuts
    114114                    for (std::map<std::string, ConsoleCommand*>::const_iterator it_command = it_group->second.begin(); it_command != it_group->second.end(); ++it_command)
    115                         if (it_command->second->isActive() && it_command->second->hasAccess() && (!it_command->second->isHidden())^bOnlyShowHidden && (fragmentLC == "" || getLowercase(it_command->first).find_first_of(fragmentLC) == 0))
     115                        if (it_command->second->isActive() && it_command->second->hasAccess() && (!it_command->second->isHidden())^bOnlyShowHidden && (fragmentLC == "" || getLowercase(it_command->first).find(fragmentLC) == 0))
    116116                            groupList.push_back(ArgumentCompletionListElement(it_command->first, getLowercase(it_command->first)));
    117117                }
  • code/trunk/src/libraries/core/command/CommandEvaluation.cc

    r7401 r8858  
    131131
    132132            if (!this->execCommand_)
    133                 *error = CommandExecutor::Error;
     133                *error = CommandExecutor::Inexistent;
    134134            else if (!this->execCommand_->isActive())
    135135                *error = CommandExecutor::Deactivated;
     
    151151            if (this->bEvaluatedArguments_)
    152152            {
    153                 COUT(6) << "CE_execute (evaluation): " << this->execCommand_->getName() << " with " << this->numberOfEvaluatedArguments_ << " arguments: " << this->arguments_[0] << ' ' << this->arguments_[1] << ' ' << this->arguments_[2] << ' ' << this->arguments_[3] << ' ' << this->arguments_[4] << std::endl;
     153                orxout(verbose, context::commands) << "CE_execute (evaluation): " << this->execCommand_->getName() << " with " << this->numberOfEvaluatedArguments_ << " arguments: " << this->arguments_[0] << ' ' << this->arguments_[1] << ' ' << this->arguments_[2] << ' ' << this->arguments_[3] << ' ' << this->arguments_[4] << endl;
    154154
    155155                // pass as many arguments to the executor as were evaluated (thus the executor can still use additional default values)
     
    186186        {
    187187            if (bPrintError)
    188                 COUT(1) << "Error: Can't evaluate arguments, no console command assigned." << std::endl;
    189             return CommandExecutor::Error;
     188                orxout(internal_error, context::commands) << "Can't evaluate arguments, no console command assigned." << endl;
     189            return CommandExecutor::Inexistent;
    190190        }
    191191
     
    200200            this->bEvaluatedArguments_ = true;
    201201        else if (bPrintError)
    202             COUT(1) << "Error: Can't evaluate arguments, not enough arguments given." << std::endl;
     202            orxout(internal_error, context::commands) << "Can't evaluate arguments, not enough arguments given." << endl;
    203203
    204204        return error;
  • code/trunk/src/libraries/core/command/CommandExecutor.cc

    r7401 r8858  
    6969        @return Returns the error-code (see @ref CommandExecutorErrorCodes "error codes")
    7070    */
    71     /* static */ int CommandExecutor::execute(const std::string& command, bool useTcl)
     71    /* static */ int CommandExecutor::execute(const std::string& command, bool useTcl, bool printErrors)
    7272    {
    7373        int error;
    7474        CommandExecutor::queryMT(command, &error, useTcl);
     75        if (error && printErrors)
     76            orxout(user_error) << "Can't execute \"" << command << "\", " << CommandExecutor::getErrorDescription(error) << ". (execute)" << endl;
    7577        return error;
    7678    }
     
    8587    /* static */ MultiType CommandExecutor::queryMT(const std::string& command, int* error, bool useTcl)
    8688    {
     89        MultiType result;
     90        int error_internal;
     91
    8792        if (useTcl)
    8893        {
    8994            // pass the command to tcl
    90             return TclBind::eval(command, error);
     95            result = TclBind::eval(command, &error_internal);
    9196        }
    9297        else
     
    108113
    109114            // query the command and return its return-value
    110             return evaluation.query(error);
    111         }
     115            result = evaluation.query(&error_internal);
     116        }
     117
     118        if (error)
     119            *error = error_internal;
     120        else if (error_internal)
     121            orxout(user_error) << "Can't execute \"" << command << "\", " << CommandExecutor::getErrorDescription(error_internal) << ". (query)" << endl;
     122
     123        return result;
    112124    }
    113125
     
    172184
    173185    /**
     186        @brief Returns a description of the error code.
     187        @param error The error code
     188    */
     189    /* static */ std::string CommandExecutor::getErrorDescription(int error)
     190    {
     191        switch (error)
     192        {
     193            case CommandExecutor::Inexistent:  return "command doesn't exist";
     194            case CommandExecutor::Incomplete:  return "not enough arguments given";
     195            case CommandExecutor::Deactivated: return "command is not active";
     196            case CommandExecutor::Denied:      return "access denied";
     197            case CommandExecutor::Error:       return "an error occurred";
     198            default: return "";
     199        }
     200    }
     201
     202    /**
    174203        @brief Gets an evaluated command from the cache.
    175204        @param command The command that should be looked up in the cache
     
    261290            if ((tokens.size() == 1 && ConsoleCommand::getCommand(tokens[0])) || (tokens.size() == 2 && ConsoleCommand::getCommand(tokens[0], tokens[1])))
    262291            {
    263                 COUT(1) << "Error: A command with name \"" << alias << "\" already exists." << std::endl;
     292                orxout(user_error) << "A command with name \"" << alias << "\" already exists." << endl;
    264293                return;
    265294            }
     
    271300                createConsoleCommand(tokens[0], tokens[1], executor);
    272301            else
    273                 COUT(1) << "Error: \"" << alias << "\" is not a valid alias name (must have one or two words)." << std::endl;
     302                orxout(user_error) << "\"" << alias << "\" is not a valid alias name (must have one or two words)." << endl;
    274303        }
    275304        else
    276             COUT(1) << "Error: \"" << command << "\" is not a valid command (did you mean \"" << evaluation.getCommandSuggestion() << "\"?)." << std::endl;
     305            orxout(user_error) << "\"" << command << "\" is not a valid command (did you mean \"" << evaluation.getCommandSuggestion() << "\"?)." << endl;
    277306    }
    278307}
  • code/trunk/src/libraries/core/command/CommandExecutor.h

    r7401 r8858  
    111111// tolua_end
    112112        public:
    113             static int execute(const std::string& command, bool useTcl = true); // tolua_export
     113            static int execute(const std::string& command, bool useTcl = true, bool printErrors = true); // tolua_export
    114114
    115115            static MultiType queryMT(const std::string& command, int* error = 0, bool useTcl = true);
     
    119119
    120120            static const int Success = 0;       ///< Error code for "success" (or no error)
    121             static const int Error = 1;         ///< Error code if the command doesn't exist
     121            static const int Inexistent = 1;    ///< Error code if the command doesn't exist
    122122            static const int Incomplete = 2;    ///< Error code if the command needs more arguments
    123123            static const int Deactivated = 3;   ///< Error code if the command is not active
    124124            static const int Denied = 4;        ///< Error code if the command needs a different access level
     125            static const int Error = 5;         ///< Error code if the command returned an error
     126
     127            static std::string getErrorDescription(int error);
    125128
    126129            static MultiType unhide(const std::string& command);
  • code/trunk/src/libraries/core/command/ConsoleCommand.cc

    r8316 r8858  
    172172                if (!this->executor_->defaultValueSet(i))
    173173                {
    174                     COUT(2) << "Default value " << i << " is missing" << std::endl;
     174                    orxout(internal_warning, context::commands) << "Default value " << i << " is missing" << endl;
    175175                    return false;
    176176                }
     
    202202                if (!executor->defaultValueSet(i))
    203203                {
    204                     COUT(2) << "Default value " << i << " is missing" << std::endl;
     204                    orxout(internal_warning, context::commands) << "Default value " << i << " is missing" << endl;
    205205                    return false;
    206206                }
     
    229229        else
    230230        {
    231             COUT(1) << "Error: Couldn't assign new executor to console command \"" << this->baseName_ << "\", headers don't match." << std::endl;
     231            orxout(internal_error, context::commands) << "Couldn't assign new executor to console command \"" << this->baseName_ << "\", headers don't match." << endl;
    232232            return false;
    233233        }
     
    256256        else
    257257        {
    258             COUT(1) << "Error: Couldn't assign new functor to console command \"" << this->baseName_ << "\", headers don't match." << std::endl;
     258            orxout(internal_error, context::commands) << "Couldn't assign new functor to console command \"" << this->baseName_ << "\", headers don't match." << endl;
    259259            return false;
    260260        }
     
    307307            this->pushFunction(new Executor(*this->executor_.get()));
    308308        else
    309             COUT(1) << "Error: Couldn't push copy of executor in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     309            orxout(internal_error, context::commands) << "Couldn't push copy of executor in console command \"" << this->baseName_ << "\", no executor set." << endl;
    310310    }
    311311
     
    367367            }
    368368            else if (object)
    369                 COUT(1) << "Error: Can't assign object to console command \"" << this->baseName_ << "\", no functor set." << std::endl;
     369                orxout(internal_error, context::commands) << "Can't assign object to console command \"" << this->baseName_ << "\", no functor set." << endl;
    370370        }
    371371        else if (object)
    372             COUT(1) << "Error: Can't assign object to console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     372            orxout(internal_error, context::commands) << "Can't assign object to console command \"" << this->baseName_ << "\", no executor set." << endl;
    373373
    374374        return false;
     
    418418            this->executor_->setDefaultValues(arg1);
    419419        else
    420             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     420            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    421421
    422422        return *this;
     
    431431            this->executor_->setDefaultValues(arg1, arg2);
    432432        else
    433             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     433            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    434434
    435435        return *this;
     
    444444            this->executor_->setDefaultValues(arg1, arg2, arg3);
    445445        else
    446             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     446            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    447447
    448448        return *this;
     
    457457            this->executor_->setDefaultValues(arg1, arg2, arg3, arg4);
    458458        else
    459             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     459            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    460460
    461461        return *this;
     
    470470            this->executor_->setDefaultValues(arg1, arg2, arg3, arg4, arg5);
    471471        else
    472             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     472            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    473473
    474474        return *this;
     
    485485            this->executor_->setDefaultValue(index, arg);
    486486        else
    487             COUT(1) << "Error: Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << std::endl;
     487            orxout(internal_error, context::commands) << "Can't set default values in console command \"" << this->baseName_ << "\", no executor set." << endl;
    488488
    489489        return *this;
     
    500500            this->argumentCompleter_[index] = completer;
    501501        else
    502             COUT(2) << "Warning: Couldn't add autocompletion-function for index " << index << " in console command \"" << this->baseName_ << "\": index out of bound." << std::endl;
     502            orxout(internal_warning, context::commands) << "Couldn't add autocompletion-function for index " << index << " in console command \"" << this->baseName_ << "\": index out of bound." << endl;
    503503
    504504        return *this;
     
    611611        {
    612612            if (group == "")
    613                 COUT(1) << "Error: Couldn't find console command with shortcut \"" << name << "\"" << std::endl;
     613                orxout(internal_error, context::commands) << "Couldn't find console command with shortcut \"" << name << "\"" << endl;
    614614            else
    615                 COUT(1) << "Error: Couldn't find console command with group \"" << group << "\" and name \"" << name << "\"" << std::endl;
     615                orxout(internal_error, context::commands) << "Couldn't find console command with group \"" << group << "\" and name \"" << name << "\"" << endl;
    616616        }
    617617        return 0;
     
    644644        {
    645645            if (group == "")
    646                 COUT(1) << "Error: Couldn't find console command with shortcut \"" << name << "\"" << std::endl;
     646                orxout(internal_error, context::commands) << "Couldn't find console command with shortcut \"" << name << "\"" << endl;
    647647            else
    648                 COUT(1) << "Error: Couldn't find console command with group \"" << group << "\" and name \"" << name << "\"" << std::endl;
     648                orxout(internal_error, context::commands) << "Couldn't find console command with group \"" << group << "\" and name \"" << name << "\"" << endl;
    649649        }
    650650        return 0;
     
    681681        {
    682682            if (group == "")
    683                 COUT(2) << "Warning: A console command with shortcut \"" << name << "\" already exists." << std::endl;
     683                orxout(internal_warning, context::commands) << "A console command with shortcut \"" << name << "\" already exists." << endl;
    684684            else
    685                 COUT(2) << "Warning: A console command with name \"" << name << "\" already exists in group \"" << group << "\"." << std::endl;
     685                orxout(internal_warning, context::commands) << "A console command with name \"" << name << "\" already exists in group \"" << group << "\"." << endl;
    686686        }
    687687        else
  • code/trunk/src/libraries/core/command/ConsoleCommand.h

    r8418 r8858  
    5353    void myCoutFunction(const std::string& text)        // Define a static function
    5454    {
    55         COUT(0) << "Text: " << text << std::endl;       // Print the text to the console
     55        orxout() << "Text: " << text << endl;           // Print the text to the console
    5656    }
    5757
     
    125125    void myOtherCoutFunction(const std::string& text)                       // Define a new static function
    126126    {
    127         COUT(0) << "Uppercase: " << getUppercase(text) << std::endl;        // Print the text in uppercase to the console
     127        orxout() << "Uppercase: " << getUppercase(text) << endl;            // Print the text in uppercase to the console
    128128    }
    129129
  • code/trunk/src/libraries/core/command/ConsoleCommandCompilation.cc

    r8079 r8858  
    3838#include <string>
    3939
    40 #include "util/Debug.h"
     40#include "util/Output.h"
    4141#include "util/ExprParser.h"
    4242#include "util/StringUtils.h"
     
    4646namespace orxonox
    4747{
     48    SetConsoleCommand("echo", echo);
     49
     50    SetConsoleCommand("orxout", orxout_level);
     51    SetConsoleCommand("orxout_context", orxout_level_context);
     52
     53    SetConsoleCommand("log"    , log    );
     54    SetConsoleCommand("error"  , error  ).hide();
     55    SetConsoleCommand("warning", warning).hide();
     56    SetConsoleCommand("status" , status ).hide();
     57    SetConsoleCommand("info"   , info   ).hide();
     58    SetConsoleCommand("debug"  , debug  ).hide();
     59
    4860//    SetConsoleCommand("source", source).argumentCompleter(0, autocompletion::files());  // disabled because we use the implementation in Tcl
    49     SetConsoleCommand("echo", echo);
    50 //    SetConsoleCommand("puts", puts);                                                    // disabled because we use the implementation in Tcl
    51 
    5261//    SetConsoleCommand("read", read).argumentCompleter(0, autocompletion::files());      // disabled because we use the implementation in Tcl
    5362//    SetConsoleCommand("append", append).argumentCompleter(0, autocompletion::files());  // disabled because we use the implementation in Tcl
     
    5766
    5867    /**
     68        @brief Simply returns the arguments.
     69    */
     70    std::string echo(const std::string& text)
     71    {
     72        return text;
     73    }
     74
     75    /**
     76        @brief Builds a map that maps the levels of all output levels to their ID.
     77    */
     78    std::map<std::string, OutputLevel> getOutputLevelsMap()
     79    {
     80        std::map<std::string, OutputLevel> levels;
     81
     82        levels["message"]          = level::message;
     83        levels["debug_output"]     = level::debug_output;
     84        levels["user_error"]       = level::user_error;
     85        levels["user_warning"]     = level::user_warning;
     86        levels["user_status"]      = level::user_status;
     87        levels["user_info"]        = level::user_info;
     88        levels["internal_error"]   = level::internal_error;
     89        levels["internal_warning"] = level::internal_warning;
     90        levels["internal_status"]  = level::internal_status;
     91        levels["internal_info"]    = level::internal_info;
     92        levels["verbose"]          = level::verbose;
     93        levels["verbose_more"]     = level::verbose_more;
     94        levels["verbose_ultra"]    = level::verbose_ultra;
     95
     96        return levels;
     97    }
     98
     99    /**
     100        @brief Prints text to the console.
     101        @param level_name The name of the output level
     102    */
     103    void orxout_level(const std::string& level_name, const std::string& text)
     104    {
     105        static std::map<std::string, OutputLevel> levels = getOutputLevelsMap();
     106
     107        OutputLevel level = level::debug_output;
     108        std::map<std::string, OutputLevel>::iterator it = levels.find(level_name);
     109        if (it != levels.end())
     110            level = it->second;
     111        else
     112            orxout(internal_warning) << "'" << level_name << "' is not a valid output level" << endl;
     113
     114        orxout(level) << text << endl;
     115    }
     116
     117    /**
     118        @brief Prints text to the console.
     119        @param level_name The name of the output level
     120        @param context_name The name of the output context
     121    */
     122    void orxout_level_context(const std::string& level_name, const std::string& context_name, const std::string& text)
     123    {
     124        static std::map<std::string, OutputLevel> levels = getOutputLevelsMap();
     125
     126        OutputLevel level = level::debug_output;
     127        std::map<std::string, OutputLevel>::iterator it = levels.find(level_name);
     128        if (it != levels.end())
     129            level = it->second;
     130        else
     131            orxout(internal_warning) << "'" << level_name << "' is not a valid output level" << endl;
     132
     133        OutputContextContainer context = registerContext(context_name);
     134
     135        orxout(level, context) << text << endl;
     136    }
     137
     138    /// @brief Prints text to the console and the logfile.
     139    void log(const std::string& text)
     140    { orxout() << text << endl; }
     141
     142    /// @brief Prints output with error level.
     143    void error(const std::string& text)
     144    { orxout(user_error) << text << endl; }
     145
     146    /// @brief Prints output with warning level.
     147    void warning(const std::string& text)
     148    { orxout(user_warning) << text << endl; }
     149
     150    /// @brief Prints output with status level.
     151    void status(const std::string& text)
     152    { orxout(user_status) << text << endl; }
     153
     154    /// @brief Prints output with info level.
     155    void info(const std::string& text)
     156    { orxout(user_info) << text << endl; }
     157
     158    /// @brief Prints debug output with verbose level.
     159    void debug(const std::string& text)
     160    { orxout(verbose, context::tcl) << text << endl; }
     161
     162    /**
    59163        @brief Reads the content of a file and executes the commands in it line by line.
    60164    */
     
    66170        if (it != executingFiles.end())
    67171        {
    68             COUT(1) << "Error: Recurring source command in \"" << filename << "\". Stopped execution." << std::endl;
     172            orxout(user_error) << "Recurring source command in \"" << filename << "\". Stopped execution." << endl;
    69173            return;
    70174        }
     
    76180        if (!file.is_open())
    77181        {
    78             COUT(1) << "Error: Couldn't open file \"" << filename << "\"." << std::endl;
     182            orxout(user_error) << "Couldn't open file \"" << filename << "\"." << endl;
    79183            return;
    80184        }
     
    95199
    96200    /**
    97         @brief Simply returns the arguments.
    98     */
    99     std::string echo(const std::string& text)
    100     {
    101         return text;
    102     }
    103 
    104     /**
    105         @brief Writes text to the console, depending on the first argument with or without a line-break after it.
    106     */
    107     void puts(bool newline, const std::string& text)
    108     {
    109         if (newline)
    110         {
    111             COUT(0) << stripEnclosingBraces(text) << std::endl;
    112         }
    113         else
    114         {
    115             COUT(0) << stripEnclosingBraces(text);
    116         }
    117     }
    118 
    119     /**
    120201        @brief Writes text to a file.
    121202    */
     
    127208        if (!file.is_open())
    128209        {
    129             COUT(1) << "Error: Couldn't write to file \"" << filename << "\"." << std::endl;
    130             return;
    131         }
    132 
    133         file << text << std::endl;
     210            orxout(user_error) << "Couldn't write to file \"" << filename << "\"." << endl;
     211            return;
     212        }
     213
     214        file << text << endl;
    134215        file.close();
    135216    }
     
    145226        if (!file.is_open())
    146227        {
    147             COUT(1) << "Error: Couldn't append to file \"" << filename << "\"." << std::endl;
    148             return;
    149         }
    150 
    151         file << text << std::endl;
     228            orxout(user_error) << "Couldn't append to file \"" << filename << "\"." << endl;
     229            return;
     230        }
     231
     232        file << text << endl;
    152233        file.close();
    153234    }
     
    163244        if (!file.is_open())
    164245        {
    165             COUT(1) << "Error: Couldn't read from file \"" << filename << "\"." << std::endl;
     246            orxout(user_error) << "Couldn't read from file \"" << filename << "\"." << endl;
    166247            return "";
    167248        }
     
    192273            if (expr.getResult() == 42.0)
    193274            {
    194                 COUT(3) << "Greetings from the restaurant at the end of the universe." << std::endl;
     275                orxout(user_info) << "Greetings from the restaurant at the end of the universe." << endl;
    195276            }
    196277            if (!expr.getRemains().empty())
    197278            {
    198                 COUT(2) << "Warning: Expression could not be parsed to the end! Remains: '" << expr.getRemains() << '\'' << std::endl;
     279                orxout(user_warning) << "Expression could not be parsed to the end! Remains: '" << expr.getRemains() << '\'' << endl;
    199280            }
    200281            return static_cast<float>(expr.getResult());
     
    202283        else
    203284        {
    204             COUT(1) << "Error: Cannot calculate expression: Parse error." << std::endl;
     285            orxout(user_error) << "Cannot calculate expression: Parse error." << endl;
    205286            return 0;
    206287        }
  • code/trunk/src/libraries/core/command/ConsoleCommandCompilation.h

    r7401 r8858  
    4242    _CoreExport void source(const std::string& filename);
    4343    _CoreExport std::string echo(const std::string& text);
    44     _CoreExport void puts(bool newline, const std::string& test);
     44
     45    _CoreExport void orxout_level(const std::string& level_name, const std::string& text);
     46    _CoreExport void orxout_level_context(const std::string& level_name, const std::string& context_name, const std::string& text);
     47
     48    _CoreExport void log(const std::string& text);
     49    _CoreExport void error(const std::string& text);
     50    _CoreExport void warning(const std::string& text);
     51    _CoreExport void status(const std::string& text);
     52    _CoreExport void info(const std::string& text);
     53    _CoreExport void debug(const std::string& text);
    4554
    4655    _CoreExport void write(const std::string& filename, const std::string& text);
  • code/trunk/src/libraries/core/command/Executor.cc

    r7401 r8858  
    3838
    3939#include "util/Convert.h"
    40 #include "util/Debug.h"
     40#include "util/Output.h"
    4141#include "util/StringUtils.h"
    4242#include "util/SubString.h"
     
    104104        {
    105105            if (bPrintError)
    106                 COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough arguments or default values given (input: " << arguments.join() << ")." << std::endl;
     106                orxout(internal_warning) << "Can't call executor " << this->name_ << " through parser: Not enough arguments or default values given (input: " << arguments.join() << ")." << endl;
    107107            return MT_Type::Null;
    108108        }
    109109
    110         COUT(5) << "Executor::parse: \"" << arguments.join(delimiter) << "\" -> " << argCount << " arguments: " << arg[0] << " / " << arg[1] << " / " << arg[2] << " / " << arg[3] << " / " << arg[4] << std::endl;
     110        orxout(verbose, context::misc::executor) << "Executor::parse: \"" << arguments.join(delimiter) << "\" -> " << argCount << " arguments: " << arg[0] << " / " << arg[1] << " / " << arg[2] << " / " << arg[3] << " / " << arg[4] << endl;
    111111
    112112        // execute the function with the evaluated arguments (the default values of the executor are also included in these arguments)
  • code/trunk/src/libraries/core/command/Executor.h

    r7401 r8858  
    5757    void myFunction(int a, int b)                           // declare a static function
    5858    {
    59         COUT(0) << "The sum is " << (a + b) << std::endl;   // print the sum of a and b to the console
     59        orxout() << "The sum is " << (a + b) << endl;       // print the sum of a and b to the console
    6060    }
    6161
  • code/trunk/src/libraries/core/command/Functor.h

    r8729 r8858  
    118118#include <typeinfo>
    119119
    120 #include "util/Debug.h"
     120#include "util/Output.h"
    121121#include "util/MultiType.h"
    122122#include "core/OrxonoxClass.h"
     
    256256                else
    257257                {
    258                     COUT(1) << "Error: Can't execute FunctorMember, no object set." << std::endl;
     258                    orxout(internal_error) << "Can't execute FunctorMember, no object set." << endl;
    259259                    return MT_Type::Null;
    260260                }
     
    339339            // see Functor::setRawObjectPointer()
    340340            inline void setRawObjectPointer(void*)
    341                 { COUT(2) << "Warning: Can't assign an object pointer to a static functor" << std::endl; }
     341                { orxout(internal_warning) << "Can't assign an object pointer to a static functor" << endl; }
    342342            // see Functor::getRawObjectPointer()
    343343            inline void* getRawObjectPointer() const
  • code/trunk/src/libraries/core/command/IOConsolePOSIX.cc

    r8729 r8858  
    3737#include "util/Clock.h"
    3838#include "util/Math.h"
     39#include "util/output/ConsoleWriter.h"
    3940#include "core/Game.h"
    4041#include "core/input/InputBuffer.h"
     
    5556
    5657    IOConsole::IOConsole()
    57         : shell_(new Shell("IOConsole", false))
     58        : shell_(new Shell("Console", false))
    5859        , buffer_(shell_->getInputBuffer())
    5960        , cout_(std::cout.rdbuf())
     
    7475
    7576        // Disable standard std::cout logging
    76         OutputHandler::getInstance().disableCout();
     77        ConsoleWriter::getInstance().disable();
    7778        // Redirect std::cout to an ostringstream
    7879        // (Other part is in the initialiser list)
     
    8889        std::cout.flush();
    8990        if (!this->origCout_.str().empty())
    90             this->shell_->addOutput(this->origCout_.str(), Shell::None);
     91            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
    9192        // Erase input and status lines
    9293        this->cout_ << "\033[1G\033[J";
     
    102103        std::cout.rdbuf(this->cout_.rdbuf());
    103104        // Enable standard std::cout logging again
    104         OutputHandler::getInstance().enableCout();
     105        ConsoleWriter::getInstance().enable();
    105106    }
    106107
     
    229230        if (!this->origCout_.str().empty())
    230231        {
    231             this->shell_->addOutput(this->origCout_.str(), Shell::None);
     232            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
    232233            this->origCout_.str("");
    233234        }
     
    239240        switch (type)
    240241        {
    241         case Shell::Error:   this->cout_ << "\033[91m"; break;
    242         case Shell::Warning: this->cout_ << "\033[93m"; break;
    243         case Shell::Info:    this->cout_ << "\033[90m"; break;
    244         case Shell::Debug:   this->cout_ << "\033[90m"; break;
    245         case Shell::Verbose: this->cout_ << "\033[90m"; break;
    246         case Shell::Ultra:   this->cout_ << "\033[90m"; break;
    247         case Shell::Command: this->cout_ << "\033[36m"; break;
    248         case Shell::Hint:    this->cout_ << "\033[33m"; break;
    249         case Shell::TDebug:  this->cout_ << "\033[95m"; break;
    250         default: break;
     242            case Shell::Message:
     243            case Shell::DebugOutput:     this->cout_ << "\033[0m"; break;
     244
     245            case Shell::UserError:       this->cout_ << "\033[91m"; break;
     246            case Shell::UserWarning:     this->cout_ << "\033[93m"; break;
     247            case Shell::UserStatus:      this->cout_ << "\033[92m"; break;
     248            case Shell::UserInfo:        this->cout_ << "\033[96m"; break;
     249
     250            case Shell::InternalError:   this->cout_ << "\033[31m"; break;
     251            case Shell::InternalWarning: this->cout_ << "\033[33m"; break;
     252            case Shell::InternalStatus:  this->cout_ << "\033[32m"; break;
     253            case Shell::InternalInfo:    this->cout_ << "\033[36m"; break;
     254
     255            case Shell::Verbose:         this->cout_ << "\033[94m"; break;
     256            case Shell::VerboseMore:     this->cout_ << "\033[34m"; break;
     257            case Shell::VerboseUltra:    this->cout_ << "\033[34m"; break;
     258
     259            case Shell::Command:         this->cout_ << "\033[95m"; break;
     260            case Shell::Hint:            this->cout_ << "\033[35m"; break;
     261
     262            default:                     this->cout_ << "\033[37m"; break;
    251263        }
    252264
     
    371383    void IOConsole::executed()
    372384    {
    373         this->shell_->addOutput(this->promptString_ + this->shell_->getInput() + '\n', Shell::Command);
     385        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::Command);
    374386    }
    375387
     
    378390    {
    379391        // Exit is not an option, just do nothing (Shell doesn't really exit too)
    380     }
    381 
    382     //! Called if only the last output-line has changed
    383     void IOConsole::onlyLastLineChanged()
    384     {
    385         // Save cursor position and move it to the beginning of the first output line
    386         this->cout_ << "\033[s\033[1A\033[1G";
    387         // Erase the line
    388         this->cout_ << "\033[K";
    389         // Reprint the last output line
    390         this->printOutputLine(this->shell_->getNewestLineIterator()->first, this->shell_->getNewestLineIterator()->second);
    391         // Restore cursor
    392         this->cout_ << "\033[u";
    393         this->cout_.flush();
    394392    }
    395393
  • code/trunk/src/libraries/core/command/IOConsolePOSIX.h

    r7401 r8858  
    6666        // Methods from ShellListener
    6767        void linesChanged();
    68         void onlyLastLineChanged();
    6968        void lineAdded();
    7069        void inputChanged();
  • code/trunk/src/libraries/core/command/IOConsoleWindows.cc

    r8729 r8858  
    3434#include "util/Clock.h"
    3535#include "util/Math.h"
     36#include "util/output/ConsoleWriter.h"
    3637#include "core/Game.h"
    3738#include "core/input/InputBuffer.h"
     
    4344    //! Redirects std::cout, creates the corresponding Shell and changes the terminal mode
    4445    IOConsole::IOConsole()
    45         : shell_(new Shell("IOConsole", false))
     46        : shell_(new Shell("Console", false))
    4647        , buffer_(shell_->getInputBuffer())
    4748        , cout_(std::cout.rdbuf())
     
    5253    {
    5354        // Disable standard this->cout_ logging
    54         OutputHandler::getInstance().disableCout();
     55        ConsoleWriter::getInstance().disable();
    5556        // Redirect std::cout to an ostringstream
    5657        // (Other part is in the initialiser list)
     
    9596        std::cout.flush();
    9697        if (!this->origCout_.str().empty())
    97             this->shell_->addOutput(this->origCout_.str(), Shell::None);
     98            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
    9899
    99100        this->shell_->unregisterListener(this);
     
    108109        std::cout.rdbuf(this->cout_.rdbuf());
    109110        // Enable standard this->cout_ logging again
    110         OutputHandler::getInstance().enableCout();
     111        ConsoleWriter::getInstance().enable();
    111112
    112113        resetTerminalMode();
     
    188189        if (!this->origCout_.str().empty())
    189190        {
    190             this->shell_->addOutput(this->origCout_.str(), Shell::None);
     191            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
    191192            this->origCout_.str("");
    192193        }
     
    200201        switch (type)
    201202        {
    202         case Shell::Error:   colour = FOREGROUND_INTENSITY                    | FOREGROUND_RED; break;
    203         case Shell::Warning: colour = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED; break;
    204         case Shell::Info:
    205         case Shell::Debug:
    206         case Shell::Verbose:
    207         case Shell::Ultra:   colour = FOREGROUND_INTENSITY                                     ; break;
    208         case Shell::Command: colour =                        FOREGROUND_GREEN                  | FOREGROUND_BLUE; break;
    209         case Shell::Hint:    colour =                        FOREGROUND_GREEN | FOREGROUND_RED                  ; break;
    210         case Shell::TDebug:  colour = FOREGROUND_INTENSITY                    | FOREGROUND_RED | FOREGROUND_BLUE; break;
    211         default:             colour =                        FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE; break;
     203            case Shell::Message:
     204            case Shell::DebugOutput:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
     205
     206            case Shell::UserError:       colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | 0              ; break;
     207            case Shell::UserWarning:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
     208            case Shell::UserStatus:      colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | 0              ; break;
     209            case Shell::UserInfo:        colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
     210
     211            case Shell::InternalError:   colour = 0                    | FOREGROUND_RED | 0                | 0              ; break;
     212            case Shell::InternalWarning: colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
     213            case Shell::InternalStatus:  colour = 0                    | 0              | FOREGROUND_GREEN | 0              ; break;
     214            case Shell::InternalInfo:    colour = 0                    | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
     215
     216            case Shell::Verbose:         colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
     217            case Shell::VerboseMore:     colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
     218            case Shell::VerboseUltra:    colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
     219
     220            case Shell::Command:         colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
     221            case Shell::Hint:            colour = 0                    | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
     222
     223            default:                     colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
    212224        }
    213225
     
    238250            || !SetConsoleMode(this->stdInHandle_, 0))
    239251        {
    240             COUT(1) << "Error: Could not set Windows console settings" << std::endl;
     252            orxout(user_error) << "Could not set Windows console settings" << endl;
    241253            return;
    242254        }
     
    318330    void IOConsole::executed()
    319331    {
    320         this->shell_->addOutput(this->promptString_ + this->shell_->getInput() + '\n', Shell::Command);
     332        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::Command);
    321333    }
    322334
     
    377389    }
    378390
    379     //! Called if only the last output-line has changed
    380     void IOConsole::onlyLastLineChanged()
    381     {
    382         int newLineHeight = 1 + this->shell_->getNewestLineIterator()->first.size() / this->terminalWidth_;
    383         // Compute the number of new lines needed
    384         int newLines = newLineHeight - this->lastOutputLineHeight_;
    385         this->lastOutputLineHeight_ = newLineHeight;
    386         // Scroll console if necessary
    387         if (newLines > 0) // newLines < 0 is assumed impossible
    388             this->createNewOutputLines(newLines);
    389         Shell::LineList::const_iterator it = this->shell_->getNewestLineIterator();
    390         this->printOutputLine(it->first, it->second, makeCOORD(0, this->inputLineRow_ - newLineHeight));
    391     }
    392 
    393391    //! Called if a new output line was added
    394392    void IOConsole::lineAdded()
  • code/trunk/src/libraries/core/command/IOConsoleWindows.h

    r8729 r8858  
    6868        // Methods from ShellListener
    6969        void linesChanged();
    70         void onlyLastLineChanged();
    7170        void lineAdded();
    7271        void inputChanged();
  • code/trunk/src/libraries/core/command/IRC.cc

    r7401 r8858  
    8585        }
    8686        catch (Tcl::tcl_error const &e)
    87         {   COUT(1) << "Tcl (IRC) error: " << e.what();   }
     87        {   orxout(user_error, context::tcl) << "Tcl (IRC) error: " << e.what() << endl;   }
    8888
    8989        this->nickname_ = "orx" + multi_cast<std::string>(static_cast<unsigned int>(rand()));
     
    100100        {
    101101            IRC::getInstance().initialize();
    102             COUT(1) << "Error: IRC client wasn't yet initialized, please try again." << std::endl;
     102            orxout(user_error) << "IRC client wasn't yet initialized, please try again." << endl;
    103103            return false;
    104104        }
     
    110110        }
    111111        catch (Tcl::tcl_error const &e)
    112         {   COUT(1) << "Tcl (IRC) error: " << e.what();   }
     112        {   orxout(user_error, context::tcl) << "Tcl (IRC) error: " << e.what() << endl;   }
    113113
    114114        return false;
     
    139139    void IRC::tcl_say(Tcl::object const &channel, Tcl::object const &nick, Tcl::object const &args)
    140140    {
    141         COUT(0) << "IRC> " << nick.get() << ": " << stripEnclosingBraces(args.get()) << std::endl;
     141        orxout(message) << "IRC> " << nick.get() << ": " << stripEnclosingBraces(args.get()) << endl;
    142142    }
    143143
     
    145145    void IRC::tcl_privmsg(Tcl::object const &query, Tcl::object const &nick, Tcl::object const &args)
    146146    {
    147         COUT(0) << "IRC (" << query.get() << ")> " << nick.get() << ": " << stripEnclosingBraces(args.get()) << std::endl;
     147        orxout(message) << "IRC (" << query.get() << ")> " << nick.get() << ": " << stripEnclosingBraces(args.get()) << endl;
    148148    }
    149149
     
    151151    void IRC::tcl_action(Tcl::object const &channel, Tcl::object const &nick, Tcl::object const &args)
    152152    {
    153         COUT(0) << "IRC> * " << nick.get() << ' ' << stripEnclosingBraces(args.get()) << std::endl;
     153        orxout(message) << "IRC> * " << nick.get() << ' ' << stripEnclosingBraces(args.get()) << endl;
    154154    }
    155155
     
    157157    void IRC::tcl_info(Tcl::object const &channel, Tcl::object const &args)
    158158    {
    159         COUT(0) << "IRC> --> " << stripEnclosingBraces(args.get()) << std::endl;
     159        orxout(message) << "IRC> --> " << stripEnclosingBraces(args.get()) << endl;
    160160    }
    161161}
  • code/trunk/src/libraries/core/command/Shell.cc

    r8729 r8858  
    3535
    3636#include "util/Math.h"
    37 #include "util/OutputHandler.h"
    3837#include "util/StringUtils.h"
    3938#include "util/SubString.h"
     39#include "util/output/OutputManager.h"
     40#include "util/output/MemoryWriter.h"
    4041#include "core/CoreIncludes.h"
    4142#include "core/ConfigFileManager.h"
     
    4445#include "core/input/InputBuffer.h"
    4546#include "CommandExecutor.h"
    46 #include "ConsoleCommand.h"
    4747
    4848namespace orxonox
    4949{
    50     SetConsoleCommand("log",     OutputHandler::log    );
    51     SetConsoleCommand("error",   OutputHandler::error  ).hide();
    52     SetConsoleCommand("warning", OutputHandler::warning).hide();
    53     SetConsoleCommand("info",    OutputHandler::info   ).hide();
    54     SetConsoleCommand("debug",   OutputHandler::debug  ).hide();
    55 
    5650    unsigned int Shell::cacheSize_s;
    5751
    58     /**
    59         @brief Constructor: Initializes the values and registers itself at OutputHandler.
     52    namespace DefaultLogLevel
     53    {
     54        const OutputLevel Dev  = level::internal_warning;
     55        const OutputLevel User = level::user_info;
     56    }
     57
     58    /**
     59        @brief Constructor: Initializes the values.
    6060        @param consoleName The name of the shell - used to define the name of the soft-debug-level config-value
    6161        @param bScrollable If true, the user is allowed to scroll through the output-lines
    6262    */
    6363    Shell::Shell(const std::string& consoleName, bool bScrollable)
    64         : OutputListener(consoleName)
     64        : BaseWriter(consoleName, false)
    6565        , inputBuffer_(new InputBuffer())
    66         , consoleName_(consoleName)
    6766        , bScrollable_(bScrollable)
    6867    {
    6968        RegisterRootObject(Shell);
     69
     70        OutputManager::getInstance().registerListener(this);
    7071
    7172        this->scrollPosition_ = 0;
     
    7374        this->historyPosition_ = 0;
    7475        this->historyOffset_ = 0;
    75         this->bFinishedLastLine_ = true;
    7676
    7777        this->clearOutput();
     
    8181        ConfigFileManager::getInstance().setFilename(ConfigFileType::CommandHistory, "commandHistory.ini");
    8282
    83         // Use a stringstream object to buffer the output
    84         this->outputStream_ = &this->outputBuffer_;
     83        // Choose the default level according to the path Orxonox was started (build directory or not)
     84        OutputLevel defaultDebugLevel = (PathConfig::buildDirectoryRun() ? DefaultLogLevel::Dev : DefaultLogLevel::User);
     85        this->setLevelMax(defaultDebugLevel);
    8586
    8687        this->setConfigValues();
    8788
    8889        // Get the previous output and add it to the Shell
    89         OutputHandler::OutputVector::const_iterator it = OutputHandler::getInstance().getOutput().begin();
    90         for (;it != OutputHandler::getInstance().getOutput().end(); ++it)
    91         {
    92             if (it->first <= debugLevel_)
    93             {
    94                 this->outputBuffer_ << it->second;
    95                 this->outputChanged(it->first);
    96             }
    97         }
    98 
    99         // Register the shell as output listener
    100         OutputHandler::getInstance().registerOutputListener(this);
    101         OutputHandler::getInstance().setSoftDebugLevel(consoleName_, debugLevel_);
    102     }
    103 
    104     /**
    105         @brief Destructor: Unregisters the shell from OutputHandler.
     90        MemoryWriter::getInstance().resendOutput(this);
     91    }
     92
     93    /**
     94        @brief Destructor
    10695    */
    10796    Shell::~Shell()
    10897    {
    109         OutputHandler::getInstance().unregisterOutputListener(this);
    11098        this->inputBuffer_->destroy();
    111     }
    112 
    113     namespace DefaultLogLevel
    114     {
    115         const OutputLevel::Value Dev  = OutputLevel::Info;
    116         const OutputLevel::Value User = OutputLevel::Error;
     99
     100        OutputManager::getInstance().unregisterListener(this);
    117101    }
    118102
     
    129113        SetConfigValue(cacheSize_s, 32);
    130114
    131         // Choose the default level according to the path Orxonox was started (build directory or not)
    132         OutputLevel::Value defaultDebugLevel = (PathConfig::buildDirectoryRun() ? DefaultLogLevel::Dev : DefaultLogLevel::User);
    133         SetConfigValueExternal(debugLevel_, "OutputHandler", "debugLevel" + consoleName_, defaultDebugLevel)
    134             .description("The maximum level of debug output shown in the " + consoleName_);
    135         OutputHandler::getInstance().setSoftDebugLevel(consoleName_, debugLevel_);
     115        SetConfigValueExternal(this->configurableMaxLevel_,
     116                               this->getConfigurableSectionName(),
     117                               this->getConfigurableMaxLevelName(),
     118                               this->configurableMaxLevel_)
     119            .description("The maximum level of output shown in the " + this->getName())
     120            .callback(static_cast<BaseWriter*>(this), &BaseWriter::changedConfigurableLevel);
     121        SetConfigValueExternal(this->configurableAdditionalContextsMaxLevel_,
     122                               this->getConfigurableSectionName(),
     123                               this->getConfigurableAdditionalContextsMaxLevelName(),
     124                               this->configurableAdditionalContextsMaxLevel_)
     125            .description("The maximum level of output shown in the " + this->getName() + " for additional contexts")
     126            .callback(static_cast<BaseWriter*>(this), &BaseWriter::changedConfigurableAdditionalContextsLevel);
     127        SetConfigValueExternal(this->configurableAdditionalContexts_,
     128                               this->getConfigurableSectionName(),
     129                               this->getConfigurableAdditionalContextsName(),
     130                               this->configurableAdditionalContexts_)
     131            .description("Additional output contexts shown in the " + this->getName())
     132            .callback(static_cast<BaseWriter*>(this), &BaseWriter::changedConfigurableAdditionalContexts);
    136133    }
    137134
     
    168165        if (isNormal)
    169166        {
    170             ModifyConfigValueExternal(debugLevel_, "debugLevel" + consoleName_, update);
     167            ModifyConfigValueExternal(this->configurableMaxLevel_, this->getConfigurableMaxLevelName(), update);
    171168        }
    172169        else
    173170        {
    174             OutputLevel::Value level = (value ? DefaultLogLevel::Dev : DefaultLogLevel::User);
    175             ModifyConfigValueExternal(debugLevel_, "debugLevel" + consoleName_, tset, level);
     171            OutputLevel level = (value ? DefaultLogLevel::Dev : DefaultLogLevel::User);
     172            ModifyConfigValueExternal(this->configurableMaxLevel_, this->getConfigurableMaxLevelName(), tset, level);
    176173        }
    177174    }
     
    252249
    253250    /**
    254         @brief Sends output to the internal output buffer.
     251        @brief Adds multiple lines to the internal output buffer.
    255252    */
    256253    void Shell::addOutput(const std::string& text, LineType type)
    257254    {
    258         this->outputBuffer_ << text;
    259         this->outputChanged(type);
     255        std::vector<std::string> lines;
     256        vectorize(text, '\n', &lines);
     257
     258        for (size_t i = 0; i < lines.size(); ++i)
     259            this->addLine(lines[i], type);
     260    }
     261
     262    /**
     263        @brief Adds a line to the internal output buffer.
     264    */
     265    void Shell::addLine(const std::string& line, LineType type)
     266    {
     267        // yes it was - push the new line to the list
     268        this->outputLines_.push_front(std::make_pair(line, static_cast<LineType>(type)));
     269
     270        // adjust the scroll position if needed
     271        if (this->scrollPosition_)
     272            this->scrollPosition_++;
     273        else
     274            this->scrollIterator_ = this->outputLines_.begin();
     275
     276        if (!this->scrollPosition_)
     277            this->updateListeners<&ShellListener::lineAdded>();
    260278    }
    261279
     
    269287
    270288        this->scrollPosition_ = 0;
    271         this->bFinishedLastLine_ = true;
    272289
    273290        this->updateListeners<&ShellListener::linesChanged>();
     291    }
     292
     293    /**
     294        @brief Inherited from BaseWriter (LogListener), called if a new line of output was sent.
     295    */
     296    void Shell::printLine(const std::string& line, OutputLevel level)
     297    {
     298        this->addLine(line, static_cast<LineType>(level));
    274299    }
    275300
     
    323348
    324349    /**
    325         @brief Called by OutputHandler or internally whenever output was sent to the output buffer. Reads from the buffer and writes the new output-lines to the list.
    326     */
    327     void Shell::outputChanged(int lineType)
    328     {
    329         bool newline = false;
    330         do
    331         {
    332             // get the first line from the buffer
    333             std::string output;
    334             std::getline(this->outputBuffer_, output);
    335 
    336             // check the state of the buffer
    337             bool eof = this->outputBuffer_.eof();
    338             bool fail = this->outputBuffer_.fail();
    339             if (eof)
    340                 this->outputBuffer_.flush(); // check if more output was received in the meantime
    341             if (eof || fail)
    342                 this->outputBuffer_.clear(); // clear the error flags
    343 
    344             // the line is terminated with a line-break if neither an error occurred nor the end of the file was reached
    345             newline = (!eof && !fail);
    346 
    347             // no output retrieved - break the loop
    348             if (!newline && output.empty())
    349                 break;
    350 
    351             // check if the last line was terminated with a line-break
    352             if (this->bFinishedLastLine_)
    353             {
    354                 // yes it was - push the new line to the list
    355                 this->outputLines_.push_front(std::make_pair(output, static_cast<LineType>(lineType)));
    356 
    357                 // adjust the scroll position if needed
    358                 if (this->scrollPosition_)
    359                     this->scrollPosition_++;
    360                 else
    361                     this->scrollIterator_ = this->outputLines_.begin();
    362 
    363                 if (!this->scrollPosition_)
    364                     this->updateListeners<&ShellListener::lineAdded>();
    365             }
    366             else
    367             {
    368                 // no it wasn't - add the new output to the last line
    369                 this->outputLines_.front().first += output;
    370                 this->updateListeners<&ShellListener::onlyLastLineChanged>();
    371             }
    372 
    373             // remember if the last line was terminated with a line-break
    374             this->bFinishedLastLine_ = newline;
    375 
    376         } while (newline); // loop as long as more lines are in the buffer
    377     }
    378 
    379     /**
    380350        @brief Clears the text in the input buffer.
    381351    */
     
    409379        const std::string& result = CommandExecutor::query(this->inputBuffer_->get(), &error);
    410380        if (error)
    411         {
    412             switch (error)
    413             {
    414                 case CommandExecutor::Error:       this->outputBuffer_ << "Error: Can't execute \"" << this->inputBuffer_->get() << "\", command doesn't exist. (S)" << std::endl; break;
    415                 case CommandExecutor::Incomplete:  this->outputBuffer_ << "Error: Can't execute \"" << this->inputBuffer_->get() << "\", not enough arguments given. (S)" << std::endl; break;
    416                 case CommandExecutor::Deactivated: this->outputBuffer_ << "Error: Can't execute \"" << this->inputBuffer_->get() << "\", command is not active. (S)" << std::endl; break;
    417                 case CommandExecutor::Denied:      this->outputBuffer_ << "Error: Can't execute \"" << this->inputBuffer_->get() << "\", access denied. (S)" << std::endl; break;
    418             }
    419             this->outputChanged(Error);
    420         }
     381            this->addOutput("Error: Can't execute \"" + this->inputBuffer_->get() + "\", " + CommandExecutor::getErrorDescription(error) + ". (Shell)", UserError);
    421382        else if (result != "")
    422         {
    423             this->outputBuffer_ << result << std::endl;
    424             this->outputChanged(Command);
    425         }
     383            this->addOutput(result, Result);
    426384
    427385        this->clearInput();
     
    432390    {
    433391        this->inputBuffer_->set(CommandExecutor::evaluate(this->inputBuffer_->get()).complete());
    434         this->outputBuffer_ << CommandExecutor::evaluate(this->inputBuffer_->get()).hint() << std::endl;
    435         this->outputChanged(Hint);
     392        this->addOutput(CommandExecutor::evaluate(this->inputBuffer_->get()).hint(), Hint);
    436393
    437394        this->inputChanged();
  • code/trunk/src/libraries/core/command/Shell.h

    r8729 r8858  
    4848#include <vector>
    4949
    50 #include "util/OutputHandler.h"
     50#include "util/output/BaseWriter.h"
    5151#include "core/Core.h"
    5252#include "core/OrxonoxClass.h"
     
    6666        private:
    6767            virtual void linesChanged() {}          ///< Called if all output-lines have changed
    68             virtual void onlyLastLineChanged() {}   ///< Called if only the last output-line has changed
    6968            virtual void lineAdded() {}             ///< Called if a new line was added to the output
    7069            virtual void inputChanged() {}          ///< Called if the input has changed
     
    7877        @brief The Shell is the logical component of the console that displays output to the user and allows him to enter commands.
    7978
    80         The Shell gathers output sent from OutputHandler by inheriting from OutputListener.
     79        The Shell gathers output sent from OutputManager by inheriting from BaseWriter.
    8180        The output-lines are stored in the shell, so they can be displayed in a graphical
    8281        console. Additionally the Shell has an InputBuffer which is needed by the user to
     
    8584        Different graphical consoles build upon a Shell, for example InGameConsole and IOConsole.
    8685    */
    87     class _CoreExport Shell : public OutputListener, public DevModeListener
     86    class _CoreExport Shell : public BaseWriter, public DevModeListener
    8887    {
    8988        public:
     
    9190            enum LineType
    9291            {
    93                 TDebug  = OutputLevel::TDebug,
    94                 None    = OutputLevel::None,
    95                 Warning = OutputLevel::Warning,
    96                 Error   = OutputLevel::Error,
    97                 Info    = OutputLevel::Info,
    98                 Debug   = OutputLevel::Debug,
    99                 Verbose = OutputLevel::Verbose,
    100                 Ultra   = OutputLevel::Ultra,
     92                DebugOutput     = debug_output,
     93                Message         = message,
     94                UserError       = user_error,
     95                UserWarning     = user_warning,
     96                UserStatus      = user_status,
     97                UserInfo        = user_info,
     98                InternalError   = internal_error,
     99                InternalWarning = internal_warning,
     100                InternalStatus  = internal_status,
     101                InternalInfo    = internal_info,
     102                Verbose         = verbose,
     103                VerboseMore     = verbose_more,
     104                VerboseUltra    = verbose_ultra,
     105                Cout,
    101106                Input,
    102107                Command,
     108                Result,
    103109                Hint
    104110            };
     
    127133            LineList::const_iterator getEndIterator() const;
    128134
    129             void addOutput(const std::string& text, LineType type = None);
     135            void addOutput(const std::string& text, LineType type = DebugOutput);
     136            void addLine(const std::string& line, LineType type = DebugOutput);
    130137            void clearOutput();
    131138
     
    150157            const std::string& getFromHistory() const;
    151158            void clearInput();
    152             // OutputListener
    153             void outputChanged(int level);
     159            // BaseWriter
     160            virtual void printLine(const std::string& line, OutputLevel level);
    154161
    155162            void configureInputBuffer();
     
    183190            std::list<ShellListener*> listeners_;           ///< The registered shell listeners
    184191            InputBuffer*              inputBuffer_;         ///< The input buffer that is needed by the user to enter text
    185             std::stringstream         outputBuffer_;        ///< The output buffer that is used to retrieve lines of output from OutputListener
    186             bool                      bFinishedLastLine_;   ///< Stores if the most recent output-line was terminated with a line-break or if more output is expected for this line
    187192            LineList                  outputLines_;         ///< A list of all output-lines that were displayed in the shell so far
    188193            LineList::const_iterator  scrollIterator_;      ///< An iterator to an entry of the list of output-lines, changes if the user scrolls through the output in the shell
    189194            unsigned int              scrollPosition_;      ///< The number of the line that is currently being referenced by scrollIterator_
    190195            unsigned int              historyPosition_;     ///< If the user scrolls through the history of entered commands (stored in commandHistory_), this contains the currently viewed history entry
    191 
    192             const std::string         consoleName_;         ///< The name of this shell - used to define the name of the soft-debug-level config-value
    193196            const bool                bScrollable_;         ///< If true, the user can scroll through the output-lines
    194197
     
    197200            unsigned int              historyOffset_;       ///< The command history is a circular buffer, this variable defines the current write-offset
    198201            std::vector<std::string>  commandHistory_;      ///< The history of commands that were entered by the user
    199             int                       debugLevel_;          //!< The maximum level of output that is displayed in the shell (will be passed to OutputListener to filter output)
    200202            static unsigned int       cacheSize_s;          ///< The maximum cache size of the CommandExecutor - this is stored here for better readability of the config file and because CommandExecutor is no OrxonoxClass
    201203    };
  • code/trunk/src/libraries/core/command/TclBind.cc

    r8366 r8858  
    3434
    3535#include "SpecialConfig.h"
    36 #include "util/Debug.h"
     36#include "util/Output.h"
    3737#include "util/Exception.h"
    3838#include "util/StringUtils.h"
     
    106106            }
    107107            catch (Tcl::tcl_error const &e)
    108             {   COUT(1) << "Tcl error while creating Tcl-interpreter: " << e.what() << std::endl;   }
     108            {   orxout(internal_error, context::tcl) << "Tcl error while creating Tcl-interpreter: " << e.what() << endl;   }
    109109        }
    110110    }
     
    129129        }
    130130        catch (Tcl::tcl_error const &e)
    131         {   COUT(1) << "Tcl error while creating Tcl-interpreter: " << e.what() << std::endl; COUT(1) << "Error: Tcl isn't properly initialized. Orxonox might possibly not work like that." << std::endl;   }
     131        {
     132            orxout(internal_error, context::tcl) << "Tcl error while creating Tcl-interpreter: " << e.what() << endl;
     133            orxout(user_error, context::tcl) << "Tcl isn't properly initialized. Orxonox might possibly not work like that." << endl;
     134        }
    132135
    133136        return interpreter;
     
    154157    std::string TclBind::tcl_query(Tcl::object const &args)
    155158    {
    156         COUT(4) << "Tcl_query: " << args.get() << std::endl;
     159        orxout(verbose, context::commands) << "Tcl_query: " << args.get() << endl;
    157160        return TclBind::tcl_helper(args, true);
    158161    }
     
    163166    void TclBind::tcl_execute(Tcl::object const &args)
    164167    {
    165         COUT(4) << "Tcl_execute: " << args.get() << std::endl;
     168        orxout(verbose, context::commands) << "Tcl_execute: " << args.get() << endl;
    166169        TclBind::tcl_helper(args, false);
    167170    }
     
    184187            error = evaluation.execute();
    185188
    186         switch (error)
    187         {
    188             case CommandExecutor::Error:       COUT(1) << "Error: Can't execute command \"" << command << "\", command doesn't exist. (B)" << std::endl; break;
    189             case CommandExecutor::Incomplete:  COUT(1) << "Error: Can't execute command \"" << command << "\", not enough arguments given. (B)" << std::endl; break;
    190             case CommandExecutor::Deactivated: COUT(1) << "Error: Can't execute command \"" << command << "\", command is not active. (B)" << std::endl; break;
    191             case CommandExecutor::Denied:      COUT(1) << "Error: Can't execute command \"" << command << "\", access denied. (B)" << std::endl; break;
    192         }
    193 
    194         if (error == CommandExecutor::Error)
    195             COUT(3) << "Did you mean \"" << evaluation.getCommandSuggestion() << "\"?" << std::endl;
     189        if (error)
     190        {
     191            orxout(user_error) << "Can't execute command \"" << command << "\", " + CommandExecutor::getErrorDescription(error) + ". (TclBind)" << endl;
     192            if (error == CommandExecutor::Inexistent)
     193                orxout(user_info) << "Did you mean \"" << evaluation.getCommandSuggestion() << "\"?" << endl;
     194        }
    196195
    197196        return result;
     
    211210            }
    212211            catch (Tcl::tcl_error const &e)
    213             {   COUT(1) << "Tcl error: " << e.what() << std::endl;   }
     212            {   orxout(user_error, context::tcl) << "Tcl error: " << e.what() << endl;   }
    214213        }
    215214
     
    223222    void TclBind::bgerror(const std::string& error)
    224223    {
    225         COUT(1) << "Tcl background error: " << stripEnclosingBraces(error) << std::endl;
     224        orxout(user_error, context::tcl) << "Tcl background error: " <&