void FileReaderSync::ReadAsBinaryString(File& aBlob, nsAString& aResult, ErrorResult& aRv) { nsCOMPtr<nsIInputStream> stream; nsresult rv = aBlob.GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } uint32_t numRead; do { char readBuf[4096]; rv = stream->Read(readBuf, sizeof(readBuf), &numRead); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } uint32_t oldLength = aResult.Length(); AppendASCIItoUTF16(Substring(readBuf, readBuf + numRead), aResult); if (aResult.Length() - oldLength != numRead) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } } while (numRead > 0); }
void FileReaderSync::ReadAsDataURL(File& aBlob, nsAString& aResult, ErrorResult& aRv) { nsAutoString scratchResult; scratchResult.AssignLiteral("data:"); nsString contentType; aBlob.GetType(contentType); if (contentType.IsEmpty()) { scratchResult.AppendLiteral("application/octet-stream"); } else { scratchResult.Append(contentType); } scratchResult.AppendLiteral(";base64,"); nsCOMPtr<nsIInputStream> stream; nsresult rv = aBlob.GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } uint64_t size; rv = aBlob.GetSize(&size); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } nsCOMPtr<nsIInputStream> bufferedStream; rv = NS_NewBufferedInputStream(getter_AddRefs(bufferedStream), stream, size); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } nsAutoString encodedData; rv = Base64EncodeInputStream(bufferedStream, encodedData, size); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } scratchResult.Append(encodedData); aResult = scratchResult; }
void FileReaderSync::ReadAsArrayBuffer(JSContext* aCx, JS::Handle<JSObject*> aScopeObj, File& aBlob, JS::MutableHandle<JSObject*> aRetval, ErrorResult& aRv) { uint64_t blobSize; nsresult rv = aBlob.GetSize(&blobSize); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } UniquePtr<char[], JS::FreePolicy> bufferData(js_pod_malloc<char>(blobSize)); if (!bufferData) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } nsCOMPtr<nsIInputStream> stream; rv = aBlob.GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } uint32_t numRead; rv = stream->Read(bufferData.get(), blobSize, &numRead); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } NS_ASSERTION(numRead == blobSize, "failed to read data"); JSObject* arrayBuffer = JS_NewArrayBufferWithContents(aCx, blobSize, bufferData.get()); if (!arrayBuffer) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; } bufferData.release(); aRetval.set(arrayBuffer); }
void FileReaderSync::ReadAsText(File& aBlob, const Optional<nsAString>& aEncoding, nsAString& aResult, ErrorResult& aRv) { nsCOMPtr<nsIInputStream> stream; nsresult rv = aBlob.GetInternalStream(getter_AddRefs(stream)); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } nsAutoCString encoding; unsigned char sniffBuf[3] = { 0, 0, 0 }; uint32_t numRead; rv = stream->Read(reinterpret_cast<char*>(sniffBuf), sizeof(sniffBuf), &numRead); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } // The BOM sniffing is baked into the "decode" part of the Encoding // Standard, which the File API references. if (!nsContentUtils::CheckForBOM(sniffBuf, numRead, encoding)) { // BOM sniffing failed. Try the API argument. if (!aEncoding.WasPassed() || !EncodingUtils::FindEncodingForLabel(aEncoding.Value(), encoding)) { // API argument failed. Try the type property of the blob. nsAutoString type16; aBlob.GetType(type16); NS_ConvertUTF16toUTF8 type(type16); nsAutoCString specifiedCharset; bool haveCharset; int32_t charsetStart, charsetEnd; NS_ExtractCharsetFromContentType(type, specifiedCharset, &haveCharset, &charsetStart, &charsetEnd); if (!EncodingUtils::FindEncodingForLabel(specifiedCharset, encoding)) { // Type property failed. Use UTF-8. encoding.AssignLiteral("UTF-8"); } } } nsCOMPtr<nsISeekableStream> seekable = do_QueryInterface(stream); if (!seekable) { aRv.Throw(NS_ERROR_FAILURE); return; } // Seek to 0 because to undo the BOM sniffing advance. UTF-8 and UTF-16 // decoders will swallow the BOM. rv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } rv = ConvertStream(stream, encoding.get(), aResult); if (NS_FAILED(rv)) { aRv.Throw(rv); return; } }