version 0.1.13
[fms.git] / src / freenet / trustlistxml.cpp
1 #include "../../include/freenet/trustlistxml.h"\r
2 #include "../../include/stringfunctions.h"\r
3 \r
4 #include <algorithm>\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 TrustListXML::TrustListXML()\r
11 {\r
12         Initialize();\r
13 }\r
14 \r
15 void TrustListXML::AddTrust(const std::string &identity, const long messagetrust, const long trustlisttrust)\r
16 {\r
17         m_trust.push_back(trust(identity,messagetrust,trustlisttrust));\r
18 }\r
19 \r
20 std::string TrustListXML::GetIdentity(const long index)\r
21 {\r
22         if(index>=0 && index<m_trust.size())\r
23         {\r
24                 return m_trust[index].m_identity;\r
25         }\r
26         else\r
27         {\r
28                 return "";\r
29         }\r
30 }\r
31 \r
32 long TrustListXML::GetMessageTrust(const long index)\r
33 {\r
34         if(index>=0 && index<m_trust.size())\r
35         {\r
36                 return m_trust[index].m_messagetrust;\r
37         }\r
38         else\r
39         {\r
40                 return -1;\r
41         }       \r
42 }\r
43 \r
44 long TrustListXML::GetTrustListTrust(const long index)\r
45 {\r
46         if(index>=0 && index<m_trust.size())\r
47         {\r
48                 return m_trust[index].m_trustlisttrust;\r
49         }\r
50         else\r
51         {\r
52                 return -1;\r
53         }\r
54 }\r
55 \r
56 std::string TrustListXML::GetXML()\r
57 {\r
58         TiXmlDocument td;\r
59         TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
60         TiXmlElement *tid;\r
61         TiXmlPrinter tp;\r
62 \r
63         td.LinkEndChild(tdec);\r
64         tid=new TiXmlElement("TrustList");\r
65         td.LinkEndChild(tid);\r
66 \r
67         for(std::vector<trust>::iterator i=m_trust.begin(); i!=m_trust.end(); i++)\r
68         {\r
69                 std::string messagetrust;\r
70                 std::string trustlisttrust;\r
71                 StringFunctions::Convert((*i).m_messagetrust,messagetrust);\r
72                 StringFunctions::Convert((*i).m_trustlisttrust,trustlisttrust);\r
73                 TiXmlElement *tr=new TiXmlElement("Trust");\r
74                 tid->LinkEndChild(tr);\r
75                 tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
76                 if((*i).m_messagetrust>=0)\r
77                 {\r
78                         tr->LinkEndChild(XMLCreateTextElement("MessageTrustLevel",messagetrust));\r
79                 }\r
80                 if((*i).m_trustlisttrust>=0)\r
81                 {\r
82                         tr->LinkEndChild(XMLCreateTextElement("TrustListTrustLevel",trustlisttrust));\r
83                 }\r
84         }\r
85 \r
86         td.Accept(&tp);\r
87         return std::string(tp.CStr());\r
88 }\r
89 \r
90 void TrustListXML::Initialize()\r
91 {\r
92         m_trust.clear();\r
93 }\r
94 \r
95 const bool TrustListXML::ParseXML(const std::string &xml)\r
96 {\r
97         TiXmlDocument td;\r
98         td.Parse(xml.c_str());\r
99 \r
100         if(!td.Error())\r
101         {\r
102                 std::string identity;\r
103                 std::string messagetruststr;\r
104                 std::string trustlisttruststr;\r
105                 long messagetrust;\r
106                 long trustlisttrust;\r
107                 TiXmlText *txt;\r
108                 TiXmlHandle hnd(&td);\r
109                 TiXmlNode *node;\r
110                 std::vector<std::string> m_foundkeys;\r
111 \r
112                 Initialize();\r
113 \r
114                 node=hnd.FirstChild("TrustList").FirstChild("Trust").ToElement();\r
115                 while(node)\r
116                 {\r
117                         identity="";\r
118                         messagetrust=-1;\r
119                         trustlisttrust=-1;\r
120 \r
121                         TiXmlHandle hnd2(node);\r
122                         txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
123                         if(txt)\r
124                         {\r
125                                 identity=txt->ValueStr();\r
126                         }\r
127                         txt=hnd2.FirstChild("MessageTrustLevel").FirstChild().ToText();\r
128                         if(txt)\r
129                         {\r
130                                 messagetruststr=txt->ValueStr();\r
131                                 if(messagetruststr!="")\r
132                                 {\r
133                                         StringFunctions::Convert(messagetruststr,messagetrust);\r
134                                 }\r
135                         }\r
136                         txt=hnd2.FirstChild("TrustListTrustLevel").FirstChild().ToText();\r
137                         if(txt)\r
138                         {\r
139                                 trustlisttruststr=txt->ValueStr();\r
140                                 if(trustlisttruststr!="")\r
141                                 {\r
142                                         StringFunctions::Convert(trustlisttruststr,trustlisttrust);\r
143                                 }\r
144                         }\r
145 \r
146                         if(identity!="" && messagetrust>=-1 && messagetrust<=100 && trustlisttrust>=-1 && trustlisttrust<=100)\r
147                         {\r
148                                 // check so we don't add the same identity multiple times from a trust list\r
149                                 if(std::find(m_foundkeys.begin(),m_foundkeys.end(),identity)==m_foundkeys.end())\r
150                                 {\r
151                                         m_foundkeys.push_back(identity);\r
152                                         m_trust.push_back(trust(identity,messagetrust,trustlisttrust));\r
153                                 }\r
154                         }\r
155                         else\r
156                         {\r
157                                 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"TrustListXML::ParseXML malformed Trust in TrustList.xml");\r
158                         }\r
159                         \r
160                         node=node->NextSibling("Trust");\r
161                 }\r
162                 return true;\r
163 \r
164         }\r
165         else\r
166         {\r
167                 return false;\r
168         }\r
169 }\r