| /* | |
| * Copyright 2008 Google Inc. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not | |
| * use this file except in compliance with the License. You may obtain a copy of | |
| * the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the | |
| * License for the specific language governing permissions and limitations under | |
| * the License. | |
| */ | |
| #include "Debug.h" | |
| #include "ExternalWrapper.h" | |
| #include "nsCOMPtr.h" | |
| #include "nsIGenericFactory.h" | |
| #include "nsICategoryManager.h" | |
| #include "nsISupports.h" | |
| #include "nsIXULAppInfo.h" | |
| #include "nsIXULRuntime.h" | |
| #include "nsServiceManagerUtils.h" | |
| #include "nsXPCOMCID.h" | |
| #ifdef GECKO_19 | |
| #include "nsIClassInfoImpl.h" // 1.9 only | |
| #endif | |
| // Allow a macro to be treated as a C string, ie -Dfoo=bar; QUOTE(foo) = "bar" | |
| #define QUOTE_HELPER(x) #x | |
| #define QUOTE(x) QUOTE_HELPER(x) | |
| #ifdef _WINDOWS | |
| #include <windows.h> | |
| BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) { | |
| switch (ulReasonForCall) { | |
| case DLL_PROCESS_ATTACH: | |
| case DLL_THREAD_ATTACH: | |
| case DLL_THREAD_DETACH: | |
| case DLL_PROCESS_DETACH: | |
| break; | |
| } | |
| return TRUE; | |
| } | |
| #endif | |
| NS_GENERIC_FACTORY_CONSTRUCTOR(ExternalWrapper) | |
| NS_DECL_CLASSINFO(ExternalWrapper) | |
| static NS_IMETHODIMP registerSelf(nsIComponentManager *aCompMgr, nsIFile *aPath, | |
| const char *aLoaderStr, const char *aType, | |
| const nsModuleComponentInfo *aInfo) { | |
| Debug::log(Debug::Info) | |
| << " successfully registered GWT Developer Plugin" | |
| << Debug::flush; | |
| nsresult rv; | |
| nsCOMPtr<nsICategoryManager> categoryManager = | |
| do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv); | |
| NS_ENSURE_SUCCESS(rv, rv); | |
| rv = categoryManager->AddCategoryEntry("JavaScript global property", | |
| "__gwt_HostedModePlugin", OOPHM_CONTRACTID, true, true, nsnull); | |
| if (rv != NS_OK) { | |
| Debug::log(Debug::Error) << "ModuleOOPHM registerSelf returned " << rv | |
| << Debug::flush; | |
| } | |
| return rv; | |
| } | |
| static NS_IMETHODIMP factoryDestructor(void) { | |
| Debug::log(Debug::Debugging) << "ModuleOOPHM factoryDestructor()" | |
| << Debug::flush; | |
| return NS_OK; | |
| } | |
| static NS_IMETHODIMP unregisterSelf(nsIComponentManager *aCompMgr, | |
| nsIFile *aPath, const char *aLoaderStr, | |
| const nsModuleComponentInfo *aInfo) { | |
| Debug::log(Debug::Info) << "Unregistered GWT Developer Plugin" | |
| << Debug::flush; | |
| return NS_OK; | |
| } | |
| static nsModuleComponentInfo components[] = { | |
| { | |
| OOPHM_CLASSNAME, | |
| OOPHM_CID, | |
| OOPHM_CONTRACTID, | |
| ExternalWrapperConstructor, | |
| registerSelf, | |
| unregisterSelf, /* unregister self */ | |
| factoryDestructor, /* factory destructor */ | |
| NS_CI_INTERFACE_GETTER_NAME(ExternalWrapper), /* get interfaces */ | |
| nsnull, /* language helper */ | |
| &NS_CLASSINFO_NAME(ExternalWrapper), /* global class-info pointer */ | |
| 0 /* class flags */ | |
| } | |
| }; | |
| // From Gears base/firefox/module.cc | |
| static nsModuleInfo const kModuleInfo = { | |
| NS_MODULEINFO_VERSION, | |
| ("ExternalWrapperModule"), | |
| (components), | |
| (sizeof(components) / sizeof(components[0])), | |
| (nsnull), | |
| (nsnull) | |
| }; | |
| NSGETMODULE_ENTRY_POINT(ExternalWrapperModule) (nsIComponentManager *servMgr, | |
| nsIFile* location, nsIModule** result) { | |
| nsresult nr; | |
| nsCOMPtr<nsIXULAppInfo> app_info | |
| = do_GetService("@mozilla.org/xre/app-info;1", &nr); | |
| if (NS_FAILED(nr) || !app_info) { | |
| return NS_ERROR_FAILURE; | |
| } | |
| nsCString gecko_version; | |
| app_info->GetPlatformVersion(gecko_version); | |
| nsCString browser_version; | |
| app_info->GetVersion(browser_version); | |
| nsCOMPtr<nsIXULRuntime> xulRuntime | |
| = do_GetService("@mozilla.org/xre/app-info;1", &nr); | |
| if (NS_FAILED(nr) || !app_info) { | |
| return NS_ERROR_FAILURE; | |
| } | |
| nsCString os; | |
| xulRuntime->GetOS(os); | |
| nsCString abi; | |
| xulRuntime->GetXPCOMABI(abi); | |
| Debug::log(Debug::Info) << "Initializing GWT Developer Plugin" | |
| << Debug::flush; | |
| Debug::log(Debug::Info) << " gecko=" << gecko_version.BeginReading() | |
| << ", firefox=" << browser_version.BeginReading() << ", abi=" | |
| << os.BeginReading() << "_" << abi.BeginReading() << ", built for " | |
| QUOTE(BROWSER) << Debug::flush; | |
| return NS_NewGenericModule2(&kModuleInfo, result); | |
| } |