1 /******************************************************************************
2 *
3 * Copyright (C) 2014 Google, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 #define LOG_TAG "bt_btif_config_transcode"
20
21 #include <tinyxml2.h>
22
23 extern "C" {
24 #include "osi/include/config.h"
25 #include "osi/include/log.h"
26 }
27
28 using namespace tinyxml2;
29
btif_config_transcode(const char * xml_filename)30 extern "C" config_t *btif_config_transcode(const char *xml_filename) {
31 XMLDocument document;
32 int error = document.LoadFile(xml_filename);
33 if (error != XML_SUCCESS) {
34 LOG_ERROR("%s unable to load XML file '%s': %d", __func__, xml_filename, error);
35 return NULL;
36 }
37
38 XMLElement *rootElement = document.RootElement();
39 if (!rootElement) {
40 LOG_ERROR("%s unable to find root element; assuming corrupted config file.", __func__);
41 return NULL;
42 }
43
44 config_t *config = config_new_empty();
45 if (!config) {
46 LOG_ERROR("%s unable to allocate config object.", __func__);
47 return NULL;
48 }
49
50 for (XMLElement *i = rootElement->FirstChildElement(); i != NULL; i = i->NextSiblingElement())
51 for (XMLElement *j = i->FirstChildElement(); j != NULL; j = j->NextSiblingElement()) {
52 const char *section = j->Attribute("Tag");
53 for (XMLElement *k = j->FirstChildElement(); k != NULL; k = k->NextSiblingElement()) {
54 const char *key = k->Attribute("Tag");
55 const char *value = k->GetText();
56 if (section && key && value)
57 config_set_string(config, section, key, value);
58 }
59 }
60
61 return config;
62 }
63