• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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