From 05a29b0a4e9cee49de41e84b6f1f14df7bbe6419 Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Tue, 24 Feb 2015 00:18:27 +0100
Subject: [PATCH] C++: global static default options, some already settable via
 cmdline

Setting default channel name and default payload type works OK
---
 ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h | 14 +++++++-------
 ipaacalib/cpp/include/ipaaca/ipaaca-ius.h     | 14 +++++++-------
 ipaacalib/cpp/include/ipaaca/ipaaca.h         |  4 ++++
 ipaacalib/cpp/src/ipaaca-buffers.cc           | 14 +++++++-------
 ipaacalib/cpp/src/ipaaca-cmdline-parser.cc    | 15 +++++++++++----
 ipaacalib/cpp/src/ipaaca-ius.cc               |  8 ++++----
 ipaacalib/cpp/src/ipaaca-json.cc              |  8 ++++----
 ipaacalib/cpp/src/ipaaca.cc                   |  3 +++
 8 files changed, 47 insertions(+), 33 deletions(-)

diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
index 124cb19..fe3f6d3 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
@@ -77,10 +77,10 @@ IPAACA_HEADER_EXPORT class BufferConfiguration//{{{
 		IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> _category_interests;
 		IPAACA_MEMBER_VAR_EXPORT std::string _channel;
 	public:
-		IPAACA_HEADER_EXPORT inline BufferConfiguration(const std::string basename) { _basename = basename; }
-		IPAACA_HEADER_EXPORT inline const std::string get_basename() const { return _basename; }
-		IPAACA_HEADER_EXPORT inline const std::vector<std::string> get_category_interests() const { return _category_interests; }
-		IPAACA_HEADER_EXPORT inline const std::string get_channel() const { return _channel; }
+		IPAACA_HEADER_EXPORT inline BufferConfiguration(const std::string& basename): _basename(basename), _channel(__ipaaca_static_option_default_channel) { }
+		IPAACA_HEADER_EXPORT inline const std::string& get_basename() const { return _basename; }
+		IPAACA_HEADER_EXPORT inline const std::vector<std::string>& get_category_interests() const { return _category_interests; }
+		IPAACA_HEADER_EXPORT inline const std::string& get_channel() const { return _channel; }
 	public:
 		// setters, initialization helpers
 		IPAACA_HEADER_EXPORT inline BufferConfiguration& set_basename(const std::string& basename) { _basename = basename; return *this; }
@@ -92,7 +92,7 @@ IPAACA_HEADER_EXPORT class BufferConfigurationBuilder: private BufferConfigurati
 {
 	public:
 		[[deprecated("Use setters in BufferConfiguration instead of the Builder")]]
-		IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string basename):BufferConfiguration(basename) {}
+		IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string& basename): BufferConfiguration(basename) {}
 		IPAACA_HEADER_EXPORT inline void set_basename(const std::string& basename)
 		{
 			_basename = basename;
@@ -157,7 +157,7 @@ IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Bu
 		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);
-			_channel = "default";
+			_channel = __ipaaca_static_option_default_channel;
 		}
 		IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category);
 	public:
@@ -204,7 +204,7 @@ IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enabl
 
 		IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu);
 	protected:
-		IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel="default");
+		IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel=""); // empty string auto-replaced with __ipaaca_static_option_default_channel
 		IPAACA_HEADER_EXPORT void _initialize_server();
 	public:
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename);
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
index 5affdde..ec2e11f 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
@@ -51,7 +51,7 @@ IPAACA_HEADER_EXPORT class IUInterface {//{{{
 		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 "JSON" (legacy said "MAP")
+		IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is taken from __ipaaca_static_option_default_payload_type
 		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
 		IPAACA_MEMBER_VAR_EXPORT bool _committed;
 		IPAACA_MEMBER_VAR_EXPORT bool _retracted;
@@ -122,14 +122,14 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 	   IPAACA_MEMBER_VAR_EXPORT  Lock _revision_lock;
 	protected:
 		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="JSON" );
+		IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="" ); // __ipaaca_static_option_default_payload_type
 	public:
 		IPAACA_HEADER_EXPORT inline ~IU() {
 			//IPAACA_IMPLEMENT_ME
 		}
 		[[deprecated("Please use the new argument order: category, payload_type, read_only")]]
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode, bool read_only=false, const std::string& payload_type="JSON" );
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, const std::string& payload_type="JSON", bool read_only=false);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode, bool read_only=false, const std::string& payload_type="" );
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, const std::string& payload_type="", bool read_only=false);
 		IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; }
 		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; }
 		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
