public IList Get(MemBlock key, byte[] token) {
int seen_start_idx = 0;
int seen_end_idx = 0;
if( token != null ) {
using(MemoryStream ms = new MemoryStream(token)) {
int[] bounds = (int[])AdrConverter.Deserialize(ms);
seen_start_idx = bounds[0];
seen_end_idx = bounds[1];
seen_start_idx = seen_end_idx + 1;
}
}
int consumed_bytes = 0;
Entry[] data = null;
lock(_sync ) {
_data.DeleteExpired(key);
LinkedList<Entry> ll_data = _data.GetEntries(key);
// Keys exist!
if( ll_data != null ) {
data = new Entry[ll_data.Count];
ll_data.CopyTo(data, 0);
}
}
ArrayList result = null;
if(data != null) {
result = new ArrayList();
ArrayList values = new ArrayList();
int remaining_items = 0;
byte[] next_token = null;
seen_end_idx = data.Length - 1;
for(int i = seen_start_idx; i < data.Length; i++) {
Entry e = (Entry) data[i];
if(e.Value.Length + consumed_bytes <= MAX_BYTES) {
int age = (int) (DateTime.UtcNow - e.CreateTime).TotalSeconds;
int ttl = (int) (e.EndTime - DateTime.UtcNow).TotalSeconds;
consumed_bytes += e.Value.Length;
Hashtable item = new Hashtable();
item["age"] = age;
item["value"] = (byte[])e.Value;
item["ttl"] = ttl;
values.Add(item);
}
else {
seen_end_idx = i - 1;
break;
}
}
remaining_items = data.Length - (seen_end_idx + 1);
//Token creation
int[] new_bounds = new int[2];
new_bounds[0] = seen_start_idx;
new_bounds[1] = seen_end_idx;
using(MemoryStream ms = new System.IO.MemoryStream()) {
AdrConverter.Serialize(new_bounds, ms);
next_token = ms.ToArray();
}
result.Add(values);
result.Add(remaining_items);
result.Add(next_token);
}
return result;
}