ResourceStream.cpp (1696B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim:set ts=2 sw=2 sts=2 et cindent: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "ResourceStream.h" 8 9 namespace mozilla { 10 11 ResourceStream::ResourceStream(mozilla::MediaResource* aResource) 12 : mResource(aResource), mPinCount(0) { 13 MOZ_ASSERT(aResource); 14 DDLINKCHILD("resource", &mResource); 15 } 16 17 ResourceStream::~ResourceStream() { MOZ_ASSERT(mPinCount == 0); } 18 19 nsresult ResourceStream::ReadAt(int64_t aOffset, void* aBuffer, size_t aCount, 20 size_t* aBytesRead) { 21 uint32_t sum = 0; 22 uint32_t bytesRead = 0; 23 do { 24 uint64_t offset = aOffset + sum; 25 char* buffer = reinterpret_cast<char*>(aBuffer) + sum; 26 uint32_t toRead = aCount - sum; 27 nsresult rv = mResource.ReadAt(offset, buffer, toRead, &bytesRead); 28 if (NS_FAILED(rv)) { 29 return rv; 30 } 31 sum += bytesRead; 32 } while (sum < aCount && bytesRead > 0); 33 34 *aBytesRead = sum; 35 return NS_OK; 36 } 37 38 nsresult ResourceStream::CachedReadAt(int64_t aOffset, void* aBuffer, 39 size_t aCount, size_t* aBytesRead) { 40 nsresult rv = mResource.GetResource()->ReadFromCache( 41 reinterpret_cast<char*>(aBuffer), aOffset, aCount); 42 if (NS_FAILED(rv)) { 43 *aBytesRead = 0; 44 return rv; 45 } 46 *aBytesRead = aCount; 47 return rv; 48 } 49 50 bool ResourceStream::Length(int64_t* aSize) { 51 if (mResource.GetLength() < 0) return false; 52 *aSize = mResource.GetLength(); 53 return true; 54 } 55 56 } // namespace mozilla