Merge master in TmfTraceModel
[deliverable/tracecompass.git] / org.eclipse.linuxtools.ctf.core / src / org / eclipse / linuxtools / ctf / core / trace / StreamInputReader.java
CommitLineData
866e5b51
FC
1/*******************************************************************************
2 * Copyright (c) 2011-2012 Ericsson, Ecole Polytechnique de Montreal and others
3 *
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors: Matthew Khouzam - Initial API and implementation
10 * Contributors: Simon Marchi - Initial API and implementation
11 *******************************************************************************/
12
13package org.eclipse.linuxtools.ctf.core.trace;
14
ce2388e0 15import java.nio.ByteOrder;
866e5b51
FC
16import java.util.ListIterator;
17
18import org.eclipse.linuxtools.ctf.core.event.EventDefinition;
19import org.eclipse.linuxtools.ctf.core.event.types.StructDefinition;
ce2388e0
FC
20import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInput;
21import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInputPacketIndexEntry;
866e5b51
FC
22
23/**
24 * <b><u>StreamInputReader</u></b>
25 * <p>
26 * Reads the events of a trace file.
27 */
28public class StreamInputReader {
29
30 // ------------------------------------------------------------------------
31 // Attributes
32 // ------------------------------------------------------------------------
33
34 /**
35 * The StreamInput we are reading.
36 */
37 private final StreamInput streamInput;
38
39 /**
40 * The packet reader used to read packets from this trace file.
41 */
42 private final StreamInputPacketReader packetReader;
43
44 /**
45 * Iterator on the packet index
46 */
47 private ListIterator<StreamInputPacketIndexEntry> packetIndexIt;
48
49 /**
50 * Reference to the current event of this trace file (iow, the last on that
51 * was read, the next one to be returned)
52 */
53 private EventDefinition currentEvent = null;
54
55 private int name;
56
57 // ------------------------------------------------------------------------
58 // Constructors
59 // ------------------------------------------------------------------------
60
61 /**
62 * Constructs a StreamInputReader that reads a StreamInput.
63 *
64 * @param streamInput
65 * The StreamInput to read.
66 */
67 public StreamInputReader(StreamInput streamInput) {
68 this.streamInput = streamInput;
69 this.packetReader = new StreamInputPacketReader(this);
70
71 /*
72 * Get the iterator on the packet index.
73 */
74 this.packetIndexIt = streamInput.getIndex().listIterator();
75
76 /*
77 * Make first packet the current one.
78 */
79 goToNextPacket();
80 }
81
82 // ------------------------------------------------------------------------
83 // Getters/Setters/Predicates
84 // ------------------------------------------------------------------------
85
86 public EventDefinition getCurrentEvent() {
87 return this.currentEvent;
88 }
89
90 public StructDefinition getCurrentPacketContext() {
91 return this.packetReader.getStreamPacketContextDef();
92 }
93
ce2388e0
FC
94 public ByteOrder getByteOrder() {
95 return streamInput.getStream().getTrace().getByteOrder();
866e5b51
FC
96 }
97
98 public int getName() {
99 return this.name;
100 }
101
102 public void setName(int name) {
103 this.name = name;
104 }
105
106 public int getCPU() {
107 return this.packetReader.getCPU();
108 }
109
ce2388e0
FC
110 public String getFilename() {
111 return streamInput.getFilename();
112 }
113
114 /*
115 * for internal use only
116 */
117 StreamInput getStreamInput() {
118 return streamInput;
119 }
120
866e5b51
FC
121 // ------------------------------------------------------------------------
122 // Operations
123 // ------------------------------------------------------------------------
124 /**
125 * Reads the next event in the current event variable.
126 *
127 * @return If an event has been successfully read.
128 */
129 public boolean readNextEvent() {
130 /*
131 * Change packet if needed
132 */
133 if (!this.packetReader.hasMoreEvents()) {
134 goToNextPacket();
135 }
136
137 /*
138 * If an event is available, read it.
139 */
140 if (this.packetReader.hasMoreEvents()) {
141 try {
142 this.setCurrentEvent(this.packetReader.readNextEvent());
143 } catch (CTFReaderException e) {
144 /* Some problem happened, we'll assume there is no more events */
145 return false;
146 }
147 return true;
148 }
149 this.setCurrentEvent(null);
150 return false;
151 }
152
153 /**
154 * Change the current packet of the packet reader to the next one.
155 */
156 private void goToNextPacket() {
ce2388e0
FC
157 if (getPacketIndexIt().hasNext()) {
158 StreamInputPacketIndexEntry nextPacket = getPacketIndexIt().next();
159 this.packetReader.setCurrentPacket(nextPacket);
866e5b51
FC
160 } else {
161 this.packetReader.setCurrentPacket(null);
162 }
163 }
164
165 /**
166 * Changes the location of the trace file reader so that the current event
167 * is the first event with a timestamp greater than the given timestamp.
168 *
169 * @param timestamp
170 * The timestamp to seek to.
171 */
ce2388e0
FC
172 public long seek(long timestamp) {
173 long offset = 0;
866e5b51
FC
174 /*
175 * Search in the index for the packet to search in.
176 */
177 this.packetIndexIt = this.streamInput.getIndex().search(timestamp);
178
179 /*
180 * Switch to this packet.
181 */
182 goToNextPacket();
183
184 /*
185 * Advance until A. we reached the end of the trace file (which means
186 * the given timestamp is after the last event), or B. we found the
187 * first event with a timestamp greater than the given timestamp.
188 */
189 readNextEvent();
190 boolean done = (this.getCurrentEvent() == null);
191 while (!done && (this.getCurrentEvent().timestamp < timestamp)) {
192 readNextEvent();
193 done = (this.getCurrentEvent() == null);
ce2388e0 194 offset++;
866e5b51 195 }
ce2388e0
FC
196 return offset;
197 }
198
199 public long seekIndex(long index) throws CTFReaderException {
200 /*
201 * Search in the index for the packet to search in.
202 */
203 this.packetIndexIt = this.streamInput.getIndex().searchIndex(index);
204 /*
205 * Switch to this packet.
206 */
207 goToNextPacket();
208 /*
209 * Read the first packet
210 */
211 readNextEvent();
212 /*
213 * get the current index
214 */
215 if (this.packetReader.getCurrentPacket() == null) {
216 throw new CTFReaderException(
217 "Current packet null in index seek, did you index your trace yet?");
218 }
219 return this.packetReader.getCurrentPacket().getIndexBegin();
220
866e5b51
FC
221 }
222
223 public void goToLastEvent() throws CTFReaderException {
224 /*
225 * Search in the index for the packet to search in.
226 */
ce2388e0
FC
227 int len = this.streamInput.getIndex().getEntries().size();
228 int back = 0;
229 long desired_timestamp = -1;
230 do {
231 back++;
232 StreamInputPacketIndexEntry entry = this.streamInput.getIndex()
233 .getEntries().get(len - back);
234 desired_timestamp = entry.getTimestampBegin() + 1;
235 seek(desired_timestamp);
236
237 } while (!this.packetReader.hasMoreEvents());
866e5b51
FC
238 /*
239 * Go until the end of that packet
240 */
ce2388e0
FC
241
242 int packet_size = 0;
866e5b51
FC
243 while (this.packetReader.hasMoreEvents()) {
244 this.packetReader.readNextEvent();
ce2388e0
FC
245 packet_size++;
246 }
247 seek(desired_timestamp);
248 for (int i = 0; i < (packet_size - 1); i++) {
249 this.packetReader.readNextEvent();
866e5b51
FC
250 }
251 }
252
253 public void setCurrentEvent(EventDefinition currentEvent) {
254 this.currentEvent = currentEvent;
255 }
256
ce2388e0
FC
257 /**
258 * @return the packetIndexIt
259 */
260 private ListIterator<StreamInputPacketIndexEntry> getPacketIndexIt() {
261 return packetIndexIt;
262 }
263
264 /**
265 * @return the packetReader
266 */
267 public StreamInputPacketReader getPacketReader() {
268 return packetReader;
269 }
270
866e5b51 271}
This page took 0.035131 seconds and 5 git commands to generate.