From 98544ede429b6b6d1b9a2e0d9dd0ca927bd24186 Mon Sep 17 00:00:00 2001 From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de> Date: Tue, 11 Feb 2014 22:39:45 +0100 Subject: [PATCH] C++: experimental Windows compatibility changes State: "experimental - work required". Special build file conditions and conditionally compiled source code sections were implemented to make ipaaca compile under Windows. For now, the required libraries from the prepackaged "rsx" ZIP provided by CoRLab have been hard-coded in the Windows resolution / linking sections. The unpacked archive is expected to reside in the common repo dir as "rsx". --- ipaacalib/cpp/CMakeLists.txt | 111 ++- ipaacalib/cpp/include/ipaaca/ipaaca.h | 802 +++++++++++---------- ipaacalib/cpp/src/ipaaca-cmdline-parser.cc | 8 + ipaacalib/cpp/src/ipaaca.cc | 341 +++++---- 4 files changed, 713 insertions(+), 549 deletions(-) diff --git a/ipaacalib/cpp/CMakeLists.txt b/ipaacalib/cpp/CMakeLists.txt index e792a9e..ab6d3fd 100644 --- a/ipaacalib/cpp/CMakeLists.txt +++ b/ipaacalib/cpp/CMakeLists.txt @@ -7,56 +7,87 @@ project (ipaaca_cpp) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DIPAACA_DEBUG_MESSAGES") # expose the full RSB api in the headers (set only in ipaaca itself) +# !! NOTE: at the moment required in any ipaaca cpp project in Windows !! set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DIPAACA_EXPOSE_FULL_RSB_API") # find cmake modules locally too set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules) -find_package(Boost COMPONENTS system filesystem thread regex REQUIRED) -link_directories(${Boost_LIBRARY_DIRS}) -include_directories(${Boost_INCLUDE_DIRS}) -#set(BOOSTLIBS boost_regex-mt boost_date_time-mt boost_program_options-mt boost_thread-mt boost_filesystem-mt boost_signals-mt boost_system-mt) - -find_package(Protobuf REQUIRED) -link_directories(${PROTOBUF_LIBRARY_DIRS}) -include_directories(${PROTOBUF_INCLUDE_DIRS}) - -##set(PROTOLIBS protobuf) -#set(RSBLIBS rsc rsbcore) - -# add for for each new rsb version -include_directories( ${PROJECT_SOURCE_DIR}/../../deps/include/rsc0.10 ) -include_directories( ${PROJECT_SOURCE_DIR}/../../deps/include/rsb0.10 ) -# change for each new rsb version -if (DEFINED APPLE) -set(RSBLIBS rsc0.10 rsb.0.10) -else(DEFINED APPLE) -set(RSBLIBS ${PROJECT_SOURCE_DIR}/../../deps/lib/librsc0.10.so ${PROJECT_SOURCE_DIR}/../../deps/lib/librsb.so.0.10 ) -endif(DEFINED APPLE) - -#set(LIBS ${LIBS} ${BOOSTLIBS} ${PROTOLIBS} ${RSBLIBS}) -#set(LIBS ${LIBS} ${PROTOLIBS} ${RSBLIBS}) -set(LIBS ${LIBS} ${PROTOBUF_LIBRARY} ${Boost_LIBRARIES} ${RSBLIBS}) - -if (NOT DEFINED APPLE) - set(LIBS ${LIBS} uuid) -endif(NOT DEFINED APPLE) +if(WIN32) # Check if we are on Windows + if(MSVC) # Check if we are using the Visual Studio compiler + #set_target_properties(TestProject PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS") + # + # Setup section for Windows build (using precompiled rsb + deps) + # + # set BOOST_ROOT=%YOURREPODIR%\rsx\boost + # set PROTOBUF_INCLUDE_DIR=%YOURREPODIR%\rsx\protobuf\include + # + # + #find_package(Boost COMPONENTS date_time program_options system filesystem thread signals regex REQUIRED) + #link_directories(${Boost_LIBRARY_DIRS}) + #include_directories(${Boost_INCLUDE_DIRS}) + # overriding the determined libs to remove boost_thread (causes multiple-definition issues) + + set(Boost_LIBRARIES boost_regex-vc100-mt-gd-1_54 boost_date_time-vc100-mt-gd-1_54 boost_program_options-vc100-mt-gd-1_54 boost_filesystem-vc100-mt-gd-1_54 boost_signals-vc100-mt-gd-1_54 boost_system-vc100-mt-gd-1_54) + + include_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/boost/include/boost-1_54 ) + link_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/boost/lib ) + + include_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/RSC-0.11.0-win32/include/rsc0.11 ) + include_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/RSB-0.11.0-win32/include/rsb0.11 ) + include_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/protobuf/include ) + link_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/RSC-0.11.0-win32/lib ) + link_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/RSB-0.11.0-win32/lib ) + link_directories( ${PROJECT_SOURCE_DIR}/../../../rsx/protobuf/bin ) + + set(RSBLIBS rsc0.11 rsb) + set(PROTOBUF_LIBRARY libprotobuf) + set(LIBS ${LIBS} rpcrt4) + # boost_regex-vc100-mt-gd-1_54.lib;boost_date_time-vc100-mt-gd-1_54.lib;boost_program_options-vc100-mt-gd-1_54.lib;boost_filesystem-vc100-mt-gd-1_54.lib;boost_signals-vc100-mt-gd-1_54.lib;boost_system-vc100-mt-gd-1_54.lib + + # boost_regex-mt boost_date_time-mt boost_program_options-mt boost_thread-mt boost_filesystem-mt boost_signals-mt boost_system-mt + else() + message(SEND_ERROR "Unsupported compiler! Please build with MSVC (2010).") + endif() +else() + # + # Setup section for Linux or OS X (using 'rsb' soa project) + # + find_package(Boost COMPONENTS system filesystem thread regex REQUIRED) + link_directories(${Boost_LIBRARY_DIRS}) + include_directories(${Boost_INCLUDE_DIRS}) + #set(BOOSTLIBS boost_regex-mt boost_date_time-mt boost_program_options-mt boost_thread-mt boost_filesystem-mt boost_signals-mt boost_system-mt) + + find_package(Protobuf REQUIRED) + link_directories(${PROTOBUF_LIBRARY_DIRS}) + include_directories(${PROTOBUF_INCLUDE_DIRS}) + + # add for for each new rsb version + include_directories( ${PROJECT_SOURCE_DIR}/../../deps/include/rsc0.10 ) + include_directories( ${PROJECT_SOURCE_DIR}/../../deps/include/rsb0.10 ) + # change for each new rsb version + if (DEFINED APPLE) + set(RSBLIBS rsc0.10 rsb.0.10) + else(DEFINED APPLE) + set(RSBLIBS ${PROJECT_SOURCE_DIR}/../../deps/lib/librsc0.10.so ${PROJECT_SOURCE_DIR}/../../deps/lib/librsb.so.0.10 ) + set(LIBS ${LIBS} uuid) + endif(DEFINED APPLE) + # enhance the default search paths (headers, libs ...) + set(CMAKE_PREFIX_PATH ${PROJECT_SOURCE_DIR}:/opt/local:${CMAKE_PREFIX_PATH}) + # MacPorts compatibility + if (DEFINED APPLE) + message(STATUS "Adding extra options for building on Mac OS X") + set(CXX_DEFINES "${CXX_DEFINES} -D__MACOSX__") + link_directories( /opt/local/lib ) + include_directories( /opt/local/include ) + endif(DEFINED APPLE) +endif(WIN32) -# enhance the default search paths (headers, libs ...) -set(CMAKE_PREFIX_PATH ${PROJECT_SOURCE_DIR}:/opt/local:${CMAKE_PREFIX_PATH}) -## Ace2 uses deprecated style (non-template friend functions and non-const char*s) -## We just hide the warnings here -#set(CXX_OLD_CODE_CONVENIENCE_FLAGS "-Wno-non-template-friend -Wno-write-strings") +set(LIBS ${LIBS} ${PROTOBUF_LIBRARY} ${Boost_LIBRARIES} ${RSBLIBS}) # Compiler defines copied from the old build system set(CXX_DEFINES "-D_BSD_SOURCE -DUSE_AV -DMGC_USE_DOUBLE -DLEDA_PREFIX -D__NO_CAST_TO_LOCAL_TYPE__ -DDBGLVL=0") -if (DEFINED APPLE) - message(STATUS "Adding extra options for building on Mac OS X") - set(CXX_DEFINES "${CXX_DEFINES} -D__MACOSX__") - link_directories( /opt/local/lib ) - include_directories( /opt/local/include ) -endif(DEFINED APPLE) # Combine the extra compiler flags set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_OLD_CODE_CONVENIENCE_FLAGS} ${CXX_DEFINES}") diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h index 057ff19..1ed2f2b 100644 --- a/ipaacalib/cpp/include/ipaaca/ipaaca.h +++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h @@ -39,15 +39,43 @@ #define IPAACA_PROTOCOL_VERSION_MINOR 0 /// running release number of ipaaca-c++ -#define IPAACA_CPP_RELEASE_NUMBER 1 +#define IPAACA_CPP_RELEASE_NUMBER 11 /// date of last release number increment -#define IPAACA_CPP_RELEASE_DATE "2012-09-08" +#define IPAACA_CPP_RELEASE_DATE "2014-02-10" + +#ifndef __FUNCTION_NAME__ + #ifdef WIN32 // Windows + #define __FUNCTION_NAME__ __FUNCTION__ + #else // POSIX + #define __FUNCTION_NAME__ __func__ + #endif +#endif + +#if defined (_WIN32) + #if defined(ipaaca_EXPORTS) + #define IPAACA_EXPORT +// __declspec(dllexport) + #define IPAACA_HEADER_EXPORT __declspec(dllexport) + #define IPAACA_MEMBER_VAR_EXPORT +// __declspec(dllexport) + #else + #define IPAACA_EXPORT +// __declspec(dllimport) + #define IPAACA_HEADER_EXPORT __declspec(dllimport) + #define IPAACA_MEMBER_VAR_EXPORT +// __declspec(dllimport) + #endif +#else + #define IPAACA_EXPORT + #define IPAACA_HEADER_EXPORT + #define IPAACA_MEMBER_VAR_EXPORT +#endif #ifdef IPAACA_DEBUG_MESSAGES -#define IPAACA_INFO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- " << i << std::endl; -#define IPAACA_WARNING(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- WARNING: " << i << std::endl; -#define IPAACA_IMPLEMENT_ME std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- IMPLEMENT ME" << std::endl; -#define IPAACA_TODO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- TODO: " << i << std::endl; +#define IPAACA_INFO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- " << i << std::endl; +#define IPAACA_WARNING(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- WARNING: " << i << std::endl; +#define IPAACA_IMPLEMENT_ME std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- IMPLEMENT ME" << std::endl; +#define IPAACA_TODO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __FUNCTION_NAME__ << "() -- TODO: " << i << std::endl; #else #define IPAACA_INFO(i) ; #define IPAACA_WARNING(i) ; @@ -60,6 +88,7 @@ #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> @@ -81,7 +110,14 @@ // for logger #include <iomanip> + +#ifdef WIN32 +// for Windows +#include <time.h> +#else +// for Linux and OS X #include <sys/time.h> +#endif #ifndef Q_MOC_RUN #include <boost/bind.hpp> @@ -94,9 +130,6 @@ #include <ipaaca/ipaaca.pb.h> -#include <pthread.h> -#include <uuid/uuid.h> - #include <set> namespace ipaaca { @@ -116,7 +149,7 @@ typedef uint32_t IUEventType; #define IU_ALL_EVENTS 127 /// Convert an int event type to a human-readable string -inline std::string iu_event_type_to_str(IUEventType type) +IPAACA_HEADER_EXPORT inline std::string iu_event_type_to_str(IUEventType type) { switch(type) { case IU_ADDED: return "ADDED"; @@ -131,7 +164,7 @@ inline std::string iu_event_type_to_str(IUEventType type) } /// IU access mode: PUSH means that updates are broadcast; REMOTE means that reads are RPC calls; MESSAGE means a fire-and-forget message -enum IUAccessMode { +IPAACA_HEADER_EXPORT enum IUAccessMode { IU_ACCESS_PUSH, IU_ACCESS_REMOTE, IU_ACCESS_MESSAGE @@ -166,144 +199,169 @@ class IULinkUpdateConverter; class IntConverter; /// generate a UUID as an ASCII string -std::string generate_uuid_string(); +IPAACA_HEADER_EXPORT std::string generate_uuid_string(); /// store for (local) IUs. TODO Stores need to be unified more -class IUStore: public std::map<std::string, boost::shared_ptr<IU> > +IPAACA_HEADER_EXPORT class IUStore: public std::map<std::string, boost::shared_ptr<IU> > { }; /// store for RemotePushIUs. TODO Stores need to be unified more -class RemotePushIUStore: public std::map<std::string, boost::shared_ptr<RemotePushIU> > // TODO genericize to all remote IU types +IPAACA_HEADER_EXPORT class RemotePushIUStore: public std::map<std::string, boost::shared_ptr<RemotePushIU> > // TODO genericize to all remote IU types { }; -class Exception: public std::exception//{{{ +IPAACA_HEADER_EXPORT class Exception: public std::exception//{{{ { protected: - std::string _description; + IPAACA_MEMBER_VAR_EXPORT std::string _description; public: - inline Exception(const std::string& description=""): _description(description) { } - inline ~Exception() throw() { } - const char* what() const throw() { + IPAACA_HEADER_EXPORT inline Exception(const std::string& description=""): _description(description) { } + IPAACA_HEADER_EXPORT inline ~Exception() throw() { } + IPAACA_HEADER_EXPORT const char* what() const throw() { return _description.c_str(); } };//}}} -class Abort: public std::exception//{{{ +IPAACA_HEADER_EXPORT class Abort: public std::exception//{{{ { protected: - std::string _description; + IPAACA_MEMBER_VAR_EXPORT std::string _description; public: - inline Abort(const std::string& description=""): _description(description) { } - inline ~Abort() throw() { } - const char* what() const throw() { + IPAACA_HEADER_EXPORT inline Abort(const std::string& description=""): _description(description) { } + IPAACA_HEADER_EXPORT inline ~Abort() throw() { } + IPAACA_HEADER_EXPORT const char* what() const throw() { return _description.c_str(); } };//}}} /// a reentrant lock/mutex -class Lock +#ifdef WIN32 +#include <boost/thread/recursive_mutex.hpp> +#include <boost/thread/thread.hpp> +IPAACA_HEADER_EXPORT class Lock { protected: - pthread_mutexattr_t _attrs; - pthread_mutex_t _mutex; + IPAACA_MEMBER_VAR_EXPORT boost::recursive_mutex _mutex; public: - inline Lock() { + IPAACA_HEADER_EXPORT inline Lock() { + } + IPAACA_HEADER_EXPORT inline ~Lock() { + } + IPAACA_HEADER_EXPORT inline void lock() { + _mutex.lock(); + } + IPAACA_HEADER_EXPORT inline void unlock() { + _mutex.unlock(); + } +}; +#else +#include <pthread.h> +IPAACA_HEADER_EXPORT class Lock +{ + protected: + IPAACA_MEMBER_VAR_EXPORT pthread_mutexattr_t _attrs; + IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t _mutex; + public: + IPAACA_HEADER_EXPORT inline Lock() { pthread_mutexattr_init(&_attrs); pthread_mutexattr_settype(&_attrs, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&_mutex, &_attrs); } - inline ~Lock() { + IPAACA_HEADER_EXPORT inline ~Lock() { pthread_mutex_destroy(&_mutex); pthread_mutexattr_destroy(&_attrs); } - inline void lock() { + IPAACA_HEADER_EXPORT inline void lock() { pthread_mutex_lock(&_mutex); } - inline void unlock() { + IPAACA_HEADER_EXPORT inline void unlock() { pthread_mutex_unlock(&_mutex); } }; +#endif /// Stack-based lock holder. Create in a new stack frame /// (i.e. {}-block) and it will obtain the lock and /// auto-release in on exiting the stack frame. -class Locker +IPAACA_HEADER_EXPORT class Locker { protected: - Lock* _lock; + IPAACA_MEMBER_VAR_EXPORT Lock* _lock; private: - inline Locker(): _lock(NULL) { } // not available + IPAACA_HEADER_EXPORT inline Locker(): _lock(NULL) { } // not available public: - inline Locker(Lock& lock): _lock(&lock) { + IPAACA_HEADER_EXPORT inline Locker(Lock& lock): _lock(&lock) { //std::cout << "-- Locker: lock" << std::endl; _lock->lock(); } - inline ~Locker() { + IPAACA_HEADER_EXPORT inline ~Locker() { //std::cout << "-- Locker: unlock" << std::endl; _lock->unlock(); } }; -class PthreadMutexLocker + +#ifndef WIN32 +IPAACA_HEADER_EXPORT class PthreadMutexLocker { protected: - pthread_mutex_t* _lock; + IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t* _lock; private: - inline PthreadMutexLocker(): _lock(NULL) { } // not available + IPAACA_HEADER_EXPORT inline PthreadMutexLocker(): _lock(NULL) { } // not available public: - inline PthreadMutexLocker(pthread_mutex_t* lock): _lock(lock) { + IPAACA_HEADER_EXPORT inline PthreadMutexLocker(pthread_mutex_t* lock): _lock(lock) { if (!lock) throw Exception("PthreadMutexLocker got a NULL mutex!"); pthread_mutex_lock(_lock); } - inline ~PthreadMutexLocker() { + IPAACA_HEADER_EXPORT inline ~PthreadMutexLocker() { pthread_mutex_unlock(_lock); } }; +#endif typedef std::set<std::string> LinkSet; typedef std::map<std::string, LinkSet> LinkMap; -class SmartLinkMap { +IPAACA_HEADER_EXPORT class SmartLinkMap { friend std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj); friend class IUInterface; friend class IU; friend class IUConverter; friend class MessageConverter; public: - const LinkSet& get_links(const std::string& key); - const LinkMap& get_all_links(); + IPAACA_HEADER_EXPORT const LinkSet& get_links(const std::string& key); + IPAACA_HEADER_EXPORT const LinkMap& get_all_links(); protected: - LinkMap _links; - static LinkSet empty_link_set; - void _add_and_remove_links(const LinkMap& add, const LinkMap& remove); - void _replace_links(const LinkMap& links); + IPAACA_MEMBER_VAR_EXPORT LinkMap _links; + IPAACA_MEMBER_VAR_EXPORT static LinkSet empty_link_set; + IPAACA_HEADER_EXPORT void _add_and_remove_links(const LinkMap& add, const LinkMap& remove); + IPAACA_HEADER_EXPORT void _replace_links(const LinkMap& links); }; -const LinkSet EMPTY_LINK_SET; +IPAACA_MEMBER_VAR_EXPORT const LinkSet EMPTY_LINK_SET; //const std::set<std::string> EMPTY_LINK_SET; //typedef boost::function<void (const std::string&, bool, IUEventType, const std::string&)> IUEventHandlerFunction; -typedef boost::function<void (boost::shared_ptr<IUInterface>, IUEventType, bool)> IUEventHandlerFunction; +IPAACA_HEADER_EXPORT typedef boost::function<void (boost::shared_ptr<IUInterface>, IUEventType, bool)> IUEventHandlerFunction; -class IUEventHandler { +IPAACA_HEADER_EXPORT class IUEventHandler { protected: - IUEventHandlerFunction _function; - IUEventType _event_mask; - bool _for_all_categories; - std::set<std::string> _categories; + IPAACA_MEMBER_VAR_EXPORT IUEventHandlerFunction _function; + IPAACA_MEMBER_VAR_EXPORT IUEventType _event_mask; + IPAACA_MEMBER_VAR_EXPORT bool _for_all_categories; + IPAACA_MEMBER_VAR_EXPORT std::set<std::string> _categories; protected: - inline bool _condition_met(IUEventType event_type, const std::string& category) + IPAACA_HEADER_EXPORT inline bool _condition_met(IUEventType event_type, const std::string& category) { return ((_event_mask&event_type)!=0) && (_for_all_categories || (_categories.count(category)>0)); } public: - IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category); - IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); + IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category); + IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); //void call(Buffer* buffer, const std::string& uid, bool local, IUEventType event_type, const std::string& category); - void call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); + IPAACA_HEADER_EXPORT void call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); typedef boost::shared_ptr<IUEventHandler> ptr; }; -class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{ +IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{ friend class IU; friend class RemotePushIU; friend class CallbackIUPayloadUpdate; @@ -311,183 +369,184 @@ class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{ friend class CallbackIUCommission; protected: //Lock _handler_lock; - std::string _uuid; - std::string _basename; - std::string _unique_name; - std::string _id_prefix; - std::vector<IUEventHandler::ptr> _event_handlers; - protected: - _IPAACA_ABSTRACT_ virtual void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") = 0; - _IPAACA_ABSTRACT_ virtual void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") = 0; - _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; - void _allocate_unique_name(const std::string& basename, const std::string& function); - inline Buffer(const std::string& basename, const std::string& function) { + IPAACA_MEMBER_VAR_EXPORT std::string _uuid; + IPAACA_MEMBER_VAR_EXPORT std::string _basename; + IPAACA_MEMBER_VAR_EXPORT std::string _unique_name; + IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix; + IPAACA_MEMBER_VAR_EXPORT std::vector<IUEventHandler::ptr> _event_handlers; + protected: + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0; + IPAACA_HEADER_EXPORT void _allocate_unique_name(const std::string& basename, const std::string& function); + IPAACA_HEADER_EXPORT inline Buffer(const std::string& basename, const std::string& function) { _allocate_unique_name(basename, function); } - void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); + IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category); public: - virtual inline ~Buffer() { } - inline const std::string& unique_name() { return _unique_name; } - void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); - void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category=""); + IPAACA_HEADER_EXPORT virtual inline ~Buffer() { } + IPAACA_HEADER_EXPORT inline const std::string& unique_name() { return _unique_name; } + IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories); + IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category=""); //_IPAACA_ABSTRACT_ virtual void add(boost::shared_ptr<IUInterface> iu) = 0; - _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0; - _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0; }; //}}} -class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer> {//{{{ +IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer> {//{{{ friend class IU; friend class RemotePushIU; friend class OutputBufferRsbAdaptor; protected: protected: //OutputBufferRsbAdaptor _rsb; - IUStore _iu_store; - Lock _iu_id_counter_lock; + IPAACA_MEMBER_VAR_EXPORT IUStore _iu_store; + IPAACA_MEMBER_VAR_EXPORT Lock _iu_id_counter_lock; #ifdef IPAACA_EXPOSE_FULL_RSB_API protected: - std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store; - rsb::patterns::ServerPtr _server; - rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category); + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store; + IPAACA_MEMBER_VAR_EXPORT rsb::patterns::ServerPtr _server; + IPAACA_HEADER_EXPORT rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category); #endif protected: // informing functions - void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef"); - void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef"); - void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name); + IPAACA_HEADER_EXPORT void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef"); + IPAACA_HEADER_EXPORT void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef"); + IPAACA_HEADER_EXPORT void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name); // remote access functions // _remote_update_links(IULinkUpdate) // _remote_update_payload(IUPayloadUpdate) // _remote_commit(protobuf::IUCommission) - void _publish_iu(boost::shared_ptr<IU> iu); - void _retract_iu(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT void _publish_iu(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu); protected: - OutputBuffer(const std::string& basename); - void _initialize_server(); + IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename); + IPAACA_HEADER_EXPORT void _initialize_server(); public: - static boost::shared_ptr<OutputBuffer> create(const std::string& basename); - ~OutputBuffer() { + IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename); + IPAACA_HEADER_EXPORT ~OutputBuffer() { IPAACA_IMPLEMENT_ME } - void add(boost::shared_ptr<IU> iu); - boost::shared_ptr<IU> remove(const std::string& iu_uid); - boost::shared_ptr<IU> remove(boost::shared_ptr<IU> iu); - boost::shared_ptr<IUInterface> get(const std::string& iu_uid); - std::set<boost::shared_ptr<IUInterface> > get_ius(); + IPAACA_HEADER_EXPORT void add(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(const std::string& iu_uid); + IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(boost::shared_ptr<IU> iu); + IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid); + IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius(); typedef boost::shared_ptr<OutputBuffer> ptr; }; //}}} -class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer> {//{{{ +IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer> {//{{{ friend class IU; friend class RemotePushIU; friend class InputBufferRsbAdaptor; //InputBufferRsbAdaptor _rsb; #ifdef IPAACA_EXPOSE_FULL_RSB_API protected: - std::map<std::string, rsb::ListenerPtr> _listener_store; - std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store; - RemotePushIUStore _iu_store; // TODO genericize - rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name); - rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category); - void _handle_iu_events(rsb::EventPtr event); + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::ListenerPtr> _listener_store; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store; + IPAACA_MEMBER_VAR_EXPORT RemotePushIUStore _iu_store; // TODO genericize + IPAACA_HEADER_EXPORT rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name); + IPAACA_HEADER_EXPORT rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category); + IPAACA_HEADER_EXPORT void _handle_iu_events(rsb::EventPtr event); #endif protected: - inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") + IPAACA_HEADER_EXPORT inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") { IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_link_update() should never be invoked") } - inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") + IPAACA_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") { IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_payload_update() should never be invoked") } - inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") + IPAACA_HEADER_EXPORT inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") { IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked") } protected: - InputBuffer(const std::string& basename, const std::set<std::string>& category_interests); - InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests); - InputBuffer(const std::string& basename, const std::string& category_interest1); - InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); - InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); - InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); - public: - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests); - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests); - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1); - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); - static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); - ~InputBuffer() { + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); + IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); + public: + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3); + IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4); + IPAACA_HEADER_EXPORT ~InputBuffer() { IPAACA_IMPLEMENT_ME } - boost::shared_ptr<IUInterface> get(const std::string& iu_uid); - std::set<boost::shared_ptr<IUInterface> > get_ius(); + IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid); + IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius(); typedef boost::shared_ptr<InputBuffer> ptr; }; //}}} -class IUPayloadUpdate {//{{{ +IPAACA_HEADER_EXPORT class IUPayloadUpdate {//{{{ public: - std::string uid; - revision_t revision; - std::string writer_name; - bool is_delta; - std::map<std::string, std::string> new_items; - std::vector<std::string> keys_to_remove; + IPAACA_MEMBER_VAR_EXPORT std::string uid; + IPAACA_MEMBER_VAR_EXPORT revision_t revision; + IPAACA_MEMBER_VAR_EXPORT std::string writer_name; + IPAACA_MEMBER_VAR_EXPORT bool is_delta; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> new_items; + IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> keys_to_remove; friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj); typedef boost::shared_ptr<IUPayloadUpdate> ptr; };//}}} -class IULinkUpdate {//{{{ +IPAACA_HEADER_EXPORT class IULinkUpdate {//{{{ public: - std::string uid; - revision_t revision; - std::string writer_name; - bool is_delta; - std::map<std::string, std::set<std::string> > new_links; - std::map<std::string, std::set<std::string> > links_to_remove; + IPAACA_MEMBER_VAR_EXPORT std::string uid; + IPAACA_MEMBER_VAR_EXPORT revision_t revision; + IPAACA_MEMBER_VAR_EXPORT std::string writer_name; + IPAACA_MEMBER_VAR_EXPORT bool is_delta; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > new_links; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > links_to_remove; friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj); typedef boost::shared_ptr<IULinkUpdate> ptr; };//}}} -class Initializer +IPAACA_HEADER_EXPORT class Initializer { public: - static void initialize_ipaaca_rsb_if_needed(); - static void initialize_updated_default_config(); - static bool initialized(); + IPAACA_HEADER_EXPORT static void initialize_ipaaca_rsb_if_needed(); + IPAACA_HEADER_EXPORT static void initialize_updated_default_config(); + IPAACA_HEADER_EXPORT static bool initialized(); + IPAACA_HEADER_EXPORT static void dump_current_default_config(); protected: - static bool _initialized; + IPAACA_MEMBER_VAR_EXPORT static bool _initialized; }; -class PayloadEntryProxy//{{{ +IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{ { protected: - Payload* _payload; - std::string _key; - public: - PayloadEntryProxy(Payload* payload, const std::string& key); - PayloadEntryProxy& operator=(const std::string& value); - PayloadEntryProxy& operator=(const char* value); - PayloadEntryProxy& operator=(double value); - PayloadEntryProxy& operator=(bool value); - operator std::string(); - operator long(); - operator double(); - operator bool(); - inline std::string to_str() { return operator std::string(); } + IPAACA_MEMBER_VAR_EXPORT Payload* _payload; + IPAACA_MEMBER_VAR_EXPORT std::string _key; + public: + IPAACA_HEADER_EXPORT PayloadEntryProxy(Payload* payload, const std::string& key); + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const std::string& value); + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const char* value); + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(double value); + IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(bool value); + IPAACA_HEADER_EXPORT operator std::string(); + IPAACA_HEADER_EXPORT operator long(); + IPAACA_HEADER_EXPORT operator double(); + IPAACA_HEADER_EXPORT operator bool(); + IPAACA_HEADER_EXPORT inline std::string to_str() { return operator std::string(); } //inline long to_int() { return operator long(); } - inline long to_long() { return operator long(); } - inline double to_float() { return operator double(); } - inline bool to_bool() { return operator bool(); } + IPAACA_HEADER_EXPORT inline long to_long() { return operator long(); } + IPAACA_HEADER_EXPORT inline double to_float() { return operator double(); } + IPAACA_HEADER_EXPORT inline bool to_bool() { return operator bool(); } };//}}} -class Payload//{{{ +IPAACA_HEADER_EXPORT class Payload//{{{ { friend std::ostream& operator<<(std::ostream& os, const Payload& obj); friend class IUInterface; @@ -499,99 +558,99 @@ class Payload//{{{ friend class MessageConverter; friend class CallbackIUPayloadUpdate; protected: - std::string _owner_name; - std::map<std::string, std::string> _store; - boost::weak_ptr<IUInterface> _iu; - protected: - void initialize(boost::shared_ptr<IUInterface> iu); - inline void _set_owner_name(const std::string& name) { _owner_name = name; } - void _remotely_enforced_wipe(); - void _remotely_enforced_delitem(const std::string& k); - void _remotely_enforced_setitem(const std::string& k, const std::string& v); - void _internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name=""); - void _internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name=""); - void _internal_set(const std::string& k, const std::string& v, const std::string& writer_name=""); - void _internal_remove(const std::string& k, const std::string& writer_name=""); - public: - inline const std::string& owner_name() { return _owner_name; } + IPAACA_MEMBER_VAR_EXPORT std::string _owner_name; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> _store; + IPAACA_MEMBER_VAR_EXPORT boost::weak_ptr<IUInterface> _iu; + protected: + IPAACA_HEADER_EXPORT void initialize(boost::shared_ptr<IUInterface> iu); + IPAACA_HEADER_EXPORT inline void _set_owner_name(const std::string& name) { _owner_name = name; } + IPAACA_HEADER_EXPORT void _remotely_enforced_wipe(); + IPAACA_HEADER_EXPORT void _remotely_enforced_delitem(const std::string& k); + IPAACA_HEADER_EXPORT void _remotely_enforced_setitem(const std::string& k, const std::string& v); + IPAACA_HEADER_EXPORT void _internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name=""); + IPAACA_HEADER_EXPORT void _internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name=""); + IPAACA_HEADER_EXPORT void _internal_set(const std::string& k, const std::string& v, const std::string& writer_name=""); + IPAACA_HEADER_EXPORT void _internal_remove(const std::string& k, const std::string& writer_name=""); + public: + IPAACA_HEADER_EXPORT inline const std::string& owner_name() { return _owner_name; } // access - PayloadEntryProxy operator[](const std::string& key); - operator std::map<std::string, std::string>(); - inline void set(const std::map<std::string, std::string>& all_elems) { _internal_replace_all(all_elems); } - inline void set(const std::string& k, const std::string& v) { _internal_set(k, v); } - inline void merge(const std::map<std::string, std::string>& elems_to_merge) { _internal_merge(elems_to_merge); } - inline void remove(const std::string& k) { _internal_remove(k); } - std::string get(const std::string& k); + IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key); + IPAACA_HEADER_EXPORT operator std::map<std::string, std::string>(); + IPAACA_HEADER_EXPORT inline void set(const std::map<std::string, std::string>& all_elems) { _internal_replace_all(all_elems); } + IPAACA_HEADER_EXPORT inline void set(const std::string& k, const std::string& v) { _internal_set(k, v); } + IPAACA_HEADER_EXPORT inline void merge(const std::map<std::string, std::string>& elems_to_merge) { _internal_merge(elems_to_merge); } + IPAACA_HEADER_EXPORT inline void remove(const std::string& k) { _internal_remove(k); } + IPAACA_HEADER_EXPORT std::string get(const std::string& k); typedef boost::shared_ptr<Payload> ptr; };//}}} -class IUInterface {//{{{ +IPAACA_HEADER_EXPORT class IUInterface {//{{{ friend class IUConverter; friend class MessageConverter; friend std::ostream& operator<<(std::ostream& os, const IUInterface& obj); protected: - IUInterface(); + IPAACA_HEADER_EXPORT IUInterface(); public: - inline virtual ~IUInterface() { } + IPAACA_HEADER_EXPORT inline virtual ~IUInterface() { } protected: - std::string _uid; - revision_t _revision; - std::string _category; - std::string _payload_type; // default is "MAP" - std::string _owner_name; - bool _committed; - bool _retracted; - IUAccessMode _access_mode; - bool _read_only; + IPAACA_MEMBER_VAR_EXPORT std::string _uid; + IPAACA_MEMBER_VAR_EXPORT revision_t _revision; + IPAACA_MEMBER_VAR_EXPORT std::string _category; + IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is "MAP" + IPAACA_MEMBER_VAR_EXPORT std::string _owner_name; + IPAACA_MEMBER_VAR_EXPORT bool _committed; + IPAACA_MEMBER_VAR_EXPORT bool _retracted; + IPAACA_MEMBER_VAR_EXPORT IUAccessMode _access_mode; + IPAACA_MEMBER_VAR_EXPORT bool _read_only; //boost::shared_ptr<Buffer> _buffer; - Buffer* _buffer; - SmartLinkMap _links; + IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer; + IPAACA_MEMBER_VAR_EXPORT SmartLinkMap _links; protected: friend class Payload; // Internal functions that perform the update logic, // e.g. sending a notification across the network - _IPAACA_ABSTRACT_ virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) = 0; - _IPAACA_ABSTRACT_ virtual void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) = 0; //void _set_buffer(boost::shared_ptr<Buffer> buffer); - void _associate_with_buffer(Buffer* buffer); - void _set_buffer(Buffer* buffer); - void _set_uid(const std::string& uid); - void _set_owner_name(const std::string& owner_name); + IPAACA_HEADER_EXPORT void _associate_with_buffer(Buffer* buffer); + IPAACA_HEADER_EXPORT void _set_buffer(Buffer* buffer); + IPAACA_HEADER_EXPORT void _set_uid(const std::string& uid); + IPAACA_HEADER_EXPORT void _set_owner_name(const std::string& owner_name); protected: // internal functions that do not emit update events - inline void _add_and_remove_links(const LinkMap& add, const LinkMap& remove) { _links._add_and_remove_links(add, remove); } - inline void _replace_links(const LinkMap& links) { _links._replace_links(links); } - public: - inline bool is_published() { return (_buffer != 0); } - inline const std::string& uid() const { return _uid; } - inline revision_t revision() const { return _revision; } - inline const std::string& category() const { return _category; } - inline const std::string& payload_type() const { return _payload_type; } - inline const std::string& owner_name() const { return _owner_name; } - inline bool committed() const { return _committed; } - inline IUAccessMode access_mode() const { return _access_mode; } - inline bool read_only() const { return _read_only; } + IPAACA_HEADER_EXPORT inline void _add_and_remove_links(const LinkMap& add, const LinkMap& remove) { _links._add_and_remove_links(add, remove); } + IPAACA_HEADER_EXPORT inline void _replace_links(const LinkMap& links) { _links._replace_links(links); } + public: + IPAACA_HEADER_EXPORT inline bool is_published() { return (_buffer != 0); } + IPAACA_HEADER_EXPORT inline const std::string& uid() const { return _uid; } + IPAACA_HEADER_EXPORT inline revision_t revision() const { return _revision; } + IPAACA_HEADER_EXPORT inline const std::string& category() const { return _category; } + IPAACA_HEADER_EXPORT inline const std::string& payload_type() const { return _payload_type; } + IPAACA_HEADER_EXPORT inline const std::string& owner_name() const { return _owner_name; } + IPAACA_HEADER_EXPORT inline bool committed() const { return _committed; } + IPAACA_HEADER_EXPORT inline IUAccessMode access_mode() const { return _access_mode; } + IPAACA_HEADER_EXPORT inline bool read_only() const { return _read_only; } //inline boost::shared_ptr<Buffer> buffer() { return _buffer; } - inline Buffer* buffer() const { return _buffer; } - inline const LinkSet& get_links(std::string type) { return _links.get_links(type); } - inline const LinkMap& get_all_links() { return _links.get_all_links(); } + IPAACA_HEADER_EXPORT inline Buffer* buffer() const { return _buffer; } + IPAACA_HEADER_EXPORT inline const LinkSet& get_links(std::string type) { return _links.get_links(type); } + IPAACA_HEADER_EXPORT inline const LinkMap& get_all_links() { return _links.get_all_links(); } // Payload - _IPAACA_ABSTRACT_ virtual Payload& payload() = 0; - _IPAACA_ABSTRACT_ virtual const Payload& const_payload() const = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual Payload& payload() = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual const Payload& const_payload() const = 0; // setters - _IPAACA_ABSTRACT_ virtual void commit() = 0; + IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void commit() = 0; // functions to modify and update links: - void add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = ""); - void remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = ""); - void modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name = ""); - void set_links(const LinkMap& links, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void set_links(const LinkMap& links, const std::string& writer_name = ""); // (with cpp specific convenience functions:) - void add_link(const std::string& type, const std::string& target, const std::string& writer_name = ""); - void remove_link(const std::string& type, const std::string& target, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void add_link(const std::string& type, const std::string& target, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void remove_link(const std::string& type, const std::string& target, const std::string& writer_name = ""); typedef boost::shared_ptr<IUInterface> ptr; };//}}} -class IU: public IUInterface {//{{{ +IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{ friend class Buffer; friend class InputBuffer; friend class OutputBuffer; @@ -599,29 +658,29 @@ class IU: public IUInterface {//{{{ friend class CallbackIULinkUpdate; friend class CallbackIUCommission; public: - Payload _payload; + IPAACA_MEMBER_VAR_EXPORT Payload _payload; protected: - Lock _revision_lock; + IPAACA_MEMBER_VAR_EXPORT Lock _revision_lock; protected: - inline void _increase_revision_number() { _revision++; } - IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT inline void _increase_revision_number() { _revision++; } + IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); public: - inline ~IU() { + IPAACA_HEADER_EXPORT inline ~IU() { //IPAACA_IMPLEMENT_ME } - static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); - inline Payload& payload() { return _payload; } - inline const Payload& const_payload() const { return _payload; } - void commit(); + IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; } + IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; } + IPAACA_HEADER_EXPORT void commit(); protected: - virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); - virtual void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT virtual void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); protected: - virtual void _internal_commit(const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT virtual void _internal_commit(const std::string& writer_name = ""); public: typedef boost::shared_ptr<IU> ptr; };//}}} -class Message: public IU {//{{{ +IPAACA_HEADER_EXPORT class Message: public IU {//{{{ friend class Buffer; friend class InputBuffer; friend class OutputBuffer; @@ -629,259 +688,267 @@ class Message: public IU {//{{{ friend class CallbackIULinkUpdate; friend class CallbackIUCommission; protected: - Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); public: - inline ~Message() { + IPAACA_HEADER_EXPORT inline ~Message() { //IPAACA_IMPLEMENT_ME } - static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); + IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" ); protected: - void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); - void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); protected: - void _internal_commit(const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _internal_commit(const std::string& writer_name = ""); public: typedef boost::shared_ptr<Message> ptr; };//}}} -class RemotePushIU: public IUInterface {//{{{ +IPAACA_HEADER_EXPORT class RemotePushIU: public IUInterface {//{{{ friend class Buffer; friend class InputBuffer; friend class OutputBuffer; friend class IUConverter; friend class MessageConverter; public: - Payload _payload; + IPAACA_MEMBER_VAR_EXPORT Payload _payload; protected: - RemotePushIU(); - static boost::shared_ptr<RemotePushIU> create(); + IPAACA_HEADER_EXPORT RemotePushIU(); + IPAACA_HEADER_EXPORT static boost::shared_ptr<RemotePushIU> create(); public: - inline ~RemotePushIU() { + IPAACA_HEADER_EXPORT inline ~RemotePushIU() { //IPAACA_IMPLEMENT_ME } - inline Payload& payload() { return _payload; } - inline const Payload& const_payload() const { return _payload; } - void commit(); + IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; } + IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; } + IPAACA_HEADER_EXPORT void commit(); protected: - void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); - void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); protected: - void _apply_update(IUPayloadUpdate::ptr update); - void _apply_link_update(IULinkUpdate::ptr update); - void _apply_commission(); - void _apply_retraction(); + IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update); + IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update); + IPAACA_HEADER_EXPORT void _apply_commission(); + IPAACA_HEADER_EXPORT void _apply_retraction(); typedef boost::shared_ptr<RemotePushIU> ptr; };//}}} -class RemoteMessage: public IUInterface {//{{{ +IPAACA_HEADER_EXPORT class RemoteMessage: public IUInterface {//{{{ friend class Buffer; friend class InputBuffer; friend class OutputBuffer; friend class IUConverter; friend class MessageConverter; public: - Payload _payload; + IPAACA_MEMBER_VAR_EXPORT Payload _payload; protected: - RemoteMessage(); - static boost::shared_ptr<RemoteMessage> create(); + IPAACA_HEADER_EXPORT RemoteMessage(); + IPAACA_HEADER_EXPORT static boost::shared_ptr<RemoteMessage> create(); public: - inline ~RemoteMessage() { + IPAACA_HEADER_EXPORT inline ~RemoteMessage() { //IPAACA_IMPLEMENT_ME } - inline Payload& payload() { return _payload; } - inline const Payload& const_payload() const { return _payload; } - void commit(); + IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; } + IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; } + IPAACA_HEADER_EXPORT void commit(); protected: - void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); - void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = ""); + IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = ""); protected: - void _apply_update(IUPayloadUpdate::ptr update); - void _apply_link_update(IULinkUpdate::ptr update); - void _apply_commission(); - void _apply_retraction(); + IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update); + IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update); + IPAACA_HEADER_EXPORT void _apply_commission(); + IPAACA_HEADER_EXPORT void _apply_retraction(); typedef boost::shared_ptr<RemoteMessage> ptr; };//}}} -class IUNotFoundError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUNotFoundError: public Exception//{{{ { public: - inline ~IUNotFoundError() throw() { } - inline IUNotFoundError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUNotFoundError() throw() { } + IPAACA_HEADER_EXPORT inline IUNotFoundError() { //boost::shared_ptr<IU> iu) { _description = "IUNotFoundError"; } };//}}} -class IUPublishedError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUPublishedError: public Exception//{{{ { public: - inline ~IUPublishedError() throw() { } - inline IUPublishedError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUPublishedError() throw() { } + IPAACA_HEADER_EXPORT inline IUPublishedError() { //boost::shared_ptr<IU> iu) { _description = "IUPublishedError"; } };//}}} -class IUCommittedError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUCommittedError: public Exception//{{{ { public: - inline ~IUCommittedError() throw() { } - inline IUCommittedError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUCommittedError() throw() { } + IPAACA_HEADER_EXPORT inline IUCommittedError() { //boost::shared_ptr<IU> iu) { _description = "IUCommittedError"; } };//}}} -class IUUpdateFailedError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUUpdateFailedError: public Exception//{{{ { public: - inline ~IUUpdateFailedError() throw() { } - inline IUUpdateFailedError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUUpdateFailedError() throw() { } + IPAACA_HEADER_EXPORT inline IUUpdateFailedError() { //boost::shared_ptr<IU> iu) { _description = "IUUpdateFailedError"; } };//}}} -class IUReadOnlyError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUReadOnlyError: public Exception//{{{ { public: - inline ~IUReadOnlyError() throw() { } - inline IUReadOnlyError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUReadOnlyError() throw() { } + IPAACA_HEADER_EXPORT inline IUReadOnlyError() { //boost::shared_ptr<IU> iu) { _description = "IUReadOnlyError"; } };//}}} -class IUAlreadyInABufferError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUAlreadyInABufferError: public Exception//{{{ { public: - inline ~IUAlreadyInABufferError() throw() { } - inline IUAlreadyInABufferError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUAlreadyInABufferError() throw() { } + IPAACA_HEADER_EXPORT inline IUAlreadyInABufferError() { //boost::shared_ptr<IU> iu) { _description = "IUAlreadyInABufferError"; } };//}}} -class IUAlreadyHasAnUIDError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUAlreadyHasAnUIDError: public Exception//{{{ { public: - inline ~IUAlreadyHasAnUIDError() throw() { } - inline IUAlreadyHasAnUIDError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnUIDError() throw() { } + IPAACA_HEADER_EXPORT inline IUAlreadyHasAnUIDError() { //boost::shared_ptr<IU> iu) { _description = "IUAlreadyHasAnUIDError"; } };//}}} -class IUAlreadyHasAnOwnerNameError: public Exception//{{{ +IPAACA_HEADER_EXPORT class IUAlreadyHasAnOwnerNameError: public Exception//{{{ { public: - inline ~IUAlreadyHasAnOwnerNameError() throw() { } - inline IUAlreadyHasAnOwnerNameError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnOwnerNameError() throw() { } + IPAACA_HEADER_EXPORT inline IUAlreadyHasAnOwnerNameError() { //boost::shared_ptr<IU> iu) { _description = "IUAlreadyHasAnOwnerNameError"; } };//}}} -class NotImplementedError: public Exception//{{{ +IPAACA_HEADER_EXPORT class UUIDGenerationError: public Exception//{{{ +{ + public: + IPAACA_HEADER_EXPORT inline ~UUIDGenerationError() throw() { } + IPAACA_HEADER_EXPORT inline UUIDGenerationError() { //boost::shared_ptr<IU> iu) { + _description = "UUIDGenerationError"; + } +};//}}} +IPAACA_HEADER_EXPORT class NotImplementedError: public Exception//{{{ { public: - inline ~NotImplementedError() throw() { } - inline NotImplementedError() { //boost::shared_ptr<IU> iu) { + IPAACA_HEADER_EXPORT inline ~NotImplementedError() throw() { } + IPAACA_HEADER_EXPORT inline NotImplementedError() { //boost::shared_ptr<IU> iu) { _description = "NotImplementedError"; } };//}}} #ifdef IPAACA_EXPOSE_FULL_RSB_API -class CallbackIUPayloadUpdate: public rsb::patterns::Server::Callback<IUPayloadUpdate, int> {//{{{ +IPAACA_HEADER_EXPORT class CallbackIUPayloadUpdate: public rsb::patterns::Server::Callback<IUPayloadUpdate, int> {//{{{ protected: - Buffer* _buffer; + IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer; public: - CallbackIUPayloadUpdate(Buffer* buffer); - boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update); + IPAACA_HEADER_EXPORT CallbackIUPayloadUpdate(Buffer* buffer); + IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update); };//}}} -class CallbackIULinkUpdate: public rsb::patterns::Server::Callback<IULinkUpdate, int> {//{{{ +IPAACA_HEADER_EXPORT class CallbackIULinkUpdate: public rsb::patterns::Server::Callback<IULinkUpdate, int> {//{{{ protected: - Buffer* _buffer; + IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer; public: - CallbackIULinkUpdate(Buffer* buffer); + IPAACA_HEADER_EXPORT CallbackIULinkUpdate(Buffer* buffer); public: - boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update); + IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update); };//}}} -class CallbackIUCommission: public rsb::patterns::Server::Callback<protobuf::IUCommission, int> {//{{{ +IPAACA_HEADER_EXPORT class CallbackIUCommission: public rsb::patterns::Server::Callback<protobuf::IUCommission, int> {//{{{ protected: - Buffer* _buffer; + IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer; public: - CallbackIUCommission(Buffer* buffer); + IPAACA_HEADER_EXPORT CallbackIUCommission(Buffer* buffer); public: - boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update); + IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update); };//}}} -class CallbackIURetraction: public rsb::patterns::Server::Callback<protobuf::IURetraction, int> {//{{{ +IPAACA_HEADER_EXPORT class CallbackIURetraction: public rsb::patterns::Server::Callback<protobuf::IURetraction, int> {//{{{ protected: - Buffer* _buffer; + IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer; public: - CallbackIURetraction(Buffer* buffer); + IPAACA_HEADER_EXPORT CallbackIURetraction(Buffer* buffer); public: - boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IURetraction> update); + IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IURetraction> update); };//}}} -class IUConverter: public rsb::converter::Converter<std::string> {//{{{ +IPAACA_HEADER_EXPORT class IUConverter: public rsb::converter::Converter<std::string> {//{{{ public: - IUConverter(); - std::string serialize(const rsb::AnnotatedData& data, std::string& wire); - rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); + IPAACA_HEADER_EXPORT IUConverter(); + IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire); + IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); };//}}} -class MessageConverter: public rsb::converter::Converter<std::string> {//{{{ +IPAACA_HEADER_EXPORT class MessageConverter: public rsb::converter::Converter<std::string> {//{{{ public: - MessageConverter(); - std::string serialize(const rsb::AnnotatedData& data, std::string& wire); - rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); + IPAACA_HEADER_EXPORT MessageConverter(); + IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire); + IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); };//}}} -class IUPayloadUpdateConverter: public rsb::converter::Converter<std::string> {//{{{ +IPAACA_HEADER_EXPORT class IUPayloadUpdateConverter: public rsb::converter::Converter<std::string> {//{{{ public: - IUPayloadUpdateConverter(); - std::string serialize(const rsb::AnnotatedData& data, std::string& wire); - rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); + IPAACA_HEADER_EXPORT IUPayloadUpdateConverter(); + IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire); + IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); };//}}} -class IULinkUpdateConverter: public rsb::converter::Converter<std::string> {//{{{ +IPAACA_HEADER_EXPORT class IULinkUpdateConverter: public rsb::converter::Converter<std::string> {//{{{ public: - IULinkUpdateConverter(); - std::string serialize(const rsb::AnnotatedData& data, std::string& wire); - rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); + IPAACA_HEADER_EXPORT IULinkUpdateConverter(); + IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire); + IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); };//}}} -class IntConverter: public rsb::converter::Converter<std::string> {//{{{ +IPAACA_HEADER_EXPORT class IntConverter: public rsb::converter::Converter<std::string> {//{{{ public: - IntConverter(); - std::string serialize(const rsb::AnnotatedData& data, std::string& wire); - rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); + IPAACA_HEADER_EXPORT IntConverter(); + IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire); + IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire); };//}}} #endif // additional misc classes ( Command line options )//{{{ -class CommandLineOptions { +IPAACA_HEADER_EXPORT class CommandLineOptions { public: - inline CommandLineOptions() { } - std::map<std::string, std::string> param_opts; - std::map<std::string, bool> param_set; + IPAACA_HEADER_EXPORT inline CommandLineOptions() { } + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> param_opts; + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> param_set; public: - void set_option(const std::string& name, bool expect, const char* optarg); - std::string get_param(const std::string& o); - bool is_set(const std::string& o); - void dump(); + IPAACA_HEADER_EXPORT void set_option(const std::string& name, bool expect, const char* optarg); + IPAACA_HEADER_EXPORT std::string get_param(const std::string& o); + IPAACA_HEADER_EXPORT bool is_set(const std::string& o); + IPAACA_HEADER_EXPORT void dump(); typedef boost::shared_ptr<CommandLineOptions> ptr; }; class CommandLineParser { protected: - std::map<char, std::string> longopt; // letter->name - std::map<std::string, char> shortopt; // letter->name - std::map<std::string, bool> options; // name / expect_param - std::map<std::string, std::string> defaults; // for opt params - std::map<std::string, int> set_flag; // for paramless opts + IPAACA_MEMBER_VAR_EXPORT std::map<char, std::string> longopt; // letter->name + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, char> shortopt; // letter->name + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> options; // name / expect_param + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> defaults; // for opt params + IPAACA_MEMBER_VAR_EXPORT std::map<std::string, int> set_flag; // for paramless opts protected: - CommandLineParser(); + IPAACA_HEADER_EXPORT CommandLineParser(); public: - inline ~CommandLineParser() { } - static inline boost::shared_ptr<CommandLineParser> create() { + IPAACA_HEADER_EXPORT inline ~CommandLineParser() { } + IPAACA_HEADER_EXPORT static inline boost::shared_ptr<CommandLineParser> create() { return boost::shared_ptr<CommandLineParser>(new CommandLineParser()); } - void initialize_parser_defaults(); - void dump_options(); - void add_option(const std::string& optname, char shortn, bool expect_param, const std::string& defaultv); - void ensure_defaults_in( CommandLineOptions::ptr clo ); - CommandLineOptions::ptr parse(int argc, char* const* argv); + IPAACA_HEADER_EXPORT void initialize_parser_defaults(); + IPAACA_HEADER_EXPORT void dump_options(); + IPAACA_HEADER_EXPORT void add_option(const std::string& optname, char shortn, bool expect_param, const std::string& defaultv); + IPAACA_HEADER_EXPORT void ensure_defaults_in( CommandLineOptions::ptr clo ); + IPAACA_HEADER_EXPORT CommandLineOptions::ptr parse(int argc, char* const* argv); typedef boost::shared_ptr<CommandLineParser> ptr; }; //}}} // additional misc functions ( String splitting / joining )//{{{ -std::string str_join(const std::set<std::string>& set,const std::string& sep); -std::string str_join(const std::vector<std::string>& vec,const std::string& sep); -void str_split_wipe(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters ); -void str_split_append(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters ); +IPAACA_HEADER_EXPORT std::string str_join(const std::set<std::string>& set,const std::string& sep); +IPAACA_HEADER_EXPORT std::string str_join(const std::vector<std::string>& vec,const std::string& sep); +IPAACA_HEADER_EXPORT void str_split_wipe(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters ); +IPAACA_HEADER_EXPORT void str_split_append(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters ); //}}} // (snippets) //{{{ @@ -896,8 +963,15 @@ class IUEventFunctionHandler: public rsb::EventFunctionHandler { */ //}}} -Lock& logger_lock(); +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; } +#endif + } // of namespace ipaaca diff --git a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc index 6430d28..18035dc 100644 --- a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc +++ b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc @@ -31,7 +31,10 @@ */ #include <ipaaca/ipaaca.h> + +#ifndef WIN32 #include <getopt.h> +#endif namespace ipaaca { @@ -114,6 +117,10 @@ void CommandLineParser::add_option(const std::string& optname, char shortoptn, b CommandLineOptions::ptr CommandLineParser::parse(int argc, char* const* argv) { +#ifdef WIN32 + LOG_IPAACA_CONSOLE("IMPLEMENT ME: command line parsing for Windows. (req'd: getopt)") + throw NotImplementedError(); +#else int len = options.size(); struct option long_options[len+1]; int i=0; @@ -177,6 +184,7 @@ CommandLineOptions::ptr CommandLineParser::parse(int argc, char* const* argv) } ensure_defaults_in( clo ); return clo; +#endif } void CommandLineParser::ensure_defaults_in( CommandLineOptions::ptr clo ) diff --git a/ipaacalib/cpp/src/ipaaca.cc b/ipaacalib/cpp/src/ipaaca.cc index 3226416..3f9ee57 100644 --- a/ipaacalib/cpp/src/ipaaca.cc +++ b/ipaacalib/cpp/src/ipaaca.cc @@ -32,7 +32,13 @@ #include <ipaaca/ipaaca.h> #include <cstdlib> + +#ifdef WIN32 +#include <rpc.h> +#else +#include <uuid/uuid.h> #include <glob.h> +#endif namespace ipaaca { @@ -50,21 +56,23 @@ Lock& logger_lock() { // util and init//{{{ -bool Initializer::_initialized = false; +IPAACA_EXPORT bool Initializer::_initialized = false; //const LinkSet EMPTY_LINK_SET = LinkSet(); //const std::set<std::string> EMPTY_LINK_SET(); -bool Initializer::initialized() { return _initialized; } -void Initializer::initialize_ipaaca_rsb_if_needed() +IPAACA_EXPORT bool Initializer::initialized() { return _initialized; } +IPAACA_EXPORT void Initializer::initialize_ipaaca_rsb_if_needed() { if (_initialized) return; - + + IPAACA_INFO("Calling initialize_updated_default_config()") initialize_updated_default_config(); // RYT FIXME This configuration stuff has been simply removed in rsb! //ParticipantConfig config = ParticipantConfig::fromConfiguration(); //getFactory().setDefaultParticipantConfig(config); + IPAACA_INFO("Creating and registering Converters") boost::shared_ptr<IUConverter> iu_converter(new IUConverter()); converterRepository<std::string>()->registerConverter(iu_converter); @@ -86,11 +94,26 @@ void Initializer::initialize_ipaaca_rsb_if_needed() boost::shared_ptr<IntConverter> int_converter(new IntConverter()); converterRepository<std::string>()->registerConverter(int_converter); + IPAACA_INFO("Initialization complete.") _initialized = true; //IPAACA_TODO("initialize all converters") } -void Initializer::initialize_updated_default_config() +IPAACA_EXPORT void Initializer::dump_current_default_config() +{ + IPAACA_INFO("--- Dumping current default participant configuration ---") + rsb::ParticipantConfig config = getFactory().getDefaultParticipantConfig(); + std::set<rsb::ParticipantConfig::Transport> transports = config.getTransports(); + for (std::set<rsb::ParticipantConfig::Transport>::const_iterator it=transports.begin(); it!=transports.end(); ++it) { + IPAACA_INFO( "Active transport: " << it->getName() ) + } + IPAACA_INFO("--- End of configuration dump ---") + //ParticipantConfig::Transport inprocess = config.getTransport("inprocess"); + //inprocess.setEnabled(true); + //config.addTransport(inprocess); +} + +IPAACA_EXPORT void Initializer::initialize_updated_default_config() { // quick hack to iterate through the pwd parents // and find the closest rsb plugin dir @@ -98,6 +121,10 @@ void Initializer::initialize_updated_default_config() // but only if not yet defined const char* plugin_path = getenv("RSB_PLUGINS_CPP_PATH"); if (!plugin_path) { +#ifdef WIN32 + LOG_IPAACA_CONSOLE("WARNING: RSB_PLUGINS_CPP_PATH not set - in Windows it has to be specified.") + //throw NotImplementedError(); +#else LOG_IPAACA_CONSOLE("RSB_PLUGINS_CPP_PATH not set; looking here and up to 7 dirs up.") std::string pathstr = "./"; for (int i=0; i< 8 /* depth EIGHT (totally arbitrary..) */ ; i++) { @@ -114,24 +141,46 @@ void Initializer::initialize_updated_default_config() globfree(&g); pathstr += "../"; } +#endif } else { LOG_IPAACA_CONSOLE("RSB_PLUGINS_CPP_PATH already defined: " << plugin_path) } } -std::string generate_uuid_string() +IPAACA_EXPORT std::string generate_uuid_string() { +#ifdef WIN32 + // Windows + UUID uuid; + RPC_STATUS stat; + stat = UuidCreate(&uuid); + if (stat == RPC_S_OK) { + unsigned char* uuid_str = NULL; + stat = UuidToString(&uuid, &uuid_str); + if (stat == RPC_S_OK) { + std::string result((const char*) uuid_str, 16); + RpcStringFree(&uuid_str); + return result; + } + } else { + throw UUIDGenerationError(); + } +#else + // POSIX uuid_t uuidt; uuid_generate(uuidt); #ifdef __MACOSX__ + // (Mac) uuid_string_t uuidstr; uuid_unparse_lower(uuidt, uuidstr); return uuidstr; #else + // (Linux) char result_c[37]; uuid_unparse_lower(uuidt, result_c); return result_c; #endif +#endif } /* @@ -146,7 +195,7 @@ void init_inprocess_too() { */ //}}} -std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj)//{{{ +IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj)//{{{ { os << "{"; bool first = true; @@ -164,7 +213,7 @@ std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj)//{{{ return os; } //}}} -std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{{ +IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{{ { os << "{"; bool first = true; @@ -176,7 +225,7 @@ std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{{ return os; } //}}} -std::ostream& operator<<(std::ostream& os, const IUInterface& obj)//{{{ +IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const IUInterface& obj)//{{{ { os << "IUInterface(uid='" << obj.uid() << "'"; os << ", category='" << obj.category() << "'"; @@ -191,7 +240,7 @@ std::ostream& operator<<(std::ostream& os, const IUInterface& obj)//{{{ return os; } //}}} -std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj)//{{{ +IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj)//{{{ { os << "PayloadUpdate(uid=" << obj.uid << ", revision=" << obj.revision; os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False"); @@ -211,7 +260,7 @@ std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj)//{{{ return os; } //}}} -std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj)//{{{ +IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj)//{{{ { os << "LinkUpdate(uid=" << obj.uid << ", revision=" << obj.revision; os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False"); @@ -246,8 +295,8 @@ std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj)//{{{ // SmartLinkMap//{{{ -LinkSet SmartLinkMap::empty_link_set; -void SmartLinkMap::_add_and_remove_links(const LinkMap& add, const LinkMap& remove) +IPAACA_EXPORT LinkSet SmartLinkMap::empty_link_set; +IPAACA_EXPORT void SmartLinkMap::_add_and_remove_links(const LinkMap& add, const LinkMap& remove) { // remove specified links for (LinkMap::const_iterator it = remove.begin(); it != remove.end(); ++it ) { @@ -270,25 +319,25 @@ void SmartLinkMap::_add_and_remove_links(const LinkMap& add, const LinkMap& remo } } } -void SmartLinkMap::_replace_links(const LinkMap& links) +IPAACA_EXPORT void SmartLinkMap::_replace_links(const LinkMap& links) { //_links.clear(); _links=links; } -const LinkSet& SmartLinkMap::get_links(const std::string& key) +IPAACA_EXPORT const LinkSet& SmartLinkMap::get_links(const std::string& key) { LinkMap::const_iterator it = _links.find(key); if (it==_links.end()) return empty_link_set; return it->second; } -const LinkMap& SmartLinkMap::get_all_links() +IPAACA_EXPORT const LinkMap& SmartLinkMap::get_all_links() { return _links; } //}}} // IUEventHandler//{{{ -IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category) +IPAACA_EXPORT IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category) : _function(function), _event_mask(event_mask), _for_all_categories(false) { if (category=="") { @@ -297,7 +346,7 @@ IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType even _categories.insert(category); } } -IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories) +IPAACA_EXPORT IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories) : _function(function), _event_mask(event_mask), _for_all_categories(false) { if (categories.size()==0) { @@ -306,7 +355,7 @@ IUEventHandler::IUEventHandler(IUEventHandlerFunction function, IUEventType even _categories = categories; } } -void IUEventHandler::call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category) +IPAACA_EXPORT void IUEventHandler::call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category) { if (_condition_met(event_type, category)) { //IUInterface::ptr iu = buffer->get(uid); @@ -324,23 +373,23 @@ void IUEventHandler::call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, boo //}}} // Buffer//{{{ -void Buffer::_allocate_unique_name(const std::string& basename, const std::string& function) { +IPAACA_EXPORT void Buffer::_allocate_unique_name(const std::string& basename, const std::string& function) { std::string uuid = ipaaca::generate_uuid_string(); _basename = basename; _uuid = uuid.substr(0,8); _unique_name = "/ipaaca/component/" + _basename + "ID" + _uuid + "/" + function; } -void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories) +IPAACA_EXPORT void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories) { IUEventHandler::ptr handler = IUEventHandler::ptr(new IUEventHandler(function, event_mask, categories)); _event_handlers.push_back(handler); } -void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category) +IPAACA_EXPORT void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category) { IUEventHandler::ptr handler = IUEventHandler::ptr(new IUEventHandler(function, event_mask, category)); _event_handlers.push_back(handler); } -void Buffer::call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category) +IPAACA_EXPORT void Buffer::call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category) { //IPAACA_INFO("handling an event " << ipaaca::iu_event_type_to_str(event_type) << " for IU " << iu->uid()) for (std::vector<IUEventHandler::ptr>::iterator it = _event_handlers.begin(); it != _event_handlers.end(); ++it) { @@ -350,11 +399,11 @@ void Buffer::call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool loca //}}} // Callbacks for OutputBuffer//{{{ -CallbackIUPayloadUpdate::CallbackIUPayloadUpdate(Buffer* buffer): _buffer(buffer) { } -CallbackIULinkUpdate::CallbackIULinkUpdate(Buffer* buffer): _buffer(buffer) { } -CallbackIUCommission::CallbackIUCommission(Buffer* buffer): _buffer(buffer) { } +IPAACA_EXPORT CallbackIUPayloadUpdate::CallbackIUPayloadUpdate(Buffer* buffer): _buffer(buffer) { } +IPAACA_EXPORT CallbackIULinkUpdate::CallbackIULinkUpdate(Buffer* buffer): _buffer(buffer) { } +IPAACA_EXPORT CallbackIUCommission::CallbackIUCommission(Buffer* buffer): _buffer(buffer) { } -boost::shared_ptr<int> CallbackIUPayloadUpdate::call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update) +IPAACA_EXPORT boost::shared_ptr<int> CallbackIUPayloadUpdate::call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update) { //std::cout << "-- Received a modify_payload with " << update->new_items.size() << " keys to merge." << std::endl; IUInterface::ptr iui = _buffer->get(update->uid); @@ -387,7 +436,7 @@ boost::shared_ptr<int> CallbackIUPayloadUpdate::call(const std::string& methodNa return boost::shared_ptr<int>(new int(revision)); } -boost::shared_ptr<int> CallbackIULinkUpdate::call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update) +IPAACA_EXPORT boost::shared_ptr<int> CallbackIULinkUpdate::call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update) { IUInterface::ptr iui = _buffer->get(update->uid); if (! iui) { @@ -411,7 +460,7 @@ boost::shared_ptr<int> CallbackIULinkUpdate::call(const std::string& methodName, iu->_revision_lock.unlock(); return boost::shared_ptr<int>(new int(revision)); } -boost::shared_ptr<int> CallbackIUCommission::call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update) +IPAACA_EXPORT boost::shared_ptr<int> CallbackIUCommission::call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update) { IUInterface::ptr iui = _buffer->get(update->uid()); if (! iui) { @@ -440,38 +489,44 @@ boost::shared_ptr<int> CallbackIUCommission::call(const std::string& methodName, // OutputBuffer//{{{ -OutputBuffer::OutputBuffer(const std::string& basename) +IPAACA_EXPORT OutputBuffer::OutputBuffer(const std::string& basename) :Buffer(basename, "OB") { + IPAACA_INFO("Entering ...") _id_prefix = _basename + "-" + _uuid + "-IU-"; _initialize_server(); + IPAACA_INFO("... exiting.") } -void OutputBuffer::_initialize_server() +IPAACA_EXPORT void OutputBuffer::_initialize_server() { + IPAACA_INFO("Entering ...") + IPAACA_INFO("Calling createServer(\"" << _unique_name << "\")") _server = getFactory().createServer( Scope( _unique_name ) ); + IPAACA_INFO("Registering methods") _server->registerMethod("updatePayload", Server::CallbackPtr(new CallbackIUPayloadUpdate(this))); _server->registerMethod("updateLinks", Server::CallbackPtr(new CallbackIULinkUpdate(this))); _server->registerMethod("commit", Server::CallbackPtr(new CallbackIUCommission(this))); + IPAACA_INFO("... exiting.") } -OutputBuffer::ptr OutputBuffer::create(const std::string& basename) +IPAACA_EXPORT OutputBuffer::ptr OutputBuffer::create(const std::string& basename) { Initializer::initialize_ipaaca_rsb_if_needed(); return OutputBuffer::ptr(new OutputBuffer(basename)); } -IUInterface::ptr OutputBuffer::get(const std::string& iu_uid) +IPAACA_EXPORT IUInterface::ptr OutputBuffer::get(const std::string& iu_uid) { IUStore::iterator it = _iu_store.find(iu_uid); if (it==_iu_store.end()) return IUInterface::ptr(); return it->second; } -std::set<IUInterface::ptr> OutputBuffer::get_ius() +IPAACA_EXPORT std::set<IUInterface::ptr> OutputBuffer::get_ius() { std::set<IUInterface::ptr> set; for (IUStore::iterator it=_iu_store.begin(); it!=_iu_store.end(); ++it) set.insert(it->second); return set; } -void OutputBuffer::_send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) +IPAACA_EXPORT void OutputBuffer::_send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { IULinkUpdate* lup = new ipaaca::IULinkUpdate(); Informer<ipaaca::IULinkUpdate>::DataPtr ldata(lup); @@ -487,7 +542,7 @@ void OutputBuffer::_send_iu_link_update(IUInterface* iu, bool is_delta, revision informer->publish(ldata); } -void OutputBuffer::_send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) +IPAACA_EXPORT void OutputBuffer::_send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { IUPayloadUpdate* pup = new ipaaca::IUPayloadUpdate(); Informer<ipaaca::IUPayloadUpdate>::DataPtr pdata(pup); @@ -502,7 +557,7 @@ void OutputBuffer::_send_iu_payload_update(IUInterface* iu, bool is_delta, revis informer->publish(pdata); } -void OutputBuffer::_send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name) +IPAACA_EXPORT void OutputBuffer::_send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name) { Informer<protobuf::IUCommission>::DataPtr data(new protobuf::IUCommission()); data->set_uid(iu->uid()); @@ -514,7 +569,7 @@ void OutputBuffer::_send_iu_commission(IUInterface* iu, revision_t revision, con informer->publish(data); } -void OutputBuffer::add(IU::ptr iu) +IPAACA_EXPORT void OutputBuffer::add(IU::ptr iu) { if (_iu_store.count(iu->uid()) > 0) { throw IUPublishedError(); @@ -530,14 +585,14 @@ void OutputBuffer::add(IU::ptr iu) _publish_iu(iu); } -void OutputBuffer::_publish_iu(IU::ptr iu) +IPAACA_EXPORT void OutputBuffer::_publish_iu(IU::ptr iu) { Informer<AnyType>::Ptr informer = _get_informer(iu->_category); Informer<ipaaca::IU>::DataPtr iu_data(iu); informer->publish(iu_data); } -Informer<AnyType>::Ptr OutputBuffer::_get_informer(const std::string& category) +IPAACA_EXPORT Informer<AnyType>::Ptr OutputBuffer::_get_informer(const std::string& category) { if (_informer_store.count(category) > 0) { return _informer_store[category]; @@ -549,7 +604,7 @@ Informer<AnyType>::Ptr OutputBuffer::_get_informer(const std::string& category) return informer; } } -boost::shared_ptr<IU> OutputBuffer::remove(const std::string& iu_uid) +IPAACA_EXPORT boost::shared_ptr<IU> OutputBuffer::remove(const std::string& iu_uid) { IUStore::iterator it = _iu_store.find(iu_uid); if (it == _iu_store.end()) { @@ -561,12 +616,12 @@ boost::shared_ptr<IU> OutputBuffer::remove(const std::string& iu_uid) _iu_store.erase(iu_uid); return iu; } -boost::shared_ptr<IU> OutputBuffer::remove(IU::ptr iu) +IPAACA_EXPORT boost::shared_ptr<IU> OutputBuffer::remove(IU::ptr iu) { return remove(iu->uid()); // to make sure it is in the store } -void OutputBuffer::_retract_iu(IU::ptr iu) +IPAACA_EXPORT void OutputBuffer::_retract_iu(IU::ptr iu) { Informer<protobuf::IURetraction>::DataPtr data(new protobuf::IURetraction()); data->set_uid(iu->uid()); @@ -579,39 +634,39 @@ void OutputBuffer::_retract_iu(IU::ptr iu) //}}} // InputBuffer//{{{ -InputBuffer::InputBuffer(const std::string& basename, const std::set<std::string>& category_interests) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::set<std::string>& category_interests) :Buffer(basename, "IB") { for (std::set<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) { _create_category_listener_if_needed(*it); } } -InputBuffer::InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests) :Buffer(basename, "IB") { for (std::vector<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) { _create_category_listener_if_needed(*it); } } -InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1) :Buffer(basename, "IB") { _create_category_listener_if_needed(category_interest1); } -InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2) :Buffer(basename, "IB") { _create_category_listener_if_needed(category_interest1); _create_category_listener_if_needed(category_interest2); } -InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3) :Buffer(basename, "IB") { _create_category_listener_if_needed(category_interest1); _create_category_listener_if_needed(category_interest2); _create_category_listener_if_needed(category_interest3); } -InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4) +IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4) :Buffer(basename, "IB") { _create_category_listener_if_needed(category_interest1); @@ -621,44 +676,44 @@ InputBuffer::InputBuffer(const std::string& basename, const std::string& categor } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::set<std::string>& category_interests) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::set<std::string>& category_interests) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interests)); } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::vector<std::string>& category_interests) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::vector<std::string>& category_interests) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interests)); } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interest1)); } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interest1, category_interest2)); } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interest1, category_interest2, category_interest3)); } -InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4) +IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4) { Initializer::initialize_ipaaca_rsb_if_needed(); return InputBuffer::ptr(new InputBuffer(basename, category_interest1, category_interest2, category_interest3, category_interest4)); } -IUInterface::ptr InputBuffer::get(const std::string& iu_uid) +IPAACA_EXPORT IUInterface::ptr InputBuffer::get(const std::string& iu_uid) { RemotePushIUStore::iterator it = _iu_store.find(iu_uid); // TODO genericize if (it==_iu_store.end()) return IUInterface::ptr(); return it->second; } -std::set<IUInterface::ptr> InputBuffer::get_ius() +IPAACA_EXPORT std::set<IUInterface::ptr> InputBuffer::get_ius() { std::set<IUInterface::ptr> set; for (RemotePushIUStore::iterator it=_iu_store.begin(); it!=_iu_store.end(); ++it) set.insert(it->second); // TODO genericize @@ -666,7 +721,7 @@ std::set<IUInterface::ptr> InputBuffer::get_ius() } -RemoteServerPtr InputBuffer::_get_remote_server(const std::string& unique_server_name) +IPAACA_EXPORT RemoteServerPtr InputBuffer::_get_remote_server(const std::string& unique_server_name) { std::map<std::string, RemoteServerPtr>::iterator it = _remote_server_store.find(unique_server_name); if (it!=_remote_server_store.end()) return it->second; @@ -675,13 +730,18 @@ RemoteServerPtr InputBuffer::_get_remote_server(const std::string& unique_server return remote_server; } -ListenerPtr InputBuffer::_create_category_listener_if_needed(const std::string& category) +IPAACA_EXPORT ListenerPtr InputBuffer::_create_category_listener_if_needed(const std::string& category) { + IPAACA_INFO("Entering ...") std::map<std::string, ListenerPtr>::iterator it = _listener_store.find(category); - if (it!=_listener_store.end()) return it->second; - //IPAACA_INFO("Creating a new listener for category " << category) + if (it!=_listener_store.end()) { + IPAACA_INFO("... exiting.") + return it->second; + } + IPAACA_INFO("Creating a new listener for category " << category) std::string scope_string = "/ipaaca/category/" + category; ListenerPtr listener = getFactory().createListener( Scope(scope_string) ); + IPAACA_INFO("Adding handler") HandlerPtr event_handler = HandlerPtr( new EventFunctionHandler( boost::bind(&InputBuffer::_handle_iu_events, this, _1) @@ -689,19 +749,10 @@ ListenerPtr InputBuffer::_create_category_listener_if_needed(const std::string& ); listener->addHandler(event_handler); _listener_store[category] = listener; + IPAACA_INFO("... exiting.") return listener; - /* - '''Return (or create, store and return) a category listener.''' - if iu_category in self._listener_store: return self._informer_store[iu_category] - cat_listener = rsb.createListener(rsb.Scope("/ipaaca/category/"+str(iu_category)), config=self._participant_config) - cat_listener.addHandler(self._handle_iu_events) - self._listener_store[iu_category] = cat_listener - self._category_interests.append(iu_category) - logger.info("Added listener in scope "+"/ipaaca/category/"+iu_category) - return cat_listener - */ -} -void InputBuffer::_handle_iu_events(EventPtr event) +} +IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event) { std::string type = event->getType(); if (type == "ipaaca::RemotePushIU") { @@ -799,19 +850,19 @@ void InputBuffer::_handle_iu_events(EventPtr event) // IUInterface//{{{ -IUInterface::IUInterface() +IPAACA_EXPORT IUInterface::IUInterface() : _buffer(NULL), _committed(false), _retracted(false) { } -void IUInterface::_set_uid(const std::string& uid) { +IPAACA_EXPORT void IUInterface::_set_uid(const std::string& uid) { if (_uid != "") { throw IUAlreadyHasAnUIDError(); } _uid = uid; } -void IUInterface::_set_buffer(Buffer* buffer) { //boost::shared_ptr<Buffer> buffer) { +IPAACA_EXPORT void IUInterface::_set_buffer(Buffer* buffer) { //boost::shared_ptr<Buffer> buffer) { if (_buffer) { throw IUAlreadyInABufferError(); } @@ -819,7 +870,7 @@ void IUInterface::_set_buffer(Buffer* buffer) { //boost::shared_ptr<Buffer> buff } -void IUInterface::_set_owner_name(const std::string& owner_name) { +IPAACA_EXPORT void IUInterface::_set_owner_name(const std::string& owner_name) { if (_owner_name != "") { throw IUAlreadyHasAnOwnerNameError(); } @@ -827,14 +878,14 @@ void IUInterface::_set_owner_name(const std::string& owner_name) { } /// set the buffer pointer and the owner names of IU and Payload -void IUInterface::_associate_with_buffer(Buffer* buffer) { //boost::shared_ptr<Buffer> buffer) { +IPAACA_EXPORT void IUInterface::_associate_with_buffer(Buffer* buffer) { //boost::shared_ptr<Buffer> buffer) { _set_buffer(buffer); // will throw if already set _set_owner_name(buffer->unique_name()); payload()._set_owner_name(buffer->unique_name()); } /// C++-specific convenience function to add one single link -void IUInterface::add_link(const std::string& type, const std::string& target, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::add_link(const std::string& type, const std::string& target, const std::string& writer_name) { LinkMap none; LinkMap add; @@ -843,7 +894,7 @@ void IUInterface::add_link(const std::string& type, const std::string& target, c _add_and_remove_links(add, none); } /// C++-specific convenience function to remove one single link -void IUInterface::remove_link(const std::string& type, const std::string& target, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::remove_link(const std::string& type, const std::string& target, const std::string& writer_name) { LinkMap none; LinkMap remove; @@ -852,7 +903,7 @@ void IUInterface::remove_link(const std::string& type, const std::string& target _add_and_remove_links(none, remove); } -void IUInterface::add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name) { LinkMap none; LinkMap add; @@ -861,7 +912,7 @@ void IUInterface::add_links(const std::string& type, const LinkSet& targets, con _add_and_remove_links(add, none); } -void IUInterface::remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name) { LinkMap none; LinkMap remove; @@ -870,13 +921,13 @@ void IUInterface::remove_links(const std::string& type, const LinkSet& targets, _add_and_remove_links(none, remove); } -void IUInterface::modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name) { _modify_links(true, add, remove, writer_name); _add_and_remove_links(add, remove); } -void IUInterface::set_links(const LinkMap& links, const std::string& writer_name) +IPAACA_EXPORT void IUInterface::set_links(const LinkMap& links, const std::string& writer_name) { LinkMap none; _modify_links(false, links, none, writer_name); @@ -886,14 +937,14 @@ void IUInterface::set_links(const LinkMap& links, const std::string& writer_name //}}} // IU//{{{ -IU::ptr IU::create(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type) +IPAACA_EXPORT IU::ptr IU::create(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type) { IU::ptr iu = IU::ptr(new IU(category, access_mode, read_only, payload_type)); /* params */ //)); iu->_payload.initialize(iu); return iu; } -IU::IU(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type) +IPAACA_EXPORT IU::IU(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type) { _revision = 1; _uid = ipaaca::generate_uuid_string(); @@ -905,7 +956,7 @@ IU::IU(const std::string& category, IUAccessMode access_mode, bool read_only, co _committed = false; } -void IU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) +IPAACA_EXPORT void IU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { _revision_lock.lock(); if (_committed) { @@ -918,7 +969,7 @@ void IU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& l } _revision_lock.unlock(); } -void IU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) +IPAACA_EXPORT void IU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { _revision_lock.lock(); if (_committed) { @@ -933,12 +984,12 @@ void IU::_modify_payload(bool is_delta, const std::map<std::string, std::string> _revision_lock.unlock(); } -void IU::commit() +IPAACA_EXPORT void IU::commit() { _internal_commit(); } -void IU::_internal_commit(const std::string& writer_name) +IPAACA_EXPORT void IU::_internal_commit(const std::string& writer_name) { _revision_lock.lock(); if (_committed) { @@ -990,17 +1041,17 @@ void Message::_internal_commit(const std::string& writer_name) // RemotePushIU//{{{ -RemotePushIU::ptr RemotePushIU::create() +IPAACA_EXPORT RemotePushIU::ptr RemotePushIU::create() { RemotePushIU::ptr iu = RemotePushIU::ptr(new RemotePushIU(/* params */)); iu->_payload.initialize(iu); return iu; } -RemotePushIU::RemotePushIU() +IPAACA_EXPORT RemotePushIU::RemotePushIU() { // nothing } -void RemotePushIU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) +IPAACA_EXPORT void RemotePushIU::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { if (_committed) { throw IUCommittedError(); @@ -1023,7 +1074,7 @@ void RemotePushIU::_modify_links(bool is_delta, const LinkMap& new_links, const _revision = *result; } } -void RemotePushIU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) +IPAACA_EXPORT void RemotePushIU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { //std::cout << "-- Sending a modify_payload with " << new_items.size() << " keys to merge." << std::endl; if (_committed) { @@ -1048,7 +1099,7 @@ void RemotePushIU::_modify_payload(bool is_delta, const std::map<std::string, st } } -void RemotePushIU::commit() +IPAACA_EXPORT void RemotePushIU::commit() { if (_read_only) { throw IUReadOnlyError(); @@ -1070,7 +1121,7 @@ void RemotePushIU::commit() } } -void RemotePushIU::_apply_link_update(IULinkUpdate::ptr update) +IPAACA_EXPORT void RemotePushIU::_apply_link_update(IULinkUpdate::ptr update) { _revision = update->revision; if (update->is_delta) { @@ -1079,7 +1130,7 @@ void RemotePushIU::_apply_link_update(IULinkUpdate::ptr update) _replace_links(update->new_links); } } -void RemotePushIU::_apply_update(IUPayloadUpdate::ptr update) +IPAACA_EXPORT void RemotePushIU::_apply_update(IUPayloadUpdate::ptr update) { _revision = update->revision; if (update->is_delta) { @@ -1096,11 +1147,11 @@ void RemotePushIU::_apply_update(IUPayloadUpdate::ptr update) } } } -void RemotePushIU::_apply_commission() +IPAACA_EXPORT void RemotePushIU::_apply_commission() { _committed = true; } -void RemotePushIU::_apply_retraction() +IPAACA_EXPORT void RemotePushIU::_apply_retraction() { _retracted = true; } @@ -1108,30 +1159,30 @@ void RemotePushIU::_apply_retraction() // RemoteMessage//{{{ -RemoteMessage::ptr RemoteMessage::create() +IPAACA_EXPORT RemoteMessage::ptr RemoteMessage::create() { RemoteMessage::ptr iu = RemoteMessage::ptr(new RemoteMessage(/* params */)); iu->_payload.initialize(iu); return iu; } -RemoteMessage::RemoteMessage() +IPAACA_EXPORT RemoteMessage::RemoteMessage() { // nothing } -void RemoteMessage::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) +IPAACA_EXPORT void RemoteMessage::_modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) { IPAACA_INFO("Info: modifying a RemoteMessage only has local effects") } -void RemoteMessage::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) +IPAACA_EXPORT void RemoteMessage::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name) { IPAACA_INFO("Info: modifying a RemoteMessage only has local effects") } -void RemoteMessage::commit() +IPAACA_EXPORT void RemoteMessage::commit() { IPAACA_INFO("Info: committing to a RemoteMessage only has local effects") } -void RemoteMessage::_apply_link_update(IULinkUpdate::ptr update) +IPAACA_EXPORT void RemoteMessage::_apply_link_update(IULinkUpdate::ptr update) { IPAACA_WARNING("Warning: should never be called: RemoteMessage::_apply_link_update") _revision = update->revision; @@ -1141,7 +1192,7 @@ void RemoteMessage::_apply_link_update(IULinkUpdate::ptr update) _replace_links(update->new_links); } } -void RemoteMessage::_apply_update(IUPayloadUpdate::ptr update) +IPAACA_EXPORT void RemoteMessage::_apply_update(IUPayloadUpdate::ptr update) { IPAACA_WARNING("Warning: should never be called: RemoteMessage::_apply_update") _revision = update->revision; @@ -1159,12 +1210,12 @@ void RemoteMessage::_apply_update(IUPayloadUpdate::ptr update) } } } -void RemoteMessage::_apply_commission() +IPAACA_EXPORT void RemoteMessage::_apply_commission() { IPAACA_WARNING("Warning: should never be called: RemoteMessage::_apply_commission") _committed = true; } -void RemoteMessage::_apply_retraction() +IPAACA_EXPORT void RemoteMessage::_apply_retraction() { IPAACA_WARNING("Warning: should never be called: RemoteMessage::_apply_retraction") _retracted = true; @@ -1176,49 +1227,49 @@ void RemoteMessage::_apply_retraction() // PayloadEntryProxy//{{{ -PayloadEntryProxy::PayloadEntryProxy(Payload* payload, const std::string& key) +IPAACA_EXPORT PayloadEntryProxy::PayloadEntryProxy(Payload* payload, const std::string& key) : _payload(payload), _key(key) { } -PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value) +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value) { //std::cout << "operator=(string)" << std::endl; _payload->set(_key, value); return *this; } -PayloadEntryProxy& PayloadEntryProxy::operator=(const char* value) +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const char* value) { //std::cout << "operator=(const char*)" << std::endl; _payload->set(_key, value); return *this; } -PayloadEntryProxy& PayloadEntryProxy::operator=(double value) +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(double value) { //std::cout << "operator=(double)" << std::endl; _payload->set(_key, boost::lexical_cast<std::string>(value)); return *this; } -PayloadEntryProxy& PayloadEntryProxy::operator=(bool value) +IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(bool value) { //std::cout << "operator=(bool)" << std::endl; _payload->set(_key, boost::lexical_cast<std::string>(value)); return *this; } -PayloadEntryProxy::operator std::string() +IPAACA_EXPORT PayloadEntryProxy::operator std::string() { return _payload->get(_key); } -PayloadEntryProxy::operator bool() +IPAACA_EXPORT PayloadEntryProxy::operator bool() { std::string s = operator std::string(); return ((s=="1")||(s=="true")||(s=="True")); } -PayloadEntryProxy::operator long() +IPAACA_EXPORT PayloadEntryProxy::operator long() { //return boost::lexical_cast<long>(operator std::string().c_str()); return atof(operator std::string().c_str()); } -PayloadEntryProxy::operator double() +IPAACA_EXPORT PayloadEntryProxy::operator double() { //return boost::lexical_cast<double>(operator std::string().c_str()); return atol(operator std::string().c_str()); @@ -1227,42 +1278,42 @@ PayloadEntryProxy::operator double() // Payload//{{{ -void Payload::initialize(boost::shared_ptr<IUInterface> iu) +IPAACA_EXPORT void Payload::initialize(boost::shared_ptr<IUInterface> iu) { _iu = boost::weak_ptr<IUInterface>(iu); } -PayloadEntryProxy Payload::operator[](const std::string& key) +IPAACA_EXPORT PayloadEntryProxy Payload::operator[](const std::string& key) { //boost::shared_ptr<PayloadEntryProxy> p(new PayloadEntryProxy(this, key)); return PayloadEntryProxy(this, key); } -Payload::operator std::map<std::string, std::string>() +IPAACA_EXPORT Payload::operator std::map<std::string, std::string>() { return _store; } -inline void Payload::_internal_set(const std::string& k, const std::string& v, const std::string& writer_name) { +IPAACA_EXPORT inline void Payload::_internal_set(const std::string& k, const std::string& v, const std::string& writer_name) { std::map<std::string, std::string> _new; std::vector<std::string> _remove; _new[k]=v; _iu.lock()->_modify_payload(true, _new, _remove, writer_name ); _store[k] = v; } -inline void Payload::_internal_remove(const std::string& k, const std::string& writer_name) { +IPAACA_EXPORT inline void Payload::_internal_remove(const std::string& k, const std::string& writer_name) { std::map<std::string, std::string> _new; std::vector<std::string> _remove; _remove.push_back(k); _iu.lock()->_modify_payload(true, _new, _remove, writer_name ); _store.erase(k); } -void Payload::_internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name) +IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name) { std::vector<std::string> _remove; _iu.lock()->_modify_payload(false, new_contents, _remove, writer_name ); _store = new_contents; } -void Payload::_internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name) +IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name) { std::vector<std::string> _remove; _iu.lock()->_modify_payload(true, contents_to_merge, _remove, writer_name ); @@ -1271,19 +1322,19 @@ void Payload::_internal_merge(const std::map<std::string, std::string>& contents // _store[it->first] = it->second; //} } -inline std::string Payload::get(const std::string& k) { +IPAACA_EXPORT inline std::string Payload::get(const std::string& k) { if (_store.count(k)>0) return _store[k]; else return IPAACA_PAYLOAD_DEFAULT_STRING_VALUE; } -void Payload::_remotely_enforced_wipe() +IPAACA_EXPORT void Payload::_remotely_enforced_wipe() { _store.clear(); } -void Payload::_remotely_enforced_delitem(const std::string& k) +IPAACA_EXPORT void Payload::_remotely_enforced_delitem(const std::string& k) { _store.erase(k); } -void Payload::_remotely_enforced_setitem(const std::string& k, const std::string& v) +IPAACA_EXPORT void Payload::_remotely_enforced_setitem(const std::string& k, const std::string& v) { _store[k] = v; } @@ -1292,12 +1343,12 @@ void Payload::_remotely_enforced_setitem(const std::string& k, const std::string // IUConverter//{{{ -IUConverter::IUConverter() -: Converter<std::string> ("ipaaca::IU", "ipaaca-iu", true) +IPAACA_EXPORT IUConverter::IUConverter() +: Converter<std::string> ("class ipaaca::IU", "ipaaca-iu", true) { } -std::string IUConverter::serialize(const AnnotatedData& data, std::string& wire) +IPAACA_EXPORT std::string IUConverter::serialize(const AnnotatedData& data, std::string& wire) { //std::cout << "serialize" << std::endl; // Ensure that DATA actually holds a datum of the data-type we expect. @@ -1354,7 +1405,7 @@ std::string IUConverter::serialize(const AnnotatedData& data, std::string& wire) } -AnnotatedData IUConverter::deserialize(const std::string& wireSchema, const std::string& wire) { +IPAACA_EXPORT AnnotatedData IUConverter::deserialize(const std::string& wireSchema, const std::string& wire) { //std::cout << "deserialize" << std::endl; assert(wireSchema == getWireSchema()); // "ipaaca-iu" boost::shared_ptr<protobuf::IU> pbo(new protobuf::IU()); @@ -1428,12 +1479,12 @@ AnnotatedData IUConverter::deserialize(const std::string& wireSchema, const std: // MessageConverter//{{{ -MessageConverter::MessageConverter() -: Converter<std::string> ("ipaaca::Message", "ipaaca-messageiu", true) +IPAACA_EXPORT MessageConverter::MessageConverter() +: Converter<std::string> ("class ipaaca::Message", "ipaaca-messageiu", true) { } -std::string MessageConverter::serialize(const AnnotatedData& data, std::string& wire) +IPAACA_EXPORT std::string MessageConverter::serialize(const AnnotatedData& data, std::string& wire) { // Ensure that DATA actually holds a datum of the data-type we expect. assert(data.first == getDataType()); // "ipaaca::Message" @@ -1487,7 +1538,7 @@ std::string MessageConverter::serialize(const AnnotatedData& data, std::string& } -AnnotatedData MessageConverter::deserialize(const std::string& wireSchema, const std::string& wire) { +IPAACA_EXPORT AnnotatedData MessageConverter::deserialize(const std::string& wireSchema, const std::string& wire) { assert(wireSchema == getWireSchema()); // "ipaaca-iu" boost::shared_ptr<protobuf::IU> pbo(new protobuf::IU()); pbo->ParseFromString(wire); @@ -1559,12 +1610,12 @@ AnnotatedData MessageConverter::deserialize(const std::string& wireSchema, const // IUPayloadUpdateConverter//{{{ -IUPayloadUpdateConverter::IUPayloadUpdateConverter() -: Converter<std::string> ("ipaaca::IUPayloadUpdate", "ipaaca-iu-payload-update", true) +IPAACA_EXPORT IUPayloadUpdateConverter::IUPayloadUpdateConverter() +: Converter<std::string> ("class ipaaca::IUPayloadUpdate", "ipaaca-iu-payload-update", true) { } -std::string IUPayloadUpdateConverter::serialize(const AnnotatedData& data, std::string& wire) +IPAACA_EXPORT std::string IUPayloadUpdateConverter::serialize(const AnnotatedData& data, std::string& wire) { assert(data.first == getDataType()); // "ipaaca::IUPayloadUpdate" boost::shared_ptr<const IUPayloadUpdate> obj = boost::static_pointer_cast<const IUPayloadUpdate> (data.second); @@ -1612,12 +1663,12 @@ AnnotatedData IUPayloadUpdateConverter::deserialize(const std::string& wireSchem // IULinkUpdateConverter//{{{ -IULinkUpdateConverter::IULinkUpdateConverter() -: Converter<std::string> ("ipaaca::IULinkUpdate", "ipaaca-iu-link-update", true) +IPAACA_EXPORT IULinkUpdateConverter::IULinkUpdateConverter() +: Converter<std::string> ("class ipaaca::IULinkUpdate", "ipaaca-iu-link-update", true) { } -std::string IULinkUpdateConverter::serialize(const AnnotatedData& data, std::string& wire) +IPAACA_EXPORT std::string IULinkUpdateConverter::serialize(const AnnotatedData& data, std::string& wire) { assert(data.first == getDataType()); // "ipaaca::IULinkUpdate" boost::shared_ptr<const IULinkUpdate> obj = boost::static_pointer_cast<const IULinkUpdate> (data.second); @@ -1675,12 +1726,12 @@ AnnotatedData IULinkUpdateConverter::deserialize(const std::string& wireSchema, // IntConverter//{{{ -IntConverter::IntConverter() +IPAACA_EXPORT IntConverter::IntConverter() : Converter<std::string> ("int", "int32", true) { } -std::string IntConverter::serialize(const AnnotatedData& data, std::string& wire) +IPAACA_EXPORT std::string IntConverter::serialize(const AnnotatedData& data, std::string& wire) { // Ensure that DATA actually holds a datum of the data-type we expect. assert(data.first == getDataType()); // "int" @@ -1694,7 +1745,7 @@ std::string IntConverter::serialize(const AnnotatedData& data, std::string& wire } -AnnotatedData IntConverter::deserialize(const std::string& wireSchema, const std::string& wire) { +IPAACA_EXPORT AnnotatedData IntConverter::deserialize(const std::string& wireSchema, const std::string& wire) { assert(wireSchema == getWireSchema()); // "int" boost::shared_ptr<protobuf::IntMessage> pbo(new protobuf::IntMessage()); pbo->ParseFromString(wire); -- GitLab