From 775790fa1c830cadf2a721baac89d796707ad32e Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Thu, 5 Feb 2015 16:23:56 +0100
Subject: [PATCH] intermediate commit, not working

---
 ipaacalib/cpp/CMakeLists.txt                  | 20 +++++------
 ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h |  9 ++---
 ipaacalib/cpp/include/ipaaca/ipaaca-payload.h | 18 +++++-----
 ipaacalib/cpp/src/ipaaca-buffers.cc           |  7 ++--
 ipaacalib/cpp/src/ipaaca-internal.cc          |  9 +++--
 ipaacalib/cpp/src/ipaaca-json.cc              |  7 +++-
 ipaacalib/cpp/src/ipaaca-payload.cc           | 36 ++++++++++---------
 7 files changed, 58 insertions(+), 48 deletions(-)

diff --git a/ipaacalib/cpp/CMakeLists.txt b/ipaacalib/cpp/CMakeLists.txt
index ed15d94..285676a 100644
--- a/ipaacalib/cpp/CMakeLists.txt
+++ b/ipaacalib/cpp/CMakeLists.txt
@@ -165,10 +165,10 @@ set (JSON_TEST_SOURCE
 
 
 
-# compile all files to "ipaaca" shared library
-add_library(ipaaca SHARED ${SOURCE})
-# and link all the required external libs (found above using find_package etc.)
-target_link_libraries(ipaaca ${LIBS})
+## compile all files to "ipaaca" shared library
+#add_library(ipaaca SHARED ${SOURCE})
+## and link all the required external libs (found above using find_package etc.)
+#target_link_libraries(ipaaca ${LIBS})
 
 add_executable (ipaaca-test-json ${JSON_TEST_SOURCE})
 target_link_libraries (ipaaca-test-json ${LIBS})
@@ -178,12 +178,12 @@ set(DEFAULT_LIB_SUBDIR lib)
 set(DEFAULT_DATA_SUBDIR share/data)
 set(DEFAULT_INCLUDE_SUBDIR include)
 #set(CMAKE_INSTALL_PREFIX "")
-install (
-	TARGETS ipaaca
-	RUNTIME DESTINATION bin
-	LIBRARY DESTINATION lib
-	ARCHIVE DESTINATION lib
-	)
+#install (
+#	TARGETS ipaaca
+#	RUNTIME DESTINATION bin
+#	LIBRARY DESTINATION lib
+#	ARCHIVE DESTINATION lib
+#	)
 install(
 	DIRECTORY include
 	DESTINATION .
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
index 2c4fe44..dd00eb9 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
@@ -145,7 +145,8 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 
 
 			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;
+// LAST POSITION OPENED FIXME
+			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& 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 _IPAACA_ABSTRACT_ virtual void _send_iu_resendrequest(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);
@@ -187,7 +188,7 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			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 _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name);
 
-			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_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& 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);
 			IPAACA_HEADER_EXPORT void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name);
 			// remote access functions
@@ -238,7 +239,7 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			{
 				IPAACA_WARNING("(ERROR) InputBuffer::_publish_iu_resend() should never be invoked")
 			}
-			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_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& 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")
 			}
@@ -286,7 +287,7 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			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::map<std::string, const rapidjson::Document&> 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;
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index 82873b9..3e9cebb 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -129,27 +129,27 @@ IPAACA_HEADER_EXPORT class Payload//{{{
 	friend class CallbackIUPayloadUpdate;
 	protected:
 		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
