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