@@ -153,14 +153,14 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{
 	friend class CallbackIUCommission;
 	friend class CallbackIUResendRequest;
 	protected:
-		IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="JSON" );
+		IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="" );
 	public:
 		IPAACA_HEADER_EXPORT inline ~Message() {
 			//IPAACA_IMPLEMENT_ME
 		}
 		[[deprecated("Please use the new argument order: category, payload_type")]]
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode, bool read_only=true, const std::string& payload_type="JSON" );
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, const std::string& payload_type="JSON");
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode, bool read_only=true, const std::string& payload_type="" );
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, const std::string& payload_type="");
 	protected:
 		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h
index 35620e5..6be8178 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -167,6 +167,10 @@ namespace ipaaca {
 
 #include <ipaaca/ipaaca-locking.h>
 
+// Global static library variables (run-time default configuration)
+// Actual initial values are set in ipaaca.cc
+IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_default_payload_type;
+IPAACA_MEMBER_VAR_EXPORT extern std::string __ipaaca_static_option_default_channel;
 
 IPAACA_MEMBER_VAR_EXPORT Lock& logger_lock();
 
diff --git a/ipaacalib/cpp/src/ipaaca-buffers.cc b/ipaacalib/cpp/src/ipaaca-buffers.cc
index 38ac203..1c4ad97 100644
--- a/ipaacalib/cpp/src/ipaaca-buffers.cc
+++ b/ipaacalib/cpp/src/ipaaca-buffers.cc
@@ -282,7 +282,7 @@ IPAACA_EXPORT OutputBuffer::OutputBuffer(const std::string& basename, const std:
 {
 	//IPAACA_INFO("Entering ...")
 	_id_prefix = _basename + "-" + _uuid + "-IU-";
-	_channel = channel;
+	_channel = (channel=="") ? __ipaaca_static_option_default_channel: channel;
 	_initialize_server();
 	//IPAACA_INFO("... exiting.")
 }
@@ -456,7 +456,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const BufferConfiguration& bufferconfigur
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::set<std::string>& category_interests)
 :Buffer(basename, "IB")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	for (std::set<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) {
 		_create_category_listener_if_needed(*it);
@@ -467,7 +467,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests)
 :Buffer(basename, "IB")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	for (std::vector<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) {
 		_create_category_listener_if_needed(*it);
@@ -478,7 +478,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::v
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1)
 :Buffer(basename, "IB")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(_uuid);
@@ -487,7 +487,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2)
 :Buffer(basename, "IB")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(category_interest2);
