Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/InflaterDataAccess.java @ 421:fdd7d756dea0 v0.8.5
Allow IOException from DataAccess methods for subclasses with non-trivial implementations, to avoid exception dumps when inapropriate
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 22 Mar 2012 23:09:11 +0100 |
| parents | 6c22bdc0bdfd |
| children | 9c9c442b5f2e |
comparison
equal
deleted
inserted
replaced
| 420:6c22bdc0bdfd | 421:fdd7d756dea0 |
|---|---|
| 65 decompressedPos = 0; | 65 decompressedPos = 0; |
| 66 return this; | 66 return this; |
| 67 } | 67 } |
| 68 | 68 |
| 69 @Override | 69 @Override |
| 70 protected int available() { | 70 protected int available() throws IOException { |
| 71 return length() - decompressedPos; | 71 return length() - decompressedPos; |
| 72 } | 72 } |
| 73 | 73 |
| 74 @Override | 74 @Override |
| 75 public boolean isEmpty() { | 75 public boolean isEmpty() throws IOException { |
| 76 // can't use super.available() <= 0 because even when 0 < super.count < 6(?) | 76 // can't use super.available() <= 0 because even when 0 < super.count < 6(?) |
| 77 // decompressedPos might be already == length() | 77 // decompressedPos might be already == length() |
| 78 return available() <= 0; | 78 return available() <= 0; |
| 79 } | 79 } |
| 80 | 80 |
| 81 @Override | 81 @Override |
| 82 public int length() { | 82 public int length() throws IOException { |
| 83 if (decompressedLength != -1) { | 83 if (decompressedLength != -1) { |
| 84 return decompressedLength; | 84 return decompressedLength; |
| 85 } | 85 } |
| 86 decompressedLength = 0; // guard to avoid endless loop in case length() would get invoked from below. | 86 decompressedLength = 0; // guard to avoid endless loop in case length() would get invoked from below. |
| 87 int c = 0; | 87 int c = 0; |
| 88 try { | 88 int oldPos = decompressedPos; |
| 89 int oldPos = decompressedPos; | 89 byte[] dummy = new byte[buffer.length]; |
| 90 byte[] dummy = new byte[buffer.length]; | 90 int toRead; |
| 91 int toRead; | 91 while ((toRead = super.available()) > 0) { |
| 92 while ((toRead = super.available()) > 0) { | 92 if (toRead > buffer.length) { |
| 93 if (toRead > buffer.length) { | 93 toRead = buffer.length; |
| 94 toRead = buffer.length; | 94 } |
| 95 super.readBytes(buffer, 0, toRead); | |
| 96 inflater.setInput(buffer, 0, toRead); | |
| 97 try { | |
| 98 while (!inflater.needsInput()) { | |
| 99 c += inflater.inflate(dummy, 0, dummy.length); | |
| 95 } | 100 } |
| 96 super.readBytes(buffer, 0, toRead); | 101 } catch (DataFormatException ex) { |
| 97 inflater.setInput(buffer, 0, toRead); | 102 throw new HgBadStateException(ex); |
| 98 try { | |
| 99 while (!inflater.needsInput()) { | |
| 100 c += inflater.inflate(dummy, 0, dummy.length); | |
| 101 } | |
| 102 } catch (DataFormatException ex) { | |
| 103 throw new HgBadStateException(ex); | |
| 104 } | |
| 105 } | 103 } |
| 106 decompressedLength = c + oldPos; | |
| 107 reset(); | |
| 108 seek(oldPos); | |
| 109 return decompressedLength; | |
| 110 } catch (IOException ex) { | |
| 111 decompressedLength = -1; // better luck next time? | |
| 112 throw new HgBadStateException(ex); // XXX perhaps, checked exception | |
| 113 } | 104 } |
| 105 decompressedLength = c + oldPos; | |
| 106 reset(); | |
| 107 seek(oldPos); | |
| 108 return decompressedLength; | |
| 114 } | 109 } |
| 115 | 110 |
| 116 @Override | 111 @Override |
| 117 public void seek(int localOffset) throws IOException { | 112 public void seek(int localOffset) throws IOException { |
| 118 if (localOffset < 0 /* || localOffset >= length() */) { | 113 if (localOffset < 0 /* || localOffset >= length() */) { |
