diff -r 000000000000 -r 6474c204b198 dom/indexedDB/IDBFileHandle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/indexedDB/IDBFileHandle.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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 "IDBFileHandle.h" + +#include "mozilla/dom/file/File.h" +#include "mozilla/dom/IDBFileHandleBinding.h" +#include "mozilla/dom/quota/FileStreams.h" + +#include "IDBDatabase.h" + +USING_INDEXEDDB_NAMESPACE +USING_QUOTA_NAMESPACE + +namespace { + +inline +already_AddRefed +GetFileFor(FileInfo* aFileInfo) + +{ + FileManager* fileManager = aFileInfo->Manager(); + nsCOMPtr directory = fileManager->GetDirectory(); + NS_ENSURE_TRUE(directory, nullptr); + + nsCOMPtr file = fileManager->GetFileForId(directory, + aFileInfo->Id()); + NS_ENSURE_TRUE(file, nullptr); + + return file.forget(); +} + +} // anonymous namespace + +IDBFileHandle::IDBFileHandle(IDBDatabase* aOwner) + : FileHandle(aOwner) +{ +} + +// static +already_AddRefed +IDBFileHandle::Create(IDBDatabase* aDatabase, + const nsAString& aName, + const nsAString& aType, + already_AddRefed aFileInfo) +{ + NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); + + nsRefPtr fileInfo(aFileInfo); + NS_ASSERTION(fileInfo, "Null pointer!"); + + nsRefPtr newFile = new IDBFileHandle(aDatabase); + + newFile->mFileStorage = aDatabase; + newFile->mName = aName; + newFile->mType = aType; + + newFile->mFile = GetFileFor(fileInfo); + NS_ENSURE_TRUE(newFile->mFile, nullptr); + newFile->mFileName.AppendInt(fileInfo->Id()); + + fileInfo.swap(newFile->mFileInfo); + + return newFile.forget(); +} + +already_AddRefed +IDBFileHandle::CreateStream(nsIFile* aFile, bool aReadOnly) +{ + nsCOMPtr storage = do_QueryInterface(mFileStorage); + NS_ASSERTION(storage, "This should always succeed!"); + + PersistenceType persistenceType = storage->Type(); + const nsACString& group = storage->Group(); + const nsACString& origin = storage->Origin(); + + nsCOMPtr result; + + if (aReadOnly) { + nsRefPtr stream = + FileInputStream::Create(persistenceType, group, origin, aFile, -1, -1, + nsIFileInputStream::DEFER_OPEN); + result = NS_ISUPPORTS_CAST(nsIFileInputStream*, stream); + } + else { + nsRefPtr stream = + FileStream::Create(persistenceType, group, origin, aFile, -1, -1, + nsIFileStream::DEFER_OPEN); + result = NS_ISUPPORTS_CAST(nsIFileStream*, stream); + } + NS_ENSURE_TRUE(result, nullptr); + + return result.forget(); +} + +already_AddRefed +IDBFileHandle::CreateFileObject(mozilla::dom::file::LockedFile* aLockedFile, + uint32_t aFileSize) +{ + nsCOMPtr file = new mozilla::dom::file::File( + mName, mType, aFileSize, mFile, aLockedFile, mFileInfo); + + return file.forget(); +} + +// virtual +JSObject* +IDBFileHandle::WrapObject(JSContext* aCx) +{ + return IDBFileHandleBinding::Wrap(aCx, this); +} + +IDBDatabase* +IDBFileHandle::Database() +{ + NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); + + IDBDatabase* database = static_cast(mFileStorage.get()); + MOZ_ASSERT(database); + + return database; +}