CXM_generic_protocol.anubis 1.67 KB
/*
 * 
 * User: David RENE
 * Date: 25/04/2007
 * Time: 16:20
 * (c) Calexium
 *
 */

read system/muscle.anubis
read system/data_io.anubis
read tools/basis.anubis

read calexium_lib/CXM_message_constants.anubis

public define Int32 _CXM_ERROR      = 0.
public define Int32 _CXM_OK         = 1.
public define Int32 _CXM_UNKNOW_CMD = 2.

public define One
  send_ACK_error
  (
    RWStream  conn,
    Int32     cmd_id
  )=
  with err_msg = message(_CXM_ACK),
  forget(add_int32(err_msg, "CMD", cmd_id));
  forget(add_int32(err_msg, "STATUS", _CXM_ERROR));
  forget(send_message_by_Stream(conn, err_msg))
  .
  
public define One
  send_ACK_ok
  (
    RWStream  conn,
    Int32     cmd_id
  )=
  with ok_msg = message(_CXM_ACK),
  forget(add_int32(ok_msg, "CMD", cmd_id));
  forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  forget(send_message_by_Stream(conn, ok_msg))
  .

public define One
  send_ACK_ok
  (
    RWStream  conn,
    Int32     cmd_id,
    Message   result
  )=
  with ok_msg = message(_CXM_ACK),
  forget(add_int32(ok_msg, "CMD", cmd_id));
  forget(add_int32(ok_msg, "STATUS", _CXM_OK));
  forget(add_message(ok_msg, "RESULT", result));
  forget(send_message_by_Stream(conn, ok_msg))
  .
  
public define One
  send_result
  (
    RWStream        conn,
    Int32           cmd_id,
    Maybe(Message)  mb_msg
  )=
  if mb_msg is
  {
    failure       then send_ACK_error(conn, cmd_id),
    success(msg)  then send_ACK_ok(conn, cmd_id, msg)
  }
  .
  
public define Maybe(Message)
  wait_for_reply
  (
    RWStream conn
  ) =
  if unflatten_message(make_data_io(weaken(conn))) is
  {
    failure       then 
      sleep(1);
      wait_for_reply(conn),
    success(msg)  then   success(msg)
  }.