// Copyright 2019 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef TINK_RANDOM_ACCESS_STREAM_H_
#define TINK_RANDOM_ACCESS_STREAM_H_

#include "tink/util/buffer.h"
#include "tink/util/status.h"
#include "tink/util/statusor.h"

namespace crypto {
namespace tink {

// Abstract interface for streams that provide random access for reading,
// like regular files.
class RandomAccessStream {
 public:
  RandomAccessStream() = default;
  virtual ~RandomAccessStream() = default;

  // Reads up to 'count' bytes starting at 'position' and writes them
  // to 'dest_buffer'.  'position' must be within the size of the stream,
  // 'count' must be positive, 'dest_buffer' must be non-NULL and its
  // allocated size must be not smaller than 'count'.
  //
  // Return values:
  //  OK: if exactly 'count' bytes were read and written to 'dest_buffer',
  //      or if fewer than 'count' (potentially 0) bytes were read,
  //      but the lack of bytes is not permanent, and retrying may succeed;
  //      in this case 'dest_buffer' contains the read bytes, and the size
  //      of the buffer has been changed to the number of bytes read.
  //  OUT_OF_RANGE: if the end of stream has been reached;
  //      in this case 'dest_buffer' contains the bytes read till the end
  //      of the stream (if any).  This status is returned also when
  //      'position' is larger than the current size of the stream.
  //  INVALID_ARGUMENT: if some of the arguments are not valid.
  //  other: if some other error occurred.
  virtual crypto::tink::util::Status PRead(
      int64_t position,
      int count,
      crypto::tink::util::Buffer* dest_buffer) = 0;

  // Returns the size of this stream in bytes, if available.
  // If the size is not available, returns a non-Ok status.
  // The returned value is the "logical" size of a stream, i.e. of
  // a sequence of bytes), stating how many bytes are there in the sequence.
  // For a successful PRead-operation the starting position should be
  // in the range 0..size()-1 (otherwise PRead may return a non-Ok status).
  virtual crypto::tink::util::StatusOr<int64_t> size() = 0;
};

}  // namespace tink
}  // namespace crypto

#endif  // TINK_RANDOM_ACCESS_STREAM_H_
