summaryrefslogtreecommitdiffstats
path: root/halimpl/pn54x/utils/phNxpConfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'halimpl/pn54x/utils/phNxpConfig.cpp')
-rw-r--r--halimpl/pn54x/utils/phNxpConfig.cpp865
1 files changed, 0 insertions, 865 deletions
diff --git a/halimpl/pn54x/utils/phNxpConfig.cpp b/halimpl/pn54x/utils/phNxpConfig.cpp
deleted file mode 100644
index 9e8c7cb..0000000
--- a/halimpl/pn54x/utils/phNxpConfig.cpp
+++ /dev/null
@@ -1,865 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 2011-2012 Broadcom Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
-
-/******************************************************************************
- *
- * The original Work has been changed by NXP Semiconductors.
- *
- * Copyright (C) 2013-2014 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************/
-
-#include <stdio.h>
-#include <sys/stat.h>
-#include <list>
-#include <string>
-#include <vector>
-
-#include <phNxpConfig.h>
-#include <phNxpLog.h>
-#include "sparse_crc32.h"
-
-#if GENERIC_TARGET
-const char alternative_config_path[] = "/data/vendor/nfc/";
-#else
-const char alternative_config_path[] = "";
-#endif
-
-#if 1
-const char* transport_config_paths[] = {"/odm/etc/", "/vendor/etc/", "/etc/"};
-#else
-const char* transport_config_paths[] = {"res/"};
-#endif
-const int transport_config_path_size =
- (sizeof(transport_config_paths) / sizeof(transport_config_paths[0]));
-
-#define config_name "libnfc-nxp.conf"
-#define extra_config_base "libnfc-nxp-"
-#define extra_config_ext ".conf"
-#define IsStringValue 0x80000000
-
-const char config_timestamp_path[] =
- "/data/vendor/nfc/libnfc-nxpConfigState.bin";
-
-namespace {
-
-size_t readConfigFile(const char* fileName, uint8_t** p_data) {
- FILE* fd = fopen(fileName, "rb");
- if (fd == nullptr) return 0;
-
- fseek(fd, 0L, SEEK_END);
- const size_t file_size = ftell(fd);
- rewind(fd);
-
- uint8_t* buffer = new uint8_t[file_size];
- size_t read = fread(buffer, file_size, 1, fd);
- fclose(fd);
-
- if (read == 1) {
- *p_data = buffer;
- return file_size;
- }
-
- return 0;
-}
-
-} // namespace
-
-using namespace ::std;
-
-class CNfcParam : public string {
- public:
- CNfcParam();
- CNfcParam(const char* name, const string& value);
- CNfcParam(const char* name, unsigned long value);
- virtual ~CNfcParam();
- unsigned long numValue() const { return m_numValue; }
- const char* str_value() const { return m_str_value.c_str(); }
- size_t str_len() const { return m_str_value.length(); }
-
- private:
- string m_str_value;
- unsigned long m_numValue;
-};
-
-class CNfcConfig : public vector<const CNfcParam*> {
- public:
- virtual ~CNfcConfig();
- static CNfcConfig& GetInstance();
- friend void readOptionalConfig(const char* optional);
- bool isModified();
- void resetModified();
-
- bool getValue(const char* name, char* pValue, size_t len) const;
- bool getValue(const char* name, unsigned long& rValue) const;
- bool getValue(const char* name, unsigned short& rValue) const;
- bool getValue(const char* name, char* pValue, long len, long* readlen) const;
- const CNfcParam* find(const char* p_name) const;
- void clean();
-
- private:
- CNfcConfig();
- bool readConfig(const char* name, bool bResetContent);
- void moveFromList();
- void moveToList();
- void add(const CNfcParam* pParam);
- list<const CNfcParam*> m_list;
- bool mValidFile;
- uint32_t config_crc32_;
-
- unsigned long state;
-
- inline bool Is(unsigned long f) { return (state & f) == f; }
- inline void Set(unsigned long f) { state |= f; }
- inline void Reset(unsigned long f) { state &= ~f; }
-};
-
-/*******************************************************************************
-**
-** Function: isPrintable()
-**
-** Description: determine if 'c' is printable
-**
-** Returns: 1, if printable, otherwise 0
-**
-*******************************************************************************/
-inline bool isPrintable(char c) {
- return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ||
- (c >= '0' && c <= '9') || c == '/' || c == '_' || c == '-' || c == '.';
-}
-
-/*******************************************************************************
-**
-** Function: isDigit()
-**
-** Description: determine if 'c' is numeral digit
-**
-** Returns: true, if numerical digit
-**
-*******************************************************************************/
-inline bool isDigit(char c, int base) {
- if ('0' <= c && c <= '9') return true;
- if (base == 16) {
- if (('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) return true;
- }
- return false;
-}
-
-/*******************************************************************************
-**
-** Function: getDigitValue()
-**
-** Description: return numerical value of a decimal or hex char
-**
-** Returns: numerical value if decimal or hex char, otherwise 0
-**
-*******************************************************************************/
-inline int getDigitValue(char c, int base) {
- if ('0' <= c && c <= '9') return c - '0';
- if (base == 16) {
- if ('A' <= c && c <= 'F')
- return c - 'A' + 10;
- else if ('a' <= c && c <= 'f')
- return c - 'a' + 10;
- }
- return 0;
-}
-
-/*******************************************************************************
-**
-** Function: findConfigFilePathFromTransportConfigPaths()
-**
-** Description: find a config file path with a given config name from transport
-** config paths
-**
-** Returns: none
-**
-*******************************************************************************/
-void findConfigFilePathFromTransportConfigPaths(const string& configName,
- string& filePath) {
- for (int i = 0; i < transport_config_path_size - 1; i++) {
- filePath.assign(transport_config_paths[i]);
- filePath += configName;
- struct stat file_stat;
- if (stat(filePath.c_str(), &file_stat) == 0 && S_ISREG(file_stat.st_mode)) {
- return;
- }
- }
- filePath.assign(transport_config_paths[transport_config_path_size - 1]);
- filePath += configName;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::readConfig()
-**
-** Description: read Config settings and parse them into a linked list
-** move the element from linked list to a array at the end
-**
-** Returns: 1, if there are any config data, 0 otherwise
-**
-*******************************************************************************/
-bool CNfcConfig::readConfig(const char* name, bool bResetContent) {
- enum {
- BEGIN_LINE = 1,
- TOKEN,
- STR_VALUE,
- NUM_VALUE,
- BEGIN_HEX,
- BEGIN_QUOTE,
- END_LINE
- };
-
- uint8_t* p_config = nullptr;
- size_t config_size = readConfigFile(name, &p_config);
- if (p_config == nullptr) {
- ALOGE("%s Cannot open config file %s\n", __func__, name);
- if (bResetContent) {
- ALOGE("%s Using default value for all settings\n", __func__);
- mValidFile = false;
- }
- return false;
- }
-
- string token;
- string strValue;
- unsigned long numValue = 0;
- CNfcParam* pParam = NULL;
- int i = 0;
- int base = 0;
- char c;
- int bflag = 0;
- state = BEGIN_LINE;
-
- config_crc32_ = sparse_crc32(0, p_config, config_size);
- mValidFile = true;
- if (size() > 0) {
- if (bResetContent)
- clean();
- else
- moveToList();
- }
-
- for (size_t offset = 0; offset != config_size; ++offset) {
- c = p_config[offset];
- switch (state & 0xff) {
- case BEGIN_LINE:
- if (c == '#')
- state = END_LINE;
- else if (isPrintable(c)) {
- i = 0;
- token.erase();
- strValue.erase();
- state = TOKEN;
- token.push_back(c);
- }
- break;
- case TOKEN:
- if (c == '=') {
- token.push_back('\0');
- state = BEGIN_QUOTE;
- } else if (isPrintable(c))
- token.push_back(c);
- else
- state = END_LINE;
- break;
- case BEGIN_QUOTE:
- if (c == '"') {
- state = STR_VALUE;
- base = 0;
- } else if (c == '0')
- state = BEGIN_HEX;
- else if (isDigit(c, 10)) {
- state = NUM_VALUE;
- base = 10;
- numValue = getDigitValue(c, base);
- i = 0;
- } else if (c == '{') {
- state = NUM_VALUE;
- bflag = 1;
- base = 16;
- i = 0;
- Set(IsStringValue);
- } else
- state = END_LINE;
- break;
- case BEGIN_HEX:
- if (c == 'x' || c == 'X') {
- state = NUM_VALUE;
- base = 16;
- numValue = 0;
- i = 0;
- break;
- } else if (isDigit(c, 10)) {
- state = NUM_VALUE;
- base = 10;
- numValue = getDigitValue(c, base);
- break;
- } else if (c != '\n' && c != '\r') {
- state = END_LINE;
- break;
- }
- // fall through to numValue to handle numValue
-
- case NUM_VALUE:
- if (isDigit(c, base)) {
- numValue *= base;
- numValue += getDigitValue(c, base);
- ++i;
- } else if (bflag == 1 &&
- (c == ' ' || c == '\r' || c == '\n' || c == '\t')) {
- break;
- } else if (base == 16 &&
- (c == ',' || c == ':' || c == '-' || c == ' ' || c == '}')) {
- if (c == '}') {
- bflag = 0;
- }
- if (i > 0) {
- int n = (i + 1) / 2;
- while (n-- > 0) {
- numValue = numValue >> (n * 8);
- unsigned char c = (numValue)&0xFF;
- strValue.push_back(c);
- }
- }
-
- Set(IsStringValue);
- numValue = 0;
- i = 0;
- } else {
- if (c == '\n' || c == '\r') {
- if (bflag == 0) {
- state = BEGIN_LINE;
- }
- } else {
- if (bflag == 0) {
- state = END_LINE;
- }
- }
- if (Is(IsStringValue) && base == 16 && i > 0) {
- int n = (i + 1) / 2;
- while (n-- > 0) strValue.push_back(((numValue >> (n * 8)) & 0xFF));
- }
- if (strValue.length() > 0)
- pParam = new CNfcParam(token.c_str(), strValue);
- else
- pParam = new CNfcParam(token.c_str(), numValue);
- add(pParam);
- strValue.erase();
- numValue = 0;
- }
- break;
- case STR_VALUE:
- if (c == '"') {
- strValue.push_back('\0');
- state = END_LINE;
- pParam = new CNfcParam(token.c_str(), strValue);
- add(pParam);
- } else if (isPrintable(c))
- strValue.push_back(c);
- break;
- case END_LINE:
- if (c == '\n' || c == '\r') state = BEGIN_LINE;
- break;
- default:
- break;
- }
- }
-
- delete[] p_config;
-
- moveFromList();
- return size() > 0;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::CNfcConfig()
-**
-** Description: class constructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcConfig::CNfcConfig() : mValidFile(true), state(0) {}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::~CNfcConfig()
-**
-** Description: class destructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcConfig::~CNfcConfig() {}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::GetInstance()
-**
-** Description: get class singleton object
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcConfig& CNfcConfig::GetInstance() {
- static CNfcConfig theInstance;
-
- if (theInstance.size() == 0 && theInstance.mValidFile) {
- string strPath;
- if (alternative_config_path[0] != '\0') {
- strPath.assign(alternative_config_path);
- strPath += config_name;
- theInstance.readConfig(strPath.c_str(), true);
- if (!theInstance.empty()) {
- return theInstance;
- }
- }
- findConfigFilePathFromTransportConfigPaths(config_name, strPath);
- theInstance.readConfig(strPath.c_str(), true);
- }
-
- return theInstance;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::getValue()
-**
-** Description: get a string value of a setting
-**
-** Returns: true if setting exists
-** false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, char* pValue, size_t len) const {
- const CNfcParam* pParam = find(name);
- if (pParam == NULL) return false;
-
- if (pParam->str_len() > 0) {
- memset(pValue, 0, len);
- memcpy(pValue, pParam->str_value(), pParam->str_len());
- return true;
- }
- return false;
-}
-
-bool CNfcConfig::getValue(const char* name, char* pValue, long len,
- long* readlen) const {
- const CNfcParam* pParam = find(name);
- if (pParam == NULL) return false;
-
- if (pParam->str_len() > 0) {
- if (pParam->str_len() <= (unsigned long)len) {
- memset(pValue, 0, len);
- memcpy(pValue, pParam->str_value(), pParam->str_len());
- *readlen = pParam->str_len();
- } else {
- *readlen = -1;
- }
-
- return true;
- }
- return false;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::getValue()
-**
-** Description: get a long numerical value of a setting
-**
-** Returns: true if setting exists
-** false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned long& rValue) const {
- const CNfcParam* pParam = find(name);
- if (pParam == NULL) return false;
-
- if (pParam->str_len() == 0) {
- rValue = static_cast<unsigned long>(pParam->numValue());
- return true;
- }
- return false;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::getValue()
-**
-** Description: get a short numerical value of a setting
-**
-** Returns: true if setting exists
-** false if setting does not exist
-**
-*******************************************************************************/
-bool CNfcConfig::getValue(const char* name, unsigned short& rValue) const {
- const CNfcParam* pParam = find(name);
- if (pParam == NULL) return false;
-
- if (pParam->str_len() == 0) {
- rValue = static_cast<unsigned short>(pParam->numValue());
- return true;
- }
- return false;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::find()
-**
-** Description: search if a setting exist in the setting array
-**
-** Returns: pointer to the setting object
-**
-*******************************************************************************/
-const CNfcParam* CNfcConfig::find(const char* p_name) const {
- if (size() == 0) return NULL;
-
- for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it) {
- if (**it < p_name) {
- continue;
- } else if (**it == p_name) {
- if ((*it)->str_len() > 0) {
- NXPLOG_EXTNS_D("%s found %s=%s\n", __func__, p_name,
- (*it)->str_value());
- } else {
- NXPLOG_EXTNS_D("%s found %s=(0x%lx)\n", __func__, p_name,
- (*it)->numValue());
- }
- return *it;
- } else
- break;
- }
- return NULL;
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::clean()
-**
-** Description: reset the setting array
-**
-** Returns: none
-**
-*******************************************************************************/
-void CNfcConfig::clean() {
- if (size() == 0) return;
-
- for (iterator it = begin(), itEnd = end(); it != itEnd; ++it) delete *it;
- clear();
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::Add()
-**
-** Description: add a setting object to the list
-**
-** Returns: none
-**
-*******************************************************************************/
-void CNfcConfig::add(const CNfcParam* pParam) {
- if (m_list.size() == 0) {
- m_list.push_back(pParam);
- return;
- }
- for (list<const CNfcParam *>::iterator it = m_list.begin(),
- itEnd = m_list.end();
- it != itEnd; ++it) {
- if (**it < pParam->c_str()) continue;
- m_list.insert(it, pParam);
- return;
- }
- m_list.push_back(pParam);
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::moveFromList()
-**
-** Description: move the setting object from list to array
-**
-** Returns: none
-**
-*******************************************************************************/
-void CNfcConfig::moveFromList() {
- if (m_list.size() == 0) return;
-
- for (list<const CNfcParam *>::iterator it = m_list.begin(),
- itEnd = m_list.end();
- it != itEnd; ++it)
- push_back(*it);
- m_list.clear();
-}
-
-/*******************************************************************************
-**
-** Function: CNfcConfig::moveToList()
-**
-** Description: move the setting object from array to list
-**
-** Returns: none
-**
-*******************************************************************************/
-void CNfcConfig::moveToList() {
- if (m_list.size() != 0) m_list.clear();
-
- for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
- m_list.push_back(*it);
- clear();
-}
-
-bool CNfcConfig::isModified() {
- FILE* fd = fopen(config_timestamp_path, "r+");
- if (fd == nullptr) {
- ALOGE("%s Unable to open file '%s' - assuming modified", __func__,
- config_timestamp_path);
- return true;
- }
-
- uint32_t stored_crc32 = 0;
- fread(&stored_crc32, sizeof(uint32_t), 1, fd);
- fclose(fd);
-
- return stored_crc32 != config_crc32_;
-}
-
-void CNfcConfig::resetModified() {
- FILE* fd = fopen(config_timestamp_path, "w+");
- if (fd == nullptr) {
- ALOGE("%s Unable to open file '%s' for writing", __func__,
- config_timestamp_path);
- return;
- }
-
- fwrite(&config_crc32_, sizeof(uint32_t), 1, fd);
- fclose(fd);
-}
-
-/*******************************************************************************
-**
-** Function: CNfcParam::CNfcParam()
-**
-** Description: class constructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam() : m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function: CNfcParam::~CNfcParam()
-**
-** Description: class destructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcParam::~CNfcParam() {}
-
-/*******************************************************************************
-**
-** Function: CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, const string& value)
- : string(name), m_str_value(value), m_numValue(0) {}
-
-/*******************************************************************************
-**
-** Function: CNfcParam::CNfcParam()
-**
-** Description: class copy constructor
-**
-** Returns: none
-**
-*******************************************************************************/
-CNfcParam::CNfcParam(const char* name, unsigned long value)
- : string(name), m_numValue(value) {}
-
-/*******************************************************************************
-**
-** Function: GetStrValue
-**
-** Description: API function for getting a string value of a setting
-**
-** Returns: True if found, otherwise False.
-**
-*******************************************************************************/
-extern "C" int GetNxpStrValue(const char* name, char* pValue,
- unsigned long len) {
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
- return rConfig.getValue(name, pValue, len);
-}
-
-/*******************************************************************************
-**
-** Function: GetByteArrayValue()
-**
-** Description: Read byte array value from the config file.
-**
-** Parameters:
-** name - name of the config param to read.
-** pValue - pointer to input buffer.
-** bufflen - input buffer length.
-** len - out parameter to return the number of bytes read from
-** config file, return -1 in case bufflen is not enough.
-**
-** Returns: TRUE[1] if config param name is found in the config file, else
-** FALSE[0]
-**
-*******************************************************************************/
-extern "C" int GetNxpByteArrayValue(const char* name, char* pValue,
- long bufflen, long* len) {
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
- return rConfig.getValue(name, pValue, bufflen, len);
-}
-
-/*******************************************************************************
-**
-** Function: GetNumValue
-**
-** Description: API function for getting a numerical value of a setting
-**
-** Returns: true, if successful
-**
-*******************************************************************************/
-extern "C" int GetNxpNumValue(const char* name, void* pValue,
- unsigned long len) {
- if (!pValue) return false;
-
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
- const CNfcParam* pParam = rConfig.find(name);
-
- if (pParam == NULL) return false;
- unsigned long v = pParam->numValue();
- if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4) {
- const unsigned char* p = (const unsigned char*)pParam->str_value();
- for (unsigned int i = 0; i < pParam->str_len(); ++i) {
- v *= 256;
- v += *p++;
- }
- }
- switch (len) {
- case sizeof(unsigned long):
- *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
- break;
- case sizeof(unsigned short):
- *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
- break;
- case sizeof(unsigned char):
- *(static_cast<unsigned char*>(pValue)) = (unsigned char)v;
- break;
- default:
- return false;
- }
- return true;
-}
-
-/*******************************************************************************
-**
-** Function: resetConfig
-**
-** Description: reset settings array
-**
-** Returns: none
-**
-*******************************************************************************/
-extern "C" void resetNxpConfig()
-
-{
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
-
- rConfig.clean();
-}
-
-/*******************************************************************************
-**
-** Function: readOptionalConfig()
-**
-** Description: read Config settings from an optional conf file
-**
-** Returns: none
-**
-*******************************************************************************/
-void readOptionalConfig(const char* extra) {
- string strPath;
- string configName(extra_config_base);
- configName += extra;
- configName += extra_config_ext;
-
- if (alternative_config_path[0] != '\0') {
- strPath.assign(alternative_config_path);
- strPath += configName;
- } else {
- findConfigFilePathFromTransportConfigPaths(configName, strPath);
- }
-
- CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
-}
-
-/*******************************************************************************
-**
-** Function: isNxpConfigModified()
-**
-** Description: check if config file has modified
-**
-** Returns: 0 if not modified, 1 otherwise.
-**
-*******************************************************************************/
-extern "C" int isNxpConfigModified() {
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
- return rConfig.isModified();
-}
-
-/*******************************************************************************
-**
-** Function: updateNxpConfigTimestamp()
-**
-** Description: update if config file has modified
-**
-** Returns: 0 if not modified, 1 otherwise.
-**
-*******************************************************************************/
-extern "C" int updateNxpConfigTimestamp() {
- CNfcConfig& rConfig = CNfcConfig::GetInstance();
- rConfig.resetModified();
- return 0;
-}