forked from mirrors/linphone-iphone
git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@1 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
104 lines
3.5 KiB
Java
104 lines
3.5 KiB
Java
/*
|
|
* This file is part of JSTUN.
|
|
*
|
|
* Copyright (c) 2005 Thomas King <king@t-king.de> - All rights
|
|
* reserved.
|
|
*
|
|
* This software is licensed under either the GNU Public License (GPL),
|
|
* or the Apache 2.0 license. Copies of both license agreements are
|
|
* included in this distribution.
|
|
*/
|
|
|
|
package de.javawi.jstun.attribute;
|
|
|
|
import de.javawi.jstun.util.Utility;
|
|
import de.javawi.jstun.util.UtilityException;
|
|
|
|
public class ErrorCode extends MessageAttribute {
|
|
/*
|
|
* 0 1 2 3
|
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | 0 |Class| Number |
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
* | Reason Phrase (variable) ..
|
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
*/
|
|
|
|
int responseCode;
|
|
String reason;
|
|
|
|
public ErrorCode() {
|
|
super(MessageAttribute.MessageAttributeType.ErrorCode);
|
|
}
|
|
|
|
public void setResponseCode(int responseCode) throws MessageAttributeException {
|
|
switch (responseCode) {
|
|
case 400: reason = "Bad Request"; break;
|
|
case 401: reason = "Unauthorized"; break;
|
|
case 420: reason = "Unkown Attribute"; break;
|
|
case 430: reason = "Stale Credentials"; break;
|
|
case 431: reason = "Integrity Check Failure"; break;
|
|
case 432: reason = "Missing Username"; break;
|
|
case 433: reason = "Use TLS"; break;
|
|
case 500: reason = "Server Error"; break;
|
|
case 600: reason = "Global Failure"; break;
|
|
default: throw new MessageAttributeException("Response Code is not valid");
|
|
}
|
|
this.responseCode = responseCode;
|
|
}
|
|
|
|
public int getResponseCode() {
|
|
return responseCode;
|
|
}
|
|
|
|
public String getReason() {
|
|
return reason;
|
|
}
|
|
|
|
public byte[] getBytes() throws UtilityException {
|
|
int length = reason.length();
|
|
// length adjustment
|
|
if ((length % 4) != 0) {
|
|
length += 4 - (length % 4);
|
|
}
|
|
// message attribute header
|
|
length += 4;
|
|
byte[] result = new byte[length];
|
|
// message attribute header
|
|
// type
|
|
System.arraycopy(Utility.integerToTwoBytes(typeToInteger(type)), 0, result, 0, 2);
|
|
// length
|
|
System.arraycopy(Utility.integerToTwoBytes(length-4), 0, result, 2, 2);
|
|
|
|
// error code header
|
|
int classHeader = (int) Math.floor(((double)responseCode)/100);
|
|
result[6] = Utility.integerToOneByte(classHeader);
|
|
result[7] = Utility.integerToOneByte(responseCode%100);
|
|
byte[] reasonArray = reason.getBytes();
|
|
System.arraycopy(reasonArray, 0, result, 8, reasonArray.length);
|
|
return result;
|
|
}
|
|
|
|
public static ErrorCode parse(byte[] data) throws MessageAttributeParsingException {
|
|
try {
|
|
if (data.length < 4) {
|
|
throw new MessageAttributeParsingException("Data array too short");
|
|
}
|
|
byte classHeaderByte = data[3];
|
|
int classHeader = Utility.oneByteToInteger(classHeaderByte);
|
|
if ((classHeader < 1) || (classHeader > 6)) throw new MessageAttributeParsingException("Class parsing error");
|
|
byte numberByte = data[4];
|
|
int number = Utility.oneByteToInteger(numberByte);
|
|
if ((number < 0) || (number > 99)) throw new MessageAttributeParsingException("Number parsing error");
|
|
int responseCode = (classHeader * 100) + number;
|
|
ErrorCode result = new ErrorCode();
|
|
result.setResponseCode(responseCode);
|
|
return result;
|
|
} catch (UtilityException ue) {
|
|
throw new MessageAttributeParsingException("Parsing error");
|
|
} catch (MessageAttributeException mae) {
|
|
throw new MessageAttributeParsingException("Parsing error");
|
|
}
|
|
}
|
|
}
|