From 5b418a0756f34f024bbbe41aa21994a3e2d60650 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Thu, 14 Oct 2021 23:51:05 +0200 Subject: [PATCH] start working on xml support --- src/jsonexpression.cpp | 4 +- src/xmlexpression.cpp | 133 +++++++++++++++++++++++++++++++++++++++++ src/xmlexpression.h | 81 +++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 src/xmlexpression.cpp create mode 100644 src/xmlexpression.h diff --git a/src/jsonexpression.cpp b/src/jsonexpression.cpp index 1c3d898..90b72b5 100644 --- a/src/jsonexpression.cpp +++ b/src/jsonexpression.cpp @@ -78,12 +78,12 @@ void JSONExpression::field_before() void JSONExpression::before_field_name() { - (*out_stream) << "\""; + (*out_stream) << "<"; } void JSONExpression::after_field_name() { - (*out_stream) << "\""; + (*out_stream) << ">"; } diff --git a/src/xmlexpression.cpp b/src/xmlexpression.cpp new file mode 100644 index 0000000..f4846dd --- /dev/null +++ b/src/xmlexpression.cpp @@ -0,0 +1,133 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2021, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "xmlexpression.h" +#include "morm_types.h" +#include "convert/misc.h" + + +namespace morm +{ + + +void XMLExpression::before_generate_from_model() +{ + BaseExpression::before_generate_from_model(); + + if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) + { + (*out_stream) << "{"; + } +} + + +void XMLExpression::after_generate_from_model() +{ + BaseExpression::after_generate_from_model(); + + if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) + { + (*out_stream) << "}"; + } +} + + + +void XMLExpression::field_before() +{ + BaseExpression::field_before(); + + if( !is_first_field ) + { + (*out_stream) << ","; + } +} + + + +void XMLExpression::before_field_name() +{ + (*out_stream) << "\""; +} + +void XMLExpression::after_field_name() +{ + (*out_stream) << "\""; +} + + + +void XMLExpression::before_field_value_string(const FT & field_type) +{ + (*out_stream) << "\""; +} + +void XMLExpression::after_field_value_string(const FT & field_type) +{ + (*out_stream) << "\""; +} + + +void XMLExpression::put_name_value_separator() +{ + (*out_stream) << ':'; +} + + +void XMLExpression::before_field_value_list() +{ + (*out_stream) << "["; +} + + +void XMLExpression::after_field_value_list() +{ + (*out_stream) << "]"; +} + + +void XMLExpression::esc(char val, pt::TextStream & stream, const FT & field_type) +{ + if( field_type.is_hexadecimal() || field_type.is_binary() ) + { + char_to_hex(val, stream); + } + else + { + pt::esc_to_xml(val, stream); + } +} + + +} diff --git a/src/xmlexpression.h b/src/xmlexpression.h new file mode 100644 index 0000000..eea33a9 --- /dev/null +++ b/src/xmlexpression.h @@ -0,0 +1,81 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2021, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef headerfile_morm_xmlexpression +#define headerfile_morm_xmlexpression + +#include "flatexpression.h" + + + +namespace morm +{ + +class XMLExpression : public FlatExpression +{ + +protected: + + void before_generate_from_model(); + void after_generate_from_model(); + + + + void field_before(); + + void before_field_name(); + void after_field_name(); + + void put_name_value_separator(); + + void before_field_value_list(); + void after_field_value_list(); + + // using FlatExpression::esc to suppress clang warning: + // 'morm::JSONExpression::esc' hides overloaded virtual function [-Woverloaded-virtual] + using FlatExpression::esc; + + void esc(char val, pt::TextStream & stream, const FT & field_type); + + +private: + + void before_field_value_string(const FT & field_type); + void after_field_value_string(const FT & field_type); + +}; + +} + +#endif