diff options
Diffstat (limited to 'b2g/components/GaiaChrome.cpp')
-rw-r--r-- | b2g/components/GaiaChrome.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/b2g/components/GaiaChrome.cpp b/b2g/components/GaiaChrome.cpp new file mode 100644 index 000000000..2b53750c2 --- /dev/null +++ b/b2g/components/GaiaChrome.cpp @@ -0,0 +1,188 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "GaiaChrome.h" + +#include "nsAppDirectoryServiceDefs.h" +#include "nsChromeRegistry.h" +#include "nsDirectoryServiceDefs.h" +#include "nsLocalFile.h" +#include "nsXULAppAPI.h" + +#include "mozilla/ClearOnShutdown.h" +#include "mozilla/ModuleUtils.h" +#include "mozilla/Services.h" +#include "mozilla/FileLocation.h" + +#define NS_GAIACHROME_CID \ + { 0x83f8f999, 0x6b87, 0x4dd8, { 0xa0, 0x93, 0x72, 0x0b, 0xfb, 0x67, 0x4d, 0x38 } } + +using namespace mozilla; + +StaticRefPtr<GaiaChrome> gGaiaChrome; + +NS_IMPL_ISUPPORTS(GaiaChrome, nsIGaiaChrome) + +GaiaChrome::GaiaChrome() + : mPackageName(NS_LITERAL_CSTRING("gaia")) + , mAppsDir(NS_LITERAL_STRING("apps")) + , mDataRoot(NS_LITERAL_STRING("/data/local")) + , mSystemRoot(NS_LITERAL_STRING("/system/b2g")) +{ + MOZ_ASSERT(NS_IsMainThread()); + + GetProfileDir(); + Register(); +} + +//virtual +GaiaChrome::~GaiaChrome() +{ +} + +nsresult +GaiaChrome::GetProfileDir() +{ + nsCOMPtr<nsIFile> profDir; + nsresult rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR, + getter_AddRefs(profDir)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = profDir->Clone(getter_AddRefs(mProfDir)); + NS_ENSURE_SUCCESS(rv, rv); + + return NS_OK; +} + +nsresult +GaiaChrome::ComputeAppsPath(nsIFile* aPath) +{ +#if defined(MOZ_MULET) + aPath->InitWithFile(mProfDir); +#elif defined(MOZ_WIDGET_GONK) + nsCOMPtr<nsIFile> locationDetection = new nsLocalFile(); + locationDetection->InitWithPath(mSystemRoot); + locationDetection->Append(mAppsDir); + bool appsInSystem = EnsureIsDirectory(locationDetection); + locationDetection->InitWithPath(mDataRoot); + locationDetection->Append(mAppsDir); + bool appsInData = EnsureIsDirectory(locationDetection); + + if (!appsInData && !appsInSystem) { + printf_stderr("!!! NO root directory with apps found\n"); + MOZ_ASSERT(false); + return NS_ERROR_UNEXPECTED; + } + + aPath->InitWithPath(appsInData ? mDataRoot : mSystemRoot); +#else + return NS_ERROR_UNEXPECTED; +#endif + + aPath->Append(mAppsDir); + aPath->Append(NS_LITERAL_STRING(".")); + + nsresult rv = EnsureValidPath(aPath); + NS_ENSURE_SUCCESS(rv, rv); + + return NS_OK; +} + +bool +GaiaChrome::EnsureIsDirectory(nsIFile* aPath) +{ + bool isDir = false; + aPath->IsDirectory(&isDir); + return isDir; +} + +nsresult +GaiaChrome::EnsureValidPath(nsIFile* appsDir) +{ + // Ensure there is a valid "apps/system" directory + nsCOMPtr<nsIFile> systemAppDir = new nsLocalFile(); + systemAppDir->InitWithFile(appsDir); + systemAppDir->Append(NS_LITERAL_STRING("system")); + + bool hasSystemAppDir = EnsureIsDirectory(systemAppDir); + if (!hasSystemAppDir) { + nsCString path; appsDir->GetNativePath(path); + // We don't want to continue if the apps path does not exists ... + printf_stderr("!!! Gaia chrome package is not a directory: %s\n", path.get()); + return NS_ERROR_UNEXPECTED; + } + + return NS_OK; +} + +NS_IMETHODIMP +GaiaChrome::Register() +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(nsChromeRegistry::gChromeRegistry != nullptr); + + nsCOMPtr<nsIFile> aPath = new nsLocalFile(); + nsresult rv = ComputeAppsPath(aPath); + NS_ENSURE_SUCCESS(rv, rv); + + FileLocation appsLocation(aPath); + nsCString uri; + appsLocation.GetURIString(uri); + + char* argv[2]; + argv[0] = (char*)mPackageName.get(); + argv[1] = (char*)uri.get(); + + nsChromeRegistry::ManifestProcessingContext cx(NS_APP_LOCATION, appsLocation); + nsChromeRegistry::gChromeRegistry->ManifestContent(cx, 0, argv, 0); + + return NS_OK; +} + +already_AddRefed<GaiaChrome> +GaiaChrome::FactoryCreate() +{ + if (!XRE_IsParentProcess()) { + return nullptr; + } + + MOZ_ASSERT(NS_IsMainThread()); + + if (!gGaiaChrome) { + gGaiaChrome = new GaiaChrome(); + ClearOnShutdown(&gGaiaChrome); + } + + RefPtr<GaiaChrome> service = gGaiaChrome.get(); + return service.forget(); +} + +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(GaiaChrome, + GaiaChrome::FactoryCreate) + +NS_DEFINE_NAMED_CID(NS_GAIACHROME_CID); + +static const mozilla::Module::CIDEntry kGaiaChromeCIDs[] = { + { &kNS_GAIACHROME_CID, false, nullptr, GaiaChromeConstructor }, + { nullptr } +}; + +static const mozilla::Module::ContractIDEntry kGaiaChromeContracts[] = { + { "@mozilla.org/b2g/gaia-chrome;1", &kNS_GAIACHROME_CID }, + { nullptr } +}; + +static const mozilla::Module::CategoryEntry kGaiaChromeCategories[] = { + { "profile-after-change", "Gaia Chrome Registration", GAIACHROME_CONTRACTID }, + { nullptr } +}; + +static const mozilla::Module kGaiaChromeModule = { + mozilla::Module::kVersion, + kGaiaChromeCIDs, + kGaiaChromeContracts, + kGaiaChromeCategories +}; + +NSMODULE_DEFN(GaiaChromeModule) = &kGaiaChromeModule; |