1 /****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19
20 package org.apache.james.jdkim.canon;
21
22 import java.io.FilterOutputStream;
23 import java.io.IOException;
24 import java.io.OutputStream;
25
26 /**
27 * Pass data to the underlying system until a given amount of bytes is reached.
28 */
29 public class LimitedOutputStream extends FilterOutputStream {
30
31 private int limit;
32 private int computedBytes;
33
34 /**
35 * @param out
36 * an output stream that will receive the "trucated" stream.
37 * @param limit
38 * a positive integer of the number of bytes to be passed to
39 * the underlying stream
40 */
41 public LimitedOutputStream(OutputStream out, int limit) {
42 super(out);
43 this.limit = limit;
44 this.computedBytes = 0;
45 }
46
47 public void write(byte[] b, int off, int len) throws IOException {
48 if (len > limit - computedBytes) {
49 len = limit - computedBytes;
50 }
51 if (len > 0) {
52 out.write(b, off, len);
53 computedBytes += len;
54 }
55 }
56
57 public void write(int b) throws IOException {
58 if (computedBytes < limit) {
59 out.write(b);
60 computedBytes++;
61 }
62 }
63
64 /**
65 * @return the number of bytes passed to the underlying stream
66 */
67 public int getComputedBytes() {
68 return computedBytes;
69 }
70
71 /**
72 * @return true if the limit has been reached and no data is being passed to
73 * the underlying stream.
74 */
75 public boolean isLimited() {
76 return computedBytes >= limit;
77 }
78 }