示例#1
0
//----------------------------------------------------------------------------
//  LoadModule
HRESULT CMagpieApplication::LoadModule(
  CMagpieModule           *   pSrcModule,
  LPCOLESTR                   lpszModuleID,
  LPCOLESTR                   lpszModuleSource,
  BOOL                        aDecorateScript,
  CMagpieModuleComObject  *&  pRet)
{
  CString sModuleID;
  IF_FAILED_RET(ResolveModuleID(
    pSrcModule, lpszModuleID, sModuleID));

  CComPtr<IMagpieModule> module;

  // is the module already loaded?
  HRESULT hr = E_FAIL;
  if (SUCCEEDED(GetModule(sModuleID, module.p)))
  {
    // yes, return module
    pRet = static_cast<CMagpieModuleComObject*>(module.Detach());
    return S_FALSE;  // means: already loaded
  }

  // the selected script loader. can be NULL.
  CComPtr<IMagpieScriptLoader> scriptLoader;

  if (lpszModuleSource)
  {
    hr = S_OK;
  }
  else
  {
    // find a script loader
    size_t loaderCount = m_ScriptLoaders.GetCount();
    for(size_t n = 0; n < loaderCount; n++)
    {
      hr = m_ScriptLoaders[n]->HasModuleScript(lpszModuleID);
      if (S_OK == hr)
      {
        scriptLoader = m_ScriptLoaders[n];
        break;
      }
    }
  }
  // need either scriptLoader or lpszModuleSource
  if (scriptLoader || lpszModuleSource)
  {
    CMagpieModuleComObject * pModuleObject;
    IF_FAILED_RET(CMagpieModule::CreateObject(
      *this, sModuleID, scriptLoader, lpszModuleSource, aDecorateScript, pModuleObject));

    m_Modules[sModuleID] = pModuleObject;
    pRet = pModuleObject;
    return S_OK;
  }
  // no script found for this ID
  return E_FAIL;
}
//----------------------------------------------------------------------------
//  LoadModule
HRESULT CMagpieApplication::LoadModule(
  CMagpieModule           *   pSrcModule,
  LPCOLESTR                   lpszModuleID,
  CMagpieModuleComObject  *&  pRet)
{
  CString sModuleID;
  IF_FAILED_RET(ResolveModuleID(
    pSrcModule, lpszModuleID, sModuleID));

  CComPtr<CMagpieModuleComObject> module;

  // is the module already loaded?
  HRESULT hr = E_FAIL;
  hr = GetModule(sModuleID, module.p);
  if (SUCCEEDED(hr))
  {
    // yes, return module
    pRet = module.Detach();
    return S_FALSE;  // means: already loaded
  }

  // create a real path from the module ID...
  CString sModulePath, sModuleIDPath(sModuleID);
  sModuleIDPath.Replace(_T('/'), _T('\\'));
  // ...assuming that the file type is always 'js'
  // @TODO: Might change in future.
  sModulePath = m_RootPath + sModuleIDPath + _T(".js");

  if (!PathFileExists(sModulePath))
  {
    return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
  }

  IF_FAILED_RET(CMagpieModule::CreateObject(
    *this, sModuleID, sModulePath, module.p));

  m_Modules[sModuleID] = module;
  pRet = module.Detach();
  return S_OK;
}