-		IPAACA_MEMBER_VAR_EXPORT rapidjson::Document _json_document;
-		//IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> _store;
+		//IPAACA_MEMBER_VAR_EXPORT rapidjson::Document _json_document;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rapidjson::Document> _json_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 _remotely_enforced_setitem(const std::string& k, const rapidjson::Document& v);
+		IPAACA_HEADER_EXPORT void _internal_replace_all(const std::map<std::string, const rapidjson::Document&>& new_contents, const std::string& writer_name="");
+		IPAACA_HEADER_EXPORT void _internal_merge(const std::map<std::string, const rapidjson::Document&>& contents_to_merge, const std::string& writer_name="");
+		IPAACA_HEADER_EXPORT void _internal_set(const std::string& k, const rapidjson::Document& 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
 		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 set(const std::map<std::string, const rapidjson::Document&>& all_elems) { _internal_replace_all(all_elems); }
+		IPAACA_HEADER_EXPORT inline void set(const std::string& k, const rapidjson::Document& v) { _internal_set(k, v); }
+		IPAACA_HEADER_EXPORT inline void merge(const std::map<std::string, const rapidjson::Document&>& 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;
diff --git a/ipaacalib/cpp/src/ipaaca-buffers.cc b/ipaacalib/cpp/src/ipaaca-buffers.cc
index a738e6d..91a66e2 100644
--- a/ipaacalib/cpp/src/ipaaca-buffers.cc
+++ b/ipaacalib/cpp/src/ipaaca-buffers.cc
@@ -66,9 +66,10 @@ IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate&
 	os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False");
 	os << ", new_items = {";
 	bool first = true;
-	for (std::map<std::string, std::string>::const_iterator it=obj.new_items.begin(); it!=obj.new_items.end(); ++it) {
+	for (auto& : obj.new_items) {
 		if (first) { first=false; } else { os << ", "; }
-		os << "'" << it->first << "':'" << it->second << "'";
+		//os << "'" << it->first << "':'" << it->second << "'";
+		os << "'" << it->first << "': ???";  // FIXME JSONIZE
 	}
 	os << "}, keys_to_remove = [";
 	first = true;
@@ -391,7 +392,7 @@ IPAACA_EXPORT void OutputBuffer::_send_iu_link_update(IUInterface* iu, bool is_d
 	informer->publish(ldata);
 }
 
-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)
+IPAACA_EXPORT void OutputBuffer::_send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& 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);
diff --git a/ipaacalib/cpp/src/ipaaca-internal.cc b/ipaacalib/cpp/src/ipaaca-internal.cc
index 0b49fed..fe89565 100644
--- a/ipaacalib/cpp/src/ipaaca-internal.cc
+++ b/ipaacalib/cpp/src/ipaaca-internal.cc
@@ -168,12 +168,11 @@ IPAACA_EXPORT std::string IUConverter::serialize(const AnnotatedData& data, std:
 	}
 	pbo->set_access_mode(a_m);
 	pbo->set_read_only(obj->read_only());
-	// TODO JSONIZE
-	for (std::map<std::string, std::string>::const_iterator it=obj->_payload._store.begin(); it!=obj->_payload._store.end(); ++it) {
+	for (auto& kv: obj->_payload._store) {
 		protobuf::PayloadItem* item = pbo->add_payload();
-		item->set_key(it->first);
-		item->set_value(it->second);
-		item->set_type("str"); // FIXME other types than str (later)
+		item->set_key(kv.first);
+		item->set_value(kv.second);
+		item->set_type("json");
 	}
 	for (LinkMap::const_iterator it=obj->_links._links.begin(); it!=obj->_links._links.end(); ++it) {
 		protobuf::LinkSet* links = pbo->add_links();
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index de9ff66..929e803 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -45,11 +45,16 @@ int main(int, char*[]) {
 	puts("WARNING - no c++11 rvalue refs!");
 #endif
 
+	std::map<std::string, Document> documents;
 	////////////////////////////////////////////////////////////////////////////
 	// 1. Parse a JSON text string to a document.
 	const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4], \"dict\":{\"s\":\"stringvalue\", \"arr\":[6, 7, \"test\"]} } ";
 	printf("Original JSON:\n %s\n", json);
-	Document document; // Default template parameter uses UTF8 and MemoryPoolAllocator.
+	Document _document; // Default template parameter uses UTF8 and MemoryPoolAllocator.
+	documents["document_test"] = std::move(_document);
+	Document& document = documents["document_test"];
+	printf("Check whether document contains 'none' initially ...");
+	assert(document.IsNull()); // initial state of object
 #if 0
 	// "normal" parsing, decode strings to new buffers. Can use other input stream via ParseStream().
 	if (document.Parse(json).HasParseError())
diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc
index 23574f4..baba2cf 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -44,7 +44,7 @@ IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{
 {
 	os << "{";
 	bool first = true;
-	for (std::map<std::string, std::string>::const_iterator it=obj._store.begin(); it!=obj._store.end(); ++it) {
+	for (std::map<std::string, std::string>::const_iterator it=obj._json_store.begin(); it!=obj._json_store.end(); ++it) {
 		if (first) { first=false; } else { os << ", "; }
 		os << "'" << it->first << "':'" << it->second << "'";
 	}
@@ -173,53 +173,57 @@ IPAACA_EXPORT PayloadEntryProxy Payload::operator[](const std::string& key)
 }
 IPAACA_EXPORT Payload::operator std::map<std::string, std::string>()
 {
-	return _store;
+	std::map<std::string, std::string> result;
+	std::foreach(_json_store.begin(), _json_store.end(), [&result](auto pair) {
+			result[pair.first] =  pair.second.GetString();
+			});
+	return result;
 }
 
-IPAACA_EXPORT void Payload::_internal_set(const std::string& k, const std::string& v, const std::string& writer_name) {
-	std::map<std::string, std::string> _new;
+IPAACA_EXPORT void Payload::_internal_set(const std::string& k, const rapidjson::Document& v, const std::string& writer_name) {
+	std::map<std::string, const rapidjson::Document&> _new;
 	std::vector<std::string> _remove;
 	_new[k]=v;
 	_iu.lock()->_modify_payload(true, _new, _remove, writer_name );
-	_store[k] = v;
+	_json_store[k] = v;
 }
 IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::string& writer_name) {
-	std::map<std::string, std::string> _new;
+	std::map<std::string, const rapidjson::Document&> _new;
 	std::vector<std::string> _remove;
 	_remove.push_back(k);
 	_iu.lock()->_modify_payload(true, _new, _remove, writer_name );
 	_store.erase(k);
 }
-IPAACA_EXPORT 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, const rapidjson::Document&>& 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;
 }
-IPAACA_EXPORT 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, const rapidjson::Document&>& contents_to_merge, const std::string& writer_name)
 {
 	std::vector<std::string> _remove;
 	_iu.lock()->_modify_payload(true, contents_to_merge, _remove, writer_name );
-	_store.insert(contents_to_merge.begin(), contents_to_merge.end());
+	_json_store.insert(contents_to_merge.begin(), contents_to_merge.end());
 	//for (std::map<std::string, std::string>::iterator it = contents_to_merge.begin(); it!=contents_to_merge.end(); i++) {
 	//	_store[it->first] = it->second;
 	//}
 }
-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;
+IPAACA_EXPORT inline rapidjson::Document& Payload::get(const std::string& k) {
+	if (_json_store.count(k)>0) return _json_store[k];
+	else return rapidjson::Document();  // if not found; contains 'null' value
 }
 IPAACA_EXPORT void Payload::_remotely_enforced_wipe()
 {
-	_store.clear();
+	_json_store.clear();
 }
 IPAACA_EXPORT void Payload::_remotely_enforced_delitem(const std::string& k)
 {
-	_store.erase(k);
+	_json_store.erase(k);
 }
-IPAACA_EXPORT 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 rapidjson::Document&)
 {
-	_store[k] = v;
+	_json_store[k] = v;
 }
 
 //}}}
-- 
GitLab