]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: some more xml reshuffling
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 31 May 2011 21:59:40 +0000 (14:59 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 31 May 2011 21:59:40 +0000 (14:59 -0700)
src/rgw/librgw.cc
src/rgw/rgw_acl.cc
src/rgw/rgw_acl.h
src/rgw/rgw_aclparser.cc
src/rgw/rgw_xml.cc
src/rgw/rgw_xml.h

index e0f07776cbf592f82eb90d58284b9800de441423..e36d87f91757428a52c0267b9f7b031f04bc3dbe 100644 (file)
@@ -96,7 +96,7 @@ int librgw_acl_xml2bin(librgw_t rgw, const char *xml, char **bin, int *bin_len)
 {
   char *bin_ = NULL;
   try {
-    RGWXMLParser parser;
+    RGWACLXMLParser parser;
     if (!parser.init()) {
       return -1000;
     }
index 92cea40de37d8e1f46423fc37a5a1e2c82e11ecc..bb19076fb556f23c99114d2ed2844fda42993220 100644 (file)
@@ -409,31 +409,9 @@ int RGWAccessControlPolicy::get_perm(string& id, int perm_mask) {
   return perm;
 }
 
-static void xml_start(void *data, const char *el, const char **attr) {
-  RGWACLXMLParser *handler = (RGWACLXMLParser *)data;
-
-  if (!handler->xml_start(el, attr))
-    handler->set_failure();
-}
-
-RGWACLXMLParser::
-RGWACLXMLParser() : buf(NULL), buf_len(0), cur_obj(NULL), success(true)
-{
-}
-
-RGWACLXMLParser::
-~RGWACLXMLParser()
+XMLObj *RGWACLXMLParser::alloc_obj(const char *el)
 {
-  free(buf);
-  vector<XMLObj *>::iterator iter;
-  for (iter = objs.begin(); iter != objs.end(); ++iter) {
-    XMLObj *obj = *iter;
-    delete obj;
-  }
-}
-
-bool RGWACLXMLParser::xml_start(const char *el, const char **attr) {
-  XMLObj * obj;
+  XMLObj * obj = NULL;
   if (strcmp(el, "AccessControlPolicy") == 0) {
     obj = new RGWAccessControlPolicy();
   } else if (strcmp(el, "Owner") == 0) {
@@ -454,76 +432,8 @@ bool RGWACLXMLParser::xml_start(const char *el, const char **attr) {
     obj = new ACLURI();
   } else if (strcmp(el, "EmailAddress") == 0) {
     obj = new ACLEmail();
-  } else {
-    obj = new XMLObj();
   }
-  if (!obj->xml_start(cur_obj, el, attr))
-    return false;
-  if (cur_obj) {
-    cur_obj->add_child(el, obj);
-  } else {
-    children.insert(pair<string, XMLObj *>(el, obj));
-  }
-  cur_obj = obj;
-
-  objs.push_back(obj);
-  return true;
-}
-
-static void xml_end(void *data, const char *el) {
-  RGWACLXMLParser *handler = (RGWACLXMLParser *)data;
 
-  if (!handler->xml_end(el))
-    handler->set_failure();
+  return obj;
 }
 
-bool RGWACLXMLParser::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;
-}
-
-static void handle_data(void *data, const char *s, int len)
-{
-  RGWACLXMLParser *handler = (RGWACLXMLParser *)data;
-
-  handler->handle_data(s, len);
-}
-
-void RGWACLXMLParser::handle_data(const char *s, int len)
-{
-  cur_obj->xml_handle_data(s, len);
-}
-
-
-bool RGWACLXMLParser::init()
-{
-  p = XML_ParserCreate(NULL);
-  if (!p) {
-    RGW_LOG(10) << "RGWACLXMLParser::init(): ERROR allocating memory" << dendl;
-    return false;
-  }
-  XML_SetElementHandler(p, ::xml_start, ::xml_end);
-  XML_SetCharacterDataHandler(p, ::handle_data);
-  XML_SetUserData(p, (void *)this);
-  return true;
-}
-
-bool RGWACLXMLParser::parse(const char *_buf, int len, int done)
-{
-  int pos = buf_len;
-  buf = (char *)realloc(buf, buf_len + len);
-  memcpy(&buf[buf_len], _buf, len);
-  buf_len += len;
-
-  success = true;
-  if (!XML_Parse(p, &buf[pos], len, done)) {
-    fprintf(stderr, "Parse error at line %d:\n%s\n",
-             (int)XML_GetCurrentLineNumber(p),
-             XML_ErrorString(XML_GetErrorCode(p)));
-    return false;
-  }
-  return success;
-}
index 6372624ceebc6dc21198d97ec63f346ab7cf2343..5c7f94ccd637aced58eb7446b242e5579df2fa27 100644 (file)
@@ -322,27 +322,11 @@ WRITE_CLASS_ENCODER(RGWAccessControlPolicy)
  * Interfaces with the webserver's XML handling code
  * to parse it in a way that makes sense for the rgw.
  */
-class RGWACLXMLParser : public XMLObj
+class RGWACLXMLParser : public RGWXMLParser
 {
-  XML_Parser p;
-  char *buf;
-  int buf_len;
-  XMLObj *cur_obj;
-  vector<XMLObj *> objs;
+  XMLObj *alloc_obj(const char *el);
 public:
-  RGWACLXMLParser();
-  ~RGWACLXMLParser();
-  bool init();
-  bool xml_start(const char *el, const char **attr);
-  bool xml_end(const char *el);
-  void handle_data(const char *s, int len);
-
-  bool parse(const char *buf, int len, int done);
-  const char *get_xml() { return buf; }
-  void set_failure() { success = false; }
-
-private:
-  bool success;
+  RGWACLXMLParser() {}
 };
 
 #endif
index 55db7c5e0e3d30deb1ba5c4a969bc90c0162e501..54f8c73d191e6f0806955fd5d7e72f4148aff863 100644 (file)
@@ -10,7 +10,7 @@
 using namespace std;
                                   
 int main(int argc, char **argv) {
-  RGWXMLParser parser;
+  RGWACLXMLParser parser;
 
   if (!parser.init())
     exit(1);
index d18c4730564f9387352148736199fe2408b3d847..7a64690737b174518e249f8e6e6985e3088ebd9a 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "include/types.h"
 
+#include "rgw_common.h"
 #include "rgw_xml.h"
 
 using namespace std;
@@ -120,4 +121,101 @@ find_first(string name)
     return first->second;
   return NULL;
 }
+static void xml_start(void *data, const char *el, const char **attr) {
+  RGWXMLParser *handler = (RGWXMLParser *)data;
 
+  if (!handler->xml_start(el, attr))
+    handler->set_failure();
+}
+
+RGWXMLParser::
+RGWXMLParser() : buf(NULL), buf_len(0), cur_obj(NULL), success(true)
+{
+}
+
+RGWXMLParser::
+~RGWXMLParser()
+{
+  free(buf);
+  vector<XMLObj *>::iterator iter;
+  for (iter = objs.begin(); iter != objs.end(); ++iter) {
+    XMLObj *obj = *iter;
+    delete obj;
+  }
+}
+
+bool RGWXMLParser::xml_start(const char *el, const char **attr) {
+  XMLObj * obj = alloc_obj(el);
+  if (!obj) {
+    obj = new XMLObj();
+  }
+  if (!obj->xml_start(cur_obj, el, attr))
+    return false;
+  if (cur_obj) {
+    cur_obj->add_child(el, obj);
+  } else {
+    children.insert(pair<string, XMLObj *>(el, obj));
+  }
+  cur_obj = obj;
+
+  objs.push_back(obj);
+  return true;
+}
+
+static void xml_end(void *data, const char *el) {
+  RGWXMLParser *handler = (RGWXMLParser *)data;
+
+  if (!handler->xml_end(el))
+    handler->set_failure();
+}
+
+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;
+}
+
+static void handle_data(void *data, const char *s, int len)
+{
+  RGWXMLParser *handler = (RGWXMLParser *)data;
+
+  handler->handle_data(s, len);
+}
+
+void RGWXMLParser::handle_data(const char *s, int len)
+{
+  cur_obj->xml_handle_data(s, len);
+}
+
+
+bool RGWXMLParser::init()
+{
+  p = XML_ParserCreate(NULL);
+  if (!p) {
+    RGW_LOG(10) << "RGWXMLParser::init(): ERROR allocating memory" << dendl;
+    return false;
+  }
+  XML_SetElementHandler(p, ::xml_start, ::xml_end);
+  XML_SetCharacterDataHandler(p, ::handle_data);
+  XML_SetUserData(p, (void *)this);
+  return true;
+}
+
+bool RGWXMLParser::parse(const char *_buf, int len, int done)
+{
+  int pos = buf_len;
+  buf = (char *)realloc(buf, buf_len + len);
+  memcpy(&buf[buf_len], _buf, len);
+  buf_len += len;
+
+  success = true;
+  if (!XML_Parse(p, &buf[pos], len, done)) {
+    fprintf(stderr, "Parse error at line %d:\n%s\n",
+             (int)XML_GetCurrentLineNumber(p),
+             XML_ErrorString(XML_GetErrorCode(p)));
+    return false;
+  }
+  return success;
+}
index 2d99dbac7f8edae653d00556066d0fecbb799748..e05a8ac57ddbe3d5d4e40c22b894799b3601fab7 100644 (file)
@@ -72,9 +72,11 @@ class RGWXMLParser : public XMLObj
   int buf_len;
   XMLObj *cur_obj;
   vector<XMLObj *> objs;
+protected:
+  virtual XMLObj *alloc_obj(const char *el) = 0;
 public:
   RGWXMLParser();
-  ~RGWXMLParser();
+  virtual ~RGWXMLParser();
   bool init();
   bool xml_start(const char *el, const char **attr);
   bool xml_end(const char *el);