/* * @author Valentin Simonov / http://va.lent.in/ */ #if TOUCHSCRIPT_DEBUG using System; using System.Collections.Generic; using System.IO; using TouchScript.Debugging.Filters; using TouchScript.Pointers; using UnityEngine; namespace TouchScript.Debugging.Loggers { public class FileReaderLogger : IPointerLogger { public const int MIN_POINTER_LIST_SIZE = 1000; private int pointerCount = 0; private BinaryReader reader; protected List data = new List(1); protected List> events = new List>(1); /// public int PointerCount { get { return pointerCount; } } public FileReaderLogger(string path) { try { reader = new BinaryReader(new FileStream(path, FileMode.Open)); } catch (IOException e) { Debug.LogFormat("Error opening file at '{0}'. {1}", path, e.Message); } try { while (true) { var type = (Pointer.PointerType) reader.ReadUInt32(); var log = new PointerLog() { Id = reader.ReadInt32(), Tick = reader.ReadInt64(), PointerId = reader.ReadInt32(), Event = (PointerEvent) reader.ReadUInt32(), State = new PointerState() { Buttons = (Pointer.PointerButtonState) reader.ReadUInt32(), Position = new Vector2(reader.ReadSingle(), reader.ReadSingle()), PreviousPosition = new Vector2(reader.ReadSingle(), reader.ReadSingle()), Flags = reader.ReadUInt32(), Target = null, TargetPath = reader.ReadString(), } }; checkId(log.PointerId, type); var list = getPointerList(log.PointerId); list.Add(log); } } finally { reader.Close(); } } /// public void Log(Pointer pointer, PointerEvent evt) { throw new NotImplementedException("FileReaderLogger doesn't support writing data."); } /// public List GetFilteredPointerData(IPointerDataFilter filter = null) { //if (filter == null) return new List(data); } /// public List GetFilteredLogsForPointer(int id, IPointerLogFilter filter = null) { if (id < 0 || id >= pointerCount) return new List(); List list = events[id]; if (filter == null) return new List(list); var count = list.Count; List filtered = new List(count); for (var i = 0; i < count; i++) { var item = list[i]; if (filter.Applies(ref item)) filtered.Add(item); } return filtered; } public void Dispose() {} private IList getPointerList(int id) { return events[id]; } private void checkId(int id, Pointer.PointerType type) { if (id > pointerCount) throw new InvalidOperationException("Pointer id desync!"); else if (id == pointerCount) { var list = new List(MIN_POINTER_LIST_SIZE); events.Add(list); data.Add(new PointerData() { Id = id, Type = type, }); pointerCount++; } } } } #endif