1b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu/******************************************************************************
2b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
3b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Copyright (C) 2011-2012 Broadcom Corporation
4b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
5b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Licensed under the Apache License, Version 2.0 (the "License");
6b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  you may not use this file except in compliance with the License.
7b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  You may obtain a copy of the License at:
8b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
9b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  http://www.apache.org/licenses/LICENSE-2.0
10b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
11b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  Unless required by applicable law or agreed to in writing, software
12b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  distributed under the License is distributed on an "AS IS" BASIS,
13b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  See the License for the specific language governing permissions and
15b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *  limitations under the License.
16b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu *
17b58ba0e89a3767e6174c42d3e90540d1eae10f81Evan Chu ******************************************************************************/
18e29968cf3e053557a9c2efc5a7a42d0767c51d9dEvan Chu#include "OverrideLog.h"
1945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include "config.h"
2045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <stdio.h>
2145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <string>
2245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <vector>
2345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#include <list>
2445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define LOG_TAG "NfcAdaptation"
2645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
2745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#if GENERIC_TARGET
28ba4c17ee1d31e1b9f396292711f1414d449dd361Evan Chuconst char alternative_config_path[] = "/data/nfc/";
2945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#else
3063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenconst char alternative_config_path[] = "";
3145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#endif
3245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
3363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenconst char transport_config_path[] = "/etc/";
3463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
3563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen#define config_name             "libnfc-brcm.conf"
3663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen#define extra_config_base       "libnfc-brcm-"
3763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen#define extra_config_ext        ".conf"
3845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu#define     IsStringValue       0x80000000
3945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuusing namespace::std;
4145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
4245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuclass CNfcParam : public string
4345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
4445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chupublic:
4545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcParam();
4645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcParam(const char* name, const string& value);
4745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcParam(const char* name, unsigned long value);
4845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    virtual ~CNfcParam();
4945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    unsigned long numValue() const {return m_numValue;}
5045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const char*   str_value() const {return m_str_value.c_str();}
5145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    size_t        str_len() const   {return m_str_value.length();}
5245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuprivate:
5345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    string          m_str_value;
5445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    unsigned long   m_numValue;
5545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu};
5645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
5745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuclass CNfcConfig : public vector<const CNfcParam*>
5845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
5945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chupublic:
6045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    virtual ~CNfcConfig();
6145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    static CNfcConfig& GetInstance();
6263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    friend void readOptionalConfig(const char* optional);
6345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
6445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    bool    getValue(const char* name, char* pValue, size_t len) const;
6545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    bool    getValue(const char* name, unsigned long& rValue) const;
6645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    bool    getValue(const char* name, unsigned short & rValue) const;
6745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const CNfcParam*    find(const char* p_name) const;
6845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    void    clean();
6945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuprivate:
7045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcConfig();
7163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    bool    readConfig(const char* name, bool bResetContent);
7245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    void    moveFromList();
7363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    void    moveToList();
7445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    void    add(const CNfcParam* pParam);
7545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    list<const CNfcParam*> m_list;
7645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    bool    mValidFile;
7745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
7845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    unsigned long   state;
7945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    inline bool Is(unsigned long f) {return (state & f) == f;}
8145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    inline void Set(unsigned long f) {state |= f;}
8245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    inline void Reset(unsigned long f) {state &= ~f;}
8345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu};
8445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
8545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
8645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    isPrintable()
8845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
8945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: detremine if a char is printable
9045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
9245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
9345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
9445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuinline bool isPrintable(char c)
9545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
9645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return  (c >= 'A' && c <= 'Z') ||
9745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            (c >= 'a' && c <= 'z') ||
9845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            (c >= '0' && c <= '9') ||
9945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            c == '/' || c == '_' || c == '-' || c == '.';
10045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
10145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
10245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
10345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
10445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    isDigit()
10545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
10645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: detremine if a char is numeral digit
10745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
10845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
10945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
11045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
11145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuinline bool isDigit(char c, int base)
11245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
11345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ('0' <= c && c <= '9')
11445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return true;
11545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (base == 16)
11645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
11745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (('A' <= c && c <= 'F') ||
11845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            ('a' <= c && c <= 'f') )
11945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return true;
12045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
12145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return false;
12245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
12345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
12445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
12545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
12645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    getDigitValue()
12745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
12845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: return numercal value of a char
12945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
13145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
13245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
13345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuinline int getDigitValue(char c, int base)
13445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
13545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ('0' <= c && c <= '9')
13645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return c - '0';
13745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (base == 16)
13845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
13945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if ('A' <= c && c <= 'F')
14045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return c - 'A' + 10;
14145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else if ('a' <= c && c <= 'f')
14245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return c - 'a' + 10;
14345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
14445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return 0;
14545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
14645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
14745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
14845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
14945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::readConfig()
15045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: read Config settings and parse them into a linked list
15245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**              move the element from linked list to a array at the end
15345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
15545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
15645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
15763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenbool CNfcConfig::readConfig(const char* name, bool bResetContent)
15845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
15945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    enum {
16045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        BEGIN_LINE = 1,
16145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        TOKEN,
16245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        STR_VALUE,
16345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        NUM_VALUE,
16445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        BEGIN_HEX,
16545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        BEGIN_QUOTE,
16645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        END_LINE
16745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    };
16845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
16945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    FILE*   fd;
17045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    string  token;
17145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    string  strValue;
17245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    unsigned long    numValue = 0;
17345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcParam* pParam = NULL;
17445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int     i;
17545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    int     base;
17645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    char    c;
17745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
17845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    state = BEGIN_LINE;
17945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    /* open config file, read it into a buffer */
18045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if ((fd = fopen(name, "rb")) == NULL)
18145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
18263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        ALOGD("%s Cannot open config file %s\n", __func__, name);
18363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (bResetContent)
18463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
18563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            ALOGD("%s Using default value for all settings\n", __func__);
18645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        mValidFile = false;
18763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
18845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
18945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
19063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    ALOGD("%s Opened %s config %s\n", __func__, (bResetContent ? "base" : "optional"), name);
19145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
19245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mValidFile = true;
19345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (size() > 0)
19463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
19563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (bResetContent)
19645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        clean();
19763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        else
19863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            moveToList();
19963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
20045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
20145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    while (!feof(fd) && fread(&c, 1, 1, fd) == 1)
20245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
20345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        switch (state & 0xff)
20445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
20545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case BEGIN_LINE:
20645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == '#')
20745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = END_LINE;
20845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (isPrintable(c))
20945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
21045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                i = 0;
21145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                token.erase();
21245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                strValue.erase();
21345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = TOKEN;
21445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                token.push_back(c);
21545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
21645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
21745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case TOKEN:
21845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == '=')
21945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
22045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                token.push_back('\0');
22145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = BEGIN_QUOTE;
22245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
22345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (isPrintable(c))
22445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                token.push_back(c);
22545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else
22645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = END_LINE;
22745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
22845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case BEGIN_QUOTE:
22945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == '"')
23045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
23145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = STR_VALUE;
23245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                base = 0;
23345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
23445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (c == '0')
23545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = BEGIN_HEX;
23645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (isDigit(c, 10))
23745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
23845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = NUM_VALUE;
23945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                base = 10;
24045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue = getDigitValue(c, base);
24145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                i = 0;
24245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
24345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (c == '{')
24445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
24545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = NUM_VALUE;
24645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                base = 16;
24745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                i = 0;
24845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                Set(IsStringValue);
24945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
25045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else
25145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = END_LINE;
25245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
25345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case BEGIN_HEX:
25445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == 'x' || c == 'X')
25545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
25645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = NUM_VALUE;
25745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                base = 16;
25845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue = 0;
25945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                i = 0;
26045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                break;
26145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
26245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (isDigit(c, 10))
26345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
26445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = NUM_VALUE;
26545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                base = 10;
26645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue = getDigitValue(c, base);
26745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                break;
26845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
26945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (c != '\n' && c != '\r')
27045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
27145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = END_LINE;
27245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                break;
27345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
27445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            // fal through to numValue to handle numValue
27545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
27645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case NUM_VALUE:
27745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (isDigit(c, base))
27845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
27945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue *= base;
28045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue += getDigitValue(c, base);
28145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                ++i;
28245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
28345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (base == 16 && (c == ':' || c == '-' || c == ' ' || c == '}'))
28445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
28545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (i > 0)
28645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
28745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    int n = (i+1) / 2;
28845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    while (n-- > 0)
28945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    {
29045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                        unsigned char c = (numValue >> (n * 8))  & 0xFF;
29145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                        strValue.push_back(c);
29245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    }
29345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
29445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                Set(IsStringValue);
29545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue = 0;
29645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                i = 0;
29745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
29845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else
29945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
30045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (c == '\n' || c == '\r')
30145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    state = BEGIN_LINE;
30245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                else
30345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    state = END_LINE;
30445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (Is(IsStringValue) && base == 16 && i > 0)
30545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                {
30645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    int n = (i+1) / 2;
30745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    while (n-- > 0)
30845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                        strValue.push_back(((numValue >> (n * 8))  & 0xFF));
30945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                }
31045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                if (strValue.length() > 0)
31145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    pParam = new CNfcParam(token.c_str(), strValue);
31245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                else
31345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                    pParam = new CNfcParam(token.c_str(), numValue);
31445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                add(pParam);
31545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                strValue.erase();
31645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                numValue = 0;
31745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
31845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
31945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case STR_VALUE:
32045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == '"')
32145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            {
32245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                strValue.push_back('\0');
32345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = END_LINE;
32445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                pParam = new CNfcParam(token.c_str(), strValue);
32545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                add(pParam);
32645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            }
32745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            else if (isPrintable(c))
32845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                strValue.push_back(c);
32945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
33045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        case END_LINE:
33145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (c == '\n' || c == '\r')
33245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                state = BEGIN_LINE;
33345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
33445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        default:
33545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
33645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
33745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
33845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
33945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    fclose(fd);
34045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
34145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    moveFromList();
34245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return size() > 0;
34345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
34445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
34545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
34645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::CNfcConfig()
34845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
34945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor
35045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
35245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
35345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
35445faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcConfig::CNfcConfig() :
35545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    mValidFile(true)
35645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
35745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
35845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
35945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
36045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::~CNfcConfig()
36245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor
36445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
36645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
36745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
36845faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcConfig::~CNfcConfig()
36945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
37045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
37145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
37245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
37345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::GetInstance()
37545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: get class singleton object
37745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
37845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
37945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
38045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
38145faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcConfig& CNfcConfig::GetInstance()
38245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
38345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    static CNfcConfig theInstance;
38445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
38545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (theInstance.size() == 0 && theInstance.mValidFile)
38645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
38763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        string strPath;
38863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        if (alternative_config_path[0] != '\0')
38945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        {
39063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            strPath.assign(alternative_config_path);
39163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            strPath += config_name;
39263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            theInstance.readConfig(strPath.c_str(), true);
39345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            if (!theInstance.empty())
39463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            {
39545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu                return theInstance;
39645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        }
39763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
39863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        strPath.assign(transport_config_path);
39963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        strPath += config_name;
40063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        theInstance.readConfig(strPath.c_str(), true);
40145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
40245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return theInstance;
40445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
40545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
40645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
40745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
40845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::getValue()
40945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
41045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: get a string value of a setting
41145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
41245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     true if setting exists
41345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**              false if setting does not exist
41445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
41545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
41645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chubool CNfcConfig::getValue(const char* name, char* pValue, size_t len) const
41745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
41845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const CNfcParam* pParam = find(name);
41945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam == NULL)
42045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
42145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
42245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam->str_len() > 0)
42345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
42445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        memset(pValue, 0, len);
42545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        memcpy(pValue, pParam->str_value(), pParam->str_len());
42645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return true;
42745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
42845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return false;
42945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
43045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
43145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
43245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
43345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::getValue()
43445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
43545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: get a long numerical value of a setting
43645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
43745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     true if setting exists
43845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**              false if setting does not exist
43945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
44045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
44145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chubool CNfcConfig::getValue(const char* name, unsigned long& rValue) const
44245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
44345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const CNfcParam* pParam = find(name);
44445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam == NULL)
44545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
44645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
44745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam->str_len() == 0)
44845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
44945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rValue = static_cast<unsigned long>(pParam->numValue());
45045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return true;
45145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
45245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return false;
45345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
45445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
45545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
45645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
45745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::getValue()
45845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
45945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: get a short numerical value of a setting
46045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
46145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     true if setting exists
46245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**              false if setting does not exist
46345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
46445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
46545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chubool CNfcConfig::getValue(const char* name, unsigned short& rValue) const
46645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
46745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const CNfcParam* pParam = find(name);
46845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam == NULL)
46945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
47045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
47145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam->str_len() == 0)
47245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
47345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        rValue = static_cast<unsigned short>(pParam->numValue());
47445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return true;
47545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
47645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return false;
47745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
47845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
47945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
48045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::find()
48245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: search if a setting exist in the setting array
48445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     pointer to the setting object
48645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
48745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
48845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuconst CNfcParam* CNfcConfig::find(const char* p_name) const
48945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
49045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (size() == 0)
49145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return NULL;
49245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
49345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it)
49445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
49545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (**it < p_name)
49645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            continue;
49745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else if (**it == p_name)
49863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
49963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            if((*it)->str_len() > 0)
50063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen                ALOGD("%s found %s=%s\n", __func__, p_name, (*it)->str_value());
50163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            else
50263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen                ALOGD("%s found %s=(0x%X)\n", __func__, p_name, (*it)->numValue());
50345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            return *it;
50463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
50545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        else
50645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            break;
50745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
50845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return NULL;
50945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
51045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
51145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
51245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::clean()
51445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: reset the setting array
51645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
51845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
51945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
52045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid CNfcConfig::clean()
52145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
52245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (size() == 0)
52345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
52445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
52545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
52645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        delete *it;
52745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    clear();
52845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
52945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
53045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
53145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::Add()
53345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: add a setting object to the list
53545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
53745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
53845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
53945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid CNfcConfig::add(const CNfcParam* pParam)
54045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
54145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (m_list.size() == 0)
54245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
54345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        m_list.push_back(pParam);
54445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
54545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
54645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (list<const CNfcParam*>::iterator it = m_list.begin(), itEnd = m_list.end(); it != itEnd; ++it)
54745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
54845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        if (**it < pParam->c_str())
54945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu            continue;
55045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        m_list.insert(it, pParam);
55145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
55245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
55345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_list.push_back(pParam);
55445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
55545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
55645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
55745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
55845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcConfig::moveFromList()
55945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: move the setting object from list to array
56145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
56345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
56445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
56545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuvoid CNfcConfig::moveFromList()
56645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
56745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (m_list.size() == 0)
56845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return;
56945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    for (list<const CNfcParam*>::iterator it = m_list.begin(), itEnd = m_list.end(); it != itEnd; ++it)
57145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        push_back(*it);
57245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_list.clear();
57345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
57445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
57545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
57645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
57763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function:    CNfcConfig::moveToList()
57863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
57963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description: move the setting object from array to list
58063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
58163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns:     none
58263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
58363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen*******************************************************************************/
58463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid CNfcConfig::moveToList()
58563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen{
58663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if (m_list.size() != 0)
58763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        m_list.clear();
58863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
58963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
59063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        m_list.push_back(*it);
59163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    clear();
59263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen}
59363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
59463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen/*******************************************************************************
59563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
59645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcParam::CNfcParam()
59745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
59845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class constructor
59945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
60045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
60145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
60245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
60345faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcParam::CNfcParam() :
60445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_numValue(0)
60545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
60645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
60745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
60845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
60945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcParam::~CNfcParam()
61145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class destructor
61345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
61545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
61645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
61745faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcParam::~CNfcParam()
61845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
61945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
62045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
62145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
62245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcParam::CNfcParam()
62445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class copy constructor
62645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
62845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
62945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
63045faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcParam::CNfcParam(const char* name,  const string& value) :
63145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    string(name),
63245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_str_value(value),
63345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_numValue(0)
63445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
63545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
63645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
63745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
63845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
63945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    CNfcParam::CNfcParam()
64045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: class copy constructor
64245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
64445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
64545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
64645faad0ff5deeb0c676356345d99398cc4ab695aEvan ChuCNfcParam::CNfcParam(const char* name,  unsigned long value) :
64745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    string(name),
64845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    m_numValue(value)
64945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
65045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
65145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
65245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
65345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
65445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    GetStrValue
65545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
65645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: API function for getting a string value of a setting
65745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
65845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
65945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
66045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
66145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern "C" int GetStrValue(const char* name, char* pValue, unsigned long len)
66245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
66345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcConfig& rConfig = CNfcConfig::GetInstance();
66445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
66545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return rConfig.getValue(name, pValue, len);
66645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
66745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
66845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
66945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
67045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    GetNumValue
67145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
67245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: API function for getting a numerical value of a setting
67345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
67445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
67545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
67645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
67745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern "C" int GetNumValue(const char* name, void* pValue, unsigned long len)
67845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
67945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (!pValue)
68045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
68145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
68245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcConfig& rConfig = CNfcConfig::GetInstance();
68345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    const CNfcParam* pParam = rConfig.find(name);
68445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
68545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    if (pParam == NULL)
68645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
68745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    unsigned long v = pParam->numValue();
68863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4)
68963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    {
69063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        const unsigned char* p = (const unsigned char*)pParam->str_value();
69163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        for (int i = 0 ; i < pParam->str_len(); ++i)
69263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        {
69363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            v *= 256;
69463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen            v += *p++;
69563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        }
69663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    }
69745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    switch (len)
69845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    {
69945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case sizeof(unsigned long):
70045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
70145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
70245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case sizeof(unsigned short):
70345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
70445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
70545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    case sizeof(unsigned char):
70645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        *(static_cast<unsigned char*> (pValue)) = (unsigned char)v;
70745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        break;
70845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    default:
70945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu        return false;
71045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    }
71145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    return true;
71245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
71345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
71445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu/*******************************************************************************
71545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
71645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Function:    resetConfig
71745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
71845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Description: reset settings array
71945faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
72045faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu** Returns:     none
72145faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu**
72245faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu*******************************************************************************/
72345faad0ff5deeb0c676356345d99398cc4ab695aEvan Chuextern void resetConfig()
72445faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu{
72545faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    CNfcConfig& rConfig = CNfcConfig::GetInstance();
72645faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu
72745faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu    rConfig.clean();
72845faad0ff5deeb0c676356345d99398cc4ab695aEvan Chu}
72963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
73063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen/*******************************************************************************
73163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
73263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Function:    readOptionalConfig()
73363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
73463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Description: read Config settings from an optional conf file
73563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
73663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen** Returns:     none
73763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen**
73863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen*******************************************************************************/
73963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenenvoid readOptionalConfig(const char* extra)
74063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen{
74163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    string strPath;
74263f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    strPath.assign(transport_config_path);
74363f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    if (alternative_config_path[0] != '\0')
74463f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen        strPath.assign(alternative_config_path);
74563f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
74663f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    strPath += extra_config_base;
74763f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    strPath += extra;
74863f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    strPath += extra_config_ext;
74963f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen    CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
75063f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen}
75163f80ce896f0f8c203191b4e44e038fecb6be02aMartijn Coenen
752