netwerk/base/src/nsTemporaryFileInputStream.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "nsTemporaryFileInputStream.h"
     7 #include "nsStreamUtils.h"
     8 #include <algorithm>
    10 NS_IMPL_ISUPPORTS(nsTemporaryFileInputStream, nsIInputStream)
    12 nsTemporaryFileInputStream::nsTemporaryFileInputStream(FileDescOwner* aFileDescOwner, uint64_t aStartPos, uint64_t aEndPos)
    13   : mFileDescOwner(aFileDescOwner),
    14     mStartPos(aStartPos),
    15     mEndPos(aEndPos),
    16     mClosed(false)
    17 { 
    18   NS_ASSERTION(aStartPos <= aEndPos, "StartPos should less equal than EndPos!");
    19 }
    21 NS_IMETHODIMP
    22 nsTemporaryFileInputStream::Close()
    23 {
    24   mClosed = true;
    25   return NS_OK;
    26 }
    28 NS_IMETHODIMP
    29 nsTemporaryFileInputStream::Available(uint64_t * bytesAvailable)
    30 {
    31   if (mClosed)
    32     return NS_BASE_STREAM_CLOSED;
    34   NS_ASSERTION(mStartPos <= mEndPos, "StartPos should less equal than EndPos!");
    36   *bytesAvailable = mEndPos - mStartPos;
    37   return NS_OK;
    38 }
    40 NS_IMETHODIMP
    41 nsTemporaryFileInputStream::Read(char* buffer, uint32_t count, uint32_t* bytesRead)
    42 {
    43   return ReadSegments(NS_CopySegmentToBuffer, buffer, count, bytesRead);
    44 }
    46 NS_IMETHODIMP
    47 nsTemporaryFileInputStream::ReadSegments(nsWriteSegmentFun writer,
    48                                          void *            closure,
    49                                          uint32_t          count,
    50                                          uint32_t *        result)
    51 {
    52   NS_ASSERTION(result, "null ptr");
    53   NS_ASSERTION(mStartPos <= mEndPos, "bad stream state");
    54   *result = 0;
    56   if (mClosed) {
    57     return NS_BASE_STREAM_CLOSED;
    58   }
    60   mozilla::MutexAutoLock lock(mFileDescOwner->FileMutex());
    61   PR_Seek64(mFileDescOwner->mFD, mStartPos, PR_SEEK_SET);
    63   count = std::min(count, uint32_t(mEndPos - mStartPos));
    64   uint32_t remainBufCount = count;
    66   char buf[4096];
    67   while (remainBufCount > 0) {
    68     uint32_t bufCount = std::min(remainBufCount, (uint32_t)sizeof(buf));
    69     int32_t read_result = PR_Read(mFileDescOwner->mFD, buf, bufCount);
    70     if (read_result < 0) {
    71       return NS_ErrorAccordingToNSPR();
    72     }
    73     uint32_t write_result = 0;
    74     nsresult rv = writer(this, closure, buf,
    75                          count - remainBufCount, bufCount, &write_result);
    76     remainBufCount -= bufCount;
    77     if (NS_SUCCEEDED(rv)) {
    78       NS_ASSERTION(write_result <= bufCount,
    79                    "writer should not write more than we asked it to write");
    80     }
    81     mStartPos += bufCount;
    82   }
    83   *result = count;
    84   return NS_OK;
    85 }
    87 NS_IMETHODIMP
    88 nsTemporaryFileInputStream::IsNonBlocking(bool * nonBlocking)
    89 {
    90   *nonBlocking = false;
    91   return NS_OK;
    92 }

mercurial