1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/file/FileHandle.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,195 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "FileHandle.h" 1.11 + 1.12 +#include "nsContentUtils.h" 1.13 +#include "nsDOMClassInfoID.h" 1.14 +#include "nsNetUtil.h" 1.15 + 1.16 +#include "nsIDOMFile.h" 1.17 +#include "nsIFileStorage.h" 1.18 + 1.19 +#include "File.h" 1.20 +#include "FileRequest.h" 1.21 +#include "FileService.h" 1.22 +#include "LockedFile.h" 1.23 +#include "MetadataHelper.h" 1.24 +#include "mozilla/dom/FileHandleBinding.h" 1.25 + 1.26 +using namespace mozilla; 1.27 +using namespace mozilla::dom; 1.28 +USING_FILE_NAMESPACE 1.29 + 1.30 +namespace { 1.31 + 1.32 +class GetFileHelper : public MetadataHelper 1.33 +{ 1.34 +public: 1.35 + GetFileHelper(LockedFile* aLockedFile, 1.36 + FileRequest* aFileRequest, 1.37 + MetadataParameters* aParams, 1.38 + FileHandle* aFileHandle) 1.39 + : MetadataHelper(aLockedFile, aFileRequest, aParams), 1.40 + mFileHandle(aFileHandle) 1.41 + { } 1.42 + 1.43 + virtual nsresult 1.44 + GetSuccessResult(JSContext* aCx, 1.45 + JS::MutableHandle<JS::Value> aVal) MOZ_OVERRIDE; 1.46 + 1.47 + virtual void 1.48 + ReleaseObjects() MOZ_OVERRIDE 1.49 + { 1.50 + mFileHandle = nullptr; 1.51 + 1.52 + MetadataHelper::ReleaseObjects(); 1.53 + } 1.54 + 1.55 +private: 1.56 + nsRefPtr<FileHandle> mFileHandle; 1.57 +}; 1.58 + 1.59 +} // anonymous namespace 1.60 + 1.61 +NS_IMPL_CYCLE_COLLECTION_INHERITED(FileHandle, DOMEventTargetHelper, 1.62 + mFileStorage) 1.63 + 1.64 +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FileHandle) 1.65 +NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) 1.66 + 1.67 +NS_IMPL_ADDREF_INHERITED(FileHandle, DOMEventTargetHelper) 1.68 +NS_IMPL_RELEASE_INHERITED(FileHandle, DOMEventTargetHelper) 1.69 + 1.70 +// static 1.71 +already_AddRefed<FileHandle> 1.72 +FileHandle::Create(nsPIDOMWindow* aWindow, 1.73 + nsIFileStorage* aFileStorage, 1.74 + nsIFile* aFile) 1.75 +{ 1.76 + MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); 1.77 + 1.78 + nsRefPtr<FileHandle> newFileHandle = new FileHandle(aWindow); 1.79 + 1.80 + newFileHandle->mFileStorage = aFileStorage; 1.81 + nsresult rv = aFile->GetLeafName(newFileHandle->mName); 1.82 + if (NS_WARN_IF(NS_FAILED(rv))) { 1.83 + return nullptr; 1.84 + } 1.85 + 1.86 + newFileHandle->mFile = aFile; 1.87 + newFileHandle->mFileName = newFileHandle->mName; 1.88 + 1.89 + return newFileHandle.forget(); 1.90 +} 1.91 + 1.92 +// virtual 1.93 +already_AddRefed<nsISupports> 1.94 +FileHandle::CreateStream(nsIFile* aFile, bool aReadOnly) 1.95 +{ 1.96 + nsresult rv; 1.97 + 1.98 + if (aReadOnly) { 1.99 + nsCOMPtr<nsIInputStream> stream; 1.100 + rv = NS_NewLocalFileInputStream(getter_AddRefs(stream), aFile, -1, -1, 1.101 + nsIFileInputStream::DEFER_OPEN); 1.102 + if (NS_WARN_IF(NS_FAILED(rv))) { 1.103 + return nullptr; 1.104 + } 1.105 + return stream.forget(); 1.106 + } 1.107 + 1.108 + nsCOMPtr<nsIFileStream> stream; 1.109 + rv = NS_NewLocalFileStream(getter_AddRefs(stream), aFile, -1, -1, 1.110 + nsIFileStream::DEFER_OPEN); 1.111 + if (NS_WARN_IF(NS_FAILED(rv))) { 1.112 + return nullptr; 1.113 + } 1.114 + return stream.forget(); 1.115 +} 1.116 + 1.117 +// virtual 1.118 +already_AddRefed<nsIDOMFile> 1.119 +FileHandle::CreateFileObject(LockedFile* aLockedFile, uint32_t aFileSize) 1.120 +{ 1.121 + nsCOMPtr<nsIDOMFile> file = 1.122 + new File(mName, mType, aFileSize, mFile, aLockedFile); 1.123 + 1.124 + return file.forget(); 1.125 +} 1.126 + 1.127 +// virtual 1.128 +JSObject* 1.129 +FileHandle::WrapObject(JSContext* aCx) 1.130 +{ 1.131 + return FileHandleBinding::Wrap(aCx, this); 1.132 +} 1.133 + 1.134 +already_AddRefed<LockedFile> 1.135 +FileHandle::Open(FileMode aMode, ErrorResult& aError) 1.136 +{ 1.137 + MOZ_ASSERT(NS_IsMainThread()); 1.138 + 1.139 + if (FileService::IsShuttingDown() || mFileStorage->IsShuttingDown()) { 1.140 + aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); 1.141 + return nullptr; 1.142 + } 1.143 + 1.144 + nsRefPtr<LockedFile> lockedFile = LockedFile::Create(this, aMode); 1.145 + if (!lockedFile) { 1.146 + aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); 1.147 + return nullptr; 1.148 + } 1.149 + 1.150 + return lockedFile.forget(); 1.151 +} 1.152 + 1.153 +already_AddRefed<DOMRequest> 1.154 +FileHandle::GetFile(ErrorResult& aError) 1.155 +{ 1.156 + MOZ_ASSERT(NS_IsMainThread()); 1.157 + 1.158 + // Do nothing if the window is closed 1.159 + if (!GetOwner()) { 1.160 + return nullptr; 1.161 + } 1.162 + 1.163 + nsRefPtr<LockedFile> lockedFile = 1.164 + LockedFile::Create(this, FileMode::Readonly, LockedFile::PARALLEL); 1.165 + if (!lockedFile) { 1.166 + aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); 1.167 + return nullptr; 1.168 + } 1.169 + 1.170 + nsRefPtr<FileRequest> request = 1.171 + FileRequest::Create(GetOwner(), lockedFile, /* aWrapAsDOMRequest */ true); 1.172 + 1.173 + nsRefPtr<MetadataParameters> params = new MetadataParameters(true, false); 1.174 + 1.175 + nsRefPtr<GetFileHelper> helper = 1.176 + new GetFileHelper(lockedFile, request, params, this); 1.177 + 1.178 + nsresult rv = helper->Enqueue(); 1.179 + if (NS_FAILED(rv)) { 1.180 + aError.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); 1.181 + return nullptr; 1.182 + } 1.183 + 1.184 + return request.forget(); 1.185 +} 1.186 + 1.187 +nsresult 1.188 +GetFileHelper::GetSuccessResult(JSContext* aCx, 1.189 + JS::MutableHandle<JS::Value> aVal) 1.190 +{ 1.191 + nsCOMPtr<nsIDOMFile> domFile = 1.192 + mFileHandle->CreateFileObject(mLockedFile, mParams->Size()); 1.193 + 1.194 + nsresult rv = 1.195 + nsContentUtils::WrapNative(aCx, domFile, &NS_GET_IID(nsIDOMFile), aVal); 1.196 + NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); 1.197 + return NS_OK; 1.198 +}