/*
* FrameType.java February 2014
*
* Copyright (C) 2014, Niall Gallagher <niallg@users.sf.net>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package org.simpleframework.http.socket;
/**
* The <code>FrameType</code> represents the set of opcodes defined
* in RFC 6455. The base framing protocol uses a opcode to define the
* interpretation of the payload data for the frame.
*
* @author Niall Gallagher
*
* @see org.simpleframework.http.socket.Frame
*/
public enum FrameType {
/**
* A continuation frame identifies a fragment from a larger message.
*/
CONTINUATION(0x00),
/**
* A text frame identifies a message that contains UTF-8 text data.
*/
TEXT(0x01),
/**
* A binary frame identifies a message that contains binary data.
*/
BINARY(0x02),
/**
* A close frame identifies a frame used to terminate a connection.
*/
CLOSE(0x08),
/**
* A ping frame is a heartbeat used to determine connection health.
*/
PING(0x09),
/**
* A pong frame is sent is sent in response to a ping frame.
*/
PONG(0x0a);
/**
* This is the integer value for the opcode.
*/
public final int code;
/**
* Constructor for the <code>Frame</code> type enumeration. This is
* given the opcode that is used to identify a specific frame type.
*
* @param code this is the opcode representing the frame type
*/
private FrameType(int code) {
this.code = code;
}
/**
* This is used to determine if a frame is a text frame. It can be
* useful to know if a frame is a user based frame as it reduces
* the need to convert from or to certain character sets.
*
* @return this returns true if the frame represents a text frame
*/
public boolean isText() {
return this == TEXT;
}
/**
* This is used to determine if a frame is a close frame. A close
* frame contains an optional payload, which if present contains
* an error code in network byte order in the first two bytes,
* followed by an optional UTF-8 text reason of the closure.
*
* @return this returns true if the frame represents a close frame
*/
public boolean isClose() {
return this == CLOSE;
}
/**
* This is used to determine if a frame is a pong frame. A pong
* frame is sent in response to a ping and is used to determine if
* a WebSocket connection is still active and healthy.
*
* @return this returns true if the frame represents a pong frame
*/
public boolean isPong() {
return this == PONG;
}
/**
* This is used to determine if a frame is a ping frame. A ping
* frame is sent to check if a WebSocket connection is still healthy.
* A connection is determined healthy if it responds with a pong
* frame is a reasonable length of time.
*
* @return this returns true if the frame represents a ping frame
*/
public boolean isPing() {
return this == PING;
}
/**
* This is used to acquire the frame type given an opcode. If no
* frame type can be determined from the opcode provided then this
* will return a null value.
*
* @param octet this is the octet representing the opcode
*
* @return this returns the frame type from the opcode
*/
public static FrameType resolveType(int octet) {
int value = octet & 0xff;
for(FrameType code : values()) {
if(code.code == value) {
return code;
}
}
return null;
}
}