Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/DeflaterDataSerializer.java @ 618:7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 16 May 2013 19:46:13 +0200 |
parents | 243202f1bda5 |
children |
comparison
equal
deleted
inserted
replaced
617:65c01508f002 | 618:7c0d2ce340b8 |
---|---|
14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
16 */ | 16 */ |
17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
18 | 18 |
19 import java.io.IOException; | |
20 import java.util.zip.Deflater; | 19 import java.util.zip.Deflater; |
21 import java.util.zip.DeflaterOutputStream; | 20 import java.util.zip.DeflaterOutputStream; |
21 | |
22 import org.tmatesoft.hg.core.HgIOException; | |
22 | 23 |
23 /** | 24 /** |
24 * {@link DeflaterOutputStream} counterpart for {@link DataSerializer} API | 25 * {@link DeflaterOutputStream} counterpart for {@link DataSerializer} API |
25 * | 26 * |
26 * @author Artem Tikhomirov | 27 * @author Artem Tikhomirov |
41 deflateOutBuffer = new byte[bufferSizeHint <= 0 ? 2048 : bufferSizeHint]; | 42 deflateOutBuffer = new byte[bufferSizeHint <= 0 ? 2048 : bufferSizeHint]; |
42 auxBuffer = new byte[4 * AUX_BUFFER_CAPACITY]; // sizeof(int) * capacity | 43 auxBuffer = new byte[4 * AUX_BUFFER_CAPACITY]; // sizeof(int) * capacity |
43 } | 44 } |
44 | 45 |
45 @Override | 46 @Override |
46 public void writeInt(int... values) throws IOException { | 47 public void writeInt(int... values) throws HgIOException { |
47 for (int i = 0; i < values.length; i+= AUX_BUFFER_CAPACITY) { | 48 for (int i = 0; i < values.length; i+= AUX_BUFFER_CAPACITY) { |
48 int idx = 0; | 49 int idx = 0; |
49 for (int j = i, x = Math.min(values.length, i + AUX_BUFFER_CAPACITY); j < x; j++) { | 50 for (int j = i, x = Math.min(values.length, i + AUX_BUFFER_CAPACITY); j < x; j++) { |
50 int v = values[j]; | 51 int v = values[j]; |
51 auxBuffer[idx++] = (byte) ((v >>> 24) & 0x0ff); | 52 auxBuffer[idx++] = (byte) ((v >>> 24) & 0x0ff); |
56 internalWrite(auxBuffer, 0, idx); | 57 internalWrite(auxBuffer, 0, idx); |
57 } | 58 } |
58 } | 59 } |
59 | 60 |
60 @Override | 61 @Override |
61 public void write(byte[] data, int offset, int length) throws IOException { | 62 public void write(byte[] data, int offset, int length) throws HgIOException { |
62 // @see DeflaterOutputStream#write(byte[], int, int) | 63 // @see DeflaterOutputStream#write(byte[], int, int) |
63 int stride = deflateOutBuffer.length; | 64 int stride = deflateOutBuffer.length; |
64 for (int i = 0; i < length; i += stride) { | 65 for (int i = 0; i < length; i += stride) { |
65 internalWrite(data, offset + i, Math.min(stride, length - i)); | 66 internalWrite(data, offset + i, Math.min(stride, length - i)); |
66 } | 67 } |
67 } | 68 } |
68 | 69 |
69 private void internalWrite(byte[] data, int offset, int length) throws IOException { | 70 private void internalWrite(byte[] data, int offset, int length) throws HgIOException { |
70 deflater.setInput(data, offset, length); | 71 deflater.setInput(data, offset, length); |
71 while (!deflater.needsInput()) { | 72 while (!deflater.needsInput()) { |
72 deflate(); | 73 deflate(); |
73 } | 74 } |
74 } | 75 } |
75 | 76 |
76 @Override | 77 @Override |
77 public void done() { | 78 public void done() throws HgIOException { |
78 delegate.done(); | 79 delegate.done(); |
79 } | 80 } |
80 | 81 |
81 public void finish() throws IOException { | 82 public void finish() throws HgIOException { |
82 if (!deflater.finished()) { | 83 if (!deflater.finished()) { |
83 deflater.finish(); | 84 deflater.finish(); |
84 while (!deflater.finished()) { | 85 while (!deflater.finished()) { |
85 deflate(); | 86 deflate(); |
86 } | 87 } |
87 } | 88 } |
88 } | 89 } |
89 | 90 |
90 protected void deflate() throws IOException { | 91 protected void deflate() throws HgIOException { |
91 int len = deflater.deflate(deflateOutBuffer, 0, deflateOutBuffer.length); | 92 int len = deflater.deflate(deflateOutBuffer, 0, deflateOutBuffer.length); |
92 if (len > 0) { | 93 if (len > 0) { |
93 delegate.write(deflateOutBuffer, 0, len); | 94 delegate.write(deflateOutBuffer, 0, len); |
94 } | 95 } |
95 } | 96 } |