1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/quota/FileStreams.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,132 @@ 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 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "FileStreams.h" 1.11 + 1.12 +#include "QuotaManager.h" 1.13 +#include "prio.h" 1.14 + 1.15 +USING_QUOTA_NAMESPACE 1.16 + 1.17 +template <class FileStreamBase> 1.18 +NS_IMETHODIMP 1.19 +FileQuotaStream<FileStreamBase>::SetEOF() 1.20 +{ 1.21 + nsresult rv = FileStreamBase::SetEOF(); 1.22 + NS_ENSURE_SUCCESS(rv, rv); 1.23 + 1.24 + if (mQuotaObject) { 1.25 + int64_t offset; 1.26 + nsresult rv = FileStreamBase::Tell(&offset); 1.27 + NS_ENSURE_SUCCESS(rv, rv); 1.28 + 1.29 + mQuotaObject->UpdateSize(offset); 1.30 + } 1.31 + 1.32 + return NS_OK; 1.33 +} 1.34 + 1.35 +template <class FileStreamBase> 1.36 +NS_IMETHODIMP 1.37 +FileQuotaStream<FileStreamBase>::Close() 1.38 +{ 1.39 + nsresult rv = FileStreamBase::Close(); 1.40 + NS_ENSURE_SUCCESS(rv, rv); 1.41 + 1.42 + mQuotaObject = nullptr; 1.43 + 1.44 + return NS_OK; 1.45 +} 1.46 + 1.47 +template <class FileStreamBase> 1.48 +nsresult 1.49 +FileQuotaStream<FileStreamBase>::DoOpen() 1.50 +{ 1.51 + QuotaManager* quotaManager = QuotaManager::Get(); 1.52 + NS_ASSERTION(quotaManager, "Shouldn't be null!"); 1.53 + 1.54 + NS_ASSERTION(!mQuotaObject, "Creating quota object more than once?"); 1.55 + mQuotaObject = quotaManager->GetQuotaObject(mPersistenceType, mGroup, mOrigin, 1.56 + FileStreamBase::mOpenParams.localFile); 1.57 + 1.58 + nsresult rv = FileStreamBase::DoOpen(); 1.59 + NS_ENSURE_SUCCESS(rv, rv); 1.60 + 1.61 + if (mQuotaObject && (FileStreamBase::mOpenParams.ioFlags & PR_TRUNCATE)) { 1.62 + mQuotaObject->UpdateSize(0); 1.63 + } 1.64 + 1.65 + return NS_OK; 1.66 +} 1.67 + 1.68 +template <class FileStreamBase> 1.69 +NS_IMETHODIMP 1.70 +FileQuotaStreamWithWrite<FileStreamBase>::Write(const char* aBuf, 1.71 + uint32_t aCount, 1.72 + uint32_t* _retval) 1.73 +{ 1.74 + nsresult rv; 1.75 + 1.76 + if (FileQuotaStreamWithWrite::mQuotaObject) { 1.77 + int64_t offset; 1.78 + rv = FileStreamBase::Tell(&offset); 1.79 + NS_ENSURE_SUCCESS(rv, rv); 1.80 + 1.81 + if (!FileQuotaStreamWithWrite:: 1.82 + mQuotaObject->MaybeAllocateMoreSpace(offset, aCount)) { 1.83 + return NS_ERROR_FILE_NO_DEVICE_SPACE; 1.84 + } 1.85 + } 1.86 + 1.87 + rv = FileStreamBase::Write(aBuf, aCount, _retval); 1.88 + NS_ENSURE_SUCCESS(rv, rv); 1.89 + 1.90 + return NS_OK; 1.91 +} 1.92 + 1.93 +NS_IMPL_ISUPPORTS_INHERITED0(FileInputStream, nsFileInputStream) 1.94 + 1.95 +already_AddRefed<FileInputStream> 1.96 +FileInputStream::Create(PersistenceType aPersistenceType, 1.97 + const nsACString& aGroup, const nsACString& aOrigin, 1.98 + nsIFile* aFile, int32_t aIOFlags, int32_t aPerm, 1.99 + int32_t aBehaviorFlags) 1.100 +{ 1.101 + nsRefPtr<FileInputStream> stream = 1.102 + new FileInputStream(aPersistenceType, aGroup, aOrigin); 1.103 + nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags); 1.104 + NS_ENSURE_SUCCESS(rv, nullptr); 1.105 + return stream.forget(); 1.106 +} 1.107 + 1.108 +NS_IMPL_ISUPPORTS_INHERITED0(FileOutputStream, nsFileOutputStream) 1.109 + 1.110 +already_AddRefed<FileOutputStream> 1.111 +FileOutputStream::Create(PersistenceType aPersistenceType, 1.112 + const nsACString& aGroup, const nsACString& aOrigin, 1.113 + nsIFile* aFile, int32_t aIOFlags, int32_t aPerm, 1.114 + int32_t aBehaviorFlags) 1.115 +{ 1.116 + nsRefPtr<FileOutputStream> stream = 1.117 + new FileOutputStream(aPersistenceType, aGroup, aOrigin); 1.118 + nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags); 1.119 + NS_ENSURE_SUCCESS(rv, nullptr); 1.120 + return stream.forget(); 1.121 +} 1.122 + 1.123 +NS_IMPL_ISUPPORTS_INHERITED0(FileStream, nsFileStream) 1.124 + 1.125 +already_AddRefed<FileStream> 1.126 +FileStream::Create(PersistenceType aPersistenceType, const nsACString& aGroup, 1.127 + const nsACString& aOrigin, nsIFile* aFile, int32_t aIOFlags, 1.128 + int32_t aPerm, int32_t aBehaviorFlags) 1.129 +{ 1.130 + nsRefPtr<FileStream> stream = 1.131 + new FileStream(aPersistenceType, aGroup, aOrigin); 1.132 + nsresult rv = stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags); 1.133 + NS_ENSURE_SUCCESS(rv, nullptr); 1.134 + return stream.forget(); 1.135 +}