/* Demo Recorder for MAEMO 5 * Copyright (C) 2010 Dru Moore * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, * or (at your option) any later version, as published by the Free * Software Foundation * * This program 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 this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ namespace IdWorks { namespace XmlHelpers { public static bool parse_project_settings_file(string location, string version, ref SettingsStructures.ProjectSettings project, ref string errors) { bool ret = false; project = SettingsStructures.ProjectSettings(); errors = ""; // prepare the Xml Parser Xml.Parser.init(); // load the document Xml.Doc* doc = Xml.Parser.parse_file(location); if (null != doc) { // load the root node Xml.Node* root = doc->get_root_element(); if (null != root) { // check element is ProjectSettings if ("ProjectSettings" == root->name) { // check version string? doc_version = get_node_attribute(root, "version"); if (null != doc_version && version == doc_version) { // looking good let's get parsing. try { project.from_xml_node(root); ret = true; } catch (GLib.Error ex) { errors = "ProjectSettings parser threw an error."; ret = false; } finally { // no op } } else { errors = "Incorrect version or unversioned document."; } } else { errors = "Not a valid settings file."; } } else { errors = "No root node found."; } // clean up delete doc; } else { errors = "Couldn't parse file as valid XML."; } // clean up the parser Xml.Parser.cleanup(); return ret; } private static string? get_node_attribute(Xml.Node* node, string key) { string? ret = null; // Loop over the passed node's attributes for (Xml.Attr* prop = node->properties; prop != null; prop = prop->next) { string attr_name = prop->name; // Notice the ->children which points to a Node* // (Attr doesn't feature content) string attr_content = prop->children->content; if (key == attr_name) { ret = attr_content; break; } } return ret; } } }