void ToolManager::unloadJSEngine(bool forced)
{
	m_ScriptLock.lock();

	time_t now = time(NULL);

	if (forced || (m_uiInstanceCount == 0 && now > m_tJSEngineExpireTime))
	{
		if (m_pFactory)
		{
			ScriptCoreSetupI* setup = (ScriptCoreSetupI*)m_pFactory(SCRIPT_CORE_SETUP);

			if (setup)
				setup->cleanUp();
		}

		m_pFactory = NULL;
		m_ScriptCore.unload();
		m_ScriptCore = SharedObjectLoader();

		m_uiInstanceCount = 0;
	}

	m_ScriptLock.unlock();
}
	bool loadDll()
	{
#ifndef DEBUG
	#ifdef WIN32
			char message[255] = {0};
			if (UTIL::WIN::validateCert(L".\\bin\\scriptcore.dll", message, 255) != ERROR_SUCCESS)
			{
				Warning(gcString("Cert validation failed on scriptcore.dll: {0}\n", message));
				return false;
			}
	#endif
#endif

#ifdef WIN32
	#ifdef DEBUG
			if (!m_ScriptCore.load("scriptcore-d.dll"))
				return false;
	#else
			if (!m_ScriptCore.load("scriptcore.dll"))
				return false;
	#endif
#else
		if (!m_ScriptCore.load("libscriptcore.so"))
			return false;
#endif

		m_pFactory = m_ScriptCore.getFunction<FactoryFn>("FactoryBuilderScriptCore");

		if (!m_pFactory)
		{
			unloadDll();
			return false;
		}

#ifndef IGNORE_DESURA_LOGGING
		RegLogFn regLog = m_ScriptCore.getFunction<RegLogFn>("RegDLLCB_SCRIPT");

		if (regLog)
			InitLogging(regLog);
		else
			Warning("Failed to setup logging for scriptcore\n");
#endif

		m_pSetup = (ScriptCoreSetupI*)m_pFactory(SCRIPT_CORE_SETUP);

		if (!m_pSetup)
		{
			unloadDll();
			return false;
		}

		m_pSetup->useInternalTaskRunner();

		return m_pSetup->addItemExtender(&m_Extender);
	}
  /** \brief Check wheter a token at a given position is an undefined variable. 

      \param a_Tok [out] If a variable tom_pParser->m_vStringBufken has been found it will be placed here.
	    \return true if a variable token has been found.
      \throw nothrow
  */
  bool ParserTokenReader::IsUndefVarTok(token_type &a_Tok)
  {
    string_type strTok;
    int iEnd( ExtractToken(m_pParser->ValidNameChars(), strTok, m_iPos) );
    if ( iEnd==m_iPos )
      return false;

    if (m_iSynFlags & noVAR)
    {
      // <ibg/> 20061021 added token string strTok instead of a_Tok.GetAsString() as the 
      //                 token identifier. 
      // related bug report:
      // http://sourceforge.net/tracker/index.php?func=detail&aid=1578779&group_id=137191&atid=737979
      Error(ecUNEXPECTED_VAR, m_iPos - (int)a_Tok.GetAsString().length(), strTok);
    }

    // If a factory is available implicitely create new variables
    if (m_pFactory)
    {
      value_type *fVar = m_pFactory(strTok.c_str(), m_pFactoryData);
      a_Tok.SetVar(fVar, strTok );

      // Do not use m_pParser->DefineVar( strTok, fVar );
      // in order to define the new variable, it will clear the
      // m_UsedVar array which will kill previousely defined variables
      // from the list
      // This is safe because the new variable can never override an existing one
      // because they are checked first!
      (*m_pVarDef)[strTok] = fVar;
      m_UsedVar[strTok] = fVar;  // Add variable to used-var-list
    }
    else
    {
      a_Tok.SetVar((value_type*)&m_fZero, strTok);
      m_UsedVar[strTok] = 0;  // Add variable to used-var-list
    }

    m_iPos = iEnd;

    // Call the variable factory in order to let it define a new parser variable
    m_iSynFlags = noVAL | noVAR | noFUN | noBO | noPOSTOP | noINFIXOP | noSTR;
    return true;
  }
