// File: Unreality3D[P]Unreality3D/indie-studio/source/Network/protocol/Deserializer.cpp
// Function: IndieProtocol::Deserializer::operator()(IndieProtocol::Serialized const&)
size_t	Deserializer::operator() (Serialized const &to_handle)
  {
    Serialized	tmp;

    if (!to_handle.size || !to_handle.data)
      return 0;

    std::cout << "old buffer : " << std::endl;
    std::cout << _buffer << std::endl;

    _buffer += to_handle;

    std::cout << "new buffer : " << std::endl;
    std::cout << _buffer << std::endl;

    if (!_isReading)
      {
	if (to_handle.size >= sizeof(Header))
	  {
	    // get the header data
	    _isReading = true;
	    memcpy(&_header, to_handle.data, sizeof(Header));
	  }
	else
	  return 0;
      }
    tmp = _buffer + sizeof(Header);

    // can read the whole packet
    if (tmp.size + sizeof(Header) >= _header.size)
      {
	size_t to_return = _header.size;
	switch (_header.messageType)
	  {
	  case PacketType::CONNECT:
	    deserializeConnect(tmp);
	    break;
	  case PacketType::LIST:
	    deserializeList(tmp);
	    break;
	  case PacketType::MESSAGE:
	    deserializeMessage(tmp);
	    break;
	  default: // error or not implemented
	    break;
	  }
	reset();
	return to_return;
      }
    return 0;
  }

// Assembly:
subq $0x88, %rsp
movq %rdi, 0x78(%rsp)
movq %rsi, 0x70(%rsp)
movq 0x78(%rsp), %rax
movq %rax, 0x28(%rsp)
leaq 0x60(%rsp), %rdi
xorl %esi, %esi
xorl %eax, %eax
movl %eax, %edx
callq 0x2a480
movq 0x70(%rsp), %rax
cmpl $0x0, (%rax)
je 0x3cbc1
movq 0x70(%rsp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x3cbda
movq $0x0, 0x80(%rsp)
movl $0x1, 0x5c(%rsp)
jmp 0x3ce1a
movq 0x163cf(%rip), %rdi     # 0x52fb0
leaq 0x98f3(%rip), %rsi      # 0x464db
callq 0x2a030
movq %rax, 0x20(%rsp)
jmp 0x3cbf4
movq 0x20(%rsp), %rdi
movq 0x16360(%rip), %rsi     # 0x52f60
callq 0x2a150
jmp 0x3cc07
movq 0x28(%rsp), %rsi
addq $0x8, %rsi
movq 0x16399(%rip), %rdi     # 0x52fb0
callq 0x29840
movq %rax, 0x18(%rsp)
jmp 0x3cc23
movq 0x18(%rsp), %rdi
movq 0x16331(%rip), %rsi     # 0x52f60
callq 0x2a150
jmp 0x3cc36
movq 0x28(%rsp), %rdi
movq 0x70(%rsp), %rsi
addq $0x8, %rdi
callq 0x297b0
jmp 0x3cc4b
movq 0x1635e(%rip), %rdi     # 0x52fb0
leaq 0x9890(%rip), %rsi      # 0x464e9
callq 0x2a030
movq %rax, 0x10(%rsp)
jmp 0x3cc65
movq 0x10(%rsp), %rdi
movq 0x162ef(%rip), %rsi     # 0x52f60
callq 0x2a150
jmp 0x3cc78
movq 0x28(%rsp), %rsi
addq $0x8, %rsi
movq 0x16328(%rip), %rdi     # 0x52fb0
callq 0x29840
movq %rax, 0x8(%rsp)
jmp 0x3cc94
movq 0x8(%rsp), %rdi
movq 0x162c0(%rip), %rsi     # 0x52f60
callq 0x2a150
jmp 0x3cca7
movq 0x28(%rsp), %rax
testb $0x1, 0x18(%rax)
jne 0x3cd0d
movq 0x70(%rsp), %rax
movl (%rax), %eax
cmpq $0x6, %rax
jb 0x3ccf2
movq 0x28(%rsp), %rax
movb $0x1, 0x18(%rax)
movq 0x70(%rsp), %rcx
movq 0x8(%rcx), %rcx
movl (%rcx), %edx
movl %edx, (%rax)
movw 0x4(%rcx), %cx
movw %cx, 0x4(%rax)
jmp 0x3cd0b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x50(%rsp)
movl %eax, 0x4c(%rsp)
jmp 0x3ce34
movq $0x0, 0x80(%rsp)
movl $0x1, 0x5c(%rsp)
jmp 0x3ce1a
jmp 0x3cd0d
movq 0x28(%rsp), %rsi
addq $0x8, %rsi
leaq 0x38(%rsp), %rdi
movl $0x6, %edx
callq 0x2aaf0
jmp 0x3cd27
leaq 0x60(%rsp), %rdi
leaq 0x38(%rsp), %rsi
callq 0x289e0
jmp 0x3cd38
leaq 0x38(%rsp), %rdi
callq 0x295d0
movq 0x28(%rsp), %rcx
movl 0x60(%rsp), %eax
addq $0x6, %rax
movl (%rcx), %ecx
cmpq %rcx, %rax
jb 0x3ce06
movq 0x28(%rsp), %rax
movl (%rax), %ecx
movq %rcx, 0x30(%rsp)
movzwl 0x4(%rax), %eax
movl %eax, 0x4(%rsp)
subl $0x1, %eax
je 0x3cda8
jmp 0x3cd75
movl 0x4(%rsp), %eax
subl $0x2, %eax
je 0x3cdbb
jmp 0x3cd80
movl 0x4(%rsp), %eax
subl $0x3, %eax
je 0x3cdce
jmp 0x3cde1
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x50(%rsp)
movl %eax, 0x4c(%rsp)
leaq 0x38(%rsp), %rdi
callq 0x295d0
jmp 0x3ce34
movq 0x28(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x2ac10
jmp 0x3cdb9
jmp 0x3cde3
movq 0x28(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x2be90
jmp 0x3cdcc
jmp 0x3cde3
movq 0x28(%rsp), %rdi
leaq 0x60(%rsp), %rsi
callq 0x29270
jmp 0x3cddf
jmp 0x3cde3
jmp 0x3cde3
movq 0x28(%rsp), %rdi
callq 0x29070
jmp 0x3cdef
movq 0x30(%rsp), %rax
movq %rax, 0x80(%rsp)
movl $0x1, 0x5c(%rsp)
jmp 0x3ce1a
movq $0x0, 0x80(%rsp)
movl $0x1, 0x5c(%rsp)
leaq 0x60(%rsp), %rdi
callq 0x295d0
movq 0x80(%rsp), %rax
addq $0x88, %rsp
retq
leaq 0x60(%rsp), %rdi
callq 0x295d0
movq 0x50(%rsp), %rdi
callq 0x2b6f0
nopl (%rax,%rax)