package com.frostwire.jlibtorrent;
import com.frostwire.jlibtorrent.swig.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* The Entry class represents one node in a bencoded hierarchy. It works as a
* variant type, it can be either a list, a dictionary, an integer
* or a string.
*
* @author gubatron
* @author aldenml
*/
public final class Entry {
private final entry e;
public Entry(entry e) {
this.e = e;
}
public Entry(String s) {
this(new entry(s));
}
public Entry(long n) {
this(new entry(n));
}
public entry getSwig() {
return e;
}
public byte[] bencode() {
return Vectors.char_vector2bytes(e.bencode());
}
public String string() {
return e.string();
}
public long integer() {
return e.integer();
}
public ArrayList<Entry> list() {
entry_vector v = e.list().to_vector();
int size = (int) v.size();
ArrayList<Entry> list = new ArrayList<Entry>(size);
for (int i = 0; i < size; i++) {
list.add(new Entry(v.get(i)));
}
return list;
}
public Map<String, Entry> dictionary() {
string_entry_map dict = e.dict();
string_vector keys = dict.keys();
int size = (int) keys.size();
Map<String, Entry> map = new HashMap<String, Entry>(size);
for (int i = 0; i < size; i++) {
String key = keys.get(i);
Entry value = new Entry(dict.get(key));
map.put(key, value);
}
return map;
}
@Override
public String toString() {
return e.to_string();
}
public static Entry bdecode(byte[] data) {
return new Entry(entry.bdecode(Vectors.bytes2char_vector(data)));
}
public static Entry bdecode(File file) throws IOException {
byte[] data = Utils.readFileToByteArray(file);
return bdecode(data);
}
public static Entry fromList(List<?> list) {
entry e = new entry(entry.data_type.list_t);
entry_list d = e.list();
for (Object v : list) {
if (v instanceof String) {
d.push_back(new entry((String) v));
} else if (v instanceof Integer) {
d.push_back(new entry((Integer) v));
} else if (v instanceof Entry) {
d.push_back(((Entry) v).getSwig());
} else if (v instanceof entry) {
d.push_back((entry) v);
} else if (v instanceof List) {
d.push_back(fromList((List<?>) v).getSwig());
} else if (v instanceof Map) {
d.push_back(fromMap((Map<?, ?>) v).getSwig());
} else {
d.push_back(new entry(v.toString()));
}
}
return new Entry(e);
}
public static Entry fromMap(Map<?, ?> map) {
entry e = new entry(entry.data_type.dictionary_t);
string_entry_map d = e.dict();
for (Map.Entry<?, ?> kv : map.entrySet()) {
String k = kv.getKey().toString();
Object v = kv.getValue();
if (v instanceof String) {
d.set(k, new entry((String) v));
} else if (v instanceof Integer) {
d.set(k, new entry((Integer) v));
} else if (v instanceof Entry) {
d.set(k, ((Entry) v).getSwig());
} else if (v instanceof entry) {
d.set(k, (entry) v);
} else if (v instanceof List) {
d.set(k, fromList((List<?>) v).getSwig());
} else if (v instanceof Map) {
d.set(k, fromMap((Map<?, ?>) v).getSwig());
} else {
d.set(k, new entry(v.toString()));
}
}
return new Entry(e);
}
}