//---------------------------------------------------------------------------- // 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; }