Initial checkin of OOPHM plugins into trunk. Testing of non-XPCOM plugins
is still required, and more platforms need to be built.
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5868 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/plugins/xpcom/ModuleOOPHM.cpp b/plugins/xpcom/ModuleOOPHM.cpp
new file mode 100644
index 0000000..33c5d73
--- /dev/null
+++ b/plugins/xpcom/ModuleOOPHM.cpp
@@ -0,0 +1,145 @@
+/*
+ * 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 "nsServiceManagerUtils.h"
+#include "nsXPCOMCID.h"
+
+#ifdef BROWSER_FF3
+#include "nsIClassInfoImpl.h" // 1.9 only
+#endif
+
+#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) << "Registered GWT hosted mode 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::Debugging) << "ModuleOOPHM unRegisterSelf()"
+ << 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) {
+ Debug::log(Debug::Debugging) << "OOPHM ExternalWrapperModule entry point"
+ << Debug::flush;
+
+ // CURRENTLY BUILT AS SEPARATE PLUGINS FOR FF1.5/2 and FF3, so the below
+ // comments are out of date.
+ //
+ // This module is compiled once against Gecko 1.8 (Firefox 1.5 and 2) and
+ // once against Gecko 1.9 (Firefox 3). We need to make sure that we are
+ // only loaded into the environment we were compiled against.
+ 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);
+ Debug::log(Debug::Debugging) << " gecko version = "
+ << gecko_version.BeginReading() << Debug::flush;
+#if defined(BROWSER_FF2)
+ if (strncmp(gecko_version.BeginReading(), "1.8", 3) != 0) {
+ return NS_ERROR_FAILURE;
+ }
+#elif defined(BROWSER_FF3)
+ if (strncmp(gecko_version.BeginReading(), "1.9", 3) != 0) {
+ return NS_ERROR_FAILURE;
+ }
+#endif
+
+ return NS_NewGenericModule2(&kModuleInfo, result);
+}