@@ -497,7 +497,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 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")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(category_interest2);
@@ -508,7 +508,7 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 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")
 {
-	_channel = "default";
+	_channel = __ipaaca_static_option_default_channel;
 
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(category_interest2);
diff --git a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
index 0a50abf..89ae559 100644
--- a/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
+++ b/ipaacalib/cpp/src/ipaaca-cmdline-parser.cc
@@ -98,11 +98,18 @@ bool CommandLineParser::consume_library_option(const std::string& name, bool exp
 {
 	IPAACA_DEBUG("Trying to consume " << name)
 	if (name=="ipaaca-payload-type") {
-		IPAACA_DEBUG("TODO: set default payload type to " << optarg)
-		IPAACA_IMPLEMENT_ME
+		std::string newtype = optarg;
+		if (newtype=="MAP") newtype="STR";
+		if ((newtype=="JSON") || (newtype=="STR")) {
+			IPAACA_DEBUG("Setting default payload type " << newtype)
+			__ipaaca_static_option_default_payload_type = newtype;
+		} else {
+			IPAACA_WARNING("Ignoring unknown default payload type " << newtype << " - should be one of JSON or STR")
+		}
 	} else if (name=="ipaaca-default-channel") {
-		IPAACA_DEBUG("TODO: set default channel to " << optarg)
-		IPAACA_IMPLEMENT_ME
+		std::string newch = optarg;
+		IPAACA_DEBUG("Setting default channel " << newch)
+		__ipaaca_static_option_default_channel = newch;
 	} else if (name=="ipaaca-enable-logging") {
 		IPAACA_DEBUG("TODO: set ipaaca log level to " << optarg)
 		IPAACA_IMPLEMENT_ME
diff --git a/ipaacalib/cpp/src/ipaaca-ius.cc b/ipaacalib/cpp/src/ipaaca-ius.cc
index 9e9acf2..fa1efb4 100644
--- a/ipaacalib/cpp/src/ipaaca-ius.cc
+++ b/ipaacalib/cpp/src/ipaaca-ius.cc
@@ -47,7 +47,7 @@ IPAACA_EXPORT IU::ptr IU::create(const std::string& category, IUAccessMode acces
 }
 IPAACA_EXPORT IU::ptr IU::create(const std::string& category, const std::string& payload_type, bool read_only)
 {
-	IU::ptr iu = IU::ptr(new IU(category, IU_ACCESS_PUSH, read_only, payload_type)); /* params */ //));
+	IU::ptr iu = IU::ptr(new IU(category, IU_ACCESS_PUSH, read_only, (payload_type=="")?__ipaaca_static_option_default_payload_type:payload_type)); /* params */ //));
 	iu->_payload.initialize(iu);
 	return iu;
 }
@@ -57,7 +57,7 @@ IPAACA_EXPORT IU::IU(const std::string& category, IUAccessMode access_mode, bool
 	_revision = 1;
 	_uid = ipaaca::generate_uuid_string();
 	_category = category;
-	_payload_type = payload_type;
+	_payload_type = (payload_type=="")?__ipaaca_static_option_default_payload_type:payload_type;
 	// payload initialization deferred to IU::create(), above
 	_read_only = read_only;
 	_access_mode = access_mode;
@@ -138,11 +138,11 @@ IPAACA_EXPORT void IU::_internal_commit(const std::string& writer_name)
 // Message//{{{
 Message::ptr Message::create(const std::string& category, IUAccessMode access_mode, bool read_only, const std::string& payload_type)
 {
-	return Message::create(category, payload_type);
+	return Message::create(category, (payload_type=="")?__ipaaca_static_option_default_payload_type:payload_type);
 }
 Message::ptr Message::create(const std::string& category, const std::string& payload_type)
 {
-	Message::ptr iu = Message::ptr(new Message(category, IU_ACCESS_MESSAGE, true, payload_type)); /* params */ //));
+	Message::ptr iu = Message::ptr(new Message(category, IU_ACCESS_MESSAGE, true, (payload_type=="")?__ipaaca_static_option_default_payload_type:payload_type)); /* params */ //));
 	iu->_payload.initialize(iu);
 	return iu;
 }
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index 8ceec93..3ffcebc 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -46,9 +46,6 @@ int fakeiu_main(int argc, char** argv)
 	//	return 0;
 	//}
 	//
-	ipaaca::CommandLineParser::ptr parser = ipaaca::CommandLineParser::create();
-	ipaaca::CommandLineOptions::ptr options = parser->parse(argc, argv);
-
 	std::string json_source("[\"old\",2,3,4]");
 	ipaaca::PayloadDocumentEntry::ptr entry = ipaaca::PayloadDocumentEntry::from_json_string_representation(json_source);
 	
@@ -186,7 +183,7 @@ int legacy_iu_main(int argc, char** argv)
 		std::cout << "Received remote update, new payload: " << iu->payload() << std::endl;
 	});
 	std::cout << "--- Create IUs with category jsonTest" << std::endl;
-	ipaaca::IU::ptr iu1 = ipaaca::IU::create("jsonTest", "JSON");
+	ipaaca::IU::ptr iu1 = ipaaca::IU::create("jsonTest");
 	ipaaca::IU::ptr iu2 = ipaaca::IU::create("jsonTest", "STR");
 	std::map<std::string, long> newmap = { {"fifty", 50}, {"ninety-nine", 99} };
 	std::cout << "--- Set map" << std::endl;
@@ -254,6 +251,9 @@ int iu_main(int argc, char** argv)
 
 int main(int argc, char** argv)
 {
+	ipaaca::CommandLineParser::ptr parser = ipaaca::CommandLineParser::create();
+	ipaaca::CommandLineOptions::ptr options = parser->parse(argc, argv);
+
 	return legacy_iu_main(argc, argv);
 	//return fakeiu_main(argc, argv);
 	//return iu_main(argc, argv);
diff --git a/ipaacalib/cpp/src/ipaaca.cc b/ipaacalib/cpp/src/ipaaca.cc
index a6a092f..f72857e 100644
--- a/ipaacalib/cpp/src/ipaaca.cc
+++ b/ipaacalib/cpp/src/ipaaca.cc
@@ -72,6 +72,9 @@ IPAACA_EXPORT std::string generate_uuid_string()//{{{
 #endif
 }//}}}
 
+IPAACA_EXPORT std::string __ipaaca_static_option_default_payload_type("JSON");
+IPAACA_EXPORT std::string __ipaaca_static_option_default_channel("default");
+
 /*
 void init_inprocess_too() {
 	//ParticipantConfig config = getFactory().getDefaultParticipantConfig();
-- 
GitLab