// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/logging.h"

#include "mojo/services/network/upload_element_reader.h"

namespace mojo {

UploadElementReader::UploadElementReader(ScopedDataPipeConsumerHandle pipe)
  : pipe_(pipe.Pass()) {
}

UploadElementReader::~UploadElementReader() {}

MojoResult UploadElementReader::ReadAll(std::ostream *os) {
  MojoResult result = MOJO_RESULT_OK;

  while (true) {
    uint32_t num_bytes = buf_.size();
    result = ReadDataRaw(pipe_.get(), (void*)buf_.data(),
                         &num_bytes, MOJO_READ_DATA_FLAG_NONE);
    if (result == MOJO_RESULT_SHOULD_WAIT) {
      result = Wait(pipe_.get(),
                    MOJO_HANDLE_SIGNAL_READABLE,
                    MOJO_DEADLINE_INDEFINITE,
                    nullptr);
      if (result == MOJO_RESULT_OK)
        continue; // retry now that the data pipe is ready
    }

    if (result != MOJO_RESULT_OK) {
      // If the other end closes the data pipe,
      // we get MOJO_RESULT_FAILED_PRECONDITION.
      if (result == MOJO_RESULT_FAILED_PRECONDITION) {
        result = MOJO_RESULT_OK;
        break;
      }
      LOG(ERROR) << "UploadELementReader: result=" << result;
      break;
    }

    os->write(buf_.data(), num_bytes);
    if (!*os) {
      // TODO(toshik): better result code?
      result = MOJO_RESULT_RESOURCE_EXHAUSTED;
      LOG(ERROR) << "UploadElementReader: result=" << result;
      break;
    }
  }

  return result;
}

}  // namespace mojo
