00001 #include "plist.h"
00002
00003 using namespace std;
00004
00005 namespace plist {
00006
00007 ObjectBase* loadXML(xmlNode* node) {
00008 ObjectBase* obj=NULL;
00009 if(ObjectBase::xNodeHasName(node,"array")==0)
00010 obj=new Array(true);
00011 else if(ObjectBase::xNodeHasName(node,"dict")==0)
00012 obj=new Dictionary(true);
00013 else if(ObjectBase::xNodeHasName(node,"real")==0)
00014 obj=new Primitive<double>;
00015 else if(ObjectBase::xNodeHasName(node,"integer")==0)
00016 obj=new Primitive<long>;
00017 else if(ObjectBase::xNodeHasName(node,"string")==0)
00018 obj=new Primitive<std::string>;
00019 else if(ObjectBase::xNodeHasName(node,"true")==0)
00020 obj=new Primitive<bool>;
00021 else if(ObjectBase::xNodeHasName(node,"false")==0)
00022 obj=new Primitive<bool>;
00023 else
00024 return NULL;
00025 obj->loadXML(node);
00026 return obj;
00027 }
00028
00029
00030 class PolymorphicLoader : public XMLLoadSave {
00031 public:
00032 PolymorphicLoader() : XMLLoadSave(), obj(NULL) {}
00033 virtual ~PolymorphicLoader() {}
00034 PolymorphicLoader(const PolymorphicLoader& p) : XMLLoadSave(p), obj(NULL) {}
00035 PolymorphicLoader& operator=(const PolymorphicLoader& p) { XMLLoadSave::operator=(p); return *this; }
00036 virtual void loadXML(xmlNode* node) { obj=plist::loadXML(node); }
00037 virtual void saveXML(xmlNode * ) const {*(int*)NULL=0xDEADDEAD;}
00038 ObjectBase * obj;
00039 };
00040
00041 ObjectBase* loadFile(const std::string& file) {
00042 PolymorphicLoader loader;
00043 if(!loader.loadFile(file.c_str()))
00044 return NULL;
00045 return loader.obj;
00046 }
00047
00048 ObjectBase* loadBuffer(const char* buf, unsigned int len) {
00049 PolymorphicLoader loader;
00050 if(!loader.loadBuffer(buf,len))
00051 return NULL;
00052 return loader.obj;
00053 }
00054
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066