Tekkotsu Homepage
Demos
Overview
Downloads
Dev. Resources
Reference
Credits

plistBase.cc

Go to the documentation of this file.
00001 #include "plistBase.h"
00002 #include <libxml/xmlmemory.h>
00003 #include <libxml/parser.h>
00004 
00005 //better to put this here instead of the header
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     // find first element node within the plist
00053     xmlNode* cur=root->children;
00054     while(cur!=NULL && cur->type!=XML_ELEMENT_NODE)
00055       cur=cur->next;
00056     if(cur==NULL) //empty plist
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++; //increment early in case the listener changes subscription
00119       (*cur)->plistValueChanged(*this);
00120     }
00121   }
00122     
00123 } //namespace plist
00124 
00125 
00126 /*! @file
00127  * @brief 
00128  * @author Ethan Tira-Thompson (ejt) (Creator)
00129  *
00130  * $Author: ejt $
00131  * $Name: tekkotsu-3_0 $
00132  * $Revision: 1.1 $
00133  * $State: Exp $
00134  * $Date: 2005/12/22 21:32:28 $
00135  */

Tekkotsu v3.0
Generated Wed Oct 4 00:03:45 2006 by Doxygen 1.4.7