dom/filehandle/File.cpp
author Ryan VanderMeulen <ryanvm@gmail.com>
Thu, 10 Jul 2014 21:43:04 -0400
changeset 215438 70f3b01cb736ea9f21d692e537058ad3859a9c69
parent 213045 e94f3dde9619e8bfcbd1743437a323ad83de7df3
permissions -rw-r--r--
Backed out 5 changesets (bug 1020760, bug 1035653, bug 1020090) for leaks on a CLOSED TREE. Backed out changeset f0b20e3db93c (bug 1020760) Backed out changeset 412b654e5cd2 (bug 1035653) Backed out changeset 01ba0892af29 (bug 1020760) Backed out changeset c7de1f4b078f (bug 1020760) Backed out changeset 96aa9d33a1f5 (bug 1020090)

/* -*- 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 "File.h"

#include "FileHandle.h"
#include "mozilla/Assertions.h"
#include "nsDebug.h"

namespace mozilla {
namespace dom {

using indexedDB::IndexedDatabaseManager;

NS_IMPL_ISUPPORTS_INHERITED0(FileImpl, DOMFileImpl)

// Create as a file
FileImpl::FileImpl(const nsAString& aName, const nsAString& aContentType,
                   uint64_t aLength, nsIFile* aFile, FileHandle* aFileHandle)
  : DOMFileImplBase(aName, aContentType, aLength),
    mFile(aFile), mFileHandle(aFileHandle), mWholeFile(true), mStoredFile(false)
{
  MOZ_ASSERT(mFile, "Null file!");
  MOZ_ASSERT(mFileHandle, "Null file handle!");
}

// Create as a stored file
FileImpl::FileImpl(const nsAString& aName, const nsAString& aContentType,
                   uint64_t aLength, nsIFile* aFile, FileHandle* aFileHandle,
                   indexedDB::FileInfo* aFileInfo)
  : DOMFileImplBase(aName, aContentType, aLength),
    mFile(aFile), mFileHandle(aFileHandle), mWholeFile(true), mStoredFile(true)
{
  MOZ_ASSERT(mFile, "Null file!");
  MOZ_ASSERT(mFileHandle, "Null file handle!");
  mFileInfos.AppendElement(aFileInfo);
}

// Create slice
FileImpl::FileImpl(const FileImpl* aOther, uint64_t aStart, uint64_t aLength,
                   const nsAString& aContentType)
  : DOMFileImplBase(aContentType, aOther->mStart + aStart, aLength),
    mFile(aOther->mFile), mFileHandle(aOther->mFileHandle),
    mWholeFile(false), mStoredFile(aOther->mStoredFile)
{
  MOZ_ASSERT(mFile, "Null file!");
  MOZ_ASSERT(mFileHandle, "Null file handle!");

  if (mStoredFile) {
    indexedDB::FileInfo* fileInfo;

    if (IndexedDatabaseManager::IsClosed()) {
      fileInfo = aOther->GetFileInfo();
    }
    else {
      MutexAutoLock lock(IndexedDatabaseManager::FileMutex());
      fileInfo = aOther->GetFileInfo();
    }

    mFileInfos.AppendElement(fileInfo);
  }
}

FileImpl::~FileImpl()
{
}

void
FileImpl::Unlink()
{
  FileImpl* tmp = this;
  NS_IMPL_CYCLE_COLLECTION_UNLINK(mFileHandle);
}

void
FileImpl::Traverse(nsCycleCollectionTraversalCallback &cb)
{
  FileImpl* tmp = this;
  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mFileHandle);
}

nsresult
FileImpl::GetInternalStream(nsIInputStream** aStream)
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  nsresult rv = mFileHandle->OpenInputStream(mWholeFile, mStart, mLength,
                                             aStream);
  NS_ENSURE_SUCCESS(rv, rv);

  return NS_OK;
}

already_AddRefed<nsIDOMBlob>
FileImpl::CreateSlice(uint64_t aStart, uint64_t aLength,
                      const nsAString& aContentType)
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");

  nsCOMPtr<nsIDOMBlob> t =
    new DOMFile(new FileImpl(this, aStart, aLength, aContentType));

  return t.forget();
}

nsresult
FileImpl::GetMozFullPathInternal(nsAString& aFilename)
{
  NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
  NS_ASSERTION(mIsFile, "Should only be called on files");

  return mFile->GetPath(aFilename);
}

} // namespace dom
} // namespace mozilla