//////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2008-2012 The Regents of the University of California // // This file is part of Qbox // // Qbox is distributed under the terms of the GNU General Public License // as published by the Free Software Foundation, either version 2 of // the License, or (at your option) any later version. // See the file COPYING in the root directory of this distribution // or . // //////////////////////////////////////////////////////////////////////////////// // // SpeciesHandler.C // //////////////////////////////////////////////////////////////////////////////// #include "SpeciesHandler.h" #include "Species.h" #include "StrX.h" using namespace xercesc; #include #include #include using namespace std; //////////////////////////////////////////////////////////////////////////////// SpeciesHandler::SpeciesHandler(Species& sp) : sp_(sp) {} //////////////////////////////////////////////////////////////////////////////// SpeciesHandler::~SpeciesHandler() {} //////////////////////////////////////////////////////////////////////////////// void SpeciesHandler::startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const Attributes& attributes) { // cout << " SpeciesHandler::startElement " << StrX(qname) << endl; string locname(XMLString::transcode(localname)); if ( locname == "species" ) { // check for the case where the species is a link to another uri unsigned int len = attributes.getLength(); for (unsigned int index = 0; index < len; index++) { string attrname(XMLString::transcode(attributes.getLocalName(index))); if ( attrname == "name") { current_name = StrX(attributes.getValue(index)).localForm(); sp_.name_ = current_name; } else if ( attrname == "href" ) { current_href = StrX(attributes.getValue(index)).localForm(); sp_.uri_ = current_href; } } } else if ( locname == "projector" ) { unsigned int len = attributes.getLength(); for (unsigned int index = 0; index < len; index++) { string attrname(XMLString::transcode(attributes.getLocalName(index))); if ( attrname == "l") { current_l = atoi(StrX(attributes.getValue(index)).localForm()); } else if ( attrname == "size" ) { current_size = atoi(StrX(attributes.getValue(index)).localForm()); } } } } //////////////////////////////////////////////////////////////////////////////// void SpeciesHandler::endElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, string& content) { string locname(XMLString::transcode(localname)); istringstream stst(content); // cout << " SpeciesHandler::endElement " << StrX(qname) // << " content=" << string(content,0,20) << endl; if ( locname == "description") { // reject ambiguous case where both the href and the definition are given if ( current_href != "" ) { cout << " SpeciesHandler: ambiguous definition: uri=" << StrX(uri) << endl << " using local definition (href: " << current_href << " ignored)" << endl; } sp_.description_ = content; } else if ( locname == "atomic_number" ) { stst >> sp_.atomic_number_; } else if ( locname == "mass" ) { stst >> sp_.mass_; } else if ( locname == "symbol" ) { stst >> skipws >> sp_.symbol_; } else if ( locname == "valence_charge" ) { stst >> sp_.zval_; } else if ( locname == "lmax" ) { stst >> sp_.lmax_; } else if ( locname == "llocal" ) { stst >> sp_.llocal_; } else if ( locname == "nquad" ) { stst >> sp_.nquad_; } else if ( locname == "rquad" ) { stst >> sp_.rquad_; } else if ( locname == "mesh_spacing" ) { stst >> sp_.deltar_; } else if ( locname == "radial_potential" ) { if ( current_l+1 > sp_.vps_.size() ) { sp_.vps_.resize(current_l+1); sp_.phi_.resize(current_l+1); } sp_.vps_[current_l].resize(current_size); for ( int i = 0; i < current_size; i++ ) stst >> sp_.vps_[current_l][i]; } else if ( locname == "radial_function" ) { sp_.phi_[current_l].resize(current_size); for ( int i = 0; i < current_size; i++ ) stst >> sp_.phi_[current_l][i]; } } //////////////////////////////////////////////////////////////////////////////// StructureHandler* SpeciesHandler::startSubHandler(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const Attributes& attributes) { // check if element qname can be processed by another StructureHandler // If it can, return a pointer to the StructureHandler, otherwise return 0 // cout << " SpeciesHandler::startSubHandler " << StrX(qname) << endl; return 0; } //////////////////////////////////////////////////////////////////////////////// void SpeciesHandler::endSubHandler(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, const StructureHandler* const subHandler) { // cout << " SpeciesHandler::endSubHandler " << StrX(qname) << endl; // if any StructureHandler was created by startSubHandler, delete it // delete subHandler; }