]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/rgw/rgw_xml.cc
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / rgw / rgw_xml.cc
old mode 100644 (file)
new mode 100755 (executable)
index ff067a4..4ecd9d6
@@ -9,14 +9,10 @@
 #include <expat.h>
 
 #include "include/types.h"
+#include "include/utime.h"
 
-#include "rgw_common.h"
 #include "rgw_xml.h"
 
-#define dout_subsys ceph_subsys_rgw
-
-using namespace std;
-
 XMLObjIter::
 XMLObjIter()
 {
@@ -45,6 +41,16 @@ get_next()
   return obj;
 }
 
+bool XMLObjIter::get_name(std::string& name) const
+{
+  if (cur == end) {
+    return false;
+  }
+
+  name = cur->first;
+  return true;
+}
+
 ostream& operator<<(ostream &out, const XMLObj &obj) {
    out << obj.obj_type << ": " << obj.data;
    return out;
@@ -61,7 +67,7 @@ xml_start(XMLObj *parent, const char *el, const char **attr)
   this->parent = parent;
   obj_type = el;
   for (int i = 0; attr[i]; i += 2) {
-    attr_map[attr[i]] = string(attr[i + 1]);
+    attr_map[attr[i]] = std::string(attr[i + 1]);
   }
   return true;
 }
@@ -78,12 +84,18 @@ xml_handle_data(const char *s, int len)
   data.append(s, len);
 }
 
-string& XMLObj::
-XMLObj::get_data()
+const std::string& XMLObj::
+XMLObj::get_data() const
 {
   return data;
 }
 
+const std::string& XMLObj::
+XMLObj::get_obj_type() const
+{
+  return obj_type;
+}
+
 XMLObj *XMLObj::
 XMLObj::get_parent()
 {
@@ -91,15 +103,15 @@ XMLObj::get_parent()
 }
 
 void XMLObj::
-add_child(string el, XMLObj *obj)
+add_child(const std::string& el, XMLObj *obj)
 {
-  children.insert(pair<string, XMLObj *>(el, obj));
+  children.insert(std::pair<std::string, XMLObj *>(el, obj));
 }
 
 bool XMLObj::
-get_attr(string name, string& attr)
+get_attr(const std::string& name, std::string& attr) const
 {
-  map<string, string>::iterator iter = attr_map.find(name);
+  const std::map<std::string, std::string>::const_iterator iter = attr_map.find(name);
   if (iter == attr_map.end())
     return false;
   attr = iter->second;
@@ -107,12 +119,11 @@ get_attr(string name, string& attr)
 }
 
 XMLObjIter XMLObj::
-find(string name)
+find(const std::string& name)
 {
   XMLObjIter iter;
-  map<string, XMLObj *>::iterator first;
-  map<string, XMLObj *>::iterator last;
-  first = children.find(name);
+  const XMLObjIter::const_map_iter_t first = children.find(name);
+  XMLObjIter::const_map_iter_t last;
   if (first != children.end()) {
     last = children.upper_bound(name);
   }else
@@ -121,27 +132,28 @@ find(string name)
   return iter;
 }
 
-XMLObj *XMLObj::
-find_first(string name)
+XMLObjIter XMLObj::find_first()
 {
   XMLObjIter iter;
-  map<string, XMLObj *>::iterator first;
-  first = children.find(name);
-  if (first != children.end())
-    return first->second;
-  return NULL;
+  const XMLObjIter::const_map_iter_t first = children.begin();
+  const XMLObjIter::const_map_iter_t last = children.end();
+  iter.set(first, last);
+  return iter;
 }
