bool KstCPlugin::setPlugin(KstPluginPtr plugin) { // Assumes that this is called with a write lock in place on this object Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (plugin == _plugin) { return true; } freeParameters(); if (_localData) { if (!_plugin || !_plugin->freeLocalData(&_localData)) { free(_localData); } _localData = 0L; } if (!plugin) { _inputVectors.clear(); _inputScalars.clear(); _inputStrings.clear(); _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); _plugin = 0L; return true; } Plugin::countScalarsVectorsAndStrings(plugin->data()._inputs, _inScalarCnt, _inArrayCnt, _inStringCnt, _inPid); if (_inputVectors.count() != _inArrayCnt || _inputScalars.count() != _inScalarCnt - _inPid || _inputStrings.count() != _inStringCnt) { _plugin = 0L; return false; } _outScalarCnt = 0; _outArrayCnt = 0; _outStringCnt = 0; _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); const QValueList<Plugin::Data::IOValue>& otable = plugin->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { if ((*it)._type == Plugin::Data::IOValue::TableType) { KstWriteLocker blockVectorUpdates(&KST::vectorList.lock()); KstVectorPtr v; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { v = new KstVector(KstObjectTag((*it)._name, tag()), 0, this, true); } else { v = new KstVector(KstObjectTag((*it)._name, tag()), 0, this, false); } _outputVectors.insert((*it)._name, v); ++_outArrayCnt; } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { KstWriteLocker blockScalarUpdates(&KST::scalarList.lock()); KstScalarPtr s = new KstScalar(KstObjectTag((*it)._name, tag()), this); _outputScalars.insert((*it)._name, s); ++_outScalarCnt; } else if ((*it)._type == Plugin::Data::IOValue::StringType) { KstWriteLocker blockStringUpdates(&KST::stringList.lock()); KstStringPtr s = new KstString(KstObjectTag((*it)._name, tag()), this); _outputStrings.insert((*it)._name, s); ++_outStringCnt; } } allocateParameters(); _plugin = plugin; return true; }
KstCPlugin::KstCPlugin(const QDomElement& pluginElement) : KstDataObject(pluginElement) { QString pluginName; _inStringCnt = 0; _outStringCnt = 0; commonConstructor(); QDomNode n = pluginElement.firstChild(); while (!n.isNull()) { QDomElement e = n.toElement(); if (!e.isNull()) { if (e.tagName() == "tag") { setTagName(KstObjectTag::fromString(e.text())); } else if (e.tagName() == "name") { pluginName = e.text(); } else if (e.tagName() == "ivector") { _inputVectorLoadQueue.append(qMakePair(e.attribute("name"), e.text())); } else if (e.tagName() == "iscalar") { _inputScalarLoadQueue.append(qMakePair(e.attribute("name"), e.text())); } else if (e.tagName() == "istring") { _inputStringLoadQueue.append(qMakePair(e.attribute("name"), e.text())); } else if (e.tagName() == "ovector") { KstWriteLocker blockVectorUpdates(&KST::vectorList.lock()); KstVectorPtr v; if (e.attribute("scalarList", "0").toInt()) { v = new KstVector(KstObjectTag(e.text(), tag()), 0, this, true); } else { v = new KstVector(KstObjectTag(e.text(), tag()), 0, this, false); } _outputVectors.insert(e.attribute("name"), v); } else if (e.tagName() == "oscalar") { KstWriteLocker blockScalarUpdates(&KST::scalarList.lock()); KstScalarPtr sp = new KstScalar(KstObjectTag(e.text(), tag()), this); _outputScalars.insert(e.attribute("name"), sp); } else if (e.tagName() == "ostring") { KstWriteLocker blockStringUpdates(&KST::stringList.lock()); KstStringPtr sp = new KstString(KstObjectTag(e.text(), tag()), this); _outputStrings.insert(e.attribute("name"), sp); } } n = n.nextSibling(); } _plugin = PluginCollection::self()->plugin(pluginName); if (!_plugin.data()) { KstDebug::self()->log(i18n("Unable to load plugin %1 for \"%2\".").arg(pluginName).arg(tagName()), KstDebug::Warning); } else { Plugin::countScalarsVectorsAndStrings(_plugin->data()._inputs, _inScalarCnt, _inArrayCnt, _inStringCnt, _inPid); const QValueList<Plugin::Data::IOValue>& otable = _plugin->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { // FIXME: i18n? if ((*it)._type == Plugin::Data::IOValue::TableType) { _outArrayCnt++; if (!_outputVectors.contains((*it)._name)) { KstWriteLocker blockVectorUpdates(&KST::vectorList.lock()); KstVectorPtr v; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { v = new KstVector(KstObjectTag(tagName() + " vector - " + (*it)._name, tag()), 0, this, true); // FIXME: tag name? } else { v = new KstVector(KstObjectTag(tagName() + " vector - " + (*it)._name, tag()), 0, this, false); // FIXME: tag name? } _outputVectors.insert((*it)._name, v); } } else if ((*it)._type == Plugin::Data::IOValue::MatrixType) { abort(); // FIXME: #if 0 _outArrayCnt += 2; if (!_outputMatrices.contains((*it)._name)) { KstWriteLocker blockMatrixUpdates(&KST::matrixList.lock()); KstMatrixPtr m; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { m = new KstMatrix(KstObjectTag(tagName() + " matrix - " + (*it)._name, tag()), 0, this, true); // FIXME: tag name? } else { m = new KstMatrix(KstObjectTag(tagName() + " matrix - " + (*it)._name, tag()), 0, this, false); // FIXME: tag name? } m->setProvider(this); _outputMatrices.insert((*it)._name, m); } #endif } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { _outScalarCnt++; if (!_outputScalars.contains((*it)._name)) { KstScalarPtr s = new KstScalar(KstObjectTag(tagName() + " scalar - " + (*it)._name, tag()), this); // FIXME: tag name? _outputScalars.insert((*it)._name, s); } } else if ((*it)._type == Plugin::Data::IOValue::StringType) { _outStringCnt++; if (!_outputStrings.contains((*it)._name)) { KstStringPtr s = new KstString(KstObjectTag(tagName() + " string - " + (*it)._name, tag()), this); // FIXME: tag name? _outputStrings.insert((*it)._name, s); } } } allocateParameters(); } }
// // to be used only from javaScript... // bool KstCPlugin::validate( ) { bool rc = false; if (_plugin) { if (_plugin.data()) { Plugin::countScalarsVectorsAndStrings(_plugin->data()._inputs, _inScalarCnt, _inArrayCnt, _inStringCnt, _inPid); if (_inArrayCnt > 0 || _inScalarCnt > 0 || _inStringCnt > 0) { if (_inputVectors.count() == _inArrayCnt && _inputScalars.count() == _inScalarCnt - _inPid && _inputStrings.count() == _inStringCnt) { _outScalarCnt = 0; _outArrayCnt = 0; _outStringCnt = 0; _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); freeParameters(); const QValueList<Plugin::Data::IOValue>& otable = _plugin->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { if ((*it)._type == Plugin::Data::IOValue::TableType) { KstWriteLocker blockVectorUpdates(&KST::vectorList.lock()); KstVectorPtr v; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { v = new KstVector(KstObjectTag((*it)._name, tag()), 0, this, true); } else { v = new KstVector(KstObjectTag((*it)._name, tag()), 0, this, false); } _outputVectors.insert((*it)._name, v); ++_outArrayCnt; } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { KstWriteLocker blockScalarUpdates(&KST::scalarList.lock()); KstScalarPtr s = new KstScalar(KstObjectTag((*it)._name, tag()), this); _outputScalars.insert((*it)._name, s); ++_outScalarCnt; } else if ((*it)._type == Plugin::Data::IOValue::StringType) { KstWriteLocker blockStringUpdates(&KST::stringList.lock()); KstStringPtr s = new KstString(KstObjectTag((*it)._name, tag()), this); _outputStrings.insert((*it)._name, s); ++_outStringCnt; } } allocateParameters(); KstDataObjectList::Iterator oi = KST::dataObjectList.findTag(tagName()); if (oi == KST::dataObjectList.end()) { KST::dataObjectList.lock().writeLock(); KST::dataObjectList.append(this); KST::dataObjectList.lock().unlock(); } setDirty(true); rc = true; } } } } return rc; }
bool KstPlugin::setPlugin(KstSharedPtr<Plugin> plugin) { // Assumes that this is called with a write lock in place on this object if (plugin == _plugin) { return true; } freeParameters(); if (_localData) { if (!_plugin || !_plugin->freeLocalData(&_localData)) { free(_localData); } _localData = 0L; } if (!plugin) { _inputVectors.clear(); _inputScalars.clear(); _inputStrings.clear(); _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); _plugin = 0L; return true; } Plugin::countScalarsVectorsAndStrings(plugin->data()._inputs, _inScalarCnt, _inArrayCnt, _inStringCnt, _inPid); if (_inputVectors.count() != _inArrayCnt || _inputScalars.count() != _inScalarCnt - _inPid || _inputStrings.count() != _inStringCnt) { _plugin = 0L; return false; } _outScalarCnt = 0; _outArrayCnt = 0; _outStringCnt = 0; _outputVectors.clear(); _outputScalars.clear(); _outputStrings.clear(); const QValueList<Plugin::Data::IOValue>& otable = plugin->data()._outputs; for (QValueList<Plugin::Data::IOValue>::ConstIterator it = otable.begin(); it != otable.end(); ++it) { if ((*it)._type == Plugin::Data::IOValue::TableType) { KstVectorPtr v; if ((*it)._subType == Plugin::Data::IOValue::FloatNonVectorSubType) { v = new KstVector(QString::null, 0, this, true); } else { v = new KstVector(QString::null, 0, this, false); } v->KstObject::writeLock(); _outputVectors.insert((*it)._name, v); ++_outArrayCnt; KST::addVectorToList(v); } else if ((*it)._type == Plugin::Data::IOValue::FloatType) { KstScalarPtr s = new KstScalar(QString::null, this); s->KstObject::writeLock(); _outputScalars.insert((*it)._name, s); ++_outScalarCnt; } else if ((*it)._type == Plugin::Data::IOValue::StringType) { KstStringPtr s = new KstString(QString::null, this); s->KstObject::writeLock(); _outputStrings.insert((*it)._name, s); ++_outStringCnt; } } allocateParameters(); _plugin = plugin; return true; }