Home | History | Annotate | Download | only in utils
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2011-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  The original Work has been changed by NXP Semiconductors.
     22  *
     23  *  Copyright (C) 2013-2014 NXP Semiconductors
     24  *
     25  *  Licensed under the Apache License, Version 2.0 (the "License");
     26  *  you may not use this file except in compliance with the License.
     27  *  You may obtain a copy of the License at
     28  *
     29  *  http://www.apache.org/licenses/LICENSE-2.0
     30  *
     31  *  Unless required by applicable law or agreed to in writing, software
     32  *  distributed under the License is distributed on an "AS IS" BASIS,
     33  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     34  *  See the License for the specific language governing permissions and
     35  *  limitations under the License.
     36  *
     37  ******************************************************************************/
     38 
     39 #include <string>
     40 #include <vector>
     41 #include <list>
     42 #include <stdio.h>
     43 #include <sys/stat.h>
     44 
     45 #include <phNxpConfig.h>
     46 #include <phNxpLog.h>
     47 
     48 #if GENERIC_TARGET
     49 const char alternative_config_path[] = "/data/nfc/";
     50 #else
     51 const char alternative_config_path[] = "";
     52 #endif
     53 
     54 #if 1
     55 const char transport_config_path[] = "/etc/";
     56 #else
     57 const char transport_config_path[] = "res/";
     58 #endif
     59 
     60 #define config_name             "libnfc-nxp.conf"
     61 #define extra_config_base       "libnfc-nxp-"
     62 #define extra_config_ext        ".conf"
     63 #define     IsStringValue       0x80000000
     64 
     65 const char config_timestamp_path[] = "/data/nfc/libnfc-nxpConfigState.bin";
     66 
     67 using namespace::std;
     68 
     69 class CNfcParam : public string
     70 {
     71 public:
     72     CNfcParam();
     73     CNfcParam(const char* name, const string& value);
     74     CNfcParam(const char* name, unsigned long value);
     75     virtual ~CNfcParam();
     76     unsigned long numValue() const {return m_numValue;}
     77     const char*   str_value() const {return m_str_value.c_str();}
     78     size_t        str_len() const   {return m_str_value.length();}
     79 private:
     80     string          m_str_value;
     81     unsigned long   m_numValue;
     82 };
     83 
     84 class CNfcConfig : public vector<const CNfcParam*>
     85 {
     86 public:
     87     virtual ~CNfcConfig();
     88     static CNfcConfig& GetInstance();
     89     friend void readOptionalConfig(const char* optional);
     90     int updateTimestamp();
     91     int checkTimestamp();
     92 
     93     bool    getValue(const char* name, char* pValue, size_t len) const;
     94     bool    getValue(const char* name, unsigned long& rValue) const;
     95     bool    getValue(const char* name, unsigned short & rValue) const;
     96     bool    getValue(const char* name, char* pValue, long len,long* readlen) const;
     97     const CNfcParam*    find(const char* p_name) const;
     98     void    clean();
     99 private:
    100     CNfcConfig();
    101     bool    readConfig(const char* name, bool bResetContent);
    102     void    moveFromList();
    103     void    moveToList();
    104     void    add(const CNfcParam* pParam);
    105     list<const CNfcParam*> m_list;
    106     bool    mValidFile;
    107     unsigned long m_timeStamp;
    108 
    109     unsigned long   state;
    110 
    111     inline bool Is(unsigned long f) {return (state & f) == f;}
    112     inline void Set(unsigned long f) {state |= f;}
    113     inline void Reset(unsigned long f) {state &= ~f;}
    114 };
    115 
    116 /*******************************************************************************
    117 **
    118 ** Function:    isPrintable()
    119 **
    120 ** Description: determine if 'c' is printable
    121 **
    122 ** Returns:     1, if printable, otherwise 0
    123 **
    124 *******************************************************************************/
    125 inline bool isPrintable(char c)
    126 {
    127     return  (c >= 'A' && c <= 'Z') ||
    128             (c >= 'a' && c <= 'z') ||
    129             (c >= '0' && c <= '9') ||
    130             c == '/' || c == '_' || c == '-' || c == '.';
    131 }
    132 
    133 /*******************************************************************************
    134 **
    135 ** Function:    isDigit()
    136 **
    137 ** Description: determine if 'c' is numeral digit
    138 **
    139 ** Returns:     true, if numerical digit
    140 **
    141 *******************************************************************************/
    142 inline bool isDigit(char c, int base)
    143 {
    144     if ('0' <= c && c <= '9')
    145         return true;
    146     if (base == 16)
    147     {
    148         if (('A' <= c && c <= 'F') ||
    149             ('a' <= c && c <= 'f') )
    150             return true;
    151     }
    152     return false;
    153 }
    154 
    155 /*******************************************************************************
    156 **
    157 ** Function:    getDigitValue()
    158 **
    159 ** Description: return numerical value of a decimal or hex char
    160 **
    161 ** Returns:     numerical value if decimal or hex char, otherwise 0
    162 **
    163 *******************************************************************************/
    164 inline int getDigitValue(char c, int base)
    165 {
    166     if ('0' <= c && c <= '9')
    167         return c - '0';
    168     if (base == 16)
    169     {
    170         if ('A' <= c && c <= 'F')
    171             return c - 'A' + 10;
    172         else if ('a' <= c && c <= 'f')
    173             return c - 'a' + 10;
    174     }
    175     return 0;
    176 }
    177 
    178 /*******************************************************************************
    179 **
    180 ** Function:    CNfcConfig::readConfig()
    181 **
    182 ** Description: read Config settings and parse them into a linked list
    183 **              move the element from linked list to a array at the end
    184 **
    185 ** Returns:     1, if there are any config data, 0 otherwise
    186 **
    187 *******************************************************************************/
    188 bool CNfcConfig::readConfig(const char* name, bool bResetContent)
    189 {
    190     enum {
    191         BEGIN_LINE = 1,
    192         TOKEN,
    193         STR_VALUE,
    194         NUM_VALUE,
    195         BEGIN_HEX,
    196         BEGIN_QUOTE,
    197         END_LINE
    198     };
    199 
    200     FILE*   fd;
    201     struct stat buf;
    202     string  token;
    203     string  strValue;
    204     unsigned long    numValue = 0;
    205     CNfcParam* pParam = NULL;
    206     int     i = 0;
    207     int     base = 0;
    208     char    c;
    209     int     bflag = 0;
    210     state = BEGIN_LINE;
    211     /* open config file, read it into a buffer */
    212     if ((fd = fopen(name, "rb")) == NULL)
    213     {
    214         ALOGE("%s Cannot open config file %s\n", __func__, name);
    215         if (bResetContent)
    216         {
    217             ALOGE("%s Using default value for all settings\n", __func__);
    218             mValidFile = false;
    219         }
    220         return false;
    221     }
    222     stat(name, &buf);
    223     m_timeStamp = (unsigned long)buf.st_mtime;
    224 
    225     mValidFile = true;
    226     if (size() > 0)
    227     {
    228         if (bResetContent)
    229         clean();
    230         else
    231             moveToList();
    232     }
    233 
    234     while (!feof(fd) && fread(&c, 1, 1, fd) == 1)
    235     {
    236         switch (state & 0xff)
    237         {
    238         case BEGIN_LINE:
    239             if (c == '#')
    240                 state = END_LINE;
    241             else if (isPrintable(c))
    242             {
    243                 i = 0;
    244                 token.erase();
    245                 strValue.erase();
    246                 state = TOKEN;
    247                 token.push_back(c);
    248             }
    249             break;
    250         case TOKEN:
    251             if (c == '=')
    252             {
    253                 token.push_back('\0');
    254                 state = BEGIN_QUOTE;
    255             }
    256             else if (isPrintable(c))
    257                 token.push_back(c);
    258             else
    259                 state = END_LINE;
    260             break;
    261         case BEGIN_QUOTE:
    262             if (c == '"')
    263             {
    264                 state = STR_VALUE;
    265                 base = 0;
    266             }
    267             else if (c == '0')
    268                 state = BEGIN_HEX;
    269             else if (isDigit(c, 10))
    270             {
    271                 state = NUM_VALUE;
    272                 base = 10;
    273                 numValue = getDigitValue(c, base);
    274                 i = 0;
    275             }
    276             else if (c == '{')
    277             {
    278                 state = NUM_VALUE;
    279                 bflag = 1;
    280                 base = 16;
    281                 i = 0;
    282                 Set(IsStringValue);
    283             }
    284             else
    285                 state = END_LINE;
    286             break;
    287         case BEGIN_HEX:
    288             if (c == 'x' || c == 'X')
    289             {
    290                 state = NUM_VALUE;
    291                 base = 16;
    292                 numValue = 0;
    293                 i = 0;
    294                 break;
    295             }
    296             else if (isDigit(c, 10))
    297             {
    298                 state = NUM_VALUE;
    299                 base = 10;
    300                 numValue = getDigitValue(c, base);
    301                 break;
    302             }
    303             else if (c != '\n' && c != '\r')
    304             {
    305                 state = END_LINE;
    306                 break;
    307             }
    308             // fall through to numValue to handle numValue
    309 
    310         case NUM_VALUE:
    311             if (isDigit(c, base))
    312             {
    313                 numValue *= base;
    314                 numValue += getDigitValue(c, base);
    315                 ++i;
    316             }
    317             else if(bflag == 1 && (c == ' ' || c == '\r' || c=='\n' || c=='\t'))
    318             {
    319                 break;
    320             }
    321             else if (base == 16 && (c== ','|| c == ':' || c == '-' || c == ' ' || c == '}'))
    322             {
    323 
    324                 if( c=='}' )
    325                 {
    326                     bflag = 0;
    327                 }
    328                 if (i > 0)
    329                 {
    330                     int n = (i+1) / 2;
    331                     while (n-- > 0)
    332                     {
    333                         numValue = numValue >> (n * 8);
    334                         unsigned char c = (numValue)  & 0xFF;
    335                         strValue.push_back(c);
    336                     }
    337                 }
    338 
    339                 Set(IsStringValue);
    340                 numValue = 0;
    341                 i = 0;
    342             }
    343             else
    344             {
    345                 if (c == '\n' || c == '\r')
    346                 {
    347                     if(bflag == 0 )
    348                     {
    349                         state = BEGIN_LINE;
    350                     }
    351                 }
    352                 else
    353                 {
    354                     if( bflag == 0)
    355                     {
    356                         state = END_LINE;
    357                     }
    358                 }
    359                 if (Is(IsStringValue) && base == 16 && i > 0)
    360                 {
    361                     int n = (i+1) / 2;
    362                     while (n-- > 0)
    363                         strValue.push_back(((numValue >> (n * 8))  & 0xFF));
    364                 }
    365                 if (strValue.length() > 0)
    366                     pParam = new CNfcParam(token.c_str(), strValue);
    367                 else
    368                     pParam = new CNfcParam(token.c_str(), numValue);
    369                 add(pParam);
    370                 strValue.erase();
    371                 numValue = 0;
    372             }
    373             break;
    374         case STR_VALUE:
    375             if (c == '"')
    376             {
    377                 strValue.push_back('\0');
    378                 state = END_LINE;
    379                 pParam = new CNfcParam(token.c_str(), strValue);
    380                 add(pParam);
    381             }
    382             else if (isPrintable(c))
    383                 strValue.push_back(c);
    384             break;
    385         case END_LINE:
    386             if (c == '\n' || c == '\r')
    387                 state = BEGIN_LINE;
    388             break;
    389         default:
    390             break;
    391         }
    392     }
    393 
    394     fclose(fd);
    395 
    396     moveFromList();
    397     return size() > 0;
    398 }
    399 
    400 /*******************************************************************************
    401 **
    402 ** Function:    CNfcConfig::CNfcConfig()
    403 **
    404 ** Description: class constructor
    405 **
    406 ** Returns:     none
    407 **
    408 *******************************************************************************/
    409 CNfcConfig::CNfcConfig() :
    410     mValidFile(true),
    411     m_timeStamp(0),
    412     state(0)
    413 {
    414 }
    415 
    416 /*******************************************************************************
    417 **
    418 ** Function:    CNfcConfig::~CNfcConfig()
    419 **
    420 ** Description: class destructor
    421 **
    422 ** Returns:     none
    423 **
    424 *******************************************************************************/
    425 CNfcConfig::~CNfcConfig()
    426 {
    427 }
    428 
    429 /*******************************************************************************
    430 **
    431 ** Function:    CNfcConfig::GetInstance()
    432 **
    433 ** Description: get class singleton object
    434 **
    435 ** Returns:     none
    436 **
    437 *******************************************************************************/
    438 CNfcConfig& CNfcConfig::GetInstance()
    439 {
    440     static CNfcConfig theInstance;
    441 
    442     if (theInstance.size() == 0 && theInstance.mValidFile)
    443     {
    444         string strPath;
    445         if (alternative_config_path[0] != '\0')
    446         {
    447             strPath.assign(alternative_config_path);
    448             strPath += config_name;
    449             theInstance.readConfig(strPath.c_str(), true);
    450             if (!theInstance.empty())
    451             {
    452                 return theInstance;
    453             }
    454         }
    455         strPath.assign(transport_config_path);
    456         strPath += config_name;
    457         theInstance.readConfig(strPath.c_str(), true);
    458     }
    459 
    460     return theInstance;
    461 }
    462 
    463 /*******************************************************************************
    464 **
    465 ** Function:    CNfcConfig::getValue()
    466 **
    467 ** Description: get a string value of a setting
    468 **
    469 ** Returns:     true if setting exists
    470 **              false if setting does not exist
    471 **
    472 *******************************************************************************/
    473 bool CNfcConfig::getValue(const char* name, char* pValue, size_t len) const
    474 {
    475     const CNfcParam* pParam = find(name);
    476     if (pParam == NULL)
    477         return false;
    478 
    479     if (pParam->str_len() > 0)
    480     {
    481         memset(pValue, 0, len);
    482         memcpy(pValue, pParam->str_value(), pParam->str_len());
    483         return true;
    484     }
    485     return false;
    486 }
    487 
    488 bool CNfcConfig::getValue(const char* name, char* pValue, long len,long* readlen) const
    489 {
    490     const CNfcParam* pParam = find(name);
    491     if (pParam == NULL)
    492         return false;
    493 
    494     if (pParam->str_len() > 0)
    495     {
    496         if(pParam->str_len() <= (unsigned long)len)
    497         {
    498             memset(pValue, 0, len);
    499             memcpy(pValue, pParam->str_value(), pParam->str_len());
    500             *readlen = pParam->str_len();
    501         }
    502         else
    503         {
    504             *readlen = -1;
    505         }
    506 
    507         return true;
    508     }
    509     return false;
    510 }
    511 
    512 /*******************************************************************************
    513 **
    514 ** Function:    CNfcConfig::getValue()
    515 **
    516 ** Description: get a long numerical value of a setting
    517 **
    518 ** Returns:     true if setting exists
    519 **              false if setting does not exist
    520 **
    521 *******************************************************************************/
    522 bool CNfcConfig::getValue(const char* name, unsigned long& rValue) const
    523 {
    524     const CNfcParam* pParam = find(name);
    525     if (pParam == NULL)
    526         return false;
    527 
    528     if (pParam->str_len() == 0)
    529     {
    530         rValue = static_cast<unsigned long>(pParam->numValue());
    531         return true;
    532     }
    533     return false;
    534 }
    535 
    536 /*******************************************************************************
    537 **
    538 ** Function:    CNfcConfig::getValue()
    539 **
    540 ** Description: get a short numerical value of a setting
    541 **
    542 ** Returns:     true if setting exists
    543 **              false if setting does not exist
    544 **
    545 *******************************************************************************/
    546 bool CNfcConfig::getValue(const char* name, unsigned short& rValue) const
    547 {
    548     const CNfcParam* pParam = find(name);
    549     if (pParam == NULL)
    550         return false;
    551 
    552     if (pParam->str_len() == 0)
    553     {
    554         rValue = static_cast<unsigned short>(pParam->numValue());
    555         return true;
    556     }
    557     return false;
    558 }
    559 
    560 /*******************************************************************************
    561 **
    562 ** Function:    CNfcConfig::find()
    563 **
    564 ** Description: search if a setting exist in the setting array
    565 **
    566 ** Returns:     pointer to the setting object
    567 **
    568 *******************************************************************************/
    569 const CNfcParam* CNfcConfig::find(const char* p_name) const
    570 {
    571     if (size() == 0)
    572         return NULL;
    573 
    574     for (const_iterator it = begin(), itEnd = end(); it != itEnd; ++it)
    575     {
    576         if (**it < p_name)
    577         {
    578             continue;
    579         }
    580         else if (**it == p_name)
    581         {
    582             if((*it)->str_len() > 0)
    583             {
    584                 NXPLOG_EXTNS_D("%s found %s=%s\n", __func__, p_name, (*it)->str_value());
    585             }
    586             else
    587             {
    588                 NXPLOG_EXTNS_D("%s found %s=(0x%lx)\n", __func__, p_name, (*it)->numValue());
    589             }
    590             return *it;
    591         }
    592         else
    593             break;
    594     }
    595     return NULL;
    596 }
    597 
    598 /*******************************************************************************
    599 **
    600 ** Function:    CNfcConfig::clean()
    601 **
    602 ** Description: reset the setting array
    603 **
    604 ** Returns:     none
    605 **
    606 *******************************************************************************/
    607 void CNfcConfig::clean()
    608 {
    609     if (size() == 0)
    610         return;
    611 
    612     for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
    613         delete *it;
    614     clear();
    615 }
    616 
    617 /*******************************************************************************
    618 **
    619 ** Function:    CNfcConfig::Add()
    620 **
    621 ** Description: add a setting object to the list
    622 **
    623 ** Returns:     none
    624 **
    625 *******************************************************************************/
    626 void CNfcConfig::add(const CNfcParam* pParam)
    627 {
    628     if (m_list.size() == 0)
    629     {
    630         m_list.push_back(pParam);
    631         return;
    632     }
    633     for (list<const CNfcParam*>::iterator it = m_list.begin(), itEnd = m_list.end(); it != itEnd; ++it)
    634     {
    635         if (**it < pParam->c_str())
    636             continue;
    637         m_list.insert(it, pParam);
    638         return;
    639     }
    640     m_list.push_back(pParam);
    641 }
    642 
    643 /*******************************************************************************
    644 **
    645 ** Function:    CNfcConfig::moveFromList()
    646 **
    647 ** Description: move the setting object from list to array
    648 **
    649 ** Returns:     none
    650 **
    651 *******************************************************************************/
    652 void CNfcConfig::moveFromList()
    653 {
    654     if (m_list.size() == 0)
    655         return;
    656 
    657     for (list<const CNfcParam*>::iterator it = m_list.begin(), itEnd = m_list.end(); it != itEnd; ++it)
    658         push_back(*it);
    659     m_list.clear();
    660 }
    661 
    662 /*******************************************************************************
    663 **
    664 ** Function:    CNfcConfig::moveToList()
    665 **
    666 ** Description: move the setting object from array to list
    667 **
    668 ** Returns:     none
    669 **
    670 *******************************************************************************/
    671 void CNfcConfig::moveToList()
    672 {
    673     if (m_list.size() != 0)
    674         m_list.clear();
    675 
    676     for (iterator it = begin(), itEnd = end(); it != itEnd; ++it)
    677         m_list.push_back(*it);
    678     clear();
    679 }
    680 
    681 #if 0
    682 /*******************************************************************************
    683 **
    684 ** Function:    CNfcConfig::checkTimestamp()
    685 **
    686 ** Description: check if config file has modified
    687 **
    688 ** Returns:     0 if not modified, 1 otherwise.
    689 **
    690 *******************************************************************************/
    691 int CNfcConfig::checkTimestamp()
    692 {
    693     FILE*   fd;
    694     struct stat st;
    695     unsigned long value = 0;
    696     int ret = 0;
    697 
    698     if(stat(config_timestamp_path, &st) != 0)
    699     {
    700         ALOGD("%s file %s not exist, creat it.\n", __func__, config_timestamp_path);
    701         if ((fd = fopen(config_timestamp_path, "w+")) != NULL)
    702         {
    703             fwrite(&m_timeStamp, sizeof(unsigned long), 1, fd);
    704             fclose(fd);
    705         }
    706         return 1;
    707     }
    708     else
    709     {
    710         fd = fopen(config_timestamp_path, "r+");
    711         if(fd == NULL)
    712         {
    713             ALOGE("%s Cannot open file %s\n", __func__, config_timestamp_path);
    714             return 1;
    715         }
    716 
    717         fread(&value, sizeof(unsigned long), 1, fd);
    718         ret = (value != m_timeStamp);
    719         if(ret)
    720         {
    721             fseek(fd, 0, SEEK_SET);
    722             fwrite(&m_timeStamp, sizeof(unsigned long), 1, fd);
    723         }
    724         fclose(fd);
    725     }
    726     return ret;
    727 }
    728 
    729 #endif
    730 /*******************************************************************************
    731 **
    732 ** Function:    CNfcConfig::checkforTimestamp()
    733 **
    734 ** Description: check if config file has modified
    735 **
    736 ** Returns:     0 if not modified, 1 otherwise.
    737 **
    738 *******************************************************************************/
    739 int CNfcConfig::checkTimestamp()
    740 {
    741     FILE*   fd;
    742     struct stat st;
    743     unsigned long value = 0;
    744     int ret = 0;
    745 
    746     if(stat(config_timestamp_path, &st) != 0)
    747     {
    748         ALOGD("%s file not exist.\n", __func__);
    749         return 1;
    750     }
    751     else
    752     {
    753         fd = fopen(config_timestamp_path, "r+");
    754         if(fd == NULL)
    755         {
    756             ALOGE("%s Cannot open file %s\n", __func__, config_timestamp_path);
    757             return 1;
    758         }
    759 
    760         fread(&value, sizeof(unsigned long), 1, fd);
    761         ret = (value != m_timeStamp);
    762         fclose(fd);
    763     }
    764     return ret;
    765 }
    766 
    767 /*******************************************************************************
    768 **
    769 ** Function:    CNfcConfig::updateTimestamp()
    770 **
    771 ** Description: update if config file has modified
    772 **
    773 ** Returns:     0 if not modified, 1 otherwise.
    774 **
    775 *******************************************************************************/
    776 int CNfcConfig::updateTimestamp()
    777 {
    778     FILE*   fd;
    779     struct stat st;
    780     unsigned long value = 0;
    781     int ret = 0;
    782 
    783     if(stat(config_timestamp_path, &st) != 0)
    784     {
    785         ALOGD("%s file %s not exist, creat it.\n", __func__, config_timestamp_path);
    786         if ((fd = fopen(config_timestamp_path, "w+")) != NULL)
    787         {
    788             fwrite(&m_timeStamp, sizeof(unsigned long), 1, fd);
    789             fclose(fd);
    790         }
    791         return 1;
    792     }
    793     else
    794     {
    795         fd = fopen(config_timestamp_path, "r+");
    796         if(fd == NULL)
    797         {
    798             ALOGE("%s Cannot open file %s\n", __func__, config_timestamp_path);
    799             return 1;
    800         }
    801 
    802         fread(&value, sizeof(unsigned long), 1, fd);
    803         ret = (value != m_timeStamp);
    804         if(ret)
    805         {
    806             fseek(fd, 0, SEEK_SET);
    807             fwrite(&m_timeStamp, sizeof(unsigned long), 1, fd);
    808         }
    809         fclose(fd);
    810     }
    811     return ret;
    812 }
    813 
    814 /*******************************************************************************
    815 **
    816 ** Function:    CNfcParam::CNfcParam()
    817 **
    818 ** Description: class constructor
    819 **
    820 ** Returns:     none
    821 **
    822 *******************************************************************************/
    823 CNfcParam::CNfcParam() :
    824     m_numValue(0)
    825 {
    826 }
    827 
    828 /*******************************************************************************
    829 **
    830 ** Function:    CNfcParam::~CNfcParam()
    831 **
    832 ** Description: class destructor
    833 **
    834 ** Returns:     none
    835 **
    836 *******************************************************************************/
    837 CNfcParam::~CNfcParam()
    838 {
    839 }
    840 
    841 /*******************************************************************************
    842 **
    843 ** Function:    CNfcParam::CNfcParam()
    844 **
    845 ** Description: class copy constructor
    846 **
    847 ** Returns:     none
    848 **
    849 *******************************************************************************/
    850 CNfcParam::CNfcParam(const char* name,  const string& value) :
    851     string(name),
    852     m_str_value(value),
    853     m_numValue(0)
    854 {
    855 }
    856 
    857 /*******************************************************************************
    858 **
    859 ** Function:    CNfcParam::CNfcParam()
    860 **
    861 ** Description: class copy constructor
    862 **
    863 ** Returns:     none
    864 **
    865 *******************************************************************************/
    866 CNfcParam::CNfcParam(const char* name,  unsigned long value) :
    867     string(name),
    868     m_numValue(value)
    869 {
    870 }
    871 
    872 /*******************************************************************************
    873 **
    874 ** Function:    GetStrValue
    875 **
    876 ** Description: API function for getting a string value of a setting
    877 **
    878 ** Returns:     True if found, otherwise False.
    879 **
    880 *******************************************************************************/
    881 extern "C" int GetNxpStrValue(const char* name, char* pValue, unsigned long len)
    882 {
    883     CNfcConfig& rConfig = CNfcConfig::GetInstance();
    884 
    885     return rConfig.getValue(name, pValue, len);
    886 }
    887 
    888 /*******************************************************************************
    889 **
    890 ** Function:    GetByteArrayValue()
    891 **
    892 ** Description: Read byte array value from the config file.
    893 **
    894 ** Parameters:
    895 **              name    - name of the config param to read.
    896 **              pValue  - pointer to input buffer.
    897 **              bufflen - input buffer length.
    898 **              len     - out parameter to return the number of bytes read from config file,
    899 **                        return -1 in case bufflen is not enough.
    900 **
    901 ** Returns:     TRUE[1] if config param name is found in the config file, else FALSE[0]
    902 **
    903 *******************************************************************************/
    904 extern "C" int GetNxpByteArrayValue(const char* name, char* pValue,long bufflen, long *len)
    905 {
    906     CNfcConfig& rConfig = CNfcConfig::GetInstance();
    907 
    908     return rConfig.getValue(name, pValue, bufflen,len);
    909 }
    910 
    911 /*******************************************************************************
    912 **
    913 ** Function:    GetNumValue
    914 **
    915 ** Description: API function for getting a numerical value of a setting
    916 **
    917 ** Returns:     true, if successful
    918 **
    919 *******************************************************************************/
    920 extern "C" int GetNxpNumValue(const char* name, void* pValue, unsigned long len)
    921 {
    922     if (!pValue)
    923         return false;
    924 
    925     CNfcConfig& rConfig = CNfcConfig::GetInstance();
    926     const CNfcParam* pParam = rConfig.find(name);
    927 
    928     if (pParam == NULL)
    929         return false;
    930     unsigned long v = pParam->numValue();
    931     if (v == 0 && pParam->str_len() > 0 && pParam->str_len() < 4)
    932     {
    933         const unsigned char* p = (const unsigned char*)pParam->str_value();
    934         for (unsigned int i = 0 ; i < pParam->str_len(); ++i)
    935         {
    936             v *= 256;
    937             v += *p++;
    938         }
    939     }
    940     switch (len)
    941     {
    942     case sizeof(unsigned long):
    943         *(static_cast<unsigned long*>(pValue)) = (unsigned long)v;
    944         break;
    945     case sizeof(unsigned short):
    946         *(static_cast<unsigned short*>(pValue)) = (unsigned short)v;
    947         break;
    948     case sizeof(unsigned char):
    949         *(static_cast<unsigned char*> (pValue)) = (unsigned char)v;
    950         break;
    951     default:
    952         return false;
    953     }
    954     return true;
    955 }
    956 
    957 /*******************************************************************************
    958 **
    959 ** Function:    resetConfig
    960 **
    961 ** Description: reset settings array
    962 **
    963 ** Returns:     none
    964 **
    965 *******************************************************************************/
    966 extern "C" void resetNxpConfig()
    967 
    968 {
    969     CNfcConfig& rConfig = CNfcConfig::GetInstance();
    970 
    971     rConfig.clean();
    972 }
    973 
    974 /*******************************************************************************
    975 **
    976 ** Function:    readOptionalConfig()
    977 **
    978 ** Description: read Config settings from an optional conf file
    979 **
    980 ** Returns:     none
    981 **
    982 *******************************************************************************/
    983 void readOptionalConfig(const char* extra)
    984 {
    985     string strPath;
    986     strPath.assign(transport_config_path);
    987     if (alternative_config_path[0] != '\0')
    988         strPath.assign(alternative_config_path);
    989 
    990     strPath += extra_config_base;
    991     strPath += extra;
    992     strPath += extra_config_ext;
    993     CNfcConfig::GetInstance().readConfig(strPath.c_str(), false);
    994 }
    995 
    996 /*******************************************************************************
    997 **
    998 ** Function:    isNxpConfigModified()
    999 **
   1000 ** Description: check if config file has modified
   1001 **
   1002 ** Returns:     0 if not modified, 1 otherwise.
   1003 **
   1004 *******************************************************************************/
   1005 extern "C" int isNxpConfigModified()
   1006 {
   1007     CNfcConfig& rConfig = CNfcConfig::GetInstance();
   1008     return rConfig.checkTimestamp();
   1009 }
   1010 
   1011 /*******************************************************************************
   1012 **
   1013 ** Function:    updateNxpConfigTimestamp()
   1014 **
   1015 ** Description: update if config file has modified
   1016 **
   1017 ** Returns:     0 if not modified, 1 otherwise.
   1018 **
   1019 *******************************************************************************/
   1020 extern "C" int updateNxpConfigTimestamp()
   1021 {
   1022     CNfcConfig& rConfig = CNfcConfig::GetInstance();
   1023     return rConfig.updateTimestamp();
   1024 }
   1025