bool CConfigFile::Load(char const *f_name, bool isEncrypted)
{
    uint32_t size;
    char *data;
    FILE *s_file;
    s_file = fopen(f_name, "rb");

    if(!s_file)
        return false;

    fseek(s_file, 0, SEEK_END);
    size = ftell(s_file);
    fseek(s_file, 0, SEEK_SET);
    data = (char *)malloc(size);
    fread(data, 1, size, s_file);
    fclose(s_file);

    if(isEncrypted)
        DecryptMem(data, size);

    this->Load(data, size);

    if(data)
        delete data;

    return true;
}
bool CConfigFile::Load(const char* filename, bool bCrypt)
{
    FILE* fp = fopen(filename, "rb");
    if (!fp)
    {
        LOG_INFO("File Open Error");
        return false;
    }

    fseek(fp, 0, SEEK_END);
    int size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    char* buf = new char[size];
    fread(buf, 1, size, fp);
    fclose(fp);
    if (bCrypt)
        DecryptMem(buf, size);
    Load(buf, size);
    delete [] buf;
    buf = NULL;

    return true;
}
bool CConfigFile::Add(const char* group, const char* name, const char* value)
{
    if(group == NULL || name == NULL || value == NULL) return false;

    char buf[1024];
    if (strncmp(value, CRYPTHEADER, LEN_CRYPTHEADER) == 0)
    {
        value += LEN_CRYPTHEADER;
        int len = strlen(value) / 2;
        char* p = buf;
        while (*value)
        {
            unsigned char v = 0;
            switch (*value)
            {
            case '0':
                v += 0;
                break;
            case '1':
                v += 1;
                break;
            case '2':
                v += 2;
                break;
            case '3':
                v += 3;
                break;
            case '4':
                v += 4;
                break;
            case '5':
                v += 5;
                break;
            case '6':
                v += 6;
                break;
            case '7':
                v += 7;
                break;
            case '8':
                v += 8;
                break;
            case '9':
                v += 9;
                break;
            case 'A':
                v += 10;
                break;
            case 'B':
                v += 11;
                break;
            case 'C':
                v += 12;
                break;
            case 'D':
                v += 13;
                break;
            case 'E':
                v += 14;
                break;
            case 'F':
                v += 15;
                break;
            }
            value++;
            v <<= 4;
            switch (*value)
            {
            case '0':
                v += 0;
                break;
            case '1':
                v += 1;
                break;
            case '2':
                v += 2;
                break;
            case '3':
                v += 3;
                break;
            case '4':
                v += 4;
                break;
            case '5':
                v += 5;
                break;
            case '6':
                v += 6;
                break;
            case '7':
                v += 7;
                break;
            case '8':
                v += 8;
                break;
            case '9':
                v += 9;
                break;
            case 'A':
                v += 10;
                break;
            case 'B':
                v += 11;
                break;
            case 'C':
                v += 12;
                break;
            case 'D':
                v += 13;
                break;
            case 'E':
                v += 14;
                break;
            case 'F':
                v += 15;
                break;
            }
            value++;

            *p = (char)v;
            p++;
        }
        DecryptMem(buf, len);
        value = buf;
    }
    const char* ret = Find(group, name);
    if (ret[0])
    {
        strcpy((char*)ret, value);
        return true;
    }

    if (m_cnt == MAX_CONFIG_DATA)
        return false;

    m_data[m_cnt] = new CConfigFileData;
    m_data[m_cnt]->Set(group, name, value);
    m_cnt++;

    Sort();

    return true;
}