summaryrefslogtreecommitdiffstats
path: root/b2g/components/GaiaChrome.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/GaiaChrome.cpp')
-rw-r--r--b2g/components/GaiaChrome.cpp188
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;