blob: 89aabe6962c118f67db6a256565a32ffe2941513 [file] [log] [blame]
/*
* 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);
}