зеркало из https://github.com/mozilla/gecko-dev.git
136 строки
3.8 KiB
C++
136 строки
3.8 KiB
C++
/* 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/. */
|
|
|
|
#ifndef DeviceStorage_h
|
|
#define DeviceStorage_h
|
|
|
|
#include "nsIDOMDeviceStorage.h"
|
|
#include "nsIFile.h"
|
|
#include "nsIPrincipal.h"
|
|
#include "nsIObserver.h"
|
|
#include "nsDOMEventTargetHelper.h"
|
|
#include "mozilla/StaticPtr.h"
|
|
|
|
class DeviceStorageFile MOZ_FINAL
|
|
: public nsISupports {
|
|
public:
|
|
nsCOMPtr<nsIFile> mFile;
|
|
nsString mPath;
|
|
nsString mStorageType;
|
|
bool mEditable;
|
|
|
|
DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile, const nsAString& aPath);
|
|
DeviceStorageFile(const nsAString& aStorageType, nsIFile* aFile);
|
|
void SetPath(const nsAString& aPath);
|
|
void SetEditable(bool aEditable);
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
// we want to make sure that the names of file can't reach
|
|
// outside of the type of storage the user asked for.
|
|
bool IsSafePath();
|
|
|
|
nsresult Remove();
|
|
nsresult Write(nsIInputStream* aInputStream);
|
|
nsresult Write(InfallibleTArray<uint8_t>& bits);
|
|
void CollectFiles(nsTArray<nsRefPtr<DeviceStorageFile> > &aFiles, PRTime aSince = 0);
|
|
void collectFilesInternal(nsTArray<nsRefPtr<DeviceStorageFile> > &aFiles, PRTime aSince, nsAString& aRootPath);
|
|
|
|
static void DirectoryDiskUsage(nsIFile* aFile, uint64_t* aSoFar, const nsAString& aStorageType);
|
|
|
|
private:
|
|
void NormalizeFilePath();
|
|
void AppendRelativePath();
|
|
};
|
|
|
|
/*
|
|
The FileUpdateDispatcher converts file-watcher-notify
|
|
observer events to file-watcher-update events. This is
|
|
used to be able to broadcast events from one child to
|
|
another child in B2G. (f.e., if one child decides to add
|
|
a file, we want to be able to able to send a onchange
|
|
notifications to every other child watching that device
|
|
storage object).
|
|
|
|
We create this object (via GetSingleton) in two places:
|
|
* ContentParent::Init (for IPC)
|
|
* nsDOMDeviceStorage::Init (for non-ipc)
|
|
*/
|
|
class FileUpdateDispatcher MOZ_FINAL
|
|
: public nsIObserver
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIOBSERVER
|
|
|
|
static FileUpdateDispatcher* GetSingleton();
|
|
private:
|
|
static mozilla::StaticRefPtr<FileUpdateDispatcher> sSingleton;
|
|
};
|
|
|
|
class nsDOMDeviceStorage MOZ_FINAL
|
|
: public nsDOMEventTargetHelper
|
|
, public nsIDOMDeviceStorage
|
|
, public nsIObserver
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
NS_DECL_NSIDOMDEVICESTORAGE
|
|
|
|
NS_DECL_NSIOBSERVER
|
|
NS_DECL_NSIDOMEVENTTARGET
|
|
|
|
nsDOMDeviceStorage();
|
|
|
|
nsresult Init(nsPIDOMWindow* aWindow, const nsAString &aType);
|
|
|
|
void SetRootDirectoryForType(const nsAString& aType);
|
|
|
|
static void CreateDeviceStoragesFor(nsPIDOMWindow* aWin,
|
|
const nsAString &aType,
|
|
nsDOMDeviceStorage** aStore);
|
|
void Shutdown();
|
|
|
|
private:
|
|
~nsDOMDeviceStorage();
|
|
|
|
nsresult GetInternal(const JS::Value & aName,
|
|
JSContext* aCx,
|
|
nsIDOMDOMRequest** aRetval,
|
|
bool aEditable);
|
|
|
|
nsresult EnumerateInternal(const JS::Value & aName,
|
|
const JS::Value & aOptions,
|
|
JSContext* aCx,
|
|
uint8_t aArgc,
|
|
bool aEditable,
|
|
nsIDOMDOMCursor** aRetval);
|
|
|
|
nsString mStorageType;
|
|
nsCOMPtr<nsIFile> mRootDirectory;
|
|
|
|
nsCOMPtr<nsIPrincipal> mPrincipal;
|
|
|
|
bool mIsWatchingFile;
|
|
bool mAllowedToWatchFile;
|
|
|
|
nsresult Notify(const char* aReason, class DeviceStorageFile* aFile);
|
|
|
|
friend class WatchFileEvent;
|
|
friend class DeviceStorageRequest;
|
|
|
|
#ifdef MOZ_WIDGET_GONK
|
|
void DispatchMountChangeEvent(nsAString& aType);
|
|
#endif
|
|
|
|
// nsIDOMDeviceStorage.type
|
|
enum {
|
|
DEVICE_STORAGE_TYPE_DEFAULT = 0,
|
|
DEVICE_STORAGE_TYPE_SHARED,
|
|
DEVICE_STORAGE_TYPE_EXTERNAL
|
|
};
|
|
};
|
|
|
|
#endif
|