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