Mercurial > 510Connectbot
diff src/com/trilead/ssh2/packets/TypesWriter.java @ 0:0ce5cc452d02
initial version
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Thu, 22 May 2014 10:41:19 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/com/trilead/ssh2/packets/TypesWriter.java Thu May 22 10:41:19 2014 -0700 @@ -0,0 +1,149 @@ + +package com.trilead.ssh2.packets; + +import java.io.UnsupportedEncodingException; +import java.math.BigInteger; + +/** + * TypesWriter. + * + * @author Christian Plattner, plattner@trilead.com + * @version $Id: TypesWriter.java,v 1.2 2008/04/01 12:38:09 cplattne Exp $ + */ +public class TypesWriter { + byte arr[]; + int pos; + + public TypesWriter() { + arr = new byte[256]; + pos = 0; + } + + private void resize(int len) { + byte new_arr[] = new byte[len]; + System.arraycopy(arr, 0, new_arr, 0, arr.length); + arr = new_arr; + } + + public int length() { + return pos; + } + + public byte[] getBytes() { + byte[] dst = new byte[pos]; + System.arraycopy(arr, 0, dst, 0, pos); + return dst; + } + + public void getBytes(byte dst[]) { + System.arraycopy(arr, 0, dst, 0, pos); + } + + public void writeUINT32(int val, int off) { + if ((off + 4) > arr.length) + resize(off + 32); + + arr[off++] = (byte)(val >> 24); + arr[off++] = (byte)(val >> 16); + arr[off++] = (byte)(val >> 8); + arr[off++] = (byte) val; + } + + public void writeUINT32(int val) { + writeUINT32(val, pos); + pos += 4; + } + + public void writeUINT64(long val) { + if ((pos + 8) > arr.length) + resize(arr.length + 32); + + arr[pos++] = (byte)(val >> 56); + arr[pos++] = (byte)(val >> 48); + arr[pos++] = (byte)(val >> 40); + arr[pos++] = (byte)(val >> 32); + arr[pos++] = (byte)(val >> 24); + arr[pos++] = (byte)(val >> 16); + arr[pos++] = (byte)(val >> 8); + arr[pos++] = (byte) val; + } + + public void writeBoolean(boolean v) { + if ((pos + 1) > arr.length) + resize(arr.length + 32); + + arr[pos++] = v ? (byte) 1 : (byte) 0; + } + + public void writeByte(int v, int off) { + if ((off + 1) > arr.length) + resize(off + 32); + + arr[off] = (byte) v; + } + + public void writeByte(int v) { + writeByte(v, pos); + pos++; + } + + public void writeMPInt(BigInteger b) { + byte raw[] = b.toByteArray(); + + if ((raw.length == 1) && (raw[0] == 0)) + writeUINT32(0); /* String with zero bytes of data */ + else + writeString(raw, 0, raw.length); + } + + public void writeBytes(byte[] buff) { + writeBytes(buff, 0, buff.length); + } + + public void writeBytes(byte[] buff, int off, int len) { + if ((pos + len) > arr.length) + resize(arr.length + len + 32); + + System.arraycopy(buff, off, arr, pos, len); + pos += len; + } + + public void writeString(byte[] buff, int off, int len) { + writeUINT32(len); + writeBytes(buff, off, len); + } + + public void writeString(String v) { + byte[] b; + + try { + /* All Java JVMs must support ISO-8859-1 */ + b = v.getBytes("ISO-8859-1"); + } + catch (UnsupportedEncodingException ignore) { + b = v.getBytes(); + } + + writeUINT32(b.length); + writeBytes(b, 0, b.length); + } + + public void writeString(String v, String charsetName) throws UnsupportedEncodingException { + byte[] b = (charsetName == null) ? v.getBytes() : v.getBytes(charsetName); + writeUINT32(b.length); + writeBytes(b, 0, b.length); + } + + public void writeNameList(String v[]) { + StringBuffer sb = new StringBuffer(); + + for (int i = 0; i < v.length; i++) { + if (i > 0) + sb.append(','); + + sb.append(v[i]); + } + + writeString(sb.toString()); + } +}