00001 #include "plistBase.h"
00002 #include <libxml/xmlmemory.h>
00003 #include <libxml/parser.h>
00004
00005
00006 using namespace std;
00007
00008 namespace plist {
00009
00010 ObjectBase::ObjectBase()
00011 : XMLLoadSave()
00012 {}
00013
00014 ObjectBase::~ObjectBase() {}
00015
00016 void ObjectBase::setParseTree(xmlDoc * doc) const {
00017 XMLLoadSave::setParseTree(doc);
00018 if(xmldocument==NULL)
00019 return;
00020 xmlNodePtr cur = xmlNewNode(NULL,(const xmlChar*)"plist");
00021 xmlNewProp(cur,(const xmlChar*)"version",(const xmlChar*)"1.0");
00022 xmlDocSetRootElement(xmldocument,cur);
00023 xmlCreateIntSubset(xmldocument,(const xmlChar*)"plist",(const xmlChar*)"-//Apple Computer//DTD PLIST 1.0//EN",(const xmlChar*)"http://www.apple.com/DTDs/PropertyList-1.0.dtd");
00024 }
00025
00026 xmlNode* ObjectBase::FindRootXMLElement(xmlDoc* doc) const {
00027 if(doc==NULL)
00028 return NULL;
00029 xmlNode* root=XMLLoadSave::FindRootXMLElement(doc);
00030 string filename;
00031 if(doc->name!=NULL && doc->name[0]!='\0') {
00032 filename="document '";
00033 filename+=doc->name;
00034 filename+="' ";
00035 }
00036 if (root == NULL)
00037 throw bad_format(root,"Error: plist read empty document");
00038 if (xmlStrcmp(root->name, (const xmlChar *)"plist"))
00039 throw bad_format(root,"Error: plist read document of the wrong type, root node != plist");
00040 if (!xmlHasProp(root,(const xmlChar*)"version"))
00041 cerr << "Warning: plist " << filename << "does not carry version number, assuming 1.0" << endl;
00042 else {
00043 xmlChar* strv=xmlGetProp(root,(const xmlChar*)"version");
00044 double version=strtod((const char*)strv,NULL);
00045 if(version>1.0)
00046 cerr << "WARNING: plist " << filename << "is version " << strv << ", this software only knows 1.0. Trying anyway..." << endl;
00047 if(version==0)
00048 cerr << "WARNING: plist " << filename << "seems to have invalid version '" << strv << "', this software only knows 1.0. Trying anyway..." << endl;
00049 xmlFree(strv);
00050 }
00051
00052
00053 xmlNode* cur=root->children;
00054 while(cur!=NULL && cur->type!=XML_ELEMENT_NODE)
00055 cur=cur->next;
00056 if(cur==NULL)
00057 cur = xmlNewChild(root,NULL,(const xmlChar*)"",NULL);
00058 return cur;
00059 }
00060
00061 bool ObjectBase::xNodeHasName(xmlNode* node, const char* name) {
00062 return xmlStrcasecmp(node->name,(const xmlChar*)name)==0;
00063 }
00064 const xmlChar* ObjectBase::xNodeGetName(xmlNode* node) {
00065 return node->name;
00066 }
00067 xmlNode* ObjectBase::xNodeGetChildren(xmlNode* node) {
00068 return node->children;
00069 }
00070 xmlNode* ObjectBase::xNodeGetNextNode(xmlNode* node) {
00071 return node->next;
00072 }
00073 xmlNode* ObjectBase::xNodeGetParent(xmlNode* node) {
00074 return node->parent;
00075 }
00076 xmlDoc* ObjectBase::xNodeGetDoc(xmlNode* node) {
00077 return node->doc;
00078 }
00079
00080
00081 PrimitiveBase::~PrimitiveBase() {
00082 delete primitiveListeners;
00083 primitiveListeners=NULL;
00084 }
00085
00086 void PrimitiveBase::addPrimitiveListener(PrimitiveListener* vl) {
00087 if(vl!=NULL) {
00088 if(primitiveListeners==NULL)
00089 primitiveListeners=new std::list<PrimitiveListener*>;
00090 primitiveListeners->push_back(vl);
00091 }
00092 }
00093 void PrimitiveBase::removePrimitiveListener(PrimitiveListener* vl) {
00094 if(primitiveListeners==NULL)
00095 return;
00096 std::list<PrimitiveListener*>::iterator it=find(primitiveListeners->begin(),primitiveListeners->end(),vl);
00097 if(it!=primitiveListeners->end()) {
00098 primitiveListeners->erase(it);
00099 if(primitiveListeners->empty()) {
00100 delete primitiveListeners;
00101 primitiveListeners=NULL;
00102 }
00103 }
00104 }
00105 bool PrimitiveBase::isPrimitiveListener(PrimitiveListener* vl) {
00106 if(vl==NULL)
00107 return false;
00108 if(primitiveListeners==NULL)
00109 return false;
00110 std::list<PrimitiveListener*>::iterator it=find(primitiveListeners->begin(),primitiveListeners->end(),vl);
00111 return it!=primitiveListeners->end();
00112 }
00113 void PrimitiveBase::fireValueChanged() const {
00114 if(primitiveListeners==NULL)
00115 return;
00116 std::list<PrimitiveListener*>::const_iterator it=primitiveListeners->begin();
00117 while(it!=primitiveListeners->end()) {
00118 std::list<PrimitiveListener*>::const_iterator cur=it++;
00119 (*cur)->plistValueChanged(*this);
00120 }
00121 }
00122
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135