148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/*
248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * Please refer to the LICENSE.txt for licensing details.
448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpackage ch.ethz.ssh2.packets;
648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodimport java.io.IOException;
848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood/**
1048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * PacketChannelOpenFailure.
1148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood *
1248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @author Christian Plattner
1348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood * @version 2.50, 03/15/10
1448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood */
1548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwoodpublic class PacketChannelOpenFailure
1648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood{
1748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	byte[] payload;
1848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
1948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public int recipientChannelID;
2048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public int reasonCode;
2148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public String description;
2248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public String languageTag;
2348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
2448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public PacketChannelOpenFailure(int recipientChannelID, int reasonCode, String description,
2548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			String languageTag)
2648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
2748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.recipientChannelID = recipientChannelID;
2848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.reasonCode = reasonCode;
2948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.description = description;
3048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.languageTag = languageTag;
3148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
3248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public PacketChannelOpenFailure(byte payload[], int off, int len) throws IOException
3448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
3548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		this.payload = new byte[len];
3648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		System.arraycopy(payload, off, this.payload, 0, len);
3748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
3848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		TypesReader tr = new TypesReader(payload, off, len);
3948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		int packet_type = tr.readByte();
4148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (packet_type != Packets.SSH_MSG_CHANNEL_OPEN_FAILURE)
4348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IOException(
4448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood					"This is not a SSH_MSG_CHANNEL_OPEN_FAILURE! ("
4548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood							+ packet_type + ")");
4648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
4748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		recipientChannelID = tr.readUINT32();
4848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		reasonCode = tr.readUINT32();
4948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		description = tr.readString();
5048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		languageTag = tr.readString();
5148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
5248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (tr.remain() != 0)
5348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			throw new IOException("Padding in SSH_MSG_CHANNEL_OPEN_FAILURE packet!");
5448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
5548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood
5648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	public byte[] getPayload()
5748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	{
5848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		if (payload == null)
5948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		{
6048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			TypesWriter tw = new TypesWriter();
6148ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			tw.writeByte(Packets.SSH_MSG_CHANNEL_OPEN_FAILURE);
6248ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			tw.writeUINT32(recipientChannelID);
6348ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			tw.writeUINT32(reasonCode);
6448ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			tw.writeString(description);
6548ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			tw.writeString(languageTag);
6648ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood			payload = tw.getBytes();
6748ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		}
6848ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood		return payload;
6948ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood	}
7048ded2421114c4c87ef3f8005c9f793a5d077cbdMike Lockwood}
71