diff options
Diffstat (limited to 'backend')
-rw-r--r-- | backend/epub/Makefile.am | 7 | ||||
-rw-r--r-- | backend/epub/epub-document.c | 125 | ||||
-rw-r--r-- | backend/epub/epub-document.h | 25 |
3 files changed, 154 insertions, 3 deletions
diff --git a/backend/epub/Makefile.am b/backend/epub/Makefile.am index 6ecbdb2a..4371cde8 100644 --- a/backend/epub/Makefile.am +++ b/backend/epub/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = \ +AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/libdocument \ -DMATELOCALEDIR=\"$(datadir)/locale\" \ @@ -9,8 +9,9 @@ AM_CPPFLAGS = \ backend_LTLIBRARIES = libepubdocument.la -libepubdocument_la_SOURCES = - +libepubdocument_la_SOURCES = \ + epub-document.c \ + epub-document.h libepubdocument_la_LDFLAGS = $(BACKEND_LIBTOOL_FLAGS) libepubdocument_la_LIBADD = \ diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c new file mode 100644 index 00000000..c6bbf684 --- /dev/null +++ b/backend/epub/epub-document.c @@ -0,0 +1,125 @@ +#include "epub-document.h" + +static xmlDocPtr xmldocument ; +static xmlNodePtr xmlroot ; +static xmlChar* xmlkey ; +static xmlChar* retval ; + +/*Open a XML document for reading */ +gboolean +openXmlDocument ( const gchar* filename ) +{ + xmldocument = xmlParseFile(filename); + + if ( xmldocument == NULL ) + { + return FALSE ; + } + else + { + return TRUE ; + } +} + +/** + *Check if the root value is same as rootname . + *if supplied rootvalue = NULL ,just set root to rootnode . +**/ +gboolean +checkRoot(xmlChar* rootname) +{ + xmlroot = xmlDocGetRootElement(xmldocument); + + if (xmlroot == NULL) { + + xmlFreeDoc(xmldocument); + return FALSE; + } + + if ( rootname == NULL ) + { + return TRUE ; + } + + if ( !xmlStrcmp(xmlroot->name,rootname)) + { + return TRUE ; + } + else + { + return FALSE; + } +} + +xmlChar* +parseXMLchildren( xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr topchild,children ; + + retval = NULL ; + topchild = xmlroot->xmlChildrenNode ; + + while ( topchild != NULL ) + { + if ( !xmlStrcmp(topchild->name,parserfor) ) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(children,attributename); + return retval; + } + else + { + retval = xmlNodeListGetString(xmldocument,topchild->xmlChildrenNode, 1); + return retval ; + } + } + parseChildren( topchild , parserfor,rettype,attributename) ; + + topchild = topchild->next ; + } + + return retval ; +} + +void parseChildren(xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr child = parent->xmlChildrenNode ; + + while ( child != NULL ) + { + if ( !xmlStrcmp(child->name,parserfor)) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(child,attributename); + } + else + { + retval = xmlNodeListGetString(xmldocument,child->xmlChildrenNode, 1); + } + return ; + } + + /*return already if we have retval set*/ + if ( retval != NULL ) + { + return ; + } + + parseChildren(child,parserfor,rettype,attributename) ; + child = child->next ; + } +} + +void xmlFreeAll() +{ + xmlFreeDoc(xmldocument); + xmlFree(retval); + xmlFree(xmlkey); +}
\ No newline at end of file diff --git a/backend/epub/epub-document.h b/backend/epub/epub-document.h new file mode 100644 index 00000000..157ced04 --- /dev/null +++ b/backend/epub/epub-document.h @@ -0,0 +1,25 @@ +#include <gtk/gtk.h> +#include <glib.h> +#include <libxml/parser.h> +#include <libxml/xmlmemory.h> + +typedef enum +{ + xmlattribute, + xmlkeyword +}XMLparsereturntype; + +gboolean openXmlDocument ( const gchar* filename ); + +gboolean checkRoot (xmlChar* rootname); + +void parseChildren (xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +xmlChar* parseXMLchildren (xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +void xmlFreeAll();
\ No newline at end of file |