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