1 /* 2 (C) Copyright IBM Corp. 2005, 2013 3 4 THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE 5 ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE 6 CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT. 7 8 You can obtain a current copy of the Eclipse Public License from 9 http://www.opensource.org/licenses/eclipse-1.0.php 10 11 @author : Roberto Pineiro, IBM, roberto.pineiro@us.ibm.com 12 * @author : Chung-hao Tan, IBM, chungtan@us.ibm.com 13 * 14 * 15 * Change History 16 * Flag Date Prog Description 17 *------------------------------------------------------------------------------- 18 * 1535756 2006-08-07 lupusalex Make code warning free 19 * 1565892 2006-11-28 lupusalex Make SBLIM client JSR48 compliant 20 * 2003590 2008-06-30 blaschke-oss Change licensing from CPL to EPL 21 * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1) 22 * 2531371 2009-02-10 raman_arora Upgrade client to JDK 1.5 (Phase 2) 23 * 2620 2013-02-23 blaschke-oss Chunked output broken 24 */ 25 package org.metricshub.wbem.sblim.cimclient.internal.http.io; 26 27 /*- 28 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 29 * WBEM Java Client 30 * ჻჻჻჻჻჻ 31 * Copyright 2023 - 2025 MetricsHub 32 * ჻჻჻჻჻჻ 33 * Licensed under the Apache License, Version 2.0 (the "License"); 34 * you may not use this file except in compliance with the License. 35 * You may obtain a copy of the License at 36 * 37 * http://www.apache.org/licenses/LICENSE-2.0 38 * 39 * Unless required by applicable law or agreed to in writing, software 40 * distributed under the License is distributed on an "AS IS" BASIS, 41 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 42 * See the License for the specific language governing permissions and 43 * limitations under the License. 44 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱ 45 */ 46 47 import java.io.DataOutputStream; 48 import java.io.IOException; 49 import java.io.OutputStream; 50 51 /** 52 * Class ChunkedOutputStream implements an output stream for chunked messages 53 * 54 */ 55 public class ChunkedOutputStream extends OutputStream { 56 DataOutputStream iOs; 57 58 byte[] iBuffer; 59 60 int iUsed; 61 62 /** 63 * Ctor. 64 * 65 * @param pStream 66 * The stream to create this one upon 67 * @param pBufferLength 68 * The buffer length. When this value is exceeded a new chunk 69 * will be started. 70 */ 71 public ChunkedOutputStream(OutputStream pStream, int pBufferLength) { 72 this.iOs = new DataOutputStream(pStream); 73 this.iBuffer = new byte[pBufferLength]; 74 this.iUsed = 0; 75 } 76 77 @Override 78 public void close() throws IOException { 79 flush(); 80 this.iOs.writeBytes(Integer.toHexString(0) + "\r\n"); 81 this.iOs.flush(); 82 } 83 84 @Override 85 public void flush() throws IOException { 86 if (this.iUsed > 0) { 87 this.iOs.writeBytes(Integer.toHexString(this.iUsed) + "\r\n"); 88 this.iOs.write(this.iBuffer, 0, this.iUsed); 89 this.iOs.writeBytes("\r\n"); 90 this.iOs.flush(); 91 } 92 this.iUsed = 0; 93 } 94 95 /** 96 * @param offset 97 */ 98 @Override 99 public void write(byte source[], int offset, int len) throws IOException { 100 int copied = 0; 101 while (len > 0) { 102 int total = (this.iBuffer.length - this.iUsed < len) ? (this.iBuffer.length - this.iUsed) : len; 103 if (total > 0) { 104 System.arraycopy(source, copied, this.iBuffer, this.iUsed, total); 105 len -= total; 106 this.iUsed += total; 107 copied += total; 108 } 109 if (this.iUsed == this.iBuffer.length) flush(); 110 } 111 } 112 113 @Override 114 public void write(int i) throws IOException { 115 if (this.iBuffer.length == this.iUsed) flush(); 116 this.iBuffer[this.iUsed++] = (byte) (0xFF & i); 117 } 118 }