|
16 | 16 |
|
17 | 17 | package org.bitcoinj.core; |
18 | 18 |
|
| 19 | +import org.bitcoinj.core.listeners.DownloadProgressTracker; |
19 | 20 | import org.bitcoinj.store.BlockStoreException; |
| 21 | +import org.bitcoinj.utils.Threading; |
20 | 22 |
|
21 | 23 | import javax.annotation.Nullable; |
22 | 24 |
|
@@ -105,4 +107,56 @@ public StoredBlock getBlock(int height) { |
105 | 107 | public StoredBlock getChainHead() { |
106 | 108 | return getLongestChain().chainHead; |
107 | 109 | } |
| 110 | + |
| 111 | + PeerGroup peerGroup; |
| 112 | + MyDownloadProgressTracker downloadProgressTracker; |
| 113 | + |
| 114 | + private static class MyDownloadProgressTracker extends DownloadProgressTracker { |
| 115 | + volatile boolean headerDownloadCompleted = false; |
| 116 | + volatile boolean blockDownloadCompleted = false; |
| 117 | + MyDownloadProgressTracker(boolean preprocessingBeforeBlocks) { |
| 118 | + super(preprocessingBeforeBlocks); |
| 119 | + } |
| 120 | + |
| 121 | + @Override |
| 122 | + public void doneHeaderDownload() { |
| 123 | + super.doneHeaderDownload(); |
| 124 | + headerDownloadCompleted = true; |
| 125 | + } |
| 126 | + |
| 127 | + @Override |
| 128 | + protected void doneDownload() { |
| 129 | + super.doneDownload(); |
| 130 | + blockDownloadCompleted = true; |
| 131 | + } |
| 132 | + } |
| 133 | + |
| 134 | + public void setPeerGroup(PeerGroup peerGroup, MasternodeSync masternodeSync) { |
| 135 | + close(); |
| 136 | + if (peerGroup != null) { |
| 137 | + this.peerGroup = peerGroup; |
| 138 | + downloadProgressTracker = new MyDownloadProgressTracker(masternodeSync.hasSyncFlag(MasternodeSync.SYNC_FLAGS.SYNC_BLOCKS_AFTER_PREPROCESSING)); |
| 139 | + peerGroup.addHeadersDownloadedEventListener(Threading.USER_THREAD, downloadProgressTracker); |
| 140 | + peerGroup.addHeadersDownloadStartedEventListener(Threading.USER_THREAD, downloadProgressTracker); |
| 141 | + peerGroup.addBlocksDownloadedEventListener(Threading.USER_THREAD, downloadProgressTracker); |
| 142 | + peerGroup.addChainDownloadStartedEventListener(Threading.USER_THREAD, downloadProgressTracker); |
| 143 | + peerGroup.addMasternodeListDownloadListener(Threading.USER_THREAD, downloadProgressTracker); |
| 144 | + } |
| 145 | + } |
| 146 | + |
| 147 | + public boolean isInitialHeaderSyncComplete() { |
| 148 | + return downloadProgressTracker != null && (downloadProgressTracker.headerDownloadCompleted || downloadProgressTracker.blockDownloadCompleted); |
| 149 | + } |
| 150 | + |
| 151 | + public void close() { |
| 152 | + if (peerGroup != null && downloadProgressTracker != null) { |
| 153 | + peerGroup.removeHeadersDownloadedEventListener(downloadProgressTracker); |
| 154 | + peerGroup.removeHeadersDownloadStartedEventListener(downloadProgressTracker); |
| 155 | + peerGroup.removeBlocksDownloadedEventListener(downloadProgressTracker); |
| 156 | + peerGroup.removeChainDownloadStartedEventListener(downloadProgressTracker); |
| 157 | + peerGroup.removeMasternodeListDownloadedListener(downloadProgressTracker); |
| 158 | + } |
| 159 | + peerGroup = null; |
| 160 | + downloadProgressTracker = null; |
| 161 | + } |
108 | 162 | } |
0 commit comments