15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h>
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/types.h>
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/stat.h>
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/statfs.h>
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/vfs.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <dirent.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <limits.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/file.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/mman.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_config.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_config_util.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef ANDROID_NDK
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define ANDROID_NDK
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "tinyxml2.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef FALSE
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define TRUE 1
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define FALSE 0
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "btif_config_util"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern "C" {
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_sock_util.h"
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <cutils/log.h>
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define info(fmt, ...)  ALOGI ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define debug(fmt, ...) ALOGD ("%s(L%d): " fmt,__FUNCTION__, __LINE__,  ## __VA_ARGS__)
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define warn(fmt, ...) ALOGW ("## WARNING : %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define error(fmt, ...) ALOGE ("## ERROR : %s(L%d): " fmt "##",__FUNCTION__, __LINE__, ## __VA_ARGS__)
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define asrt(s) if(!(s)) ALOGE ("## %s assert %s failed at line:%d ##",__FUNCTION__, #s, __LINE__)
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BLUEDROID_ROOT "Bluedroid"
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BLUEDROID_NAME_TAG "Tag"
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BLUEDROID_VALUE_TYPE "Type"
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BLUEDROID_TAG_REMOTE_DEVICE "Remote Devices"
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectusing namespace tinyxml2;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstruct enum_user_data
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* sn; //current section name
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* kn; //current key name
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* vn; //current value name
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int si, ki, vi;
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLDocument* xml;
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLElement* se;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLElement* ke;
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLElement* ve;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int type_str2int(const char* type);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* type_int2str(int type);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void create_ele_name(int index, char* element, int len);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline int validate_ele_name(const char* key);
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int parse_sections(const char* section_name, const XMLElement* section);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void enum_config(void* user_data, const char* section, const char* key, const char* name,
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          const char*  value, int bytes, int type);
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void bytes2hex(const char* data, int bytes, char* str)
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static const char* hex_table = "0123456789abcdef";
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(int i = 0; i < bytes; i++)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *str = hex_table[(data[i] >> 4) & 0xf];
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ++str;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *str = hex_table[data[i] & 0xf];
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ++str;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *str = 0;
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline int hex2byte(char hex)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if('0' <= hex && hex <= '9')
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return hex - '0';
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if('a' <= hex && hex <= 'z')
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return hex - 'a' + 0xa;
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if('A' <= hex && hex <= 'Z')
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return hex - 'A' + 0xa;
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return -1;
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline int trim_bin_str_value(const char** str)
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(**str == ' ' || **str == '\r' || **str == '\t' || **str == '\n')
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*str)++;
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int len = 0;
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* s = *str;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(*s && *s != ' ' && *s != '\r' && *s != '\t' && *s != '\n')
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len++;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        s++;
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline bool hex2bytes(const char* str, int len, char* data)
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(len % 2)
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        error("cannot convert odd len hex str: %s, len:%d to binary", str, len);
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return false;
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(int i = 0; i < len; i+= 2)
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int d = hex2byte(str[i]);
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(d < 0)
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            error("cannot convert hex: %s, len:%d to binary", str, len);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return false;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *data = (char)(d << 4);
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d = hex2byte(str[i+1]);
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(d < 0)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            error("cannot convert hex: %s, len:%d to binary", str, len);
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return false;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *data++ |= (char)d;
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return true;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void reverse_bin(char *bin, int size)
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(int i = 0; i < size /2; i++)
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int b = bin[i];
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bin[i] = bin[size - i - 1];
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bin[size -i  - 1] = b;
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project////////////////////////////////////////////////////////////////////////////////////////////////////////
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_config_save_file(const char* file_name)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    debug("in file name:%s", file_name);
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLDocument xml;
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLElement* root = xml.NewElement(BLUEDROID_ROOT);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    xml.InsertFirstChild(root);
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    enum_user_data data;
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&data, 0, sizeof(data));
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    data.xml = &xml;
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(btif_config_enum(enum_config, &data))
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ret = xml.SaveFile(file_name) == XML_SUCCESS;
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_config_load_file(const char* file_name)
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //if(access(file_name, 0) != 0)
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //    return XML_ERROR_FILE_NOT_FOUND;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLDocument xml;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int err = xml.LoadFile(file_name);
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const XMLElement* root = xml.RootElement();
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(err == XML_SUCCESS && root && strcmp(root->Name(), BLUEDROID_ROOT) == 0)
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        const XMLElement* section;
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(section = root->FirstChildElement(); section; section = section->NextSiblingElement())
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            //debug("section tag:%s", section->Name());
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(validate_ele_name(section->Name()))
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                const char* section_name = section->Attribute(BLUEDROID_NAME_TAG);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(section_name && *section_name)
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if(parse_sections(section_name, section))
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret = TRUE;
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//////////////////////////////////////////////////////////////////////////////////////////////////////////
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int parse_sections(const char* section_name, const XMLElement* section)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const XMLElement* key;
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in");
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(key = section->FirstChildElement(); key; key = key->NextSiblingElement())
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("key tag:%s", key->Name());
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(validate_ele_name(key->Name()))
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            const char* key_name = key->Attribute(BLUEDROID_NAME_TAG);
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            //debug("key name:%s", key_name);
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(key_name && *key_name)
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                const XMLElement* value;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                for(value = key->FirstChildElement(); value; value = value->NextSiblingElement())
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    const char* value_name = value->Attribute(BLUEDROID_NAME_TAG);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    const char* value_type = value->Attribute(BLUEDROID_VALUE_TYPE);
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    //debug("value ele name:%s, section name:%s, key name:%s, value name:%s, value type:%s",
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    //        value->Name(), section_name, key_name, value_name, value_type);
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    int type = type_str2int(value_type);
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if(value_name && *value_name && type != BTIF_CFG_TYPE_INVALID)
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        const char* value_str = value->GetText() ? value->GetText() : "";
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        //debug("value_name:%s, value_str:%s, value_type:%s, type:%x",
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        //       value_name, value_str, value_type, type);
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if(type & BTIF_CFG_TYPE_STR)
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            btif_config_set_str(section_name, key_name, value_name, value_str);
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else if(type & BTIF_CFG_TYPE_INT)
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if(*value_str)
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            {
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                int v = atoi(value_str);
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btif_config_set_int(section_name, key_name, value_name, v);
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            }
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else if(type & BTIF_CFG_TYPE_BIN)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            int len = trim_bin_str_value(&value_str);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if(len > 0 && len % 2 == 0)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                char *bin = (char*)alloca(len / 2);
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                if(hex2bytes(value_str, len, bin))
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    btif_config_set(section_name, key_name, value_name, bin, len/2, BTIF_CFG_TYPE_BIN);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            }
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        else error("Unsupported value:%s, type:%s not loaded", value_name, value_type);
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out");
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline XMLElement* add_ele(XMLDocument* xml, XMLElement* p, int index,
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  const char* name_tag, const char* value_type = NULL)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, tag:%s", name_tag);
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char ele_name[128] = {0};
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    create_ele_name(index, ele_name, sizeof(ele_name));
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    XMLElement* ele = xml->NewElement(ele_name);
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("ele name:%s, tag:%s, index:%d, value type:%s", ele_name, name_tag, index, value_type);
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ele->SetAttribute(BLUEDROID_NAME_TAG, name_tag);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(value_type && *value_type)
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ele->SetAttribute(BLUEDROID_VALUE_TYPE, value_type);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p->InsertEndChild(ele);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, tag:%s", name_tag);
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ele;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void enum_config(void* user_data, const char* section_name, const char* key_name, const char* value_name,
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        const char*  value, int bytes, int type)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    enum_user_data& d = *(enum_user_data*)user_data;
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, key:%s, value:%s", key_name, value_name);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("section name:%s, key name:%s, value name:%s, value type:%s",
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //                      section_name, key_name, value_name, type_int2str(type));
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(type & BTIF_CFG_TYPE_VOLATILE)
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return; //skip any volatile value
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(d.sn != section_name)
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.sn = section_name;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.se = add_ele(d.xml, d.xml->RootElement(), ++d.si, section_name);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.ki = 0;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(d.kn != key_name)
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.kn = key_name;
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.ke = add_ele(d.xml, d.se, ++d.ki, key_name);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        d.vi = 0;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(d.vn != value_name)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(type & BTIF_CFG_TYPE_STR)
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.vn = value_name;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve = add_ele(d.xml, d.ke, ++d.vi, value_name, type_int2str(type));
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve->InsertFirstChild(d.xml->NewText(value));
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if(type & BTIF_CFG_TYPE_INT)
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.vn = value_name;
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve = add_ele(d.xml, d.ke, ++d.vi, value_name, type_int2str(type));
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            char value_str[64] = {0};
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            snprintf(value_str, sizeof(value_str), "%d", *(int*)value);
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve->InsertFirstChild(d.xml->NewText(value_str));
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if(type & BTIF_CFG_TYPE_BIN)
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.vn = value_name;
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve = add_ele(d.xml, d.ke, ++d.vi, value_name, type_int2str(type));
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            char* value_str = (char*)alloca(bytes*2 + 1);
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bytes2hex(value, bytes, value_str);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            d.ve->InsertFirstChild(d.xml->NewText(value_str));
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else error("unsupported config value name:%s, type:%s not saved", d.vn, type_int2str(type));
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, key:%s, value:%s", key_name, value_name);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int type_str2int(const char* type)
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(strcmp(type, "int") == 0)
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTIF_CFG_TYPE_INT;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(strcmp(type, "binary") == 0)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTIF_CFG_TYPE_BIN;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(type == 0 || *type == 0 || strcmp(type, "string") == 0)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return  BTIF_CFG_TYPE_STR;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    error("unknown value type:%s", type);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTIF_CFG_TYPE_INVALID;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* type_int2str(int type)
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(type)
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_CFG_TYPE_INT:
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "int";
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_CFG_TYPE_BIN:
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "binary";
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_CFG_TYPE_STR:
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "string";
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            error("unknown type:%d", type);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void create_ele_name(int index, char* element, int len)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    snprintf(element, len, "N%d", index);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline int validate_ele_name(const char* key)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //must be 'N' followed with numbers
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(key && *key == 'N' && *++key)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while(*key)
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(*key < '0' || *key > '9')
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return FALSE;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ++key;
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int open_file_map(const char *pathname, const char**map, int* size)
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct stat st;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    st.st_size = 0;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in");
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((fd = open(pathname, O_RDONLY)) >= 0)
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("fd:%d", fd);
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(fstat(fd, &st) == 0 && st.st_size)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *size = st.st_size;
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *map = (const char*)mmap(NULL, *size, PROT_READ, MAP_SHARED, fd, 0);
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(*map && *map != MAP_FAILED)
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //debug("out map:%p, size:%d", *map, *size);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return fd;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, failed");
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return -1;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void close_file_map(int fd, const char* map, int size)
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    munmap((void*)map, size);
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close(fd);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int read_file_line(const char* map, int start_pos, int size, int* line_size)
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *line_size = 0;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, start pos:%d, size:%d", start_pos, size);
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i = start_pos; i < size; i++)
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(map[i] == '\r' || map[i] == '\n')
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
396689d66b6559dcb3a0ad7f6cc33b6129e50910253The Android Open Source Project         ++*line_size;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, ret:%d, start pos:%d, size:%d, line_size:%d", i, start_pos, size, *line_size);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return i + 1;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* find_value_line(const char* map, int size, const char *key, int* value_size)
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int key_len = strlen(key);
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i = 0; i < size; i++)
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(map[i] == *key)
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(i + key_len + 1 > size)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return NULL;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(memcmp(map + i, key, key_len) == 0)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                read_file_line(map, i + key_len + 1, size, value_size);
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(*value_size)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return map + i + key_len + 1;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int read_line_word(const char* line, int start_pos, int line_size, char* word, int *word_size, bool lower_case = false)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //skip space
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, line start_pos:%d, line_size:%d", start_pos, line_size);
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i = start_pos; i < line_size; i++)
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("skip space loop, line[%d]:%c", i, line[i]);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(line[i] != ' ' && line[i] != '\t' && line[i] != '\r' && line[i] !='\n')
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *word_size = 0;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(; i < line_size; i++)
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("add word loop, line[%d]:%c", i, line[i]);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(line[i] != ' ' && line[i] != '\t' && line[i] != '\r' && line[i] !='\n')
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ++*word_size;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(lower_case && 'A' <= line[i] && line[i] <= 'Z')
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *word++ = 'a' - 'A' + line[i];
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *word++ = line[i];
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else break;
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *word = 0;
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, ret:%d, word:%s, word_size:%d, line start_pos:%d, line_size:%d",
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //            i, word, *word_size, start_pos, line_size);
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return i;
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int is_valid_bd_addr(const char* addr)
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int len = strlen(addr);
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("addr: %s, len:%d", addr, len);
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len == 17 && addr[2] == ':' && addr[5] == ':' && addr[14] == ':';
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int load_bluez_cfg_value(const char* adapter_path, const char* file_name)
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in");
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* map = NULL;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int size = 0;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char path[256];
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    snprintf(path, sizeof(path), "%s/%s", adapter_path, file_name);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd = open_file_map(path, &map, &size);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, path:%s, fd:%d, size:%d", path, fd, size);
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(fd < 0 || size == 0)
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        error("open_file_map fail, fd:%d, path:%s, size:%d", fd, path, size);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("out");
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //get local bt device name from bluez config
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int line_size = 0;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *value_line = find_value_line(map, size, "name", &line_size);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(value_line && line_size > 0)
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        char value[line_size + 1];
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(value, value_line, line_size);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        value[line_size] = 0;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("import local bt dev names:%s", value);
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_config_set_str("Local", "Adapter", "Name", value);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ret = TRUE;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_file_map(fd, map, size);
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, ret:%d", ret);
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint load_bluez_adapter_info(char* adapter_path, int size)
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct dirent *dptr;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DIR *dirp;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((dirp = opendir(BLUEZ_PATH)) != NULL)
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while((dptr = readdir(dirp)) != NULL)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            //debug("readdir: %s",dptr->d_name);
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(is_valid_bd_addr(dptr->d_name))
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                snprintf(adapter_path, size, "%s%s", BLUEZ_PATH, dptr->d_name);
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_config_set_str("Local", "Adapter", "Address", dptr->d_name);
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                load_bluez_cfg_value(adapter_path, BLUEZ_CONFIG);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret = TRUE;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        closedir(dirp);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline void upcase_addr(const char* laddr, char* uaddr, int size)
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i = 0; i < size && laddr[i]; i++)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uaddr[i] = ('a' <= laddr[i] && laddr[i] <= 'z') ?
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        laddr[i] - ('a' - 'A') : laddr[i];
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uaddr[i] = 0;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int load_bluez_dev_value(const char* adapter_path, const char* bd_addr,
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                const char* file_name, const char* cfg_value_name, int type)
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in");
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char addr[32];
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    upcase_addr(bd_addr, addr, sizeof(addr));
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* map = NULL;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int size = 0;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char path[256];
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    snprintf(path, sizeof(path), "%s/%s", adapter_path, file_name);
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd = open_file_map(path, &map, &size);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in, path:%s, addr:%s, fd:%d, size:%d", path, addr, fd, size);
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(fd < 0 || size == 0)
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        error("open_file_map fail, fd:%d, path:%s, size:%d", fd, path, size);
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("out");
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int line_size = 0;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *value_line = find_value_line(map, size, addr, &line_size);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(value_line && line_size)
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        char line[line_size + 1];
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(line, value_line, line_size);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        line[line_size] = 0;
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("addr:%s, Names:%s", bd_addr, line);
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(type == BTIF_CFG_TYPE_STR)
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_config_set_str("Remote", bd_addr, cfg_value_name, line);
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if(type == BTIF_CFG_TYPE_INT)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            int v = strtol(line, NULL, 16);
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            //filter out unspported devices by its class
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(strcmp(file_name, BLUEZ_CLASSES) == 0)
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                switch((v & 0x1f00) >> 8)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    case 0x5: //hid device
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        error("skip paired hid devices");
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        close_file_map(fd, map, size);
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        return FALSE;
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_config_set_int("Remote", bd_addr, cfg_value_name, v);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ret = TRUE;
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_file_map(fd, map, size);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, ret:%d", ret);
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic inline int bz2bd_linkkeytype(int type)
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 1
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return type;
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int table[5] = {0, 0, 0, 0, 0};
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(0 <= type && type < (int)(sizeof(table)/sizeof(int)))
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return table[type];
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint load_bluez_linkkeys(const char* adapter_path)
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char* map = NULL;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int size = 0;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int ret = FALSE;
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char path[256];
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("in");
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    snprintf(path, sizeof(path), "%s/%s", adapter_path, BLUEZ_LINKKEY);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd = open_file_map(path, &map, &size);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(fd < 0 || size == 0)
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        error("open_file_map fail, fd:%d, path:%s, size:%d", fd, path, size);
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("out");
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pos = 0;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("path:%s, size:%d", path, size);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(pos < size)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int line_size = 0;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        int next_pos = read_file_line(map, pos, size, &line_size);
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("pos:%d, next_pos:%d, size:%d, line_size:%d", pos, next_pos, size, line_size);
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(line_size)
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            const char* line = map + pos;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            char addr[line_size + 1];
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            int word_pos = 0;
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            int addr_size = 0;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            word_pos = read_line_word(line, word_pos, line_size, addr, &addr_size, true);
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            //debug("read_line_word addr:%s, addr_size:%d", addr, addr_size);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(*addr)
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                char value[line_size + 1];
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                int value_size = 0;
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //read link key
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                word_pos = read_line_word(line, word_pos, line_size, value, &value_size);
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                //debug("read_line_word linkkey:%s, size:%d", value, value_size);
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(*value)
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    int linkkey_size = value_size / 2;
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    char linkkey[linkkey_size];
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if(hex2bytes(value, value_size, linkkey))
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    { //read link key type
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        //bluez save the linkkey in reversed order
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        reverse_bin(linkkey, linkkey_size);
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        word_pos = read_line_word(line, word_pos,
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    line_size, value, &value_size);
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if(*value)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if(load_bluez_dev_value(adapter_path, addr,
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                BLUEZ_CLASSES, "DevClass", BTIF_CFG_TYPE_INT) &&
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               load_bluez_dev_value(adapter_path, addr,
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                BLUEZ_NAMES, "Name", BTIF_CFG_TYPE_STR) &&
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               load_bluez_dev_value(adapter_path, addr,
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                BLUEZ_TYPES, "DevType", BTIF_CFG_TYPE_INT) &&
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               load_bluez_dev_value(adapter_path, addr,
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                BLUEZ_PROFILES, "Service", BTIF_CFG_TYPE_STR))
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            {
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                load_bluez_dev_value(adapter_path, addr,
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                BLUEZ_ALIASES, "Aliase", BTIF_CFG_TYPE_STR);
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                int key_type = bz2bd_linkkeytype(atoi(value));
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                //read pin len
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                word_pos = read_line_word(line, word_pos, line_size, value, &value_size);
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                if(*value)
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                {
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    int pin_len = atoi(value);
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    ret = TRUE;
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    btif_config_set("Remote", addr, "LinkKey", linkkey,
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                                    linkkey_size, BTIF_CFG_TYPE_BIN);
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    //dump_bin("import bluez linkkey", linkkey, linkkey_size);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    btif_config_set_int("Remote", addr, "LinkKeyType", key_type);
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    btif_config_set_int("Remote", addr, "PinLength", pin_len);
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                }
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            }
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //debug("pos:%d, next_pos:%d, size:%d, line_size:%d", pos, next_pos, size, line_size);
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pos = next_pos;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_file_map(fd, map, size);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //debug("out, ret:%d", ret);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675