From 6ebc6a3177b9b104db0bfeb24869b21044430903 Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Sun, 3 Nov 2013 12:08:09 -0500 Subject: [PATCH] Implementations of XmlCategoryParser and XmlVendorParser. --- app/glabels_main.cpp | 22 ++++++- libglabels/CMakeLists.txt | 2 + libglabels/XmlCategoryParser.cpp | 106 +++++++++++++++++++++++++++++++ libglabels/XmlCategoryParser.h | 46 ++++++++++++++ libglabels/XmlUtil.cpp | 9 ++- libglabels/XmlVendorParser.cpp | 106 +++++++++++++++++++++++++++++++ libglabels/XmlVendorParser.h | 46 ++++++++++++++ 7 files changed, 333 insertions(+), 4 deletions(-) create mode 100644 libglabels/XmlCategoryParser.cpp create mode 100644 libglabels/XmlCategoryParser.h create mode 100644 libglabels/XmlVendorParser.cpp create mode 100644 libglabels/XmlVendorParser.h diff --git a/app/glabels_main.cpp b/app/glabels_main.cpp index f8d5a1a..7764ce3 100644 --- a/app/glabels_main.cpp +++ b/app/glabels_main.cpp @@ -26,6 +26,8 @@ ////// TEMPORARY TESTING //////// #include "libglabels/XmlPaperParser.h" +#include "libglabels/XmlCategoryParser.h" +#include "libglabels/XmlVendorParser.h" ///////////////////////////////// using namespace gLabels; @@ -42,9 +44,23 @@ int main( int argc, char **argv ) Db::init(); ////// TEMPORARY TESTING //////// - XmlPaperParser parser; - parser.readFile( "/usr/local/share/libglabels-3.0/templates/paper-sizes.xml" ); - Db::printKnownPapers(); + { + XmlPaperParser parser; + parser.readFile( "/usr/local/share/libglabels-3.0/templates/paper-sizes.xml" ); + Db::printKnownPapers(); + } + + { + XmlCategoryParser parser; + parser.readFile( "/usr/local/share/libglabels-3.0/templates/categories.xml" ); + Db::printKnownCategories(); + } + + { + XmlVendorParser parser; + parser.readFile( "/usr/local/share/libglabels-3.0/templates/vendors.xml" ); + Db::printKnownVendors(); + } ///////////////////////////////// MainWindow mainWin; diff --git a/libglabels/CMakeLists.txt b/libglabels/CMakeLists.txt index 5e52ed9..9d2fbed 100644 --- a/libglabels/CMakeLists.txt +++ b/libglabels/CMakeLists.txt @@ -18,7 +18,9 @@ set (libglabels_sources StrUtil.cpp Template.cpp Db.cpp + XmlCategoryParser.cpp XmlPaperParser.cpp + XmlVendorParser.cpp XmlUtil.cpp ) diff --git a/libglabels/XmlCategoryParser.cpp b/libglabels/XmlCategoryParser.cpp new file mode 100644 index 0000000..1a8a218 --- /dev/null +++ b/libglabels/XmlCategoryParser.cpp @@ -0,0 +1,106 @@ +/* XmlCategoryParser.cpp + * + * Copyright (C) 2013 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#include "XmlCategoryParser.h" + +#include +#include +#include +#include + +#include "Category.h" +#include "XmlUtil.h" +#include "Db.h" + + +namespace libglabels +{ + + bool XmlCategoryParser::readFile( const QString &fileName ) + { + QFile file( fileName ); + + if ( !file.open( QFile::ReadOnly | QFile::Text) ) + { + std::cerr << "Error: Cannot read file " << qPrintable(fileName) + << ": " << qPrintable(file.errorString()) + << std::endl; + return false; + } + + + QDomDocument doc; + QString errorString; + int errorLine; + int errorColumn; + + if ( !doc.setContent( &file, false, &errorString, &errorLine, &errorColumn ) ) + { + std::cerr << "Error: Parse error at line " << errorLine + << "column " << errorColumn + << ": " << qPrintable(errorString) + << std::endl; + return false; + } + + QDomElement root = doc.documentElement(); + if ( root.tagName() != "Glabels-categories" ) + { + std::cerr << "Error: Not a Glabels-categories file" << std::endl; + return false; + } + + parseRootNode( root ); + return true; + } + + + void XmlCategoryParser::parseRootNode( const QDomElement &node ) + { + for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() ) + { + if ( child.toElement().tagName() == "Category" ) + { + parseCategoryNode( child.toElement() ); + } + else if ( !child.isComment() ) + { + std::cerr << "Warning: bad element: " << qPrintable(child.toElement().tagName()) + << ", Ignored" + << std::endl; + } + } + } + + + void XmlCategoryParser::parseCategoryNode( const QDomElement &node ) + { + QString id = XmlUtil::getAttr( node, "id", "" ); + QString name = XmlUtil::getAttrI18n( node, "name", "" ); + + Category *category = new Category( id, name ); + if ( category != NULL ) + { + Db::registerCategory( category ); + } + } + +} + diff --git a/libglabels/XmlCategoryParser.h b/libglabels/XmlCategoryParser.h new file mode 100644 index 0000000..953e98c --- /dev/null +++ b/libglabels/XmlCategoryParser.h @@ -0,0 +1,46 @@ +/* XmlCategoryParser.h + * + * Copyright (C) 2013 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#ifndef libglabels_XmlCategoryParser_h +#define libglabels_XmlCategoryParser_h + + +#include +#include + + +namespace libglabels +{ + + class XmlCategoryParser + { + public: + XmlCategoryParser() {} + + bool readFile( const QString &fileName ); + + private: + void parseRootNode( const QDomElement &node ); + void parseCategoryNode( const QDomElement &node ); + }; + +} + +#endif // libglabels_XmlCategoryParser_h diff --git a/libglabels/XmlUtil.cpp b/libglabels/XmlUtil.cpp index 883883d..fd27cfb 100644 --- a/libglabels/XmlUtil.cpp +++ b/libglabels/XmlUtil.cpp @@ -152,7 +152,14 @@ namespace libglabels QString XmlUtil::getAttrI18n( const QDomElement &node, const QString &name, const QString &default_value ) { // TODO: are translations done in a compatable way, so that we can use "_name" attributes? - return node.attribute( QString("_").append(name), default_value ); + QString i18nString = node.attribute( QString("_").append(name), "" ); + + if ( i18nString == "" ) + { + return node.attribute( name, default_value ); + } + + return i18nString; } diff --git a/libglabels/XmlVendorParser.cpp b/libglabels/XmlVendorParser.cpp new file mode 100644 index 0000000..29354a7 --- /dev/null +++ b/libglabels/XmlVendorParser.cpp @@ -0,0 +1,106 @@ +/* XmlVendorParser.cpp + * + * Copyright (C) 2013 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#include "XmlVendorParser.h" + +#include +#include +#include +#include + +#include "Vendor.h" +#include "XmlUtil.h" +#include "Db.h" + + +namespace libglabels +{ + + bool XmlVendorParser::readFile( const QString &fileName ) + { + QFile file( fileName ); + + if ( !file.open( QFile::ReadOnly | QFile::Text) ) + { + std::cerr << "Error: Cannot read file " << qPrintable(fileName) + << ": " << qPrintable(file.errorString()) + << std::endl; + return false; + } + + + QDomDocument doc; + QString errorString; + int errorLine; + int errorColumn; + + if ( !doc.setContent( &file, false, &errorString, &errorLine, &errorColumn ) ) + { + std::cerr << "Error: Parse error at line " << errorLine + << "column " << errorColumn + << ": " << qPrintable(errorString) + << std::endl; + return false; + } + + QDomElement root = doc.documentElement(); + if ( root.tagName() != "Glabels-vendors" ) + { + std::cerr << "Error: Not a Glabels-vendors file" << std::endl; + return false; + } + + parseRootNode( root ); + return true; + } + + + void XmlVendorParser::parseRootNode( const QDomElement &node ) + { + for ( QDomNode child = node.firstChild(); !child.isNull(); child = child.nextSibling() ) + { + if ( child.toElement().tagName() == "Vendor" ) + { + parseVendorNode( child.toElement() ); + } + else if ( !child.isComment() ) + { + std::cerr << "Warning: bad element: " << qPrintable(child.toElement().tagName()) + << ", Ignored" + << std::endl; + } + } + } + + + void XmlVendorParser::parseVendorNode( const QDomElement &node ) + { + QString name = XmlUtil::getAttr( node, "name", "" ); + QString url = XmlUtil::getAttr( node, "url", "" ); + + Vendor *vendor = new Vendor( name, url ); + if ( vendor != NULL ) + { + Db::registerVendor( vendor ); + } + } + +} + diff --git a/libglabels/XmlVendorParser.h b/libglabels/XmlVendorParser.h new file mode 100644 index 0000000..baccd1d --- /dev/null +++ b/libglabels/XmlVendorParser.h @@ -0,0 +1,46 @@ +/* XmlVendorParser.h + * + * Copyright (C) 2013 Jim Evins + * + * This file is part of gLabels-qt. + * + * gLabels-qt is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * gLabels-qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gLabels-qt. If not, see . + */ + +#ifndef libglabels_XmlVendorParser_h +#define libglabels_XmlVendorParser_h + + +#include +#include + + +namespace libglabels +{ + + class XmlVendorParser + { + public: + XmlVendorParser() {} + + bool readFile( const QString &fileName ); + + private: + void parseRootNode( const QDomElement &node ); + void parseVendorNode( const QDomElement &node ); + }; + +} + +#endif // libglabels_XmlVendorParser_h