// File: mh0fm4[P]SCDC/src/components/compcoup/compcoup_transport.cc
// Function: scdc_compcoup_transport::on_dataset_cmd(scdc_transport_connection_t*)
void scdc_compcoup_transport::on_dataset_cmd(scdc_transport_connection_t *conn)
{
  SCDC_TRACE("on_dataset_cmd:");

  /* read request: DATASET_CMD <output-info> (STATE <state>|NOSTATE) <cmd> (<input-info> <input-data> )+ */

  bool output_next = false;
  scdc_dataset_transport::read_output_info(conn, 0, output_next);

  scdc_dataset_output_t output = *transport->acquire_outgoing_dataset_output(conn);

  string s;
  scdc_dataset_transport::read_delim(conn, &s, default_delim);

  /* send answer: DATASET_CMD (<output-info> <output-data> )+(OK|FAILED) (STATE <state>|<NOSTATE) RESULT <string> (<output-info> <output-data> )+ */

  scdc_dataset_transport::write_delim(conn, "DATASET_CMD", -1, default_delim);

  bool stateless = true;
  scdc_dataset *dataset = 0;

  scdc_result result;

  if (s == "STATE")
  {
    stateless = false;

    scdc_dataset_transport::read_state_begin(conn);
    dataset = dataprovs->dataset_open_read_state(conn->get_incoming(), result);
    scdc_dataset_transport::read_state_end(conn);

  } else
  {
    SCDC_ASSERT(s == "NOSTATE");
  }

  /* read cmd */
  scdc_dataset_transport::read_string(conn, &s);

  /* prepare input */
  scdc_dataset_input_t input = *transport->acquire_incoming_dataset_input(conn);

  input.next = 0;
  input.data = 0;

  bool input_next;
  dataset_input_incoming_consume(conn, &input, &input_next);

  if (input_next)
  {
    input.next = read_input_next;
    input.data = conn;

  } else
  {
    if (conn->current_incoming_input_intern)
    {
      input.next = read_input_next;
      input.data = conn;

      conn->current_incoming_input_intern = false;

    } else
    {
      input.next = 0;
      input.data = 0;
    }
  }

  /* prepare output */
  if (output_next)
  {
    output.next = write_output_next;
    output.data = conn;

  } else
  {
    output.next = 0;
    output.data = 0;
  }

  bool ret = false;

  if (stateless)
  {
    ret = scdc_compcoup::dataset_cmd(s, &input, &output, result);

  } else if (dataset)
  {
    ret = dataset->do_cmd(s, &input, &output, result);

  } else
  {
    /* error: not stateless but also no dataset handle available */
    SCDC_ERROR("no dataset available");
  }

  if (input.next == read_input_next)
  {
    /* consume remaining input */
    input.next = read_input_next_dummy;
    input.data = 0;

    dataset_input_incoming_consume(conn, &input, &input_next);
    SCDC_ASSERT(!input_next);
  }

  transport->release_incoming_dataset_input(conn);

  /* finalize immediate output */
  dataset_output_outgoing_produce(conn, 0);

  if (output.next == write_output_next)
  {
    output.next = 0;
    output.data = 0;
  }

  if (ret)
  {
    scdc_dataset_transport::write_delim(conn, "OK", -1, default_delim);

  } else
  {
    SCDC_FAIL("on_dataset_cmd: dataset_cmd failed");
    scdc_dataset_transport::write_delim(conn, "FAILED", -1, default_delim);
  }

  if (stateless)
  {
    scdc_dataset_transport::write_delim(conn, "NOSTATE", -1, default_delim);

  } else if (dataset)
  {
    scdc_dataset_transport::write_delim(conn, "STATE", -1, default_delim);
    scdc_dataset_transport::write_state_begin(conn);
    dataprovs->dataset_close_write_state(dataset, conn->get_outgoing(), result);
    scdc_dataset_transport::write_state_end(conn);
  }

  scdc_dataset_transport::write_delim(conn, "RESULT", -1, default_delim);
  scdc_dataset_transport::write_string(conn, result.c_str(), result.size());

  dataset_output_outgoing_produce(conn, &output);

  transport->release_outgoing_dataset_output(conn);

  transport->send_outgoing(conn);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x280, %rsp            # imm = 0x280
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x130(%rbp)
jmp 0xa1320
movb $0x0, -0x11(%rbp)
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movq %rsi, -0x138(%rbp)
leaq -0x11(%rbp), %rdx
callq 0xa36d0
movq -0x130(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
movq 0x98(%rax), %rax
callq *%rax
movq 0x50(%rax), %rcx
movq %rcx, -0x20(%rbp)
movups 0x40(%rax), %xmm0
movaps %xmm0, -0x30(%rbp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups 0x20(%rax), %xmm2
movups 0x30(%rax), %xmm3
movaps %xmm3, -0x40(%rbp)
movaps %xmm2, -0x50(%rbp)
movaps %xmm1, -0x60(%rbp)
movaps %xmm0, -0x70(%rbp)
leaq -0x90(%rbp), %rdi
movq %rdi, -0x140(%rbp)
callq 0xc960
movq -0x140(%rbp), %rsi
movq -0x138(%rbp), %rcx
movq -0x10(%rbp), %rdi
movl $0x20, %edx
callq 0xa2e00
jmp 0xa13b7
movq -0x10(%rbp), %rdi
leaq 0x8bdb(%rip), %rsi      # 0xa9f9d
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa13d5
movb $0x1, -0x9d(%rbp)
movq $0x0, -0xa8(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0xc960
leaq 0x8adb(%rip), %rsi      # 0xa9ed5
leaq -0x90(%rbp), %rdi
callq 0x25b80
movb %al, -0x141(%rbp)
jmp 0xa140e
movb -0x141(%rbp), %al
testb $0x1, %al
jne 0xa141d
jmp 0xa14ce
movb $0x0, -0x9d(%rbp)
movq -0x10(%rbp), %rdi
callq 0xa38d0
jmp 0xa142f
movq -0x130(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x158(%rbp)
movq -0x10(%rbp), %rdi
callq 0xa3650
movq %rax, -0x150(%rbp)
jmp 0xa1453
movq -0x150(%rbp), %rsi
movq -0x158(%rbp), %rdi
leaq -0xc8(%rbp), %rdx
callq 0x2de30
movq %rax, -0x160(%rbp)
jmp 0xa1476
movq -0x160(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x10(%rbp), %rdi
callq 0xa39c0
jmp 0xa148f
jmp 0xa1629
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
jmp 0xa1d6a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x98(%rbp)
movl %eax, -0x9c(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0xc3e0
jmp 0xa1d6a
jmp 0xa14d0
leaq 0x89fc(%rip), %rsi      # 0xa9ed3
leaq -0x90(%rbp), %rdi
callq 0x25b80
movb %al, -0x161(%rbp)
jmp 0xa14eb
movb -0x161(%rbp), %al
testb $0x1, %al
jne 0xa1623
jmp 0xa14fb
jmp 0xa14fd
leaq 0x331a4(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x170(%rbp)
jmp 0xa1515
movq -0x170(%rbp), %rax
cmpq $0x0, %rax
je 0xa161d
leaq 0x3317b(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e900
jmp 0xa1537
leaq 0x3316a(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x178(%rbp)
jmp 0xa154f
movq -0x178(%rbp), %rdi
leaq 0x500c(%rip), %rsi      # 0xa6569
callq 0xc670
movq %rax, -0x180(%rbp)
jmp 0xa156b
movq -0x180(%rbp), %rdi
leaq 0x890c(%rip), %rsi      # 0xa9e85
callq 0xc670
movq %rax, -0x188(%rbp)
jmp 0xa1587
movq -0x188(%rbp), %rdi
leaq 0x4dcf(%rip), %rsi      # 0xa6364
callq 0xc670
movq %rax, -0x190(%rbp)
jmp 0xa15a3
movq -0x190(%rbp), %rdi
movl $0x531, %esi            # imm = 0x531
callq 0xcb80
movq %rax, -0x198(%rbp)
jmp 0xa15bd
movq -0x198(%rbp), %rdi
leaq 0x8910(%rip), %rsi      # 0xa9edb
callq 0xc670
movq %rax, -0x1a0(%rbp)
jmp 0xa15d9
movq -0x1a0(%rbp), %rdi
leaq 0x6925(%rip), %rsi      # 0xa7f0c
callq 0xc670
movq %rax, -0x1a8(%rbp)
jmp 0xa15f5
movq -0x1a8(%rbp), %rdi
movq 0x329bd(%rip), %rsi     # 0xd3fc0
callq 0xc6d0
jmp 0xa160a
leaq 0x33097(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e920
jmp 0xa161b
jmp 0xa161d
jmp 0xa161f
jmp 0xa1621
jmp 0xa1623
jmp 0xa1625
jmp 0xa1627
jmp 0xa1629
movq -0x10(%rbp), %rdi
leaq -0x90(%rbp), %rsi
callq 0xa31d0
jmp 0xa163b
movq -0x130(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
movq 0x88(%rax), %rax
callq *%rax
movq %rax, -0x1b0(%rbp)
jmp 0xa165f
movq -0x1b0(%rbp), %rax
movq 0x50(%rax), %rcx
movq %rcx, -0xd0(%rbp)
movups 0x40(%rax), %xmm0
movaps %xmm0, -0xe0(%rbp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups 0x20(%rax), %xmm2
movups 0x30(%rax), %xmm3
movaps %xmm3, -0xf0(%rbp)
movaps %xmm2, -0x100(%rbp)
movaps %xmm1, -0x110(%rbp)
movaps %xmm0, -0x120(%rbp)
movq $0x0, -0xe8(%rbp)
movq $0x0, -0xe0(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x120(%rbp), %rsi
leaq -0x121(%rbp), %rdx
callq 0xa2820
jmp 0xa16d6
testb $0x1, -0x121(%rbp)
je 0xa16fa
leaq 0x140a(%rip), %rax      # 0xa2af0
movq %rax, -0xe8(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
jmp 0xa1745
movq -0x10(%rbp), %rax
testb $0x1, 0x2d2(%rax)
je 0xa172d
leaq 0x13e2(%rip), %rax      # 0xa2af0
movq %rax, -0xe8(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x10(%rbp), %rax
movb $0x0, 0x2d2(%rax)
jmp 0xa1743
movq $0x0, -0xe8(%rbp)
movq $0x0, -0xe0(%rbp)
jmp 0xa1745
testb $0x1, -0x11(%rbp)
je 0xa1760
leaq 0x145e(%rip), %rax      # 0xa2bb0
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
jmp 0xa1770
movq $0x0, -0x38(%rbp)
movq $0x0, -0x30(%rbp)
movb $0x0, -0x122(%rbp)
testb $0x1, -0x9d(%rbp)
je 0xa17c0
movq -0x130(%rbp), %rdi
leaq -0x90(%rbp), %rsi
leaq -0x120(%rbp), %rdx
leaq -0x70(%rbp), %rcx
leaq -0xc8(%rbp), %r8
callq 0xa44d0
movb %al, -0x1b1(%rbp)
jmp 0xa17ad
movb -0x1b1(%rbp), %al
andb $0x1, %al
movb %al, -0x122(%rbp)
jmp 0xa18e6
cmpq $0x0, -0xa8(%rbp)
je 0xa180e
movq -0xa8(%rbp), %rdi
movq (%rdi), %rax
movq 0x10(%rax), %rax
leaq -0x90(%rbp), %rsi
leaq -0x120(%rbp), %rdx
leaq -0x70(%rbp), %rcx
leaq -0xc8(%rbp), %r8
callq *%rax
movb %al, -0x1b2(%rbp)
jmp 0xa17fb
movb -0x1b2(%rbp), %al
andb $0x1, %al
movb %al, -0x122(%rbp)
jmp 0xa18e4
jmp 0xa1810
leaq 0x32e91(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x1c0(%rbp)
jmp 0xa1828
movq -0x1c0(%rbp), %rax
cmpq $0x0, %rax
je 0xa18de
leaq 0x32e68(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e900
jmp 0xa184a
leaq 0x32e57(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x1c8(%rbp)
jmp 0xa1862
movq -0x1c8(%rbp), %rdi
leaq 0x4c38(%rip), %rsi      # 0xa64a8
callq 0xc670
movq %rax, -0x1d0(%rbp)
jmp 0xa187e
movq -0x1d0(%rbp), %rdi
leaq 0x85bb(%rip), %rsi      # 0xa9e47
callq 0xc670
movq %rax, -0x1d8(%rbp)
jmp 0xa189a
movq -0x1d8(%rbp), %rdi
leaq 0x8b8f(%rip), %rsi      # 0xaa437
callq 0xc670
movq %rax, -0x1e0(%rbp)
jmp 0xa18b6
movq -0x1e0(%rbp), %rdi
movq 0x326fc(%rip), %rsi     # 0xd3fc0
callq 0xc6d0
jmp 0xa18cb
leaq 0x32dd6(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e920
jmp 0xa18dc
jmp 0xa18de
jmp 0xa18e0
jmp 0xa18e2
jmp 0xa18e4
jmp 0xa18e6
leaq 0x1203(%rip), %rax      # 0xa2af0
cmpq %rax, -0xe8(%rbp)
jne 0xa1a69
leaq 0x133f(%rip), %rax      # 0xa2c40
movq %rax, -0xe8(%rbp)
movq $0x0, -0xe0(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x120(%rbp), %rsi
leaq -0x121(%rbp), %rdx
callq 0xa2820
jmp 0xa192c
jmp 0xa192e
testb $0x1, -0x121(%rbp)
je 0xa1a63
jmp 0xa193d
leaq 0x32d64(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x1e8(%rbp)
jmp 0xa1955
movq -0x1e8(%rbp), %rax
cmpq $0x0, %rax
je 0xa1a5d
leaq 0x32d3b(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e900
jmp 0xa1977
leaq 0x32d2a(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e8e0
movq %rax, -0x1f0(%rbp)
jmp 0xa198f
movq -0x1f0(%rbp), %rdi
leaq 0x4bcc(%rip), %rsi      # 0xa6569
callq 0xc670
movq %rax, -0x1f8(%rbp)
jmp 0xa19ab
movq -0x1f8(%rbp), %rdi
leaq 0x84cc(%rip), %rsi      # 0xa9e85
callq 0xc670
movq %rax, -0x200(%rbp)
jmp 0xa19c7
movq -0x200(%rbp), %rdi
leaq 0x498f(%rip), %rsi      # 0xa6364
callq 0xc670
movq %rax, -0x208(%rbp)
jmp 0xa19e3
movq -0x208(%rbp), %rdi
movl $0x578, %esi            # imm = 0x578
callq 0xcb80
movq %rax, -0x210(%rbp)
jmp 0xa19fd
movq -0x210(%rbp), %rdi
leaq 0x8a41(%rip), %rsi      # 0xaa44c
callq 0xc670
movq %rax, -0x218(%rbp)
jmp 0xa1a19
movq -0x218(%rbp), %rdi
leaq 0x64e5(%rip), %rsi      # 0xa7f0c
callq 0xc670
movq %rax, -0x220(%rbp)
jmp 0xa1a35
movq -0x220(%rbp), %rdi
movq 0x3257d(%rip), %rsi     # 0xd3fc0
callq 0xc6d0
jmp 0xa1a4a
leaq 0x32c57(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x2e920
jmp 0xa1a5b
jmp 0xa1a5d
jmp 0xa1a5f
jmp 0xa1a61
jmp 0xa1a63
jmp 0xa1a65
jmp 0xa1a67
jmp 0xa1a69
movq -0x130(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
movq 0x90(%rax), %rax
callq *%rax
jmp 0xa1a86
movq -0x10(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xa29f0
jmp 0xa1a95
leaq 0x1114(%rip), %rax      # 0xa2bb0
cmpq %rax, -0x38(%rbp)
jne 0xa1ab2
movq $0x0, -0x38(%rbp)
movq $0x0, -0x30(%rbp)
testb $0x1, -0x122(%rbp)
je 0xa1ade
movq -0x10(%rbp), %rdi
leaq 0x3a76(%rip), %rsi      # 0xa553c
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa1ad9
jmp 0xa1bd2
jmp 0xa1ae0
leaq 0x32bc1(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x257e0
movq %rax, -0x228(%rbp)
jmp 0xa1af8
movq -0x228(%rbp), %rax
cmpq $0x0, %rax
je 0xa1bae
leaq 0x32b98(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x25800
jmp 0xa1b1a
leaq 0x32b87(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x257e0
movq %rax, -0x230(%rbp)
jmp 0xa1b32
movq -0x230(%rbp), %rdi
leaq 0x4670(%rip), %rsi      # 0xa61b0
callq 0xc670
movq %rax, -0x238(%rbp)
jmp 0xa1b4e
movq -0x238(%rbp), %rdi
leaq 0x82eb(%rip), %rsi      # 0xa9e47
callq 0xc670
movq %rax, -0x240(%rbp)
jmp 0xa1b6a
movq -0x240(%rbp), %rdi
leaq 0x88e3(%rip), %rsi      # 0xaa45b
callq 0xc670
movq %rax, -0x248(%rbp)
jmp 0xa1b86
movq -0x248(%rbp), %rdi
movq 0x3242c(%rip), %rsi     # 0xd3fc0
callq 0xc6d0
jmp 0xa1b9b
leaq 0x32b06(%rip), %rax     # 0xd46a8
movq (%rax), %rdi
callq 0x25820
jmp 0xa1bac
jmp 0xa1bae
jmp 0xa1bb0
jmp 0xa1bb2
movq -0x10(%rbp), %rdi
leaq 0x82fe(%rip), %rsi      # 0xa9ebb
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa1bd0
jmp 0xa1bd2
testb $0x1, -0x9d(%rbp)
je 0xa1bfe
movq -0x10(%rbp), %rdi
leaq 0x82ed(%rip), %rsi      # 0xa9ed3
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa1bf9
jmp 0xa1c99
cmpq $0x0, -0xa8(%rbp)
je 0xa1c97
movq -0x10(%rbp), %rdi
leaq 0x82be(%rip), %rsi      # 0xa9ed5
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa1c2a
movq -0x10(%rbp), %rdi
callq 0xa3700
jmp 0xa1c35
movq -0x130(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x260(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x258(%rbp)
movq -0x10(%rbp), %rdi
callq 0xa3730
movq %rax, -0x250(%rbp)
jmp 0xa1c67
movq -0x250(%rbp), %rdx
movq -0x258(%rbp), %rsi
movq -0x260(%rbp), %rdi
leaq -0xc8(%rbp), %rcx
callq 0x2e120
jmp 0xa1c8a
movq -0x10(%rbp), %rdi
callq 0xa3750
jmp 0xa1c95
jmp 0xa1c97
jmp 0xa1c99
movq -0x10(%rbp), %rdi
leaq 0x8249(%rip), %rsi      # 0xa9eed
movq $-0x1, %rdx
movl $0x20, %ecx
callq 0xa2c90
jmp 0xa1cb7
movq -0x10(%rbp), %rax
movq %rax, -0x270(%rbp)
leaq -0xc8(%rbp), %rdi
movq %rdi, -0x278(%rbp)
callq 0xc260
movq -0x278(%rbp), %rdi
movq %rax, -0x268(%rbp)
callq 0xc460
movq -0x270(%rbp), %rdi
movq -0x268(%rbp), %rsi
movq %rax, %rdx
callq 0xa37d0
jmp 0xa1d00
movq -0x10(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0xa29f0
jmp 0xa1d0f
movq -0x130(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
movq 0xa0(%rax), %rax
callq *%rax
jmp 0xa1d2c
movq -0x130(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rsi
movq (%rdi), %rax
movq 0xd0(%rax), %rax
callq *%rax
jmp 0xa1d49
leaq -0xc8(%rbp), %rdi
callq 0xc3e0
leaq -0x90(%rbp), %rdi
callq 0xc3e0
addq $0x280, %rsp            # imm = 0x280
popq %rbp
retq
leaq -0x90(%rbp), %rdi
callq 0xc3e0
movq -0x98(%rbp), %rdi
callq 0xcba0
nopw %cs:(%rax,%rax)