001: package ch.ethz.ssh2.packets;
002:
003: import java.io.UnsupportedEncodingException;
004: import java.math.BigInteger;
005:
006: /**
007: * TypesWriter.
008: *
009: * @author Christian Plattner, plattner@inf.ethz.ch
010: * @version $Id: TypesWriter.java,v 1.6 2006/08/31 20:04:29 cplattne Exp $
011: */
012: public class TypesWriter {
013: byte arr[];
014: int pos;
015:
016: public TypesWriter() {
017: arr = new byte[256];
018: pos = 0;
019: }
020:
021: private void resize(int len) {
022: byte new_arr[] = new byte[len];
023: System.arraycopy(arr, 0, new_arr, 0, arr.length);
024: arr = new_arr;
025: }
026:
027: public int length() {
028: return pos;
029: }
030:
031: public byte[] getBytes() {
032: byte[] dst = new byte[pos];
033: System.arraycopy(arr, 0, dst, 0, pos);
034: return dst;
035: }
036:
037: public void getBytes(byte dst[]) {
038: System.arraycopy(arr, 0, dst, 0, pos);
039: }
040:
041: public void writeUINT32(int val, int off) {
042: if ((off + 4) > arr.length)
043: resize(off + 32);
044:
045: arr[off++] = (byte) (val >> 24);
046: arr[off++] = (byte) (val >> 16);
047: arr[off++] = (byte) (val >> 8);
048: arr[off++] = (byte) val;
049: }
050:
051: public void writeUINT32(int val) {
052: writeUINT32(val, pos);
053: pos += 4;
054: }
055:
056: public void writeUINT64(long val) {
057: if ((pos + 8) > arr.length)
058: resize(arr.length + 32);
059:
060: arr[pos++] = (byte) (val >> 56);
061: arr[pos++] = (byte) (val >> 48);
062: arr[pos++] = (byte) (val >> 40);
063: arr[pos++] = (byte) (val >> 32);
064: arr[pos++] = (byte) (val >> 24);
065: arr[pos++] = (byte) (val >> 16);
066: arr[pos++] = (byte) (val >> 8);
067: arr[pos++] = (byte) val;
068: }
069:
070: public void writeBoolean(boolean v) {
071: if ((pos + 1) > arr.length)
072: resize(arr.length + 32);
073:
074: arr[pos++] = v ? (byte) 1 : (byte) 0;
075: }
076:
077: public void writeByte(int v, int off) {
078: if ((off + 1) > arr.length)
079: resize(off + 32);
080:
081: arr[off] = (byte) v;
082: }
083:
084: public void writeByte(int v) {
085: writeByte(v, pos);
086: pos++;
087: }
088:
089: public void writeMPInt(BigInteger b) {
090: byte raw[] = b.toByteArray();
091:
092: if ((raw.length == 1) && (raw[0] == 0))
093: writeUINT32(0); /* String with zero bytes of data */
094: else
095: writeString(raw, 0, raw.length);
096: }
097:
098: public void writeBytes(byte[] buff) {
099: writeBytes(buff, 0, buff.length);
100: }
101:
102: public void writeBytes(byte[] buff, int off, int len) {
103: if ((pos + len) > arr.length)
104: resize(arr.length + len + 32);
105:
106: System.arraycopy(buff, off, arr, pos, len);
107: pos += len;
108: }
109:
110: public void writeString(byte[] buff, int off, int len) {
111: writeUINT32(len);
112: writeBytes(buff, off, len);
113: }
114:
115: public void writeString(String v) {
116: byte[] b = v.getBytes();
117:
118: writeUINT32(b.length);
119: writeBytes(b, 0, b.length);
120: }
121:
122: public void writeString(String v, String charsetName)
123: throws UnsupportedEncodingException {
124: byte[] b = (charsetName == null) ? v.getBytes() : v
125: .getBytes(charsetName);
126:
127: writeUINT32(b.length);
128: writeBytes(b, 0, b.length);
129: }
130:
131: public void writeNameList(String v[]) {
132: StringBuffer sb = new StringBuffer();
133: for (int i = 0; i < v.length; i++) {
134: if (i > 0)
135: sb.append(',');
136: sb.append(v[i]);
137: }
138: writeString(sb.toString());
139: }
140: }
|