summaryrefslogtreecommitdiffstats
path: root/dom/system/gonk/MozMtpStorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/system/gonk/MozMtpStorage.cpp')
-rw-r--r--dom/system/gonk/MozMtpStorage.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/dom/system/gonk/MozMtpStorage.cpp b/dom/system/gonk/MozMtpStorage.cpp
new file mode 100644
index 000000000..9c358a132
--- /dev/null
+++ b/dom/system/gonk/MozMtpStorage.cpp
@@ -0,0 +1,135 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* 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 "MozMtpStorage.h"
+#include "MozMtpDatabase.h"
+#include "MozMtpServer.h"
+
+#include "base/message_loop.h"
+#include "nsXULAppAPI.h"
+
+BEGIN_MTP_NAMESPACE
+using namespace android;
+
+MozMtpStorage::MozMtpStorage(Volume* aVolume, MozMtpServer* aMozMtpServer)
+ : mMozMtpServer(aMozMtpServer),
+ mVolume(aVolume)
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+
+ // The MtpStorageID has the physical volume in the top 16 bits, and the
+ // logical volumein the lower 16 bits. We treat each volume as a separate
+ // phsyical storage;
+ mStorageID = mVolume->Id() << 16 | 1;
+
+ MTP_LOG("Storage constructed for Volume %s mStorageID 0x%08x",
+ aVolume->NameStr(), mStorageID);
+
+ Volume::RegisterVolumeObserver(this, "MozMtpStorage");
+
+ // Get things in sync
+ Notify(mVolume);
+}
+
+MozMtpStorage::~MozMtpStorage()
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+
+ MTP_LOG("Storage destructed for Volume %s mStorageID 0x%08x",
+ mVolume->NameStr(), mStorageID);
+
+ Volume::UnregisterVolumeObserver(this, "MozMtpStorage");
+ if (mMtpStorage) {
+ StorageUnavailable();
+ }
+}
+
+// virtual
+void
+MozMtpStorage::Notify(Volume* const& aVolume)
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+
+ if (aVolume != mVolume) {
+ // Not our volume
+ return;
+ }
+ Volume::STATE volState = aVolume->State();
+
+ MTP_LOG("Volume %s mStorageID 0x%08x state changed to %s SharingEnabled: %d",
+ aVolume->NameStr(), mStorageID, aVolume->StateStr(),
+ aVolume->IsSharingEnabled());
+
+ // vol->IsSharingEnabled really only applies to UMS volumes. We assume that
+ // that as long as MTP is enabled, then all volumes will be shared. The UI
+ // currently doesn't give us anything more granular than on/off.
+
+ if (mMtpStorage) {
+ if (volState != nsIVolume::STATE_MOUNTED) {
+ // The volume is no longer accessible. We need to remove this storage
+ // from the MTP server
+ StorageUnavailable();
+ }
+ } else {
+ if (volState == nsIVolume::STATE_MOUNTED) {
+ // The volume is accessible. Tell the MTP server.
+ StorageAvailable();
+ }
+ }
+}
+
+void
+MozMtpStorage::StorageAvailable()
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+
+ nsCString mountPoint = mVolume->MountPoint();
+
+ MTP_LOG("Adding Volume %s mStorageID 0x%08x mountPoint %s to MozMtpDatabase",
+ mVolume->NameStr(), mStorageID, mountPoint.get());
+
+ RefPtr<MozMtpDatabase> db = mMozMtpServer->GetMozMtpDatabase();
+ db->AddStorage(mStorageID, mountPoint.get(), mVolume->NameStr());
+
+ MOZ_ASSERT(!mMtpStorage);
+
+ //TODO: Figure out what to do about maxFileSize.
+
+ mMtpStorage.reset(new MtpStorage(mStorageID, // id
+ mountPoint.get(), // filePath
+ mVolume->NameStr(), // description
+ 1024uLL * 1024uLL, // reserveSpace
+ mVolume->IsHotSwappable(), // removable
+ 2uLL * 1024uLL * 1024uLL * 1024uLL)); // maxFileSize
+ RefPtr<RefCountedMtpServer> server = mMozMtpServer->GetMtpServer();
+
+ MTP_LOG("Adding Volume %s mStorageID 0x%08x mountPoint %s to MtpServer",
+ mVolume->NameStr(), mStorageID, mountPoint.get());
+ server->addStorage(mMtpStorage.get());
+}
+
+void
+MozMtpStorage::StorageUnavailable()
+{
+ MOZ_ASSERT(MessageLoop::current() == XRE_GetIOMessageLoop());
+ MOZ_ASSERT(mMtpStorage);
+
+ MTP_LOG("Removing mStorageID 0x%08x from MtpServer", mStorageID);
+
+ RefPtr<RefCountedMtpServer> server = mMozMtpServer->GetMtpServer();
+ server->removeStorage(mMtpStorage.get());
+
+ MTP_LOG("Removing mStorageID 0x%08x from MozMtpDatabse", mStorageID);
+
+ RefPtr<MozMtpDatabase> db = mMozMtpServer->GetMozMtpDatabase();
+ db->RemoveStorage(mStorageID);
+
+ mMtpStorage = nullptr;
+}
+
+END_MTP_NAMESPACE
+
+