#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()
{
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;
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;
}
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()
{
}
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;
}
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
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::
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);
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;
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;
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;
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;
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) {
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;
}
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());
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);
void encode_xml(const char *name, bool val, Formatter *f)
{
- string s;
+ std::string s;
if (val)
s = "True";
else
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);
}