diff src/org/tmatesoft/hg/internal/RevlogStream.java @ 217:e39cf474ef94

Experimental support to mix-in start and end events for inspectors. Additionally, Lifecycle may serve as iteration control
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 17 May 2011 03:40:52 +0200
parents 706bcc7cfee4
children 80a3433ace91
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/internal/RevlogStream.java	Tue May 17 01:15:12 2011 +0200
+++ b/src/org/tmatesoft/hg/internal/RevlogStream.java	Tue May 17 03:40:52 2011 +0200
@@ -200,6 +200,7 @@
 		}
 		// XXX may cache [start .. end] from index with a single read (pre-read)
 		
+		Lifecycle.BasicCallback cb = null;
 		DataAccess daIndex = null, daData = null;
 		daIndex = getIndexStream();
 		if (needData && !inline) {
@@ -218,6 +219,12 @@
 			}
 			
 			daIndex.seek(getIndexOffsetInt(i));
+			
+			if (inspector instanceof Lifecycle) {
+				cb = new Lifecycle.BasicCallback();
+				((Lifecycle) inspector).start(end - start + 1, cb, cb);
+			}
+			
 			for (; i <= end; i++ ) {
 				if (inline && needData) {
 					// inspector reading data (though FilterDataAccess) may have affected index position
@@ -282,6 +289,11 @@
 				if (!extraReadsToBaseRev || i >= start) {
 					inspector.next(i, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeidBuf, userDataAccess);
 				}
+				if (cb != null) {
+					if (cb.isStopped()) {
+						break;
+					}
+				}
 				if (userDataAccess != null) {
 					userDataAccess.reset();
 					if (lastUserData != null) {
@@ -293,6 +305,9 @@
 		} catch (IOException ex) {
 			throw new HgBadStateException(ex); // FIXME need better handling
 		} finally {
+			if (inspector instanceof Lifecycle) {
+				((Lifecycle) inspector).finish(cb);
+			}
 			daIndex.done();
 			if (daData != null) {
 				daData.done();