From c1d8a201f7f34f5f94fec2dfab23853ebf19fb73 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Sat, 6 Jun 2026 17:21:39 +0000 Subject: [PATCH] FAT driver ported to ByteBuffer Co-authored-by: LSantha --- .../org/jnode/fs/fat/AbstractDirectory.java | 14 +-- fs/src/fs/org/jnode/fs/fat/BootSector.java | 44 ++++----- fs/src/fs/org/jnode/fs/fat/Fat.java | 48 ++++------ .../fs/org/jnode/fs/fat/FatBasicDirEntry.java | 24 +++-- fs/src/fs/org/jnode/fs/fat/FatDirEntry.java | 64 +++++++------ fs/src/fs/org/jnode/fs/fat/FatDirectory.java | 17 ++-- .../fs/org/jnode/fs/fat/FatLfnDirEntry.java | 90 ++++++++----------- .../fs/org/jnode/fs/fat/FatLfnDirectory.java | 2 +- 8 files changed, 141 insertions(+), 162 deletions(-) diff --git a/fs/src/fs/org/jnode/fs/fat/AbstractDirectory.java b/fs/src/fs/org/jnode/fs/fat/AbstractDirectory.java index 2ada48b766..916baa3a51 100644 --- a/fs/src/fs/org/jnode/fs/fat/AbstractDirectory.java +++ b/fs/src/fs/org/jnode/fs/fat/AbstractDirectory.java @@ -381,15 +381,15 @@ protected void initialize(long myCluster, long parentCluster) { public abstract void flush() throws IOException; /** - * Read the contents of this directory from the given byte array + * Read the contents of this directory from the given buffer * * @param src */ - protected synchronized void read(byte[] src) { + protected synchronized void read(ByteBuffer src) { int size = entries.size(); for (int i = 0; i < size; i++) { int index = i * FatConstants.DIR_ENTRY_SIZE; - if (src[index] == 0) { + if (src.get(index) == 0) { entries.set(i, null); } else { FatBasicDirEntry entry = FatDirEntry.fatDirEntryFactory(this, src, index); @@ -399,12 +399,11 @@ protected synchronized void read(byte[] src) { } /** - * Write the contents of this directory to the given device at the given - * offset. + * Write the contents of this directory to the given buffer * * @param dest */ - protected synchronized void write(byte[] dest) { + protected synchronized void write(ByteBuffer dest) { int size = entries.size(); byte[] empty = new byte[FatConstants.DIR_ENTRY_SIZE]; for (int i = 0; i < size; i++) { @@ -412,7 +411,8 @@ protected synchronized void write(byte[] dest) { if (entry != null) { entry.write(dest, i * FatConstants.DIR_ENTRY_SIZE); } else { - System.arraycopy(empty, 0, dest, i * FatConstants.DIR_ENTRY_SIZE, empty.length); + dest.position(i * FatConstants.DIR_ENTRY_SIZE); + dest.put(empty); } } } diff --git a/fs/src/fs/org/jnode/fs/fat/BootSector.java b/fs/src/fs/org/jnode/fs/fat/BootSector.java index 296dd37bab..893acda9cf 100644 --- a/fs/src/fs/org/jnode/fs/fat/BootSector.java +++ b/fs/src/fs/org/jnode/fs/fat/BootSector.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import org.jnode.driver.block.BlockDeviceAPI; import org.jnode.driver.block.Geometry; @@ -29,7 +30,6 @@ import org.jnode.partitions.ibm.IBMPartitionTable; import org.jnode.partitions.ibm.IBMPartitionTableEntry; import org.jnode.partitions.ibm.IBMPartitionTypes; -import org.jnode.util.LittleEndian; import org.jnode.util.NumberUtils; /** @@ -37,25 +37,26 @@ */ public class BootSector { - private byte[] data; + private ByteBuffer data; private boolean dirty; private final IBMPartitionTableEntry[] partitions; public BootSector(int size) { - data = new byte[size]; + data = ByteBuffer.allocate(size); + data.order(ByteOrder.LITTLE_ENDIAN); dirty = false; partitions = new IBMPartitionTableEntry[4]; } public BootSector(byte[] src) { - data = new byte[src.length]; - System.arraycopy(src, 0, data, 0, src.length); + data = ByteBuffer.wrap(src.clone()); + data.order(ByteOrder.LITTLE_ENDIAN); dirty = false; partitions = new IBMPartitionTableEntry[4]; } public boolean isaValidBootSector() { - return IBMPartitionTable.containsPartitionTable(data); + return IBMPartitionTable.containsPartitionTable(data.array()); } /** @@ -64,8 +65,8 @@ public boolean isaValidBootSector() { * @param device */ public synchronized void read(BlockDeviceAPI device) throws IOException { - device.read(0, ByteBuffer.wrap(data)); - + data.clear(); + device.read(0, data); dirty = false; } @@ -75,7 +76,8 @@ public synchronized void read(BlockDeviceAPI device) throws IOException { * @param device */ public synchronized void write(BlockDeviceAPI device) throws IOException { - device.write(0, ByteBuffer.wrap(data)); + data.rewind(); + device.write(0, data); dirty = false; } @@ -87,7 +89,7 @@ public synchronized void write(BlockDeviceAPI device) throws IOException { public String getOemName() { StringBuilder b = new StringBuilder(8); for (int i = 0; i < 8; i++) { - int v = data[0x3 + i]; + int v = data.get(0x3 + i) & 0xFF; b.append((char) v); } return b.toString(); @@ -104,8 +106,9 @@ public void setOemName(String name) { } else { ch = (char) 0; } - set8(0x3 + i, ch); + data.put(0x3 + i, (byte) ch); } + dirty = true; } /** @@ -291,7 +294,7 @@ public void setNrHiddenSectors(int v) { * @return int */ protected int get8(int offset) { - return LittleEndian.getUInt8(data, offset); + return data.get(offset) & 0xFF; } /** @@ -300,7 +303,7 @@ protected int get8(int offset) { * @param offset */ protected void set8(int offset, int value) { - LittleEndian.setInt8(data, offset, value); + data.put(offset, (byte) value); dirty = true; } @@ -311,7 +314,7 @@ protected void set8(int offset, int value) { * @return int */ protected int get16(int offset) { - return LittleEndian.getUInt16(data, offset); + return data.getShort(offset) & 0xFFFF; } /** @@ -320,7 +323,7 @@ protected int get16(int offset) { * @param offset */ protected void set16(int offset, int value) { - LittleEndian.setInt16(data, offset, value); + data.putShort(offset, (short) value); dirty = true; } @@ -331,7 +334,7 @@ protected void set16(int offset, int value) { * @return int */ protected long get32(int offset) { - return LittleEndian.getUInt32(data, offset); + return data.getInt(offset) & 0xFFFFFFFFL; } /** @@ -340,7 +343,7 @@ protected long get32(int offset) { * @param offset */ protected void set32(int offset, long value) { - LittleEndian.setInt32(data, offset, (int) value); + data.putInt(offset, (int) value); dirty = true; } @@ -377,7 +380,7 @@ public IBMPartitionTableEntry initPartitions(Geometry geom, IBMPartitionTypes fi public synchronized IBMPartitionTableEntry getPartition(int partNr) { if (partitions[partNr] == null) { - partitions[partNr] = new IBMPartitionTableEntry(null, data, partNr); + partitions[partNr] = new IBMPartitionTableEntry(null, data.array(), partNr); } return partitions[partNr]; } @@ -422,10 +425,11 @@ public String toString() { res.append(getNrRootDirEntries()); res.append('\n'); - for (int i = 0; i < data.length / 16; i++) { + byte[] arr = data.array(); + for (int i = 0; i < arr.length / 16; i++) { res.append(Integer.toHexString(i)); res.append('-'); - res.append(NumberUtils.hex(data, i * 16, 16)); + res.append(NumberUtils.hex(arr, i * 16, 16)); res.append('\n'); } diff --git a/fs/src/fs/org/jnode/fs/fat/Fat.java b/fs/src/fs/org/jnode/fs/fat/Fat.java index 9dee298bd7..7a3d58f9a4 100644 --- a/fs/src/fs/org/jnode/fs/fat/Fat.java +++ b/fs/src/fs/org/jnode/fs/fat/Fat.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.Arrays; import org.jnode.driver.block.BlockDeviceAPI; import org.jnode.fs.FileSystemFullException; @@ -79,16 +80,15 @@ public Fat(FatType bitSize, int mediumDescriptor, int nrSectors, int sectorSize) * @param device */ public synchronized void read(BlockDeviceAPI device, long offset) throws IOException { - byte[] data = new byte[nrSectors * sectorSize]; - device.read(offset, ByteBuffer.wrap(data)); + ByteBuffer data = ByteBuffer.allocate(nrSectors * sectorSize); + data.order(ByteOrder.LITTLE_ENDIAN); + device.read(offset, data); for (int i = 0; i < entries.length; i++) { - int idx, b1, b2, v; + int idx, v; switch (fatType) { case FAT12: idx = (int) (i * 1.5); - b1 = data[idx] & 0xFF; - b2 = data[idx + 1] & 0xFF; - v = (b2 << 8) | b1; + v = data.getShort(idx) & 0xFFFF; if ((i % 2) == 0) { entries[i] = v & 0xFFF; } else { @@ -96,18 +96,10 @@ public synchronized void read(BlockDeviceAPI device, long offset) throws IOExcep } break; case FAT16: - idx = i * 2; - b1 = data[idx] & 0xFF; - b2 = data[idx + 1] & 0xFF; - entries[i] = (b2 << 8) | b1; + entries[i] = data.getShort(i * 2) & 0xFFFF; break; case FAT32: - idx = i * 4; - long l1 = data[idx] & 0xFF; - long l2 = data[idx + 1] & 0xFF; - long l3 = data[idx + 2] & 0xFF; - long l4 = data[idx + 3] & 0xFF; - entries[i] = (l4 << 24) | (l3 << 16) | (l2 << 8) | l1; + entries[i] = data.getInt(i * 4) & 0xFFFFFFFFL; break; } } @@ -120,7 +112,8 @@ public synchronized void read(BlockDeviceAPI device, long offset) throws IOExcep * @param device */ public synchronized void write(BlockDeviceAPI device, long offset) throws IOException { - byte[] data = new byte[nrSectors * sectorSize]; + ByteBuffer data = ByteBuffer.allocate(nrSectors * sectorSize); + data.order(ByteOrder.LITTLE_ENDIAN); for (int i = 0; i < entries.length; i++) { long v = entries[i]; int idx; @@ -128,29 +121,22 @@ public synchronized void write(BlockDeviceAPI device, long offset) throws IOExce case FAT12: idx = (int) (i * 1.5); if ((i % 2) == 0) { - data[idx] = (byte) (v & 0xFF); - data[idx + 1] = (byte) ((v >> 8) & 0x0F); + data.put(idx, (byte) (v & 0xFF)); + data.put(idx + 1, (byte) ((v >> 8) & 0x0F)); } else { - data[idx] |= (byte) ((v & 0x0F) << 4); - data[idx + 1] = (byte) ((v >> 4) & 0xFF); + data.put(idx, (byte) (data.get(idx) | ((v & 0x0F) << 4))); + data.put(idx + 1, (byte) ((v >> 4) & 0xFF)); } break; case FAT16: - idx = i << 1; - data[idx] = (byte) (v & 0xFF); - data[idx + 1] = (byte) ((v >> 8) & 0xFF); + data.putShort(i << 1, (short) v); break; case FAT32: - idx = i << 2; - data[idx] = (byte) (v & 0xFF); - data[idx + 1] = (byte) ((v >> 8) & 0xFF); - data[idx + 2] = (byte) ((v >> 16) & 0xFF); - data[idx + 3] = (byte) ((v >> 24) & 0xFF); + data.putInt(i << 2, (int) v); break; } - } - device.write(offset, ByteBuffer.wrap(data)); + device.write(offset, data); this.dirty = false; } diff --git a/fs/src/fs/org/jnode/fs/fat/FatBasicDirEntry.java b/fs/src/fs/org/jnode/fs/fat/FatBasicDirEntry.java index 7ec8b37b33..34292a0a1a 100644 --- a/fs/src/fs/org/jnode/fs/fat/FatBasicDirEntry.java +++ b/fs/src/fs/org/jnode/fs/fat/FatBasicDirEntry.java @@ -20,23 +20,37 @@ package org.jnode.fs.fat; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + /** * @author gbin */ public class FatBasicDirEntry extends FatObject implements FatConstants { - protected byte[] rawData = new byte[32]; + protected ByteBuffer rawData = ByteBuffer.allocate(32); + + { + rawData.order(ByteOrder.LITTLE_ENDIAN); + } public FatBasicDirEntry(AbstractDirectory dir) { super(dir.getFatFileSystem()); } - public FatBasicDirEntry(AbstractDirectory dir, byte[] src, int offset) { + public FatBasicDirEntry(AbstractDirectory dir, ByteBuffer src, int offset) { super(dir.getFatFileSystem()); - System.arraycopy(src, offset, rawData, 0, 32); + rawData.clear(); + int oldLimit = src.limit(); + src.position(offset); + src.limit(offset + 32); + rawData.put(src); + src.limit(oldLimit); } - public void write(byte[] dest, int offset) { - System.arraycopy(rawData, 0, dest, offset, 32); + public void write(ByteBuffer dest, int offset) { + rawData.rewind(); + dest.position(offset); + dest.put(rawData); } } diff --git a/fs/src/fs/org/jnode/fs/fat/FatDirEntry.java b/fs/src/fs/org/jnode/fs/fat/FatDirEntry.java index 0a05326968..ac23408a7b 100644 --- a/fs/src/fs/org/jnode/fs/fat/FatDirEntry.java +++ b/fs/src/fs/org/jnode/fs/fat/FatDirEntry.java @@ -21,6 +21,7 @@ package org.jnode.fs.fat; import java.io.IOException; +import java.nio.ByteBuffer; import java.util.Date; import org.jnode.fs.FSAccessRights; import org.jnode.fs.FSDirectory; @@ -30,7 +31,6 @@ import org.jnode.fs.FSFile; import org.jnode.fs.spi.UnixFSAccessRights; import org.jnode.fs.util.DosUtils; -import org.jnode.util.LittleEndian; import org.jnode.util.NumberUtils; /** @@ -108,15 +108,14 @@ public class FatDirEntry extends FatBasicDirEntry implements FSEntry, FSEntryCre */ private final FSAccessRights rights; - public static FatBasicDirEntry fatDirEntryFactory(AbstractDirectory dir, byte[] src, int offset) { - int flags = LittleEndian.getUInt8(src, offset + 0x0b); + public static FatBasicDirEntry fatDirEntryFactory(AbstractDirectory dir, ByteBuffer src, int offset) { + int flags = src.get(offset + 0x0b) & 0xFF; boolean r = (flags & F_READONLY) != 0; boolean h = (flags & F_HIDDEN) != 0; boolean s = (flags & F_SYSTEM) != 0; boolean v = (flags & F_LABEL) != 0; if (r && h && s && v) { - // this is a LFN entry, don't need to parse it! return new FatLfnDirEntry(dir, src, offset); } FatDirEntry entry = new FatDirEntry(dir, src, offset); @@ -159,40 +158,40 @@ public FatDirEntry(AbstractDirectory dir, String name, String ext) { * @param src * @param offset */ - public FatDirEntry(AbstractDirectory dir, byte[] src, int offset) { + public FatDirEntry(AbstractDirectory dir, ByteBuffer src, int offset) { super(dir, src, offset); this.parent = dir; id = Integer.toString(offset / FatConstants.DIR_ENTRY_SIZE); - unused = (src[offset] == 0); - deleted = (LittleEndian.getUInt8(src, offset) == 0xe5); + unused = (src.get(offset) == 0); + deleted = ((src.get(offset) & 0xFF) == 0xe5); char[] nameArr = new char[8]; for (int i = 0; i < nameArr.length; i++) { - nameArr[i] = (char) LittleEndian.getUInt8(src, offset + i); + nameArr[i] = (char) (src.get(offset + i) & 0xFF); } - if (LittleEndian.getUInt8(src, offset) == 0x05) { + if ((src.get(offset) & 0xFF) == 0x05) { nameArr[0] = (char) 0xe5; } setName(new String(nameArr).trim()); char[] extArr = new char[3]; for (int i = 0; i < extArr.length; i++) { - extArr[i] = (char) LittleEndian.getUInt8(src, offset + 0x08 + i); + extArr[i] = (char) (src.get(offset + 0x08 + i) & 0xFF); } setExt(new String(extArr).trim()); - this.flags = LittleEndian.getUInt8(src, offset + 0x0b); + this.flags = src.get(offset + 0x0b) & 0xFF; this.created = - DosUtils.decodeDateTime(LittleEndian.getUInt16(src, offset + 0x10), - LittleEndian.getUInt16(src, offset + 0x0e)); + DosUtils.decodeDateTime(src.getShort(offset + 0x10) & 0xFFFF, + src.getShort(offset + 0x0e) & 0xFFFF); this.lastModified = - DosUtils.decodeDateTime(LittleEndian.getUInt16(src, offset + 0x18), - LittleEndian.getUInt16(src, offset + 0x16)); + DosUtils.decodeDateTime(src.getShort(offset + 0x18) & 0xFFFF, + src.getShort(offset + 0x16) & 0xFFFF); this.lastAccessed = - DosUtils.decodeDateTime(LittleEndian.getUInt16(src, offset + 0x12), 0); // time not stored - this.startCluster = LittleEndian.getUInt16(src, offset + 0x1a); - this.length = LittleEndian.getUInt32(src, offset + 0x1c); + DosUtils.decodeDateTime(src.getShort(offset + 0x12) & 0xFFFF, 0); + this.startCluster = src.getShort(offset + 0x1a) & 0xFFFF; + this.length = src.getInt(offset + 0x1c) & 0xFFFFFFFFL; this._dirty = false; this.rights = new UnixFSAccessRights(getFileSystem()); } @@ -474,17 +473,16 @@ public void setArchive() { } /** - * Write my contents to the given byte-array + * Write my contents to the given buffer * * @param dest * @param offset */ - public void write(byte[] dest, int offset) { - // System.out.println("FatDir entry write at" + offset); + public void write(ByteBuffer dest, int offset) { if (unused) { - dest[offset] = 0; + dest.put(offset, (byte) 0); } else if (deleted) { - dest[offset] = (byte) 0xe5; + dest.put(offset, (byte) 0xe5); } for (int i = 0; i < 8; i++) { @@ -497,7 +495,7 @@ public void write(byte[] dest, int offset) { } else { ch = ' '; } - dest[offset + i] = (byte) ch; + dest.put(offset + i, (byte) ch); } for (int i = 0; i < 3; i++) { @@ -507,17 +505,17 @@ public void write(byte[] dest, int offset) { } else { ch = ' '; } - dest[offset + 0x08 + i] = (byte) ch; + dest.put(offset + 0x08 + i, (byte) ch); } - LittleEndian.setInt8(dest, offset + 0x0b, flags); - LittleEndian.setInt16(dest, offset + 0x0e, DosUtils.encodeTime(created)); - LittleEndian.setInt16(dest, offset + 0x10, DosUtils.encodeDate(created)); - LittleEndian.setInt16(dest, offset + 0x12, DosUtils.encodeDate(lastAccessed)); - LittleEndian.setInt16(dest, offset + 0x16, DosUtils.encodeTime(lastModified)); - LittleEndian.setInt16(dest, offset + 0x18, DosUtils.encodeDate(lastModified)); - LittleEndian.setInt16(dest, offset + 0x1a, startCluster); - LittleEndian.setInt32(dest, offset + 0x1c, (int) length); + dest.put(offset + 0x0b, (byte) flags); + dest.putShort(offset + 0x0e, (short) DosUtils.encodeTime(created)); + dest.putShort(offset + 0x10, (short) DosUtils.encodeDate(created)); + dest.putShort(offset + 0x12, (short) DosUtils.encodeDate(lastAccessed)); + dest.putShort(offset + 0x16, (short) DosUtils.encodeTime(lastModified)); + dest.putShort(offset + 0x18, (short) DosUtils.encodeDate(lastModified)); + dest.putShort(offset + 0x1a, (short) startCluster); + dest.putInt(offset + 0x1c, (int) length); this._dirty = false; } diff --git a/fs/src/fs/org/jnode/fs/fat/FatDirectory.java b/fs/src/fs/org/jnode/fs/fat/FatDirectory.java index 64b7e9fa85..2207eac619 100644 --- a/fs/src/fs/org/jnode/fs/fat/FatDirectory.java +++ b/fs/src/fs/org/jnode/fs/fat/FatDirectory.java @@ -60,11 +60,9 @@ protected FatDirectory(FatFileSystem fs, int nrEntries) { protected synchronized void read() throws IOException { entries.setSize((int) file.getLengthOnDisk() / 32); - // TODO optimize it also to use ByteBuffer at lower level - // final byte[] data = new byte[entries.size() * 32]; final ByteBuffer data = ByteBuffer.allocate(entries.size() * 32); file.read(0, data); - read(data.array()); + read(data); resetDirty(); } @@ -76,15 +74,13 @@ protected synchronized void read() throws IOException { protected synchronized void write() throws IOException { if (label != null) applyLabel(); - // TODO optimize it also to use ByteBuffer at lower level - // final byte[] data = new byte[entries.size() * 32]; final ByteBuffer data = ByteBuffer.allocate(entries.size() * 32); if (canChangeSize(entries.size())) { file.setLength(data.capacity()); } - write(data.array()); - // file.write(0, data, 0, data.length); + write(data); + data.rewind(); file.write(0, data); resetDirty(); } @@ -92,9 +88,7 @@ protected synchronized void write() throws IOException { public synchronized void read(BlockDeviceAPI device, long offset) throws IOException { ByteBuffer data = ByteBuffer.allocate(entries.size() * 32); device.read(offset, data); - // System.out.println("Directory at offset :" + offset); - // System.out.println("Length in bytes = " + entries.size() * 32); - read(data.array()); + read(data); resetDirty(); } @@ -102,7 +96,8 @@ public synchronized void write(BlockDeviceAPI device, long offset) throws IOExce if (label != null) applyLabel(); final ByteBuffer data = ByteBuffer.allocate(entries.size() * 32); - write(data.array()); + write(data); + data.rewind(); device.write(offset, data); resetDirty(); } diff --git a/fs/src/fs/org/jnode/fs/fat/FatLfnDirEntry.java b/fs/src/fs/org/jnode/fs/fat/FatLfnDirEntry.java index 304cc32f6e..6a9348bbc3 100644 --- a/fs/src/fs/org/jnode/fs/fat/FatLfnDirEntry.java +++ b/fs/src/fs/org/jnode/fs/fat/FatLfnDirEntry.java @@ -20,25 +20,18 @@ package org.jnode.fs.fat; -import org.jnode.util.LittleEndian; +import java.nio.ByteBuffer; /** * @author gbin */ public class FatLfnDirEntry extends FatBasicDirEntry { - /** - * @param dir - */ + public FatLfnDirEntry(AbstractDirectory dir) { super(dir); } - /** - * @param dir - * @param src - * @param offset - */ - public FatLfnDirEntry(AbstractDirectory dir, byte[] src, int offset) { + public FatLfnDirEntry(AbstractDirectory dir, ByteBuffer src, int offset) { super(dir, src, offset); } @@ -47,60 +40,49 @@ public FatLfnDirEntry(AbstractDirectory dir, String subName, int ordinal, byte c super(dir); char[] unicodechar = new char[13]; subName.getChars(0, subName.length(), unicodechar, 0); - if (isLast) { - LittleEndian.setInt8(rawData, 0, ordinal + (1 << 6)); // set the - // 6th - // security ending - // bit - } else { - LittleEndian.setInt8(rawData, 0, ordinal); - } - - LittleEndian.setInt16(rawData, 1, unicodechar[0]); - LittleEndian.setInt16(rawData, 3, unicodechar[1]); - LittleEndian.setInt16(rawData, 5, unicodechar[2]); - LittleEndian.setInt16(rawData, 7, unicodechar[3]); - LittleEndian.setInt16(rawData, 9, unicodechar[4]); - LittleEndian.setInt8(rawData, 11, 0x0f); // this is the hidden - // attribute tag for - // lfn - LittleEndian.setInt8(rawData, 12, 0); // reserved - LittleEndian.setInt8(rawData, 13, checkSum); // checksum - LittleEndian.setInt16(rawData, 14, unicodechar[5]); - LittleEndian.setInt16(rawData, 16, unicodechar[6]); - LittleEndian.setInt16(rawData, 18, unicodechar[7]); - LittleEndian.setInt16(rawData, 20, unicodechar[8]); - LittleEndian.setInt16(rawData, 22, unicodechar[9]); - LittleEndian.setInt16(rawData, 24, unicodechar[10]); - LittleEndian.setInt16(rawData, 26, 0); // sector... unused - LittleEndian.setInt16(rawData, 28, unicodechar[11]); - LittleEndian.setInt16(rawData, 30, unicodechar[12]); - + rawData.put(0, (byte) (isLast ? (ordinal + (1 << 6)) : ordinal)); + rawData.putShort(1, (short) unicodechar[0]); + rawData.putShort(3, (short) unicodechar[1]); + rawData.putShort(5, (short) unicodechar[2]); + rawData.putShort(7, (short) unicodechar[3]); + rawData.putShort(9, (short) unicodechar[4]); + rawData.put(11, (byte) 0x0f); + rawData.put(12, (byte) 0); + rawData.put(13, checkSum); + rawData.putShort(14, (short) unicodechar[5]); + rawData.putShort(16, (short) unicodechar[6]); + rawData.putShort(18, (short) unicodechar[7]); + rawData.putShort(20, (short) unicodechar[8]); + rawData.putShort(22, (short) unicodechar[9]); + rawData.putShort(24, (short) unicodechar[10]); + rawData.putShort(26, (short) 0); + rawData.putShort(28, (short) unicodechar[11]); + rawData.putShort(30, (short) unicodechar[12]); } public byte getOrdinal() { - return (byte) LittleEndian.getUInt8(rawData, 0); + return rawData.get(0); } public byte getCheckSum() { - return (byte) LittleEndian.getUInt8(rawData, 13); + return rawData.get(13); } public String getSubstring() { char[] unicodechar = new char[13]; - unicodechar[0] = (char) LittleEndian.getUInt16(rawData, 1); - unicodechar[1] = (char) LittleEndian.getUInt16(rawData, 3); - unicodechar[2] = (char) LittleEndian.getUInt16(rawData, 5); - unicodechar[3] = (char) LittleEndian.getUInt16(rawData, 7); - unicodechar[4] = (char) LittleEndian.getUInt16(rawData, 9); - unicodechar[5] = (char) LittleEndian.getUInt16(rawData, 14); - unicodechar[6] = (char) LittleEndian.getUInt16(rawData, 16); - unicodechar[7] = (char) LittleEndian.getUInt16(rawData, 18); - unicodechar[8] = (char) LittleEndian.getUInt16(rawData, 20); - unicodechar[9] = (char) LittleEndian.getUInt16(rawData, 22); - unicodechar[10] = (char) LittleEndian.getUInt16(rawData, 24); - unicodechar[11] = (char) LittleEndian.getUInt16(rawData, 28); - unicodechar[12] = (char) LittleEndian.getUInt16(rawData, 30); + unicodechar[0] = (char) rawData.getShort(1); + unicodechar[1] = (char) rawData.getShort(3); + unicodechar[2] = (char) rawData.getShort(5); + unicodechar[3] = (char) rawData.getShort(7); + unicodechar[4] = (char) rawData.getShort(9); + unicodechar[5] = (char) rawData.getShort(14); + unicodechar[6] = (char) rawData.getShort(16); + unicodechar[7] = (char) rawData.getShort(18); + unicodechar[8] = (char) rawData.getShort(20); + unicodechar[9] = (char) rawData.getShort(22); + unicodechar[10] = (char) rawData.getShort(24); + unicodechar[11] = (char) rawData.getShort(28); + unicodechar[12] = (char) rawData.getShort(30); int index = 0; while (index < 13 && unicodechar[index] != '\0') index++; diff --git a/fs/src/fs/org/jnode/fs/fat/FatLfnDirectory.java b/fs/src/fs/org/jnode/fs/fat/FatLfnDirectory.java index 3e3b89d4ad..07fdd0b34f 100644 --- a/fs/src/fs/org/jnode/fs/fat/FatLfnDirectory.java +++ b/fs/src/fs/org/jnode/fs/fat/FatLfnDirectory.java @@ -120,7 +120,7 @@ public FSEntry getEntry(String name) { } - protected synchronized void read(byte[] src) { + protected synchronized void read(ByteBuffer src) { super.read(src); readLFN(); }