19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ValuesFile.h"
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "XMLHandler.h"
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <algorithm>
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <expat.h>
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace std;
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const ANDROID_XMLNS = "http://schemas.android.com/apk/res/android";
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const XLIFF_XMLNS = "urn:oasis:names:tc:xliff:document:1.2";
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char *const NS_MAP[] = {
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "android", ANDROID_XMLNS,
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "xliff", XLIFF_XMLNS,
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    NULL, NULL
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst XMLNamespaceMap ANDROID_NAMESPACES(NS_MAP);
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =====================================================================================
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ArrayHandler : public XMLHandler
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ArrayHandler(ValuesFile* vf, int version, const string& versionString, const string& id);
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnStartElement(const SourcePos& pos, const string& ns, const string& name,
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const vector<XMLAttribute>& attrs, XMLHandler** next);
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnText(const SourcePos& pos, const string& text);
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnComment(const SourcePos& pos, const string& text);
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ValuesFile* m_vf;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int m_version;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int m_index;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string m_versionString;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string m_id;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string m_comment;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectArrayHandler::ArrayHandler(ValuesFile* vf, int version, const string& versionString,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            const string& id)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    :m_vf(vf),
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_version(version),
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_index(0),
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_versionString(versionString),
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_id(id)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectArrayHandler::OnStartElement(const SourcePos& pos, const string& ns, const string& name,
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const vector<XMLAttribute>& attrs, XMLHandler** next)
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ns == "" && name == "item") {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XMLNode* node = XMLNode::NewElement(pos, ns, name, attrs, XMLNode::EXACT);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_vf->AddString(StringResource(pos, pos.file, m_vf->GetConfiguration(),
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            m_id, m_index, node, m_version, m_versionString,
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            trim_string(m_comment)));
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *next = new NodeHandler(node, XMLNode::EXACT);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_index++;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_comment = "";
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pos.Error("invalid <%s> element inside <array>\n", name.c_str());
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectArrayHandler::OnText(const SourcePos& pos, const string& text)
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectArrayHandler::OnComment(const SourcePos& pos, const string& text)
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    m_comment += text;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =====================================================================================
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ValuesHandler : public XMLHandler
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ValuesHandler(ValuesFile* vf, int version, const string& versionString);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnStartElement(const SourcePos& pos, const string& ns, const string& name,
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const vector<XMLAttribute>& attrs, XMLHandler** next);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnText(const SourcePos& pos, const string& text);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual int OnComment(const SourcePos& pos, const string& text);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ValuesFile* m_vf;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int m_version;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string m_versionString;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string m_comment;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesHandler::ValuesHandler(ValuesFile* vf, int version, const string& versionString)
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    :m_vf(vf),
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_version(version),
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_versionString(versionString)
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesHandler::OnStartElement(const SourcePos& pos, const string& ns, const string& name,
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const vector<XMLAttribute>& attrs, XMLHandler** next)
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (ns == "" && name == "string") {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        string id = XMLAttribute::Find(attrs, "", "name", "");
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XMLNode* node = XMLNode::NewElement(pos, ns, name, attrs, XMLNode::EXACT);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_vf->AddString(StringResource(pos, pos.file, m_vf->GetConfiguration(),
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            id, -1, node, m_version, m_versionString,
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            trim_string(m_comment)));
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *next = new NodeHandler(node, XMLNode::EXACT);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else if (ns == "" && name == "array") {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        string id = XMLAttribute::Find(attrs, "", "name", "");
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *next = new ArrayHandler(m_vf, m_version, m_versionString, id);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    m_comment = "";
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesHandler::OnText(const SourcePos& pos, const string& text)
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesHandler::OnComment(const SourcePos& pos, const string& text)
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    m_comment += text;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return 0;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// =====================================================================================
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::ValuesFile(const Configuration& config)
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    :m_config(config),
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_strings(),
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     m_arrays()
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::~ValuesFile()
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile*
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::ParseFile(const string& filename, const Configuration& config,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int version, const string& versionString)
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ValuesFile* result = new ValuesFile(config);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TopElementHandler top("", "resources", new ValuesHandler(result, version, versionString));
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XMLHandler::ParseFile(filename, &top);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile*
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::ParseString(const string& filename, const string& text, const Configuration& config,
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int version, const string& versionString)
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ValuesFile* result = new ValuesFile(config);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    TopElementHandler top("", "resources", new ValuesHandler(result, version, versionString));
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XMLHandler::ParseString(filename, text, &top);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst Configuration&
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::GetConfiguration() const
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return m_config;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::AddString(const StringResource& str)
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (str.index < 0) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_strings.insert(str);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        m_arrays[str.id].insert(str);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectset<StringResource>
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::GetStrings() const
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    set<StringResource> result = m_strings;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (map<string,set<StringResource> >::const_iterator it = m_arrays.begin();
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            it != m_arrays.end(); it++) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.insert(it->second.begin(), it->second.end());
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectXMLNode*
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::ToXMLNode() const
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XMLNode* root;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // <resources>
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vector<XMLAttribute> attrs;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ANDROID_NAMESPACES.AddToAttributes(&attrs);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root = XMLNode::NewElement(GENERATED_POS, "", "resources", attrs, XMLNode::PRETTY);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // <array>
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (map<string,set<StringResource> >::const_iterator it = m_arrays.begin();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            it != m_arrays.end(); it++) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vector<XMLAttribute> arrayAttrs;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        arrayAttrs.push_back(XMLAttribute("", "name", it->first));
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const set<StringResource>& items = it->second;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XMLNode* arrayNode = XMLNode::NewElement(items.begin()->pos, "", "array", arrayAttrs,
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                XMLNode::PRETTY);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root->EditChildren().push_back(arrayNode);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // <item>
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (set<StringResource>::const_iterator item = items.begin();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                item != items.end(); item++) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            XMLNode* itemNode = item->value->Clone();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            itemNode->SetName("", "item");
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            itemNode->EditAttributes().clear();
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            arrayNode->EditChildren().push_back(itemNode);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // <string>
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (set<StringResource>::const_iterator it=m_strings.begin(); it!=m_strings.end(); it++) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const StringResource& str = *it;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        vector<XMLAttribute> attrs;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        XMLNode* strNode = str.value->Clone();
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        strNode->SetName("", "string");
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        strNode->EditAttributes().clear();
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        strNode->EditAttributes().push_back(XMLAttribute("", "name", str.id));
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        root->EditChildren().push_back(strNode);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return root;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstring
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValuesFile::ToString() const
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    XMLNode* xml = ToXMLNode();
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    string s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += xml->ToString(ANDROID_NAMESPACES);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete xml;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    s += '\n';
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return s;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
267