Skip to content
Snippets Groups Projects
ipaaca.h 9.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * This file is part of IPAACA, the
     *  "Incremental Processing Architecture
    
     *   for Artificial Conversational Agents".
    
     * Copyright (c) 2009-2015 Social Cognitive Systems Group
     *                         (formerly the Sociable Agents Group)
    
     *
     * http://opensource.cit-ec.de/projects/ipaaca/
     * http://purl.org/net/ipaaca
     *
     * This file may be licensed under the terms of of the
     * GNU Lesser General Public License Version 3 (the ``LGPL''),
     * or (at your option) any later version.
     *
     * Software distributed under the License is distributed
     * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
     * express or implied. See the LGPL for the specific language
     * governing rights and limitations.
     *
     * You should have received a copy of the LGPL along with this
     * program. If not, go to http://www.gnu.org/licenses/lgpl.html
     * or write to the Free Software Foundation, Inc.,
    
     * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    
     *
     * The development of this software was supported by the
     * Excellence Cluster EXC 277 Cognitive Interaction Technology.
     * The Excellence Cluster EXC 277 is a grant of the Deutsche
     * Forschungsgemeinschaft (DFG) in the context of the German
     * Excellence Initiative.
     */
    
    
    /**
     * \file   ipaaca.h
     *
     * \brief Central header file for IPAACA-C++.
     *
     * This is the central header file for the C++ version of IPAACA. Users should <b>include this file only.</b>
     *
     * \author Ramin Yaghoubzadeh (ryaghoubzadeh@uni-bielefeld.de)
     * \date   March, 2015
     */
    
    /**
    \mainpage Documentation for IPAACA-C++
    
    This is the automatically generated documentation for the C++ implementation of IPAACA.
    
    List of most relevant entry points:
    
    Buffers: InputBuffer, OutputBuffer
    
    
    
    IU handling (user-set): #IUEventHandlerFunction
    
    IU payload contents: Payload, PayloadEntryProxy
    */
    
    
    #ifndef __ipaaca_h_INCLUDED__
    #define __ipaaca_h_INCLUDED__
    
    
    /// ipaaca/IU/RSB protocol major version number
    
    #define IPAACA_PROTOCOL_VERSION_MAJOR         2
    
    /// ipaaca/IU/RSB protocol minor version number
    #define IPAACA_PROTOCOL_VERSION_MINOR         0
    
    /// running release number of ipaaca-c++
    
    /// date of last release number increment
    
    #define IPAACA_CPP_RELEASE_DATE     "2015-12-04"
    
    
    #ifndef __FUNCTION_NAME__
    	#ifdef WIN32   // Windows
    		#define __FUNCTION_NAME__   __FUNCTION__
    	#else          // POSIX
    		#define __FUNCTION_NAME__   __func__
    	#endif
    #endif
    
    
    #ifdef WIN32
    	#define IPAACA_SYSTEM_DEPENDENT_CLASS_NAME(c) "class "##c
    #else
    	#define IPAACA_SYSTEM_DEPENDENT_CLASS_NAME(c) c
    #endif
    
    #ifdef WIN32
    
    	#if defined(ipaaca_EXPORTS)
    		#define  IPAACA_EXPORT
    		#define  IPAACA_HEADER_EXPORT __declspec(dllexport)
    		#define  IPAACA_MEMBER_VAR_EXPORT
    	#else
    		#define  IPAACA_EXPORT
    		#define  IPAACA_HEADER_EXPORT __declspec(dllimport)
    		#define  IPAACA_MEMBER_VAR_EXPORT
    	#endif
    #else
    	#define IPAACA_EXPORT
    	#define IPAACA_HEADER_EXPORT
    	#define IPAACA_MEMBER_VAR_EXPORT
    #endif
    
    
    #ifdef IPAACA_DEBUG_MESSAGES
    
    #define IPAACA_DEBUG(i)     if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_DEBUG) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- Debug: " << i << std::endl; }
    #define IPAACA_INFO(i)      if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_INFO) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- Info: " << i << std::endl; }
    #define IPAACA_WARNING(i)   if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_WARNING) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- WARNING: " << i << std::endl; }
    #define IPAACA_ERROR(i)     if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_ERROR) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- ERROR: " << i << std::endl; }
    #define IPAACA_CRITICAL(i)  if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_CRITICAL) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- CRITICAL: " << i << std::endl; }
    #define IPAACA_IMPLEMENT_ME if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_INFO) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- IMPLEMENT_ME:" << std::endl; }
    #define IPAACA_TODO(i)      if (__ipaaca_static_option_log_level>=IPAACA_LOG_LEVEL_INFO) { std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- TODO: " << i << std::endl; }
    
    #define IPAACA_INFO(i) ;
    #define IPAACA_WARNING(i) ;
    
    #define IPAACA_ERROR(i) ;
    #define IPAACA_CRITICAL(i) ;
    
    #define IPAACA_IMPLEMENT_ME ;
    #define IPAACA_TODO(i) ;
    #endif
    
    
    #ifdef IPAACA_EXPOSE_FULL_RSB_API
    #include <rsc/runtime/TypeStringTools.h>
    #include <rsb/Factory.h>
    #include <rsb/Handler.h>
    #include <rsb/Event.h>
    
    #include <rsb/ParticipantConfig.h>
    
    #include <rsb/converter/Repository.h>
    #include <rsb/converter/ProtocolBufferConverter.h>
    #include <rsb/converter/Converter.h>
    #include <rsb/rsbexports.h>
    #endif
    
    
    // new json-based payload API, used in several classes
    
    #define RAPIDJSON_HAS_STDSTRING 1
    
    #include "rapidjson/document.h"
    #include "rapidjson/prettywriter.h"
    #include "rapidjson/filestream.h"
    #include <cstdio>
    
    /// marking pure virtual functions for extra readability
    #define _IPAACA_ABSTRACT_
    
    
    #define _IPAACA_OVERRIDE_ override
    
    
    /// value to return when reading nonexistant payload keys
    #define IPAACA_PAYLOAD_DEFAULT_STRING_VALUE ""
    
    
    // seconds until remote writes time out
    #define IPAACA_REMOTE_SERVER_TIMEOUT 2.0
    
    
    
    #include <iostream>
    
    
    
    #ifdef WIN32
    // for Windows
    #include <time.h>
    #else
    // for Linux and OS X
    
    #include <cstdlib>
    
    
    #ifdef WIN32
    #include <rpc.h>
    #else
    #include <uuid/uuid.h>
    #include <glob.h>
    #endif
    
    
    
    #include <boost/bind.hpp>
    #include <boost/function.hpp>
    
    #include <boost/shared_ptr.hpp>
    
    #include <boost/pointer_cast.hpp>
    
    #include <boost/lexical_cast.hpp>
    
    #include <ipaaca/ipaaca.pb.h>
    
    Ramin Yaghoubzadeh's avatar
    Ramin Yaghoubzadeh committed
    #include <set>
    
    #include <algorithm>
    #include <utility>
    
    Ramin Yaghoubzadeh's avatar
    Ramin Yaghoubzadeh committed
    
    
    #include <ipaaca/ipaaca-definitions.h>
    #include <ipaaca/ipaaca-forwards.h>
    
    #include <ipaaca/ipaaca-locking.h>
    
    // Global static library variables (run-time default configuration)
    // Actual initial values are set in ipaaca.cc
    
    
    /// Default payload type for new IUs (defaults to "JSON")
    
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_default_payload_type;
    
    /// Default channel for buffers (defaults to "default")
    
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_default_channel;
    
    /// Current console log level (defaults to warning), one of: IPAACA_LOG_LEVEL_CRITICAL, IPAACA_LOG_LEVEL_ERROR, IPAACA_LOG_LEVEL_WARNING, IPAACA_LOG_LEVEL_INFO, IPAACA_LOG_LEVEL_DEBUG, IPAACA_LOG_LEVEL_NONE
    
    IPAACA_MEMBER_VAR_EXPORT extern unsigned int __ipaaca_static_option_log_level;
    
    /// RSB host to connect to (defaults to "" = do not set, use global config)
    
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_rsb_host;
    
    /// RSB port to connect to (defaults to "" = do not set, use global config)
    
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_rsb_port;
    /// RSB transport to use (defaults to "" = do not set, use global config)
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_rsb_transport;
    /// Whether to run in server mode on 'socket' transport (defaults to "" = do not set, use global config)
    IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_rsb_socketserver;
    
    IPAACA_MEMBER_VAR_EXPORT Lock& logger_lock();
    
    #ifdef WIN32
    #define LOG_IPAACA_CONSOLE(msg) { ipaaca::Locker logging_locker(ipaaca::logger_lock()); std::time_t result = std::time(NULL); std::cout << "[LOG] " << std::asctime(std::localtime(&result)) << " : " << msg << std::endl; }
    #else
    // use normal gettimeofday() on POSIX
    
    #define LOG_IPAACA_CONSOLE(msg) { ipaaca::Locker logging_locker(ipaaca::logger_lock()); timeval logging_tim; gettimeofday(&logging_tim, NULL); double logging_t1=logging_tim.tv_sec+(logging_tim.tv_usec/1000000.0); std::cout << "[LOG] " << std::setprecision(15) << logging_t1 << " : " << msg << std::endl; }
    
    #ifdef WIN32
    #define IPAACA_SIMPLE_TIMER_BEGIN(N) ;
    #define IPAACA_SIMPLE_TIMER_END(N, NAME) LOG_IPAACA_CONSOLE(NAME << " - time elapsed: Windows - IMPLEMENT ME")
    #else
    /// use IPAACA_SIMPLE_TIMER_BEGIN(mysymbol) to start time profiling at a line in code
    /// Several blocks can be defined in the same stack frame if different symbols are chosen
    #define IPAACA_SIMPLE_TIMER_BEGIN(N) struct timeval _ipaaca_timer_tvstart_ ## N; \
    	gettimeofday(&_ipaaca_timer_tvstart_ ## N, NULL);
    /// use IPAACA_SIMPLE_TIMER_END(mysymbol, "message") to print time elapsed since correpsonding _BEGIN
    #define IPAACA_SIMPLE_TIMER_END(N, NAME) struct timeval _ipaaca_timer_tvend_ ## N; \
    	gettimeofday(&_ipaaca_timer_tvend_ ## N, NULL); \
    	long _ipaaca_timer_usecs_ ## N = (_ipaaca_timer_tvend_ ## N.tv_sec*1000000 + _ipaaca_timer_tvend_ ## N.tv_usec) - (_ipaaca_timer_tvstart_ ## N.tv_sec*1000000 + _ipaaca_timer_tvstart_ ## N.tv_usec); \
    	LOG_IPAACA_CONSOLE(NAME << " - ̨́us elapsed: " << _ipaaca_timer_usecs_ ## N)
    #endif
    
    
    #include <ipaaca/ipaaca-payload.h>
    #include <ipaaca/ipaaca-buffers.h>
    #include <ipaaca/ipaaca-ius.h>
    
    /// Full API (including RSB transport) is only exposed during
    ///  ipaaca compilation, user programs should use abstract API.
    #ifdef IPAACA_EXPOSE_FULL_RSB_API
    #include <ipaaca/ipaaca-internal.h>
    #endif