bool ToolManager::loadJSEngine()
{
#ifdef WIN32
#ifdef DEBUG
	if (!m_ScriptCore.load("scriptcore-d.dll"))
		return false;
#else
	if (!m_ScriptCore.load("scriptcore.dll"))
		return false;
#endif
#else
	if (!m_ScriptCore.load("libscriptcore.so"))
		return false;
#endif

	m_pFactory = m_ScriptCore.getFunction<FactoryFn>("FactoryBuilderScriptCore");

	if (!m_pFactory)
		return false;

	RegLogFn regLog = m_ScriptCore.getFunction<RegLogFn>("RegDLLCB_SCRIPT");

	if (regLog)
		regLog(g_pLogCallback);
	else
#ifdef WIN32
		Warning("Failed to setup logging for scriptcore.dll\n");
#else
		Warning("Failed to setup logging for scriptcore.so\n");
#endif

	ScriptCoreSetupI* setup = (ScriptCoreSetupI*)m_pFactory(SCRIPT_CORE_SETUP);

	if (!setup)
		return false;

	m_tJSEngineExpireTime = time(NULL) + 60*15;
	setup->useInternalTaskRunner();

	return setup->addItemExtender(&g_ItemExtender);
}
Exemple #5
0
    CourgetteI* newInstance()
    {
        bool loaded = false;

        m_ScriptLock.lock();

        if (m_uiInstanceCount == 0)
            loaded = loadDll();
        else
            loaded = true;

        bool didLoad = (loaded && m_pFactory);

        if (didLoad)
            m_uiInstanceCount++;
        m_ScriptLock.unlock();

        if (didLoad == false)
            throw gcException(ERR_LIBRARY_LOADFAILED, "Failed to load courgette");

        return (CourgetteI*)m_pFactory(COURGETTE);
    }
	ScriptCoreI* newInstance()
	{
		bool loaded = false;

		m_ScriptLock.lock();

		if (m_uiInstanceCount == 0)
			loaded = loadDll();
		else
			loaded = true;

		bool didLoad = (loaded && m_pFactory);

		if (didLoad)
			m_uiInstanceCount++;
		m_ScriptLock.unlock();

		if (didLoad == false)
			throw gcException(ERR_LIBRARY_LOADFAILED, "Failed to load script engine");

		return (ScriptCoreI*)m_pFactory(SCRIPT_CORE);
	}
void ToolManager::findJSTools(UserCore::Item::ItemInfo* item)
{
	bool validPath = false;

	for (size_t x=0; x<item->getBranchCount(); x++)
	{
		gcString path = item->getBranch(x)->getInstallScriptPath();

		if (UTIL::FS::isValidFile(path))
			validPath = true;
	}

	if (!validPath)
		return;

	m_ScriptLock.lock();
	
	if (!m_pFactory)
	{
		Warning("Failed to load scriptcore for find JS Tools\n");
		m_ScriptLock.unlock();
		return;
	}

	m_uiInstanceCount++;
	m_ScriptLock.unlock();

	for (size_t x=0; x<item->getBranchCount(); x++)
	{
		gcString path = item->getBranch(x)->getInstallScriptPath();

		if (!UTIL::FS::isValidFile(path))
			continue;

		ScriptCoreI* instance = (ScriptCoreI*)m_pFactory(SCRIPT_CORE);

		UserItem* userItem = new UserItem();
		userItem->m_pItem = item;
		userItem->m_pBranch = item->getBranch(x);
		userItem->m_pToolManager = this;

		try
		{
			instance->setItem(userItem);
			instance->executeScript(path.c_str());
			instance->executeString("ToolSetup();");
		}
		catch (gcException &e)
		{
			gcString errMsg(e.getErrMsg());

			if (errMsg.find("ToolSetup is not defined") == std::string::npos)
				Warning(gcString("Failed to execute toolsetup: {0}\n", e));
		}

		instance->destory();
	}

	m_ScriptLock.lock();
	m_uiInstanceCount--;
	m_ScriptLock.unlock();

	if (m_uiInstanceCount == 0)
		unloadJSEngine();
}