Index: src/test/PluginTest.py =================================================================== --- src/test/PluginTest.py (revision 3352) +++ src/test/PluginTest.py (working copy) @@ -26,7 +26,6 @@ def testColorNodePlugin(self): def loadPlugin(): if platform.system() == 'Windows': - Player.pluginPath = "../../../../Archimedes/libavg_win/debug" Player.loadPlugin("ColorNode") else: Player.pluginPath = "./plugin/.libs" Index: src/test/plugin/ColorNode.cpp =================================================================== --- src/test/plugin/ColorNode.cpp (revision 3352) +++ src/test/plugin/ColorNode.cpp (working copy) @@ -24,6 +24,7 @@ #define AVG_PLUGIN #include "../../api.h" +#include "../../player/Player.h" #include "../../player/AreaNode.h" #include "../../player/NodeDefinition.h" @@ -137,17 +138,12 @@ } -#ifdef _WIN32 -#pragma warning(disable: 4190) -#endif -AVG_PLUGIN_API avg::NodeDefinition getNodeDefinition() +AVG_PLUGIN_API void registerPlugin() { - return avg::ColorNode::createNodeDefinition(); -} + avg::NodeDefinition myNodeDefinition = avg::ColorNode::createNodeDefinition(); + const char* allowedParentNodeNames[] = {"avg", 0}; -AVG_PLUGIN_API const char** getAllowedParentNodeNames() -{ - static const char *names[] = {"avg", 0}; - return names; + // Register this node type + avg::Player::get()->registerNodeType(myNodeDefinition, allowedParentNodeNames); } Index: src/player/PluginManager.cpp =================================================================== --- src/player/PluginManager.cpp (revision 3352) +++ src/player/PluginManager.cpp (working copy) @@ -37,6 +37,14 @@ using namespace std; using namespace avg; +#ifdef _WIN32 +#define PATH_DELIMITER ";" +#define PLUGIN_EXTENSION ".dll" +#else +#define PATH_DELIMITER ":" +#define PLUGIN_EXTENSION ".so" +#endif + PluginManager::PluginNotFound::PluginNotFound(const string& message) : Exception(AVG_ERR_FILEIO, message) {} @@ -51,7 +59,7 @@ PluginManager::PluginManager() { - parsePath("./plugin:" + getAvgLibPath() + "plugin"); + parsePath("./plugin"PATH_DELIMITER + getAvgLibPath() + "plugin"); } void PluginManager::setSearchPath(const string& sNewPath) @@ -71,7 +79,7 @@ PluginMap::iterator i = m_LoadedPlugins.find(sPluginName); if (i == m_LoadedPlugins.end()) { // no, let's try to load it! - string sFullpath = locateSharedObject(sPluginName+".so"); + string sFullpath = locateSharedObject(sPluginName+PLUGIN_EXTENSION); void *handle = internalLoadPlugin(sFullpath); // add to map of loaded plugins m_LoadedPlugins[sPluginName] = make_pair(handle, 1); @@ -121,7 +129,7 @@ string sRemaining = sPath; string::size_type i; do { - i = sRemaining.find(':'); + i = sRemaining.find(PATH_DELIMITER); string sDirectory; if (i == string::npos) { sDirectory = sRemaining; @@ -157,50 +165,16 @@ void PluginManager::registerPlugin(void* handle) { - typedef NodeDefinition (*GetNodeDefinitionPtr)(); - GetNodeDefinitionPtr getNodeDefinition = reinterpret_cast (dlsym(handle, "getNodeDefinition")); + typedef void (*RegisterPluginPtr)(); + RegisterPluginPtr registerPlugin = + reinterpret_cast (dlsym(handle, "registerPlugin")); - typedef char** (*GetAllowedParentNodeNamesPtr)(); - GetAllowedParentNodeNamesPtr getAllowedParentNodeNames = reinterpret_cast (dlsym(handle, "getAllowedParentNodeNames")); - - if (getNodeDefinition) { - AVG_TRACE(Logger::PLUGIN, "NodePlugin detected"); - - NodeDefinition myNodeDefinition = getNodeDefinition(); - AVG_TRACE(Logger::PLUGIN, "found definition for Node " << myNodeDefinition.getName()); - Player::get()->registerNodeType(myNodeDefinition); - - char **pParentNames = 0; - if (getAllowedParentNodeNames) { - pParentNames = getAllowedParentNodeNames(); - } else { - AVG_TRACE(Logger::PLUGIN, "Plugin does not export getAllowedParentNodeNames()"); - } - - char *defaultParents[] = {"avg", "div", 0}; - if (!pParentNames) { - AVG_TRACE(Logger::PLUGIN, "defaulting to allowed parent nodes 'avg' and 'div'"); - pParentNames = defaultParents; - } - - string sChildArray[1]; - sChildArray[0] = myNodeDefinition.getName(); - vector sChildren = vectorFromCArray(1, sChildArray); - - char **pCurrParentName = pParentNames; - while(*pCurrParentName) { - AVG_TRACE(Logger::PLUGIN, "adding allowed child to parent NodeDefinition " << *pCurrParentName); - - NodeDefinition nodeDefinition = Player::get()->getNodeDef(*pCurrParentName); - nodeDefinition.addChildren(sChildren); - Player::get()->updateNodeDefinition(nodeDefinition); - - ++pCurrParentName; - } - + if (registerPlugin) { + AVG_TRACE(Logger::PLUGIN, "Plugin registration function detected"); + registerPlugin(); } else { - AVG_TRACE(Logger::PLUGIN, "no magic symbols found"); - throw PluginCorrupted("no magic symbols found."); + AVG_TRACE(Logger::PLUGIN, "No plugin registration function detected"); + throw PluginCorrupted("No plugin registration function detected"); } } Index: src/player/Player.cpp =================================================================== --- src/player/Player.cpp (revision 3352) +++ src/player/Player.cpp (working copy) @@ -127,8 +127,6 @@ registerNodeType(LineNode::createDefinition()); registerNodeType(RectNode::createDefinition()); registerNodeType(CurveNode::createDefinition()); - - updateDTD(); m_pTestHelper = new TestHelper(this); @@ -149,6 +147,7 @@ AVG_TRACE(Logger::WARNING, "DTD not found at " << sDTDFName << ". Not validating xml files."); } + m_bDirtyDTD = false; } Player::~Player() @@ -885,6 +884,9 @@ throw (Exception(AVG_ERR_XML_PARSE, "")); } + if (m_bDirtyDTD) + updateDTD(); + xmlValidCtxtPtr cvp = xmlNewValidCtxt(); cvp->error = xmlParserValidityError; cvp->warning = xmlParserValidityWarning; @@ -921,18 +923,27 @@ } } -void Player::registerNodeType(NodeDefinition Def) +void Player::registerNodeType(NodeDefinition Def, const char* pParentNames[]) { m_NodeRegistry.registerNodeType(Def); -} -void Player::updateNodeDefinition(const NodeDefinition& Def) -{ - m_NodeRegistry.updateNodeDefinition(Def); - updateDTD(); + if (pParentNames) { + string sChildArray[1]; + sChildArray[0] = Def.getName(); + vector sChildren = vectorFromCArray(1, sChildArray); + const char **pCurrParentName = pParentNames; + + while(*pCurrParentName) { + NodeDefinition nodeDefinition = m_NodeRegistry.getNodeDef(*pCurrParentName); + nodeDefinition.addChildren(sChildren); + m_NodeRegistry.updateNodeDefinition(nodeDefinition); + + ++pCurrParentName; + } + } + m_bDirtyDTD = true; } - NodePtr Player::createNode(const string& sType, const boost::python::dict& PyDict) { NodePtr pNode = m_NodeRegistry.createNode(sType, PyDict); @@ -952,6 +963,9 @@ } NodePtr pNode = createNodeFromXml(doc, xmlDocGetRootElement(doc), DivNodePtr()); + if (m_bDirtyDTD) + updateDTD(); + xmlValidCtxtPtr cvp = xmlNewValidCtxt(); cvp->error = xmlParserValidityError; cvp->warning = xmlParserValidityWarning; Index: src/player/Player.h =================================================================== --- src/player/Player.h (revision 3352) +++ src/player/Player.h (working copy) @@ -88,8 +88,7 @@ void setFakeFPS(double fps); long long getFrameTime(); - void registerNodeType(NodeDefinition Def); - void updateNodeDefinition(const NodeDefinition& Def); + void registerNodeType(NodeDefinition Def, const char* pParentNames[] = 0); NodePtr createNode (const std::string& sType, const boost::python::dict& PyDict); NodePtr createNodeFromXmlString (const std::string& sXML); @@ -207,6 +206,7 @@ double m_Volume; std::vector m_Listeners; + bool m_bDirtyDTD; xmlDtdPtr m_dtd; bool m_bPythonAvailable;