mirror of
https://projects.vdr-developer.org/git/vdr-plugin-skindesigner.git
synced 2023-10-19 17:58:31 +02:00
forgot to add new files
This commit is contained in:
parent
5a6fb850b3
commit
5df1af0e17
184
libcore/libxmlwrapper.c
Normal file
184
libcore/libxmlwrapper.c
Normal file
@ -0,0 +1,184 @@
|
||||
#include "../libcore/helpers.h"
|
||||
#include "libxmlwrapper.h"
|
||||
|
||||
void SkinDesignerXMLErrorHandler (void * userData, xmlErrorPtr error) {
|
||||
esyslog("skindesigner: Error in XML: %s", error->message);
|
||||
}
|
||||
|
||||
cLibXMLWrapper::cLibXMLWrapper(void) {
|
||||
ctxt = NULL;
|
||||
doc = NULL;
|
||||
root = NULL;
|
||||
|
||||
initGenericErrorDefaultFunc(NULL);
|
||||
xmlSetStructuredErrorFunc(NULL, SkinDesignerXMLErrorHandler);
|
||||
ctxt = xmlNewParserCtxt();
|
||||
}
|
||||
|
||||
cLibXMLWrapper::~cLibXMLWrapper() {
|
||||
DeleteDocument();
|
||||
xmlFreeParserCtxt(ctxt);
|
||||
}
|
||||
|
||||
void cLibXMLWrapper::InitLibXML() {
|
||||
xmlInitParser();
|
||||
}
|
||||
|
||||
void cLibXMLWrapper::CleanupLibXML() {
|
||||
xmlCleanupParser();
|
||||
}
|
||||
|
||||
void cLibXMLWrapper::DeleteDocument(void) {
|
||||
if (doc) {
|
||||
xmlFreeDoc(doc);
|
||||
doc = NULL;
|
||||
}
|
||||
while (!nodeStack.empty())
|
||||
nodeStack.pop();
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::ReadXMLFile(const char *path) {
|
||||
if (!ctxt) {
|
||||
esyslog("skindesigner: Failed to allocate parser context");
|
||||
return false;
|
||||
}
|
||||
if (!FileExists(path)) {
|
||||
dsyslog("skindesigner: reading XML Template %s failed", path);
|
||||
return false;
|
||||
}
|
||||
doc = xmlCtxtReadFile(ctxt, path, NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
|
||||
if (!doc) {
|
||||
dsyslog("skindesigner: reading XML Template %s failed", path);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::SetDocument(void) {
|
||||
if (!doc)
|
||||
return false;
|
||||
root = xmlDocGetRootElement(doc);
|
||||
nodeStack.push(root);
|
||||
if (root == NULL) {
|
||||
esyslog("skindesigner: ERROR: XML File is empty");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::Validate(void) {
|
||||
if (!ctxt)
|
||||
return false;
|
||||
if (ctxt->valid == 0) {
|
||||
esyslog("skindesigner: Failed to validate XML File");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::CheckNodeName(const char *name) {
|
||||
if (nodeStack.empty())
|
||||
return false;
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
if (xmlStrcmp(current->name, (const xmlChar *) name)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const char *cLibXMLWrapper::NodeName(void) {
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
return (const char*)current->name;
|
||||
}
|
||||
|
||||
vector<stringpair> cLibXMLWrapper::ParseAttributes(void) {
|
||||
vector<stringpair> attributes;
|
||||
if (nodeStack.empty())
|
||||
return attributes;
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
xmlAttrPtr attrPtr = current->properties;
|
||||
if (attrPtr == NULL) {
|
||||
return attributes;
|
||||
}
|
||||
while (NULL != attrPtr) {
|
||||
string name = (const char*)attrPtr->name;
|
||||
xmlChar *value = NULL;
|
||||
value = xmlGetProp(current, attrPtr->name);
|
||||
if (value)
|
||||
attributes.push_back(stringpair((const char*)attrPtr->name, (const char*)value));
|
||||
attrPtr = attrPtr->next;
|
||||
if (value)
|
||||
xmlFree(value);
|
||||
}
|
||||
return attributes;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::LevelDown(void) {
|
||||
if (nodeStack.empty())
|
||||
return false;
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
xmlNodePtr child = current->xmlChildrenNode;
|
||||
while (child && child->type != XML_ELEMENT_NODE) {
|
||||
child = child->next;
|
||||
}
|
||||
if (!child)
|
||||
return false;
|
||||
nodeStack.push(child);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::LevelUp(void) {
|
||||
if (nodeStack.size() == 1)
|
||||
return false;
|
||||
nodeStack.pop();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::NextNode(void) {
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
current = current->next;
|
||||
while (current && current->type != XML_ELEMENT_NODE) {
|
||||
current = current->next;
|
||||
}
|
||||
if (!current)
|
||||
return false;
|
||||
nodeStack.pop();
|
||||
nodeStack.push(current);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::GetAttribute(string &name, string &value) {
|
||||
bool ok = false;
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
xmlAttrPtr attr = current->properties;
|
||||
if (attr == NULL) {
|
||||
return ok;
|
||||
}
|
||||
xmlChar *xmlValue = NULL;
|
||||
while (NULL != attr) {
|
||||
if (xmlStrcmp(attr->name, (const xmlChar *) name.c_str())) {
|
||||
attr = attr->next;
|
||||
continue;
|
||||
}
|
||||
ok = true;
|
||||
xmlValue = xmlGetProp(current, attr->name);
|
||||
if (xmlValue) {
|
||||
value = (const char*)xmlValue;
|
||||
xmlFree(xmlValue);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool cLibXMLWrapper::GetNodeValue(string &value) {
|
||||
xmlChar *val = NULL;
|
||||
xmlNodePtr current = nodeStack.top();
|
||||
val = xmlNodeListGetString(doc, current->xmlChildrenNode, 1);
|
||||
if (val) {
|
||||
value = (const char*)val;
|
||||
xmlFree(val);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
45
libcore/libxmlwrapper.h
Normal file
45
libcore/libxmlwrapper.h
Normal file
@ -0,0 +1,45 @@
|
||||
#ifndef __LIBXMLWRAPPER_H
|
||||
#define __LIBXMLWRAPPER_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <stack>
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <libxml/xmlerror.h>
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../views/viewhelpers.h"
|
||||
|
||||
class cLibXMLWrapper {
|
||||
private:
|
||||
xmlParserCtxtPtr ctxt;
|
||||
xmlDocPtr doc;
|
||||
xmlNodePtr root;
|
||||
xmlNodePtr current;
|
||||
stack<xmlNodePtr> nodeStack;
|
||||
protected:
|
||||
void DeleteDocument(void);
|
||||
bool ReadXMLFile(const char *path);
|
||||
bool SetDocument(void);
|
||||
bool Validate(void);
|
||||
bool CheckNodeName(const char *name);
|
||||
const char *NodeName(void);
|
||||
vector<stringpair> ParseAttributes(void);
|
||||
bool LevelDown(void);
|
||||
bool LevelUp(void);
|
||||
bool NextNode(void);
|
||||
bool GetAttribute(string &name, string &value);
|
||||
bool GetNodeValue(string &value);
|
||||
public:
|
||||
cLibXMLWrapper(void);
|
||||
virtual ~cLibXMLWrapper(void);
|
||||
static void InitLibXML();
|
||||
static void CleanupLibXML();
|
||||
};
|
||||
|
||||
#endif //__LIBXMLWRAPPER_H
|
Loading…
x
Reference in New Issue
Block a user