/******************************************************************************
* Copyright (c) 2016  Ericsson AB
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*  Mate Kovacs - initial implementation and initial documentation
*  Antal Wu-Hen Chang
*  Naum Spaseski
******************************************************************************/
//
//  File:               CoAP_Types.ttcn
//  Rev:                R1A
//  Prodnr:             CNL 113 829

module CoAP_Types
{
  external function f_CoAP_enc(in CoAP_Message msg, out octetstring str) return integer;
  external function f_CoAP_dec(in octetstring str, out CoAP_Message msg) return integer;

  const Code EMPTY_MESSAGE:={ 0, 0 };
  
  const Code METHOD_GET:={ 0, 1 };
  const Code METHOD_POST:={ 0, 2 };
  const Code METHOD_PUT:={ 0, 3 };
  const Code METHOD_DELETE:={ 0, 4 };

  const Code RESPONSE_CODE_Created:={ 2, 1 };
  const Code RESPONSE_CODE_Deleted:={ 2, 2 };
  const Code RESPONSE_CODE_Valid:={ 2, 3 };
  const Code RESPONSE_CODE_Changed:={ 2, 4 };
  const Code RESPONSE_CODE_Content:={ 2, 5 };
  
  const Code RESPONSE_CODE_BadRequest:={ 4, 0 };
  const Code RESPONSE_CODE_Unauthorized:={ 4, 1 };
  const Code RESPONSE_CODE_BadOption:={ 4, 2 };
  const Code RESPONSE_CODE_Forbidden:={ 4, 3 };
  const Code RESPONSE_CODE_NotFound:={ 4, 4 };
  const Code RESPONSE_CODE_MethodNotAllowed:={ 4, 5 };
  const Code RESPONSE_CODE_NotAcceptable:={ 4, 6 };
  const Code RESPONSE_CODE_PreconditionFailed:={ 4, 12 };
  const Code RESPONSE_CODE_RequestEntityTooLarge:={ 4, 13 };
  const Code RESPONSE_CODE_UnsupportedContentFormat:={ 4, 15 };
  
  const Code RESPONSE_CODE_InternalServerError:={ 5, 0 };
  const Code RESPONSE_CODE_NotImplemented:={ 5, 1 };
  const Code RESPONSE_CODE_BadGateway:={ 5, 2 };
  const Code RESPONSE_CODE_ServiceUnavailable:={ 5, 3 };
  const Code RESPONSE_CODE_GatewayTimeout:={ 5, 4 };
  const Code RESPONSE_CODE_ProxyingNotSupported:={ 5, 5 };

  type octetstring OCT0 length (0);
  type octetstring OCT0_8   length(0..8);
  type octetstring OCT1_8   length(1..8);
  
  type universal charstring UCHAR0_255   length(0..255);
  type universal charstring UCHAR1_255   length(1..255);
  type universal charstring UCHAR1_1034   length(1..1034);

  type enumerated Type
  {
    CONFIRMABLE(0),
    NON_CONFIRMABLE(1),
    ACKNOWLEDGEMENT(2),
    RESET(3)
  }
  
  type record Code
  {
    integer               class (0..7),
    integer               detail (0..31)
  }
  
  type record Header
  {
    integer               version (0..3),
    Type                  msg_type,
    Code                  code,
    integer               message_id
  }
  
  type record UnknownOption
  {
    integer option_code,
    octetstring option_value
  }
  
  type record BlockOption
  {
    integer num (0..1048575),
    boolean m,
    integer szx (0..7)
  }

  type union CoAP_Options
  {
    OCT0_8                if_match,
    UCHAR1_255            uri_host,
    OCT1_8                etag,
    OCT0                  if_none_match,
    integer				  observe,
    integer               uri_port,
    UCHAR0_255            location_path,
    UCHAR0_255            uri_path,
    integer               content_format,
    integer               max_age,
    UCHAR0_255            uri_query,
    integer               accept,
    UCHAR0_255            location_query,
    BlockOption			  block1,
    BlockOption			  block2,
    UCHAR1_1034           proxy_uri,
    UCHAR1_255            proxy_scheme,
    integer               size1,
    UnknownOption         unknown_option
  }

  // FIXME: EANTWUH: Option order is not strict: record -> set
  type set of CoAP_Options CoAP_OptionsList;

  type record CoAP_ReqResp
  {
    Header                header,
    OCT0_8                token,
    CoAP_OptionsList      options optional,
    octetstring           payload length(1..infinity) optional
  }

  type union CoAP_Message
  {
    CoAP_ReqResp          msg,
    octetstring           raw_message
  }

}
