already_AddRefed<IDBFileRequest> IDBFileHandle::GetMetadata(const IDBFileMetadataParameters& aParameters, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); // Common state checking if (!CheckState(aRv)) { return nullptr; } // Do nothing if the window is closed if (!CheckWindow()) { return nullptr; } nsRefPtr<MetadataParameters> params = new MetadataParameters(aParameters.mSize, aParameters.mLastModified); if (!params->IsConfigured()) { aRv.ThrowTypeError(MSG_METADATA_NOT_CONFIGURED); return nullptr; } nsRefPtr<FileRequestBase> fileRequest = GenerateFileRequest(); nsRefPtr<MetadataHelper> helper = new MetadataHelper(this, fileRequest, params); if (NS_WARN_IF(NS_FAILED(helper->Enqueue()))) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); return nullptr; } return fileRequest.forget().downcast<IDBFileRequest>(); }
already_AddRefed<FileRequestBase> FileHandleBase::Flush(ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); // State checking for write if (!CheckStateForWrite(aRv)) { return nullptr; } // Do nothing if the window is closed if (!CheckWindow()) { return nullptr; } nsRefPtr<FileRequestBase> fileRequest = GenerateFileRequest(); nsRefPtr<FlushHelper> helper = new FlushHelper(this, fileRequest); if (NS_WARN_IF(NS_FAILED(helper->Enqueue()))) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); return nullptr; } return fileRequest.forget(); }
already_AddRefed<FileRequestBase> FileHandleBase::WriteInternal(nsIInputStream* aInputStream, uint64_t aInputLength, bool aAppend, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); DebugOnly<ErrorResult> error; MOZ_ASSERT(CheckStateForWrite(error)); MOZ_ASSERT_IF(!aAppend, mLocation != UINT64_MAX); MOZ_ASSERT(aInputStream); MOZ_ASSERT(aInputLength); MOZ_ASSERT(CheckWindow()); nsRefPtr<FileRequestBase> fileRequest = GenerateFileRequest(); uint64_t location = aAppend ? UINT64_MAX : mLocation; nsRefPtr<WriteHelper> helper = new WriteHelper(this, fileRequest, location, aInputStream, aInputLength); if (NS_WARN_IF(NS_FAILED(helper->Enqueue()))) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); return nullptr; } if (aAppend) { mLocation = UINT64_MAX; } else { mLocation += aInputLength; } return fileRequest.forget(); }
already_AddRefed<FileRequestBase> FileHandleBase::Read(uint64_t aSize, bool aHasEncoding, const nsAString& aEncoding, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); // State and argument checking for read if (!CheckStateAndArgumentsForRead(aSize, aRv)) { return nullptr; } // Do nothing if the window is closed if (!CheckWindow()) { return nullptr; } nsRefPtr<FileRequestBase> fileRequest = GenerateFileRequest(); nsRefPtr<ReadHelper> helper; if (aHasEncoding) { helper = new ReadTextHelper(this, fileRequest, mLocation, aSize, aEncoding); } else { helper = new ReadHelper(this, fileRequest, mLocation, aSize); } if (NS_WARN_IF(NS_FAILED(helper->Init())) || NS_WARN_IF(NS_FAILED(helper->Enqueue()))) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); return nullptr; } mLocation += aSize; return fileRequest.forget(); }
NS_IMETHODIMP LockedFile::Flush(nsIDOMFileRequest** _retval) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); if (!IsOpen()) { return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR; } if (mMode != READ_WRITE) { return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR; } // Do nothing if the window is closed if (!GetOwner()) { return NS_OK; } nsRefPtr<FileRequest> fileRequest = GenerateFileRequest(); NS_ENSURE_TRUE(fileRequest, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); nsRefPtr<FlushHelper> helper = new FlushHelper(this, fileRequest); nsresult rv = helper->Enqueue(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); fileRequest.forget(_retval); return NS_OK; }
nsresult LockedFile::WriteOrAppend(const jsval& aValue, JSContext* aCx, nsIDOMFileRequest** _retval, bool aAppend) { if (!IsOpen()) { return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR; } if (mMode != READ_WRITE) { return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR; } if (!aAppend && mLocation == LL_MAXUINT) { return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR; } // Do nothing if the window is closed if (!GetOwner()) { return NS_OK; } nsCOMPtr<nsIInputStream> inputStream; uint64_t inputLength; nsresult rv = GetInputStreamForJSVal(aValue, aCx, getter_AddRefs(inputStream), &inputLength); NS_ENSURE_SUCCESS(rv, rv); if (!inputLength) { return NS_OK; } nsRefPtr<FileRequest> fileRequest = GenerateFileRequest(); NS_ENSURE_TRUE(fileRequest, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); uint64_t location = aAppend ? LL_MAXUINT : mLocation; nsRefPtr<WriteHelper> helper = new WriteHelper(this, fileRequest, location, inputStream, inputLength); rv = helper->Enqueue(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); if (aAppend) { mLocation = LL_MAXUINT; } else { mLocation += inputLength; } fileRequest.forget(_retval); return NS_OK; }
NS_IMETHODIMP LockedFile::Truncate(uint64_t aSize, uint8_t aOptionalArgCount, nsIDOMFileRequest** _retval) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); if (!IsOpen()) { return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR; } if (mMode != READ_WRITE) { return NS_ERROR_DOM_FILEHANDLE_READ_ONLY_ERR; } uint64_t location; if (aOptionalArgCount) { // Just in case someone calls us from C++ NS_ASSERTION(aSize != LL_MAXUINT, "Passed wrong size!"); location = aSize; } else { if (mLocation == LL_MAXUINT) { return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR; } location = mLocation; } // Do nothing if the window is closed if (!GetOwner()) { return NS_OK; } nsRefPtr<FileRequest> fileRequest = GenerateFileRequest(); NS_ENSURE_TRUE(fileRequest, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); nsRefPtr<TruncateHelper> helper = new TruncateHelper(this, fileRequest, location); nsresult rv = helper->Enqueue(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); if (aOptionalArgCount) { mLocation = aSize; } fileRequest.forget(_retval); return NS_OK; }
already_AddRefed<FileRequestBase> FileHandleBase::Truncate(const Optional<uint64_t>& aSize, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Wrong thread!"); // State checking for write if (!CheckStateForWrite(aRv)) { return nullptr; } // Getting location and additional state checking for truncate uint64_t location; if (aSize.WasPassed()) { // Just in case someone calls us from C++ MOZ_ASSERT(aSize.Value() != UINT64_MAX, "Passed wrong size!"); location = aSize.Value(); } else { if (mLocation == UINT64_MAX) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR); return nullptr; } location = mLocation; } // Do nothing if the window is closed if (!CheckWindow()) { return nullptr; } nsRefPtr<FileRequestBase> fileRequest = GenerateFileRequest(); nsRefPtr<TruncateHelper> helper = new TruncateHelper(this, fileRequest, location); if (NS_WARN_IF(NS_FAILED(helper->Enqueue()))) { aRv.Throw(NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); return nullptr; } if (aSize.WasPassed()) { mLocation = aSize.Value(); } return fileRequest.forget(); }
NS_IMETHODIMP LockedFile::GetMetadata(const jsval& aParameters, JSContext* aCx, nsIDOMFileRequest** _retval) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); if (!IsOpen()) { return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR; } // Do nothing if the window is closed if (!GetOwner()) { return NS_OK; } nsRefPtr<MetadataParameters> params = new MetadataParameters(); // Get optional arguments. if (!JSVAL_IS_VOID(aParameters) && !JSVAL_IS_NULL(aParameters)) { nsresult rv = params->Init(aCx, &aParameters); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); if (!params->IsConfigured()) { return NS_ERROR_TYPE_ERR; } } else { params->Init(true, true); } nsRefPtr<FileRequest> fileRequest = GenerateFileRequest(); NS_ENSURE_TRUE(fileRequest, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); nsRefPtr<MetadataHelper> helper = new MetadataHelper(this, fileRequest, params); nsresult rv = helper->Enqueue(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); fileRequest.forget(_retval); return NS_OK; }
NS_IMETHODIMP LockedFile::ReadAsText(uint64_t aSize, const nsAString& aEncoding, nsIDOMFileRequest** _retval) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); if (!IsOpen()) { return NS_ERROR_DOM_FILEHANDLE_LOCKEDFILE_INACTIVE_ERR; } if (mLocation == LL_MAXUINT) { return NS_ERROR_DOM_FILEHANDLE_NOT_ALLOWED_ERR; } if (!aSize) { return NS_ERROR_TYPE_ERR; } // Do nothing if the window is closed if (!GetOwner()) { return NS_OK; } nsRefPtr<FileRequest> fileRequest = GenerateFileRequest(); NS_ENSURE_TRUE(fileRequest, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); nsRefPtr<ReadTextHelper> helper = new ReadTextHelper(this, fileRequest, mLocation, aSize, aEncoding); nsresult rv = helper->Init(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); rv = helper->Enqueue(); NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_FILEHANDLE_UNKNOWN_ERR); mLocation += aSize; fileRequest.forget(_retval); return NS_OK; }