// File: fieryzig[P]GameServer/GateServer/GateServer.cpp
// Function: fieryzig::GateServer::SetConfig(char const*)
RS GateServer::SetConfig(const char* configFile)
{

    string json = GetStringFromFile(configFile);
    if (json == "") {
        cout << configFile << " doesn't exist!" << endl;
        return RS::FAILED;
    }
    using rapidjson::Document;

    Document d;
    d.Parse(json.c_str());

    string type; ServerType st;
    int port = -1;
    string ip; 

    using rapidjson::Value;

    Value& v = d["ServerType"];
    if (v.IsString()) {
        type = v.GetString();                
        if ( type == "CLIENT" ) {
            st = ServerType::CLIENT;
        }
        else if ( type == "GATEWAY" ) {
            st = ServerType::GATEWAY;
        }
        else if ( type == "LOGIC" ) {
            st = ServerType::LOGIC;
        }
        else {
            cout << "Wrong Server Type!" << endl;
            return RS::FAILED;
        }
    }
    v = d["IP"];
    if (v.IsString()) {
        ip = v.GetString();
        /*
        if ( [ip](){ 
                //TODO: Check ip fomat
                return true;
            } == false) {
            cout << "Wrong IP Format!" << endl;
        }
        */
    }
    else {
        cout << "Wrong IP Format!" << endl;
    }

    v = d["PORT"];
    if (v.IsInt()) {
        port = v.GetInt();
    }
//            }
    else {
        cout << "Wrong port !" << endl;
    }

    v = d["LOGIC"];
    if (v.IsArray()) {
        for (int i = 0; i < v.Size(); i++) {
            Value& content = v[i];
            if (content.HasMember("IP") && content["IP"].IsString()) {
                //TODO: Check ip format
                string ip = content["IP"].GetString();
                int port = content["PORT"].GetInt();
                logic_ip.push_back(make_pair(ip,port));
            }
        }
    }
    else {
        cout << "Wrong LOGIC server format" << endl;

    }

    config = new ServerConfig(st, ip, port);        
    return RS::SUCCESS;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x280, %rsp            # imm = 0x280
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x190(%rbp)
movq -0x18(%rbp), %rsi
leaq -0x38(%rbp), %rdi
movq %rdi, -0x188(%rbp)
callq 0x2610
movq -0x188(%rbp), %rdi
leaq 0xdf94(%rip), %rsi      # 0x10e44
callq 0x3b50
movb %al, -0x17a(%rbp)
jmp 0x2ebd
movb -0x17a(%rbp), %al
testb $0x1, %al
jne 0x2ec9
jmp 0x2f37
movq -0x18(%rbp), %rsi
movq 0x14104(%rip), %rdi     # 0x16fd8
callq 0x2240
movq %rax, -0x198(%rbp)
jmp 0x2ee2
movq -0x198(%rbp), %rdi
leaq 0xb16d(%rip), %rsi      # 0xe05d
callq 0x2240
movq %rax, -0x1a0(%rbp)
jmp 0x2efe
movq -0x1a0(%rbp), %rdi
movq 0x140bc(%rip), %rsi     # 0x16fc8
callq 0x2270
jmp 0x2f13
movl $0x1, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x3642
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x3657
xorl %eax, %eax
movl %eax, %ecx
leaq -0xa8(%rbp), %rdi
movl $0x400, %edx            # imm = 0x400
movq %rcx, %rsi
callq 0x3c00
jmp 0x2f51
leaq -0x38(%rbp), %rdi
callq 0x2110
movq %rax, %rsi
leaq -0xa8(%rbp), %rdi
callq 0x3d00
jmp 0x2f6b
leaq -0xc8(%rbp), %rdi
callq 0x2340
movl $0xffffffff, -0xd0(%rbp) # imm = 0xFFFFFFFF
leaq -0xf0(%rbp), %rdi
callq 0x2340
leaq 0xb0d9(%rip), %rsi      # 0xe06d
leaq -0xa8(%rbp), %rdi
callq 0x3d30
movq %rax, -0x1a8(%rbp)
jmp 0x2fa9
movq -0x1a8(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf8(%rbp), %rdi
callq 0x3db0
movb %al, -0x1a9(%rbp)
jmp 0x2fcb
movb -0x1a9(%rbp), %al
testb $0x1, %al
jne 0x2fda
jmp 0x310c
movq -0xf8(%rbp), %rdi
callq 0x3dd0
movq %rax, -0x1b8(%rbp)
jmp 0x2fef
movq -0x1b8(%rbp), %rsi
leaq -0xc8(%rbp), %rdi
callq 0x2310
jmp 0x3004
leaq 0xb06d(%rip), %rsi      # 0xe078
leaq -0xc8(%rbp), %rdi
callq 0x3b50
movb %al, -0x1b9(%rbp)
jmp 0x301f
movb -0x1b9(%rbp), %al
testb $0x1, %al
jne 0x302b
jmp 0x305c
movl $0x0, -0xcc(%rbp)
jmp 0x310a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x3634
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x361c
leaq 0xb01c(%rip), %rsi      # 0xe07f
leaq -0xc8(%rbp), %rdi
callq 0x3b50
movb %al, -0x1ba(%rbp)
jmp 0x3077
movb -0x1ba(%rbp), %al
testb $0x1, %al
jne 0x3083
jmp 0x308f
movl $0x1, -0xcc(%rbp)
jmp 0x3108
leaq 0xaff1(%rip), %rsi      # 0xe087
leaq -0xc8(%rbp), %rdi
callq 0x3b50
movb %al, -0x1bb(%rbp)
jmp 0x30aa
movb -0x1bb(%rbp), %al
testb $0x1, %al
jne 0x30b6
jmp 0x30c2
movl $0x2, -0xcc(%rbp)
jmp 0x3106
movq 0x13f0f(%rip), %rdi     # 0x16fd8
leaq 0xafbd(%rip), %rsi      # 0xe08d
callq 0x2240
movq %rax, -0x1c8(%rbp)
jmp 0x30de
movq -0x1c8(%rbp), %rdi
movq 0x13edc(%rip), %rsi     # 0x16fc8
callq 0x2270
jmp 0x30f3
movl $0x1, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x35f6
jmp 0x3108
jmp 0x310a
jmp 0x310c
leaq 0xaf8d(%rip), %rsi      # 0xe0a0
leaq -0xa8(%rbp), %rdi
callq 0x3d30
movq %rax, -0x1d0(%rbp)
jmp 0x3128
movq -0x1d0(%rbp), %rsi
movq -0xf8(%rbp), %rdi
callq 0x3e50
movq -0xf8(%rbp), %rdi
callq 0x3db0
movb %al, -0x1d1(%rbp)
jmp 0x314f
movb -0x1d1(%rbp), %al
testb $0x1, %al
jne 0x315b
jmp 0x3187
movq -0xf8(%rbp), %rdi
callq 0x3dd0
movq %rax, -0x1e0(%rbp)
jmp 0x3170
movq -0x1e0(%rbp), %rsi
leaq -0xf0(%rbp), %rdi
callq 0x2310
jmp 0x3185
jmp 0x31ba
movq 0x13e4a(%rip), %rdi     # 0x16fd8
leaq 0xaf0e(%rip), %rsi      # 0xe0a3
callq 0x2240
movq %rax, -0x1e8(%rbp)
jmp 0x31a3
movq -0x1e8(%rbp), %rdi
movq 0x13e17(%rip), %rsi     # 0x16fc8
callq 0x2270
jmp 0x31b8
jmp 0x31ba
leaq 0xaef3(%rip), %rsi      # 0xe0b4
leaq -0xa8(%rbp), %rdi
callq 0x3d30
movq %rax, -0x1f0(%rbp)
jmp 0x31d6
movq -0x1f0(%rbp), %rsi
movq -0xf8(%rbp), %rdi
callq 0x3e50
movq -0xf8(%rbp), %rdi
callq 0x3eb0
movb %al, -0x1f1(%rbp)
jmp 0x31fd
movb -0x1f1(%rbp), %al
testb $0x1, %al
jne 0x3209
jmp 0x322b
movq -0xf8(%rbp), %rdi
callq 0x3ed0
movl %eax, -0x1f8(%rbp)
jmp 0x321d
movl -0x1f8(%rbp), %eax
movl %eax, -0xd0(%rbp)
jmp 0x325e
movq 0x13da6(%rip), %rdi     # 0x16fd8
leaq 0xae80(%rip), %rsi      # 0xe0b9
callq 0x2240
movq %rax, -0x200(%rbp)
jmp 0x3247
movq -0x200(%rbp), %rdi
movq 0x13d73(%rip), %rsi     # 0x16fc8
callq 0x2270
jmp 0x325c
jmp 0x325e
leaq 0xae22(%rip), %rsi      # 0xe087
leaq -0xa8(%rbp), %rdi
callq 0x3d30
movq %rax, -0x208(%rbp)
jmp 0x327a
movq -0x208(%rbp), %rsi
movq -0xf8(%rbp), %rdi
callq 0x3e50
movq -0xf8(%rbp), %rdi
callq 0x3f20
movb %al, -0x209(%rbp)
jmp 0x32a1
movb -0x209(%rbp), %al
testb $0x1, %al
jne 0x32b0
jmp 0x34f3
movl $0x0, -0xfc(%rbp)
movl -0xfc(%rbp), %eax
movl %eax, -0x214(%rbp)
movq -0xf8(%rbp), %rdi
callq 0x3f40
movl %eax, -0x210(%rbp)
jmp 0x32da
movl -0x214(%rbp), %eax
movl -0x210(%rbp), %ecx
cmpl %ecx, %eax
jae 0x34f1
movq -0xf8(%rbp), %rdi
movl -0xfc(%rbp), %esi
callq 0x3f90
movq %rax, -0x220(%rbp)
jmp 0x3309
movq -0x220(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rdi
leaq 0xad7b(%rip), %rsi      # 0xe0a0
callq 0x4020
movb %al, -0x221(%rbp)
jmp 0x3332
movb -0x221(%rbp), %al
testb $0x1, %al
jne 0x3341
jmp 0x34db
movq -0x108(%rbp), %rdi
leaq 0xad51(%rip), %rsi      # 0xe0a0
callq 0x3d30
movq %rax, -0x230(%rbp)
jmp 0x335d
movq -0x230(%rbp), %rdi
callq 0x3db0
movb %al, -0x231(%rbp)
jmp 0x3371
movb -0x231(%rbp), %al
testb $0x1, %al
jne 0x3380
jmp 0x34db
movq -0x108(%rbp), %rdi
leaq 0xad12(%rip), %rsi      # 0xe0a0
callq 0x3d30
movq %rax, -0x240(%rbp)
jmp 0x339c
movq -0x240(%rbp), %rdi
callq 0x3dd0
movq %rax, -0x248(%rbp)
jmp 0x33b1
leaq -0x129(%rbp), %rdi
movq %rdi, -0x250(%rbp)
callq 0x23e0
movq -0x248(%rbp), %rsi
movq -0x250(%rbp), %rdx
leaq -0x128(%rbp), %rdi
callq 0x2320
jmp 0x33e0
leaq -0x129(%rbp), %rdi
callq 0x2290
movq -0x108(%rbp), %rdi
leaq 0xacba(%rip), %rsi      # 0xe0b4
callq 0x3d30
movq %rax, -0x258(%rbp)
jmp 0x3408
movq -0x258(%rbp), %rdi
callq 0x3ed0
movl %eax, -0x25c(%rbp)
jmp 0x341c
movq -0x190(%rbp), %rax
movl -0x25c(%rbp), %ecx
movl %ecx, -0x130(%rbp)
addq $0x180, %rax            # imm = 0x180
movq %rax, -0x268(%rbp)
leaq -0x158(%rbp), %rdi
leaq -0x128(%rbp), %rsi
leaq -0x130(%rbp), %rdx
callq 0x40a0
jmp 0x3458
movq -0x268(%rbp), %rdi
leaq -0x158(%rbp), %rsi
callq 0x4070
jmp 0x346d
leaq -0x158(%rbp), %rdi
callq 0x40e0
leaq -0x128(%rbp), %rdi
callq 0x21a0
jmp 0x34db
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x129(%rbp), %rdi
callq 0x2290
jmp 0x361c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x34ca
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x158(%rbp), %rdi
callq 0x40e0
leaq -0x128(%rbp), %rdi
callq 0x21a0
jmp 0x361c
jmp 0x34dd
movl -0xfc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xfc(%rbp)
jmp 0x32ba
jmp 0x3526
movq 0x13ade(%rip), %rdi     # 0x16fd8
leaq 0xabc5(%rip), %rsi      # 0xe0c6
callq 0x2240
movq %rax, -0x270(%rbp)
jmp 0x350f
movq -0x270(%rbp), %rdi
movq 0x13aab(%rip), %rsi     # 0x16fc8
callq 0x2270
jmp 0x3524
jmp 0x3526
movl $0x30, %edi
callq 0x2250
movq %rax, -0x278(%rbp)
jmp 0x3539
movb $0x1, -0x179(%rbp)
movl -0xcc(%rbp), %eax
movl %eax, -0x27c(%rbp)
leaq -0x178(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0x2120
jmp 0x3561
movl -0x27c(%rbp), %esi
movq -0x278(%rbp), %rdi
movl -0xd0(%rbp), %ecx
leaq -0x178(%rbp), %rdx
callq 0x4100
jmp 0x3582
movq -0x190(%rbp), %rax
movq -0x278(%rbp), %rcx
movb $0x0, -0x179(%rbp)
movq %rcx, 0x8(%rax)
leaq -0x178(%rbp), %rdi
callq 0x21a0
movl $0x0, -0x4(%rbp)
movl $0x1, -0x48(%rbp)
jmp 0x35f6
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x35dd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x178(%rbp), %rdi
callq 0x21a0
testb $0x1, -0x179(%rbp)
jne 0x35e8
jmp 0x35f4
movq -0x278(%rbp), %rdi
callq 0x2230
jmp 0x361c
leaq -0xf0(%rbp), %rdi
callq 0x21a0
leaq -0xc8(%rbp), %rdi
callq 0x21a0
leaq -0xa8(%rbp), %rdi
callq 0x4150
jmp 0x3642
leaq -0xf0(%rbp), %rdi
callq 0x21a0
leaq -0xc8(%rbp), %rdi
callq 0x21a0
leaq -0xa8(%rbp), %rdi
callq 0x4150
jmp 0x3657
leaq -0x38(%rbp), %rdi
callq 0x21a0
movl -0x4(%rbp), %eax
addq $0x280, %rsp            # imm = 0x280
popq %rbp
retq
leaq -0x38(%rbp), %rdi
callq 0x21a0
movq -0x40(%rbp), %rdi
callq 0x23d0
nopl (%rax)