]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rgw/rgw_xml.h
import 15.2.0 Octopus source
[ceph.git] / ceph / src / rgw / rgw_xml.h
index 227e1cba4c02b8815cc71f7b949736f7a8202cda..b3e1e8ee681fc671dfbd79c013e556754d753848 100644 (file)
@@ -1,10 +1,11 @@
 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
+// vim: ts=8 sw=2 smarttab ft=cpp
 
 #ifndef CEPH_RGW_XML_H
 #define CEPH_RGW_XML_H
 
 #include <map>
+#include <stdexcept>
 #include <string>
 #include <iosfwd>
 #include <include/types.h>
@@ -145,10 +146,8 @@ public:
 };
 
 namespace RGWXMLDecoder {
-  struct err {
-    std::string message;
-
-    explicit err(const std::string& m) : message(m) {}
+  struct err : std::runtime_error {
+    using runtime_error::runtime_error;
   };
 
   typedef RGWXMLParser XMLParser;
@@ -168,7 +167,7 @@ namespace RGWXMLDecoder {
 
 static inline ostream& operator<<(ostream &out, RGWXMLDecoder::err& err)
 {
-  return out << err.message;
+  return out << err.what();
 }
 
 template<class T>
@@ -193,6 +192,13 @@ void decode_xml_obj(bufferlist& val, XMLObj *obj);
 class utime_t;
 void decode_xml_obj(utime_t& val, XMLObj *obj);
 
+template<class T>
+void decode_xml_obj(std::optional<T>& val, XMLObj *obj)
+{
+  val.emplace();
+  decode_xml_obj(*val, obj);
+}
+
 template<class T>
 void do_decode_xml_obj(list<T>& l, const string& name, XMLObj *obj)
 {
@@ -224,9 +230,9 @@ bool RGWXMLDecoder::decode_xml(const char *name, T& val, XMLObj *obj, bool manda
 
   try {
     decode_xml_obj(val, o);
-  } catch (err& e) {
+  } catch (const err& e) {
     string s = string(name) + ": ";
-    s.append(e.message);
+    s.append(e.what());
     throw err(s);
   }
 
@@ -253,9 +259,9 @@ bool RGWXMLDecoder::decode_xml(const char *name, std::vector<T>& v, XMLObj *obj,
     T val;
     try {
       decode_xml_obj(val, o);
-    } catch (err& e) {
+    } catch (const err& e) {
       string s = string(name) + ": ";
-      s.append(e.message);
+      s.append(e.what());
       throw err(s);
     }
     v.push_back(val);
@@ -280,9 +286,9 @@ bool RGWXMLDecoder::decode_xml(const char *name, C& container, void (*cb)(C&, XM
 
   try {
     decode_xml_obj(container, cb, o);
-  } catch (err& e) {
+  } catch (const err& e) {
     string s = string(name) + ": ";
-    s.append(e.message);
+    s.append(e.what());
     throw err(s);
   }
 
@@ -301,10 +307,10 @@ void RGWXMLDecoder::decode_xml(const char *name, T& val, T& default_val, XMLObj
 
   try {
     decode_xml_obj(val, o);
-  } catch (err& e) {
+  } catch (const err& e) {
     val = default_val;
     string s = string(name) + ": ";
-    s.append(e.message);
+    s.append(e.what());
     throw err(s);
   }
 }
@@ -347,6 +353,23 @@ static void do_encode_xml(const char *name, const std::list<T>& l, const char *e
   f->close_section();
 }
 
+template<class T>
+static void encode_xml(const char *name, const std::vector<T>& l, ceph::Formatter *f)
+{
+  for (typename std::vector<T>::const_iterator iter = l.begin(); iter != l.end(); ++iter) {
+    encode_xml(name, *iter, f);
+  }
+}
+
+template<class T>
+static void encode_xml(const char *name, const std::optional<T>& o, ceph::Formatter *f)
+{
+  if (!o) {
+    return;
+  }
+
+  encode_xml(name, *o, f);
+}
 
 
 #endif