size_t BufferedFile::get_bytes(address buffer, jint num, bool is_buffered) {
  jint total_read = 0;
  Buffer::Raw fb = data_buffer();

  if (!is_buffered) {
    OsFile_seek(file_pointer(), (long)(-(count() - index())), SEEK_CUR);
    set_count(0);    // flush buffer
    set_index(0);
    return OsFile_read(file_pointer(), buffer, 1, num);

  } else {
    while (!at_eof() && num > 0) {
      int num_to_read = (num > (count() - index())) ? (count() - index()) :num;
      // num_to_read may be zero
      if (num_to_read) {
        jvm_memcpy(buffer, fb().base_address() + (index() * sizeof (jbyte)), 
                   num_to_read);
        buffer += num_to_read;
        num -= num_to_read;
        set_index(index() + num_to_read);
        total_read += num_to_read;
      }
      if (num > 0) {
        refill_buffer();
      }
    }
  }
  return total_read;
}
void BufferedFile::refill_buffer() {
  if (at_eof()) {
    return;
  }
  int bytes_to_read = buffer_size();
  int max = file_size() - file_pos();
  if (bytes_to_read > max) {
    bytes_to_read = max;
  }

  int count_read;
  {
    // The file_pointer() may be shared with a FileDecoder
    // object. This may cause BufferedFile::file_pos() to become out
    // of date. A call to OsFile_seek() makes everything consistent again.
    AllocationDisabler raw_pointers_used_in_this_block;
    Buffer::Raw fb = data_buffer();
    OsFile_seek(file_pointer(), file_pos(), SEEK_SET);
    count_read = OsFile_read(file_pointer(), fb().base_address(),
                             1, bytes_to_read);
  }

  set_count(count_read);
  set_file_pos(long(file_pos() + count_read));
  set_index(0);
  if (count_read <= 0) {
     set_at_eof(true);
  }
  return;
}
int FileDecoder::get_bytes_raw(address dest_address, int count) {
  OsFile_Handle handle = file_handle();
  GUARANTEE(handle != NULL, "What are we reading from?");

  int pos = file_pos();
  OsFile_seek(handle, pos, SEEK_SET);
  int bytes_read = OsFile_read(handle, dest_address, 1, count);
  set_file_pos(pos + bytes_read);
  return bytes_read;
}
Beispiel #4
0
bool OsFile_readFile(const char *filePath, JVM_BYTE *buf, size_t bufSize)
{
	if(filePath == NULL)
		return false;
	if(buf == NULL)
		return false;
	if(bufSize == 0)
		return false;

	JVM_FILE_HANDLE handle = OsFile_open(filePath, "rb");
	if(handle == NULL)
		return false;

	size_t readSize = OsFile_read(handle, buf, bufSize);
	OsFile_close(handle);

	return readSize == bufSize;
}