/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 io.hawtjms.provider.stomp;

import java.nio.charset.Charset;

/**
 * A series of constant values used by the STOMP protocol.
 */
public interface StompConstants {

    final Charset UTF8 = Charset.forName("UTF-8");

    final String NULL = "\u0000";
    final byte NULL_BYTE = 0;

    final String NEWLINE = "\n";
    final byte NEWLINE_BYTE = '\n';

    final String COLON = ":";
    final byte COLON_BYTE = ':';

    final byte ESCAPE_BYTE = '\\';

    final String ESCAPE_ESCAPE_SEQ = "\\\\";
    final String COLON_ESCAPE_SEQ = "\\c";
    final String NEWLINE_ESCAPE_SEQ = "\\n";

    // Commands
    final String STOMP = "STOMP";
    final String CONNECT = "CONNECT";
    final String SEND = "SEND";
    final String DISCONNECT = "DISCONNECT";
    final String SUBSCRIBE = "SUBSCRIBE";
    final String UNSUBSCRIBE = "UNSUBSCRIBE";
    final String MESSAGE = "MESSAGE";

    final String BEGIN_TRANSACTION = "BEGIN";
    final String COMMIT_TRANSACTION = "COMMIT";
    final String ABORT_TRANSACTION = "ABORT";
    final String BEGIN = "BEGIN";
    final String COMMIT = "COMMIT";
    final String ABORT = "ABORT";
    final String ACK = "ACK";

    // Responses
    final String CONNECTED = "CONNECTED";
    final String ERROR = "ERROR";
    final String RECEIPT = "RECEIPT";

    // Headers
    final String RECEIPT_REQUESTED = "receipt";
    final String TRANSACTION = "transaction";
    final String CONTENT_LENGTH = "content-length";
    final String CONTENT_TYPE = "content-type";
    final String TRANSFORMATION = "transformation";
    final String TRANSFORMATION_ERROR = "transformation-error";

    /**
     * This header is used to instruct ActiveMQ to construct the message
     * based with a specific type.
     */
    final String AMQ_MESSAGE_TYPE = "amq-msg-type";
    final String RECEIPT_ID = "receipt-id";
    final String PERSISTENT = "persistent";
    final String MESSAGE_HEADER = "message";
    final String MESSAGE_ID = "message-id";
    final String CORRELATION_ID = "correlation-id";
    final String EXPIRATION_TIME = "expires";
    final String REPLY_TO = "reply-to";
    final String PRIORITY = "priority";
    final String REDELIVERED = "redelivered";
    final String TIMESTAMP = "timestamp";
    final String TYPE = "type";
    final String SUBSCRIPTION = "subscription";
    final String USERID = "JMSXUserID";
    final String PROPERTIES = "JMSXProperties";
    final String ACK_MODE = "ack";
    final String ID = "id";
    final String SELECTOR = "selector";
    final String BROWSER = "browser";
    final String AUTO = "auto";
    final String CLIENT = "client";
    final String INDIVIDUAL = "client-individual";
    final String DESTINATION = "destination";
    final String LOGIN = "login";
    final String PASSCODE = "passcode";
    final String CLIENT_ID = "client-id";
    final String REQUEST_ID = "request-id";
    final String SESSION = "session";
    final String RESPONSE_ID = "response-id";
    final String ACCEPT_VERSION = "accept-version";
    final String V1_2 = "1.2";
    final String V1_1 = "1.1";
    final String V1_0 = "1.0";
    final String HOST = "host";
    final String TRUE = "true";
    final String FALSE = "false";
    final String END = "end";
    final String HOST_ID = "host-id";
    final String SERVER = "server";
    final String CREDIT = "credit";
    final String JMSX_DELIVERY_COUNT = "JMSXDeliveryCount";
    final String JMSX_GROUP_ID = "JMSXGroupID";
    final String JMSX_GROUP_SEQUENCE = "JMSXGroupSequence";
    final String HEARTBEAT = "heart-beat";
    final String VERSION = "version";

    /**
     * Well known JMSException types that we want to map when throwing from
     * the provider on ERROR frames.
     */
    final String INVALID_CLIENTID_EXCEPTION = "InvalidClientIDException";
    final String JMS_SECURITY_EXCEPTION = "JmsSecurityException";
    final String SECURITY_EXCEPTION = "SecurityException";
}

@@ -1251,24 +1251,146 @@
 TE = '%5C%5C';%0A%0A
+    final byte ESCAPE_ESCAPE_BYTE = 92;%0A    final byte COLON_ESCAPE_BYTE = 99;%0A    final byte NEWLINE_ESCAPE_BYTE = 110;%0A%0A
     final St

Add some new constants for frame parsing.