39fb02769b634a29bb8c80fc96b42771c9d859ed
[fms.git] / src / freenet / fmsversionrequester.cpp
1 #include "../../include/freenet/fmsversionrequester.h"\r
2 #include "../../include/freenet/fmsversionxml.h"\r
3 #include "../../include/option.h"\r
4 #include "../../include/stringfunctions.h"\r
5 \r
6 #include <Poco/Timestamp.h>\r
7 #include <Poco/Timespan.h>\r
8 \r
9 FMSVersionRequester::FMSVersionRequester()\r
10 {\r
11         Initialize();\r
12 }\r
13 \r
14 FMSVersionRequester::FMSVersionRequester(FCPv2::Connection *fcp):IFCPConnected(fcp)\r
15 {\r
16         Initialize();\r
17 }\r
18 \r
19 const bool FMSVersionRequester::HandleAllData(FCPv2::Message &message)\r
20 {\r
21         std::vector<char> data;\r
22         long datalength;\r
23         FMSVersionXML xml;\r
24 \r
25         StringFunctions::Convert(message["DataLength"],datalength);\r
26 \r
27         // wait for all data to be received from connection\r
28         m_fcp->WaitForBytes(1000,datalength);\r
29 \r
30         // if we got disconnected- return immediately\r
31         if(m_fcp->IsConnected()==false)\r
32         {\r
33                 return false;\r
34         }\r
35 \r
36         // receive the file\r
37         m_fcp->Receive(data,datalength);\r
38 \r
39         // update latest edition #\r
40         std::vector<std::string> parts;\r
41         StringFunctions::Split(message["Identifier"],"/",parts);\r
42         if(parts.size()>2)\r
43         {\r
44                 std::string editionstr=parts[2];\r
45                 Option::Instance()->Set("FMSVersionEdition",editionstr);\r
46         }\r
47 \r
48         // parse file into xml and update the database\r
49         if(data.size()>0 && xml.ParseXML(std::string(data.begin(),data.end()))==true)\r
50         {\r
51 \r
52                 SQLite3DB::Statement st=m_db->Prepare("REPLACE INTO tblFMSVersion(Major,Minor,Release,Notes,Changes,PageKey,SourceKey) VALUES(?,?,?,?,?,?,?);");\r
53                 st.Bind(0,xml.GetMajor());\r
54                 st.Bind(1,xml.GetMinor());\r
55                 st.Bind(2,xml.GetRelease());\r
56                 st.Bind(3,xml.GetNotes());\r
57                 st.Bind(4,xml.GetChanges());\r
58                 st.Bind(5,xml.GetPageKey());\r
59                 st.Bind(6,xml.GetSourceKey());\r
60                 st.Step();\r
61 \r
62                 m_log->debug("FMSVersionRequester::HandleAllData parsed FMSVersion XML file : "+message["Identifier"]);\r
63         }\r
64         else\r
65         {\r
66                 m_log->error("FMSVersionRequester::HandleAllData error parsing FMSVersion XML file : "+message["Identifier"]);\r
67         }\r
68 \r
69         return true;\r
70 }\r
71 \r
72 const bool FMSVersionRequester::HandleGetFailed(FCPv2::Message &message)\r
73 {\r
74         std::vector<std::string> parts;\r
75         StringFunctions::Split(message["Identifier"],"/",parts);\r
76 \r
77         // fatal error - don't try to download again\r
78         if(message["Fatal"]=="true")\r
79         {\r
80                 if(parts.size()>2)\r
81                 {\r
82                         std::string editionstr=parts[2];\r
83                         Option::Instance()->Set("FMSVersionEdition",editionstr);\r
84                 }\r
85                 m_log->debug("FMSVersionRequester::HandleGetFailed Fatal GetFailed for "+message["Identifier"]);\r
86         }\r
87 \r
88         return true;\r
89 }\r
90 \r
91 const bool FMSVersionRequester::HandleMessage(FCPv2::Message &message)\r
92 {\r
93         if(message["Identifier"].find(m_fcpuniquename)==0)\r
94         {\r
95                 \r
96                 // ignore DataFound\r
97                 if(message.GetName()=="DataFound")\r
98                 {\r
99                         return true;\r
100                 }\r
101 \r
102                 if(message.GetName()=="AllData")\r
103                 {\r
104                         return HandleAllData(message);\r
105                 }\r
106 \r
107                 if(message.GetName()=="GetFailed")\r
108                 {\r
109                         return HandleGetFailed(message);\r
110                 }\r
111 \r
112                 if(message.GetName()=="IdentifierCollision")\r
113                 {\r
114                         return true;\r
115                 }\r
116 \r
117         }\r
118 \r
119         return false;   \r
120 }\r
121 \r
122 void FMSVersionRequester::Initialize()\r
123 {\r
124         m_fcpuniquename="FMSVersionRequester";\r
125         m_lastchecked=Poco::Timestamp();\r
126         m_lastchecked-=Poco::Timespan(0,6,0,0,0);\r
127 }\r
128 \r
129 void FMSVersionRequester::Process()\r
130 {\r
131         Poco::DateTime now;\r
132 \r
133         // check every 6 hours\r
134         if((m_lastchecked+Poco::Timespan(0,5,45,0,0))<=now)\r
135         {\r
136                 StartRequest();\r
137                 m_lastchecked=now;\r
138         }\r
139 }\r
140 \r
141 void FMSVersionRequester::RegisterWithThread(FreenetMasterThread *thread)\r
142 {\r
143         thread->RegisterFCPConnected(this);\r
144         thread->RegisterFCPMessageHandler(this);\r
145         thread->RegisterPeriodicProcessor(this);\r
146 }\r
147 \r
148 void FMSVersionRequester::StartRequest()\r
149 {\r
150         FCPv2::Message message;\r
151         std::string key="";\r
152         std::string editionstr="0";\r
153         int edition=0;\r
154         \r
155         Option::Instance()->Get("FMSVersionKey",key);\r
156         if(Option::Instance()->Get("FMSVersionEdition",editionstr))\r
157         {\r
158                 StringFunctions::Convert(editionstr,edition);\r
159                 edition++;\r
160                 StringFunctions::Convert(edition,editionstr);\r
161         }\r
162 \r
163         //start request\r
164         message.SetName("ClientGet");\r
165         message["URI"]=key+editionstr+"/FMSVersion.xml";\r
166         message["Identifier"]=m_fcpuniquename+"|"+message["URI"];\r
167         message["ReturnType"]="direct";\r
168         message["MaxSize"]="30000";             // 30K\r
169 \r
170         m_fcp->Send(message);\r
171 \r
172 }\r