/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=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 "FileStreams.h" // Local includes #include "QuotaCommon.h" #include "QuotaManager.h" #include "QuotaObject.h" // Global includes #include #include "mozilla/Assertions.h" #include "mozilla/DebugOnly.h" #include "mozilla/Result.h" #include "mozilla/dom/quota/ResultExtensions.h" #include "nsDebug.h" #include "prio.h" namespace mozilla::dom::quota { template NS_IMETHODIMP FileQuotaStream::SetEOF() { QM_TRY(MOZ_TO_RESULT(FileStreamBase::SetEOF())); if (mQuotaObject) { int64_t offset; QM_TRY(MOZ_TO_RESULT(FileStreamBase::Tell(&offset))); DebugOnly res = mQuotaObject->MaybeUpdateSize(offset, /* aTruncate */ true); MOZ_ASSERT(res); } return NS_OK; } template NS_IMETHODIMP FileQuotaStream::Close() { QM_TRY(MOZ_TO_RESULT(FileStreamBase::Close())); mQuotaObject = nullptr; return NS_OK; } template nsresult FileQuotaStream::DoOpen() { QuotaManager* quotaManager = QuotaManager::Get(); MOZ_ASSERT(quotaManager, "Shouldn't be null!"); MOZ_ASSERT(!mQuotaObject, "Creating quota object more than once?"); mQuotaObject = quotaManager->GetQuotaObject( mPersistenceType, mOriginMetadata, mClientType, FileStreamBase::mOpenParams.localFile); QM_TRY(MOZ_TO_RESULT(FileStreamBase::DoOpen())); if (mQuotaObject && (FileStreamBase::mOpenParams.ioFlags & PR_TRUNCATE)) { DebugOnly res = mQuotaObject->MaybeUpdateSize(0, /* aTruncate */ true); MOZ_ASSERT(res); } return NS_OK; } template NS_IMETHODIMP FileQuotaStreamWithWrite::Write( const char* aBuf, uint32_t aCount, uint32_t* _retval) { if (FileQuotaStreamWithWrite::mQuotaObject) { int64_t offset; QM_TRY(MOZ_TO_RESULT(FileStreamBase::Tell(&offset))); MOZ_ASSERT(INT64_MAX - offset >= int64_t(aCount)); if (!FileQuotaStreamWithWrite::mQuotaObject->MaybeUpdateSize( offset + int64_t(aCount), /* aTruncate */ false)) { return NS_ERROR_FILE_NO_DEVICE_SPACE; } } QM_TRY(MOZ_TO_RESULT(FileStreamBase::Write(aBuf, aCount, _retval))); return NS_OK; } Result>, nsresult> CreateFileInputStream( PersistenceType aPersistenceType, const OriginMetadata& aOriginMetadata, Client::Type aClientType, nsIFile* aFile, int32_t aIOFlags, int32_t aPerm, int32_t aBehaviorFlags) { const auto stream = MakeNotNull>( aPersistenceType, aOriginMetadata, aClientType); QM_TRY(MOZ_TO_RESULT(stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags))); return stream; } Result>, nsresult> CreateFileOutputStream( PersistenceType aPersistenceType, const OriginMetadata& aOriginMetadata, Client::Type aClientType, nsIFile* aFile, int32_t aIOFlags, int32_t aPerm, int32_t aBehaviorFlags) { const auto stream = MakeNotNull>( aPersistenceType, aOriginMetadata, aClientType); QM_TRY(MOZ_TO_RESULT(stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags))); return stream; } Result>, nsresult> CreateFileStream( PersistenceType aPersistenceType, const OriginMetadata& aOriginMetadata, Client::Type aClientType, nsIFile* aFile, int32_t aIOFlags, int32_t aPerm, int32_t aBehaviorFlags) { const auto stream = MakeNotNull>( aPersistenceType, aOriginMetadata, aClientType); QM_TRY(MOZ_TO_RESULT(stream->Init(aFile, aIOFlags, aPerm, aBehaviorFlags))); return stream; } } // namespace mozilla::dom::quota