-static void xml_start(void *data, const char *el, const char **attr) {
-  RGWXMLParser *handler = static_cast<RGWXMLParser *>(data);
 
-  if (!handler->xml_start(el, attr))
-    handler->set_failure();
+XMLObj *XMLObj::
+find_first(const std::string& name)
+{
+  const XMLObjIter::const_map_iter_t first = children.find(name);
+  if (first != children.end())
+    return first->second;
+  return nullptr;
 }
 
 RGWXMLParser::
-RGWXMLParser() : buf(NULL), buf_len(0), cur_obj(NULL), success(true)
+RGWXMLParser() : buf(nullptr), buf_len(0), cur_obj(nullptr), success(true), init_called(false)
 {
-  p = XML_ParserCreate(NULL);
+  p = XML_ParserCreate(nullptr);
 }
 
 RGWXMLParser::
@@ -150,76 +162,67 @@ RGWXMLParser::
   XML_ParserFree(p);
 
   free(buf);
-  list<XMLObj *>::iterator iter;
+  std::list<XMLObj *>::const_iterator iter;
   for (iter = allocated_objs.begin(); iter != allocated_objs.end(); ++iter) {
     XMLObj *obj = *iter;
     delete obj;
   }
 }
 
-
-bool RGWXMLParser::xml_start(const char *el, const char **attr) {
-  XMLObj * obj = alloc_obj(el);
+void RGWXMLParser::call_xml_start(void* user_data, const char *el, const char **attr) {
+  RGWXMLParser *handler = static_cast<RGWXMLParser *>(user_data);
+  XMLObj * obj = handler->alloc_obj(el);
   if (!obj) {
-    unallocated_objs.push_back(XMLObj());
-    obj = &unallocated_objs.back();
+    handler->unallocated_objs.push_back(XMLObj());
+    obj = &handler->unallocated_objs.back();
   } else {
-    allocated_objs.push_back(obj);
+    handler->allocated_objs.push_back(obj);
   }
-  if (!obj->xml_start(cur_obj, el, attr))
-    return false;
-  if (cur_obj) {
-    cur_obj->add_child(el, obj);
+  if (!obj->xml_start(handler->cur_obj, el, attr)) {
+    handler->success = false;
+    return;
+  }
+  if (handler->cur_obj) {
+    handler->cur_obj->add_child(el, obj);
   } else {
-    children.insert(pair<string, XMLObj *>(el, obj));
+    handler->children.insert(std::pair<std::string, XMLObj *>(el, obj));
   }
-  cur_obj = obj;
-
-  objs.push_back(obj);
-  return true;
-}
-
-static void xml_end(void *data, const char *el) {
-  RGWXMLParser *handler = static_cast<RGWXMLParser *>(data);
-
-  if (!handler->xml_end(el))
-    handler->set_failure();
-}
+  handler->cur_obj = obj;
 
-bool RGWXMLParser::xml_end(const char *el) {
-  XMLObj *parent_obj = cur_obj->get_parent();
-  if (!cur_obj->xml_end(el))
-    return false;
-  cur_obj = parent_obj;
-  return true;
+  handler->objs.push_back(obj);
 }
 
-static void handle_data(void *data, const char *s, int len)
-{
-  RGWXMLParser *handler = static_cast<RGWXMLParser *>(data);
-
-  handler->handle_data(s, len);
+void RGWXMLParser::call_xml_end(void* user_data, const char *el) {
+  RGWXMLParser *handler = static_cast<RGWXMLParser *>(user_data);
+  XMLObj *parent_obj = handler->cur_obj->get_parent();
+  if (!handler->cur_obj->xml_end(el)) {
+    handler->success = false;
+    return;
+  }
+  handler->cur_obj = parent_obj;
 }
 
-void RGWXMLParser::handle_data(const char *s, int len)
+void RGWXMLParser::call_xml_handle_data(void* user_data, const char *s, int len)
 {
-  cur_obj->xml_handle_data(s, len);
+  RGWXMLParser *handler = static_cast<RGWXMLParser *>(user_data);
+  handler->cur_obj->xml_handle_data(s, len);
 }
 
-
 bool RGWXMLParser::init()
 {
   if (!p) {
     return false;
   }
-  XML_SetElementHandler(p, ::xml_start, ::xml_end);
-  XML_SetCharacterDataHandler(p, ::handle_data);
+  init_called = true;
+  XML_SetElementHandler(p, RGWXMLParser::call_xml_start, RGWXMLParser::call_xml_end);
+  XML_SetCharacterDataHandler(p, RGWXMLParser::call_xml_handle_data);
   XML_SetUserData(p, (void *)this);
   return true;
 }
 
 bool RGWXMLParser::parse(const char *_buf, int len, int done)
 {
+  ceph_assert(init_called);
   int pos = buf_len;
   char *tmp_buf;
   tmp_buf = (char *)realloc(buf, buf_len + len);
@@ -247,7 +250,7 @@ bool RGWXMLParser::parse(const char *_buf, int len, int done)
 
 void decode_xml_obj(unsigned long& val, XMLObj *obj)
 {
-  string& s = obj->get_data();
+  auto& s = obj->get_data();
   const char *start = s.c_str();
   char *p;
 
@@ -276,7 +279,7 @@ void decode_xml_obj(unsigned long& val, XMLObj *obj)
 
 void decode_xml_obj(long& val, XMLObj *obj)
 {
-  string s = obj->get_data();
+  const std::string s = obj->get_data();
   const char *start = s.c_str();
   char *p;
 
@@ -304,7 +307,7 @@ void decode_xml_obj(long& val, XMLObj *obj)
 
 void decode_xml_obj(long long& val, XMLObj *obj)
 {
-  string s = obj->get_data();
+  const std::string s = obj->get_data();
   const char *start = s.c_str();
   char *p;
 
@@ -332,7 +335,7 @@ void decode_xml_obj(long long& val, XMLObj *obj)
 
 void decode_xml_obj(unsigned long long& val, XMLObj *obj)
 {
-  string s = obj->get_data();
+  const std::string s = obj->get_data();
   const char *start = s.c_str();
   char *p;
 
@@ -343,7 +346,7 @@ void decode_xml_obj(unsigned long long& val, XMLObj *obj)
 
  if ((errno == ERANGE && val == ULLONG_MAX) ||
      (errno != 0 && val == 0)) {
-   throw RGWXMLDecoder::err("failed to number");
+   throw RGWXMLDecoder::err("failed to parse number");
  }
 
  if (p == start) {
@@ -386,12 +389,12 @@ void decode_xml_obj(unsigned& val, XMLObj *obj)
 
 void decode_xml_obj(bool& val, XMLObj *obj)
 {
-  string s = obj->get_data();
-  if (strcasecmp(s.c_str(), "true") == 0) {
+  const std::string s = obj->get_data();
+  if (strncasecmp(s.c_str(), "true", 8) == 0) {
     val = true;
     return;
   }
-  if (strcasecmp(s.c_str(), "false") == 0) {
+  if (strncasecmp(s.c_str(), "false", 8) == 0) {
     val = false;
     return;
   }
@@ -402,7 +405,7 @@ void decode_xml_obj(bool& val, XMLObj *obj)
 
 void decode_xml_obj(bufferlist& val, XMLObj *obj)
 {
-  string s = obj->get_data();
+  const std::string s = obj->get_data();
 
   bufferlist bl;
   bl.append(s.c_str(), s.size());
@@ -415,7 +418,7 @@ void decode_xml_obj(bufferlist& val, XMLObj *obj)
 
 void decode_xml_obj(utime_t& val, XMLObj *obj)
 {
-  string s = obj->get_data();
+  const std::string s = obj->get_data();
   uint64_t epoch;
   uint64_t nsec;
   int r = utime_t::parse_date(s, &epoch, &nsec);
@@ -438,7 +441,7 @@ void encode_xml(const char *name, const char *val, Formatter *f)
 
 void encode_xml(const char *name, bool val, Formatter *f)
 {
-  string s;
+  std::string s;
   if (val)
     s = "True";
   else
@@ -490,7 +493,7 @@ void encode_xml(const char *name, const bufferlist& bl, Formatter *f)
   bufferlist b64;
   src.encode_base64(b64);
 
-  string s(b64.c_str(), b64.length());
+  const std::string s(b64.c_str(), b64.length());
 
   encode_xml(name, s, f);
 }