package peergos.shared.user.fs;
import jsinterop.annotations.*;
import peergos.shared.storage.ContentAddressedStorage;
import peergos.shared.util.*;
import java.io.*;
import java.time.*;
import java.util.Optional;
@JsType
public class FileProperties {
public static final FileProperties EMPTY = new FileProperties("", 0, LocalDateTime.MIN, false, Optional.empty());
public final String name;
@JsIgnore
public final long size;
public final LocalDateTime modified;
public final boolean isHidden;
public final Optional<byte[]> thumbnail;
public FileProperties(String name, int sizeHi, int sizeLo, LocalDateTime modified, boolean isHidden, Optional<byte[]> thumbnail) {
this.name = name;
this.size = sizeLo | ((sizeHi | 0L) << 32);
this.modified = modified;
this.isHidden = isHidden;
this.thumbnail = thumbnail;
}
@JsIgnore
public FileProperties(String name, long size, LocalDateTime modified, boolean isHidden, Optional<byte[]> thumbnail) {
this(name, (int)(size >> 32), (int) size, modified, isHidden, thumbnail);
}
public int sizeLow() {
return (int) size;
}
public int sizeHigh() {
return (int) (size >> 32);
}
public byte[] serialize() {
DataSink dout = new DataSink();
dout.writeString(name);
dout.writeLong(size);
dout.writeLong(modified.toEpochSecond(ZoneOffset.UTC));
dout.writeBoolean(isHidden);
if (!thumbnail.isPresent())
dout.writeInt(0);
else {
dout.writeArray(thumbnail.get());
}
return dout.toByteArray();
}
public static FileProperties deserialize(byte[] raw) throws IOException {
DataSource din = new DataSource(raw);
String name = din.readString();
long size = din.readLong();
long modified = din.readLong();
boolean isHidden = din.readBoolean();
int length = din.readInt();
Optional<byte[]> thumbnail = length == 0 ?
Optional.empty() :
Optional.of(Serialize.deserializeByteArray(length, din, length));
return new FileProperties(name, size, LocalDateTime.ofEpochSecond(modified, 0, ZoneOffset.UTC), isHidden, thumbnail);
}
@JsIgnore
public FileProperties withSize(long newSize) {
return new FileProperties(name, newSize, modified, isHidden, thumbnail);
}
public FileProperties withModified(LocalDateTime modified) {
return new FileProperties(name, size, modified, isHidden, thumbnail);
}
@Override
public String toString() {
return "FileProperties{" +
"name='" + name + '\'' +
", size=" + size +
", modified=" + modified +
", isHidden=" + isHidden +
", thumbnail=" + thumbnail +
'}';
}
}