Chris@55: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@55: Chris@55: /* Chris@55: Sonic Visualiser Chris@55: An audio file viewer and annotation editor. Chris@55: Centre for Digital Music, Queen Mary, University of London. Chris@55: This file copyright 2006 Chris Cannam. Chris@55: Chris@55: This program is free software; you can redistribute it and/or Chris@55: modify it under the terms of the GNU General Public License as Chris@55: published by the Free Software Foundation; either version 2 of the Chris@55: License, or (at your option) any later version. See the file Chris@55: COPYING included with this distribution for more information. Chris@55: */ Chris@55: Chris@55: #include "PluginInstance.h" Chris@55: Chris@55: #include Chris@55: #include Chris@55: Chris@56: #include Chris@56: #include Chris@56: #include Chris@56: #include Chris@56: Chris@55: #include Chris@55: Chris@55: QString Chris@55: PluginInstance::toXmlString(QString indent, QString extraAttributes) const Chris@55: { Chris@55: QString s; Chris@55: s += indent; Chris@55: Chris@55: s += QString("name.c_str()))) Chris@55: .arg(getParameter(i->name)); Chris@55: } Chris@55: Chris@55: s += "/>\n"; Chris@55: return s; Chris@55: } Chris@55: Chris@55: #define CHECK_ATTRIBUTE(ATTRIBUTE, ACCESSOR) \ Chris@55: QString ATTRIBUTE = attrs.value(#ATTRIBUTE); \ Chris@55: if (ATTRIBUTE != "" && ATTRIBUTE != ACCESSOR().c_str()) { \ Chris@55: std::cerr << "WARNING: PluginInstance::setParameters: Plugin " \ Chris@55: << #ATTRIBUTE << " does not match (attributes have \"" \ Chris@55: << ATTRIBUTE.toStdString() << "\", my " \ Chris@55: << #ATTRIBUTE << " is \"" << ACCESSOR() << "\")" << std::endl; \ Chris@55: } Chris@55: Chris@55: void Chris@55: PluginInstance::setParameters(const QXmlAttributes &attrs) Chris@55: { Chris@55: CHECK_ATTRIBUTE(name, getName); Chris@55: CHECK_ATTRIBUTE(description, getDescription); Chris@55: CHECK_ATTRIBUTE(maker, getMaker); Chris@55: CHECK_ATTRIBUTE(copyright, getCopyright); Chris@55: Chris@55: bool ok; Chris@55: int version = attrs.value("version").trimmed().toInt(&ok); Chris@55: if (ok && version != getPluginVersion()) { Chris@55: std::cerr << "WARNING: PluginInstance::setParameters: Plugin version does not match (attributes have " << version << ", my version is " << getPluginVersion() << ")" << std::endl; Chris@55: } Chris@55: Chris@55: if (!getPrograms().empty()) { Chris@55: selectProgram(attrs.value("program").toStdString()); Chris@55: } Chris@55: Chris@55: ParameterList parameters = getParameterDescriptors(); Chris@55: Chris@55: for (ParameterList::const_iterator i = parameters.begin(); Chris@55: i != parameters.end(); ++i) { Chris@56: QString name = QString("param-%1") Chris@56: .arg(stripInvalidParameterNameCharacters Chris@56: (QString(i->name.c_str()))); Chris@57: if (attrs.value(name) == "") { Chris@57: std::cerr << "PluginInstance::setParameters: no parameter \"" << i->name << "\" (attribute \"" << name.toStdString() << "\")" << std::endl; Chris@57: continue; Chris@57: } Chris@55: bool ok; Chris@55: float value = attrs.value(name).trimmed().toFloat(&ok); Chris@55: if (ok) { Chris@55: setParameter(i->name, value); Chris@55: } else { Chris@56: std::cerr << "WARNING: PluginInstance::setParameters: Invalid value \"" << attrs.value(name).toStdString() << "\" for parameter \"" << i->name << "\" (attribute \"" << name.toStdString() << "\")" << std::endl; Chris@55: } Chris@55: } Chris@55: } Chris@56: Chris@56: void Chris@56: PluginInstance::setParametersFromXml(QString xml) Chris@56: { Chris@56: QDomDocument doc; Chris@56: Chris@56: QString error; Chris@56: int errorLine; Chris@56: int errorColumn; Chris@56: Chris@56: if (!doc.setContent(xml, false, &error, &errorLine, &errorColumn)) { Chris@56: std::cerr << "PluginInstance::setParametersFromXml: Error in parsing XML: " << error.toStdString() << " at line " << errorLine << ", column " << errorColumn << std::endl; Chris@56: std::cerr << "Input follows:" << std::endl; Chris@56: std::cerr << xml.toStdString() << std::endl; Chris@56: std::cerr << "Input ends." << std::endl; Chris@56: return; Chris@56: } Chris@56: Chris@56: QDomElement pluginElt = doc.firstChildElement("plugin"); Chris@56: QDomNamedNodeMap attrNodes = pluginElt.attributes(); Chris@56: QXmlAttributes attrs; Chris@56: Chris@56: for (int i = 0; i < attrNodes.length(); ++i) { Chris@56: QDomAttr attr = attrNodes.item(i).toAttr(); Chris@56: if (attr.isNull()) continue; Chris@56: std::cerr << "Adding attribute \"" << attr.name().toStdString() Chris@56: << "\" with value \"" << attr.value().toStdString() << "\"" << std::endl; Chris@56: attrs.append(attr.name(), "", "", attr.value()); Chris@56: } Chris@56: Chris@56: setParameters(attrs); Chris@56: } Chris@55: Chris@55: QString Chris@55: PluginInstance::stripInvalidParameterNameCharacters(QString s) const Chris@55: { Chris@55: s.replace(QRegExp("[^a-zA-Z0-9_]*"), ""); Chris@55: return s; Chris@55: } Chris@55: