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; }
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; }