package net.itsuha.android.zip4j; import net.lingala.zip4j.model.FileHeader; import android.text.TextUtils; import java.io.Serializable; import java.util.Collections; import java.util.LinkedList; import java.util.List; /** * This class holds the per-item data in our Loader. */ @SuppressWarnings("serial") public class ZipEntry implements Serializable{ protected String mName; protected FileHeader mFileHeader; protected ZipDirectory mParent; public ZipEntry() { } public ZipEntry(String name, FileHeader fileHeader) { super(); mName = name; mFileHeader = fileHeader; } public String getName() { return mName; } public void setName(String name) { mName = name; } public ZipDirectory getParent() { return mParent; } public boolean hasParent() { return mParent != null; } public FileHeader getFileHeader() { return mFileHeader; } public void setFileHeader(FileHeader fileHeader) { mFileHeader = fileHeader; } public static class ZipDirectory extends ZipEntry { protected LinkedList<ZipEntry> mChildren = new LinkedList<ZipEntry>(); public ZipDirectory() { } public ZipDirectory(String name) { mName = name; } public List<ZipEntry> getChildren() { return mChildren; } public ZipDirectory changeDirectory(String name) { for (ZipEntry e : mChildren) { if (e instanceof ZipDirectory && e.mName.equals(name)) { return (ZipDirectory) e; } } return this; } public ZipDirectory cdOrMkdir(String name) { ZipDirectory cd = changeDirectory(name); if (cd == this) { ZipDirectory newDir = new ZipDirectory(name); add(newDir); return newDir; } else { return cd; } } public void add(ZipEntry entry) { entry.mParent = this; mChildren.add(entry); } protected ZipDirectory addDirectory(LinkedList<String> path) { if (path == null || path.isEmpty()) { throw new IllegalArgumentException(); } String head = path.remove(); if (TextUtils.isEmpty(head)) { if (path.isEmpty()) { return this; } else { return addDirectory(path); } } else { // Change directory or create new directory with name 'head' ZipDirectory newDir = cdOrMkdir(head); if (path.isEmpty()) { return newDir; } else { return newDir.addDirectory(path); } } } public ZipDirectory addDirectory(String relativePath) { String[] pathArray = relativePath.split("/"); LinkedList<String> path = new LinkedList<String>(); Collections.addAll(path, pathArray); return addDirectory(path); } public void addFile(String relativePath, FileHeader fileHeader) { if (TextUtils.isEmpty(relativePath)) { throw new IllegalArgumentException(); } String[] pathArray = relativePath.split("/"); if (pathArray.length == 1) { add(new ZipEntry(relativePath, fileHeader)); } else { LinkedList<String> path = new LinkedList<String>(); Collections.addAll(path, pathArray); String file = path.removeLast(); addDirectory(path) .add(new ZipEntry(file, fileHeader)); } } } }