//---------------------------------------------------------------------------- // Init STDMETHODIMP CAnchoAddon::Init(LPCOLESTR lpsExtensionID, IAnchoAddonService * pService, IWebBrowser2 * pWebBrowser) { m_pWebBrowser = pWebBrowser; m_pAnchoService = pService; m_sExtensionName = lpsExtensionID; // lookup ID in registry CRegKey regKey; CString sKey; sKey.Format(_T("%s\\%s"), s_AnchoExtensionsRegistryKey, m_sExtensionName); LONG res = regKey.Open(HKEY_CURRENT_USER, sKey, KEY_READ); if (ERROR_SUCCESS != res) { return HRESULT_FROM_WIN32(res); } // load flags to see if the addon is disabled DWORD flags = 0; res = regKey.QueryDWORDValue(s_AnchoExtensionsRegistryEntryFlags, flags); // to stay compatible with older versions we treat "no flags at all" as "enabled" if ( (ERROR_SUCCESS == res) && !(flags & ENABLED)) { // ... means: only when flag is present AND ENABLED is not set // the addon is disabled return E_ABORT; } // get addon GUID ULONG nChars = 37; // length of a GUID + terminator res = regKey.QueryStringValue(s_AnchoExtensionsRegistryEntryGUID, m_sExtensionID.GetBuffer(nChars), &nChars); m_sExtensionID.ReleaseBuffer(); if (ERROR_SUCCESS != res) { return HRESULT_FROM_WIN32(res); } // get addon path nChars = _MAX_PATH; LPTSTR pst = m_sExtensionPath.GetBuffer(nChars+1); res = regKey.QueryStringValue(s_AnchoExtensionsRegistryEntryPath, pst, &nChars); pst[nChars] = 0; PathAddBackslash(pst); m_sExtensionPath.ReleaseBuffer(); if (ERROR_SUCCESS != res) { return HRESULT_FROM_WIN32(res); } if (!PathIsDirectory(m_sExtensionPath)) { return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); } IF_FAILED_RET(CProtocolHandlerRegistrar:: RegisterTemporaryFolderHandler(s_AnchoProtocolHandlerScheme, m_sExtensionName, m_sExtensionPath)); // get addon instance //IF_FAILED_RET(m_pAnchoService->GetAddonBackground(CComBSTR(m_sExtensionName), &m_pAddonBackground)); // The addon can be a resource DLL or simply a folder in the filesystem. // TODO: Load the DLL if there is any. // create content script engine #ifdef MAGPIE_REGISTERED IF_FAILED_RET(m_Magpie.CoCreateInstance(CLSID_MagpieApplication)); #else CComBSTR bs; IF_FAILED_RET(m_pAnchoService->GetModulePath(&bs)); // Load magpie from the same path where this exe file is. CString s(bs); s += _T("Magpie.dll"); HMODULE hModMagpie = ::LoadLibrary(s); if (!hModMagpie) { return E_FAIL; } fnCreateMagpieInstance CreateMagpieInstance = (fnCreateMagpieInstance)::GetProcAddress(hModMagpie, "CreateMagpieInstance"); if (!CreateMagpieInstance) { return E_FAIL; } IF_FAILED_RET(CreateMagpieInstance(&m_Magpie)); #endif return S_OK; }
//---------------------------------------------------------------------------- // Init HRESULT CAnchoBackgroundAPI::Init(LPCTSTR lpszThisPath, LPCTSTR lpszRootURL, BSTR bsID, LPCTSTR lpszGUID, LPCTSTR lpszPath) { // set our ID m_bsID = bsID; m_GUID = lpszGUID; m_sRootURL = lpszRootURL; CString sPath(lpszPath); // create logger window IF_FAILED_RET(CLogWindow::CreateLogWindow(&m_LogWindow.p)); // create a magpie instance #ifdef MAGPIE_REGISTERED IF_FAILED_RET(m_Magpie.CoCreateInstance(CLSID_MagpieApplication)); #else // Load magpie from the same path where this exe file is. CString s(lpszThisPath); s += _T("Magpie.dll"); HMODULE hModMagpie = ::LoadLibrary(s); if (!hModMagpie) { return E_FAIL; } fnCreateMagpieInstance CreateMagpieInstance = (fnCreateMagpieInstance)::GetProcAddress(hModMagpie, "CreateMagpieInstance"); if (!CreateMagpieInstance) { return E_FAIL; } IF_FAILED_RET(CreateMagpieInstance(&m_Magpie)); #endif // add a loader for scripts in the extension filesystem IF_FAILED_RET(m_Magpie->AddFilesystemScriptLoader((LPWSTR)(LPCWSTR)sPath)); // add a loder for scripts in this exe file IF_FAILED_RET(m_Magpie->AddResourceScriptLoader((ULONG)_AtlModule.GetResourceInstance())); // advise logger IF_FAILED_RET(AtlAdvise(m_Magpie, (IUnknown*)(CAnchoAddonBackgroundLogger*)(this), DIID__IMagpieLoggerEvents, &m_dwMagpieSinkCookie)); // load manifest CString sManifestFilename; sManifestFilename.Format(_T("%smanifest.json"), sPath); CAtlFile f; IF_FAILED_RET(f.Create(sManifestFilename, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING)); ULONGLONG nLen = 0; IF_FAILED_RET(f.GetSize(nLen)); // limit to 4gb if (nLen > 0x00000000ffffffff) { return E_OUTOFMEMORY; } DWORD dwLen = (DWORD)nLen; CStringA sManifest("exports.manifest = "); DWORD strLen = (DWORD)sManifest.GetLength(); IF_FAILED_RET(f.Read(sManifest.GetBuffer(dwLen + strLen) + strLen, dwLen)); sManifest.ReleaseBuffer(dwLen + strLen); sManifest += _T(';'); IF_FAILED_RET(m_Magpie->RunScript(L"manifest", (LPWSTR)(LPCWSTR)CA2W(sManifest))); // set ourselfs in magpie as a global accessible object IF_FAILED_RET(m_Magpie->AddExtension((LPWSTR)s_AnchoGlobalAPIObjectName, (IAnchoBackgroundAPI*)this)); // initialize Ancho API // api.js will do now additional initialization, like looking at the manifest // and creating a background page. IF_FAILED_RET(m_Magpie->Run((LPWSTR)s_AnchoMainAPIModuleID)); return S_OK; }