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