/**
  REQ - 새로운 Ticket ID 를 요청합니다.

    Inst Number     : 1 (0x1)
    Inst Size       : 1 바이트
    Inst Format     : 0x01
    Return          : <TICKET> Request ID (유일한 HASH 값)
                      | <ERROR> ERROR 포맷
    Return Size     : <TICKET> 일 경우, 21 bytes
                      <ERROR> 일 경우, 해당 포맷에 따라 길이 가변.

    Contents        : Server 측에 request ID 를 요구한다.  이것을 이용하여 client 에서는
                      모든 정보를 보낼 수 있다.

    Example         : REQ   e://<hostname>[:<portnum>]
    Network         : -> 0x01
                      <- 0x04(TICKET) (20 바이트의 Request ID 값)
                      혹은
                      <- 0x06(ERROR) ...
 */
#define COMMAND_REQ             0x01

/**
  REQEND - Ticket ID 를 폐기한다.

    Inst Number     : 2 (0x2)
    Inst Size       : 1 바이트 + Ticket ID (20 바이트)
    Inst Format     : 0x02 <Ticket ID 20bytes>
    Return          : <OK>
    Return Size     : 1 byte

    Contents        : 해당 Request ID 를 이제 client 측에서 더 이상 사용하지 않을 것이기
                      때문에 서버에게 지워도 이제 괜찮다는 신호를 전달한다.  이 신호를
                      받을 경우, 서버 측에서는 해당 request id 에 대한 모든 자료들을 
                      정리한다.

    Example         : REQEND
    Network         : -> 0x02 <Ticket ID 20bytes>
                      <- <OK>
*/
#define COMMAND_REQEND          0x02

/**
  OPCODE - Opcode 를 실행한다.

    Inst Number     : 3 (0x3)
    Inst Size       : 가변 크기
    Inst Format     : 0x03 <TicketID 20bytes> <명령어들_크기_:_4_바이트> <명령어들>
    Return          : RETURN 
                      | ERROR
    Return Size     : RETURN type 에 따라 가변 길이

    Contents        : 이용 가능한 Ticket ID 를 사용하여, 명령어를 전달한다.  명령어의 길이는
                      4 바이트 unsigned int 크기만큼 사용할 수 있다.

    Example         : OPCODE    <명령어>    <명령어 인자>
                      OPCODE    new         weongyo
                      OPCODE    pushint     1
    Network         : -> 0x03 <TicketID 20bytes> 0x00000008 0x51 weongyo
                      <- <RETURN> <1 바이트 return type> <return type 에 따른 가변길이>
 */
#define COMMAND_OPCODE          0x03
/**
  TICKET - 유효한 Ticket 이 전달하는 명령어
    Inst Number     : 4 (0x4)
    Inst Size       : 1 바이트 + Ticket ID (20 바이트)
    Inst Format     : 0x04 <Ticket ID 20bytes>
    Return          : 없음
    Return Size     : 없음

    Contents        : 클라이언트로부터 Request 가 왔을 경우, valid ticket 이 발행 가능할 
                      경우에 이 명령어를 이용하여 반환하여 준다.

    Example         : TICKET <Valid_Ticket_ID>
    Network         : <- 0x04 <Valid_Ticket_20bytes>
*/
#define COMMAND_TICKET          0x04

/**
  OK - 메세지가 전달되었음을 전달

    Inst Number     : 5 (0x5)
    Inst Size       : 1 바이트
    Inst Format     : 0x04
    Return          : 없음
    Return Size     : 없음

    Contents        : 어떤 예약 명령어에 대해서 return 값이 존재할 필요가 없을 경우에는
                      최소한의 잘 받았다는 메세지로 이 NOP 역활을 하는 메세지를 보내준다.
                      그럼 client 혹은 server 에서는 자신의 메세지가 잘 전달되었다는 것을
                      확인할 수 있기 때문이다.

    Example         : OK
    Network         : <- 0x05
*/
#define COMMAND_OK              0x05

/**
  ERROR - 오류 메세지를 전달하는 명령어

    Inst Number     : 6 (0x6)
    Inst Size       : 1 바이트 + 2 바이트 오류 메세지 길이 + [ 1 바이트 오류 level + 2 바이트 문자열 길이 + 문자열 ]
    Inst Format     : 0x06 <1byte_error_type> <2bytes_string_length> <string>
    Return          : 없음
    Return Size     : 없음

    Contents        : 만약 실행되는 중간에 오류가 발생하였을 경우, 이 명령어에 자세한 오류 내용을
                      담아 보내게 됩니다.

                      `오류 타입' 이란?
                      단순하게 말해서 오류의 심각도를 말하는 것이다.  INFO, ERROR, CRIT 등등이 존재할 수
                      있음을 말한다.  현재 오류 타입의 level 은 아래와 같이 정의되어 있습니다.

                      ERRLOG_EMERG		0	# system is unusable
                      ERRLOG_ALERT		1	# action must be taken immediately
                      ERRLOG_CRIT		2	# critical conditions
                      ERRLOG_ERR		3	# error conditions
                      ERRLOG_WARNING		4	# warning conditions
                      ERRLOG_NOTICE		5	# normal but significant condition
                      ERRLOG_INFO		6	# informational
                      ERRLOG_DEBUG		7	# debug-level messages

    Exmaple         : ERROR <2 바이트 오류 메세지 길이> [<1바이트_오류_타입> <2바이트_문자열_길이> <문자열>]
    Network         : <- 0x06 0x0013 0x01 0x0010 "Can't find class"
 */
#define COMMAND_ERROR           0x06

/**
  RETURN - Opcode 의 실행에 따른 반환값을 전달하는 명령어

    Inst Number     : 7 (0x7)
    Inst Size       : 1 바이트 + 1 바이트 type + [ type 에 따라 가변 길이 ]
    Return          : 없음
    Return Size     : 없음

    Contents        : 명령어 OPCODE 가 보내졌을 때, 반환될 수 있는 종류이다.  현재 return type 으로는
                      아래와 같은 정이 정해져 있으며, 추후 계속 추가될 수 있다.  단, 메모리 타입은
                      상대방의 주소가 보이지 않는다.

                          이름                    Type 번호       Type 크기
                        ------------------------+---------------+---------------
                          VOID                    0 (0x0)         0 바이트
                          CHAR                    1 (0x1)         1 바이트
                          UNSIGNED CHAR           2 (0x2)         1 바이트

    Example         : RETURN <1 바이트 type> <type 에 따른 바이트>
    Network         : <- 0x07 0x01 0x00000001
*/
#define COMMAND_RETURN          0x07

/**
  GETSTACK - Ticket ID 의 현재 stack 상태를 받아옵니다.

    Inst Number     : 8 (0x8)
    Inst Size       : 1 바이트 + 20 바이트 TICKET ID
    Return          : ERROR
    Return          : Command ERROR 의 경우 가변 길이이다.

    Contents        : TICKET ID 의 현재 스택 상태를 받아와 출력한다.  이것의 리턴값은 Command ERROR 로써
                      ERROR 의 오류 타입은 ERRLOG_DEBUG 로 설정되어 있다.

                      !!노트!! 이 명령어는 Debugging 용으로써 기본적인 설치시 disable 되어 있을 것이다.

    Example         : GETSTACK <20 바이트 TICKET ID>
    Network         : -> 0x08 <20 바이트 TICKET ID>
                      <- 0x06 0x01 0x0010 "Can't find class"
*/
#define COMMAND_GETSTACK        0x08
