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