package com.wouterbreukink.onedrive.client;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
public class OneDriveUploadSession {
// Upload in chunks of 5MB as per MS recommendation
private static final int CHUNK_SIZE = 5 * 1024 * 1024;
private final File file;
private final String uploadUrl;
private final RandomAccessFile raf;
private OneDriveItem parent;
private Range[] ranges;
private long totalUploaded;
private long lastUploaded;
private OneDriveItem item;
public OneDriveUploadSession(OneDriveItem parent, File file, String uploadUrl, String[] ranges) throws IOException {
this.parent = parent;
this.file = file;
this.uploadUrl = uploadUrl;
this.raf = new RandomAccessFile(file, "r");
setRanges(ranges);
}
public void setRanges(String[] stringRanges) {
this.ranges = new Range[stringRanges.length];
for (int i = 0; i < stringRanges.length; i++) {
long start = Long.parseLong(stringRanges[i].substring(0, stringRanges[i].indexOf('-')));
String s = stringRanges[i].substring(stringRanges[i].indexOf('-') + 1);
long end = 0;
if (!s.isEmpty()) {
end = Long.parseLong(s);
}
ranges[i] = new Range(start, end);
}
if (ranges.length > 0) {
lastUploaded = ranges[0].start - totalUploaded;
totalUploaded = ranges[0].start;
}
}
public byte[] getChunk() throws IOException {
byte[] bytes = new byte[CHUNK_SIZE];
raf.seek(totalUploaded);
int read = raf.read(bytes);
if (read < CHUNK_SIZE) {
bytes = Arrays.copyOf(bytes, read);
}
return bytes;
}
public long getTotalUploaded() {
return totalUploaded;
}
public long getLastUploaded() {
return lastUploaded;
}
public OneDriveItem getParent() {
return parent;
}
public String getUploadUrl() {
return uploadUrl;
}
public File getFile() {
return file;
}
public boolean isComplete() {
return item != null;
}
public void setComplete(OneDriveItem item) {
this.item = item;
lastUploaded = file.length() - totalUploaded;
totalUploaded = file.length();
}
public OneDriveItem getItem() {
return item;
}
private static class Range {
public long start;
public long end;
private Range(long start, long end) {
this.start = start;
this.end = end;
}
}
}