5#include "libwfut/WFUT.h"
6#include "libwfut/types.h"
8#include "libwfut/FileIO.h"
9#include "libwfut/ChannelIO.h"
10#include "libwfut/ChannelFileList.h"
11#include "libwfut/crc32.h"
12#include "libwfut/platform.h"
16void WFUTClient::onDownloadComplete(
const std::string &u,
const std::string &f) {
19void WFUTClient::onDownloadFailed(
const std::string &u,
const std::string &f,
const std::string &r) {
24 assert (m_initialised ==
false);
30 return WFUT_GENERAL_ERROR;
33 m_io->
DownloadComplete.connect(sigc::mem_fun(
this, &WFUTClient::onDownloadComplete));
34 m_io->
DownloadFailed.connect(sigc::mem_fun(
this, &WFUTClient::onDownloadFailed));
42 assert (m_initialised ==
true);
48 m_initialised =
false;
54 const std::string &urlPrefix,
55 const std::string &pathPrefix) {
56 assert (m_initialised ==
true);
57 const FileMap &files = updates.
getFiles();
59 FileMap::const_iterator I = files.begin();
60 FileMap::const_iterator Iend = files.end();
63 if (f.deleted)
continue;
65 const std::string &url = urlPrefix + updates.
getName() +
"/" + f.filename;
66 m_io->
queueFile(pathPrefix, f.filename, url, f.crc32, f.execute);
72 const std::string &urlPrefix,
73 const std::string &pathPrefix) {
74 assert (m_initialised ==
true);
75 if (file.deleted)
return;
77 const std::string &url = urlPrefix +
"/" + file.filename;
78 m_io->
queueFile(pathPrefix, file.filename, url, file.crc32,
false);
82 assert (m_initialised ==
true);
84 FILE *fp = os_create_tmpfile();
86 return WFUT_GENERAL_ERROR;
93 return WFUT_DOWNLOAD_ERROR;
98 xml.reserve(ftell(fp));
102 while ((n = fread(buf,
sizeof(
char), 1024, fp) ) > 0) {
108 if (parseMirrorListXML(xml, mirrors)) {
111 return WFUT_PARSE_ERROR;
114 return WFUT_NO_ERROR;
119 assert (m_initialised ==
true);
121 FILE *fp = os_create_tmpfile();
123 return WFUT_GENERAL_ERROR;
130 return WFUT_DOWNLOAD_ERROR;
135 xml.reserve(ftell(fp));
139 while ((n = fread(buf,
sizeof(
char), 1024, fp) ) > 0) {
145 if (parseChannelListXML(xml, channels)) {
148 return WFUT_PARSE_ERROR;
151 return WFUT_NO_ERROR;
155 assert (m_initialised ==
true);
157 FILE *fp = os_create_tmpfile();
161 return WFUT_GENERAL_ERROR;
168 return WFUT_DOWNLOAD_ERROR;
173 xml.reserve(ftell(fp));
177 while ((n = fread(buf,
sizeof(
char), 1024, fp) ) > 0) {
183 if (parseFileListXML(xml, files)) {
186 return WFUT_PARSE_ERROR;
189 return WFUT_NO_ERROR;
193 assert (m_initialised ==
true);
194 if (parseFileList(filename, files)) {
196 return WFUT_PARSE_ERROR;
198 return WFUT_NO_ERROR;
202 assert (m_initialised ==
true);
203 if (writeFileList(filename, files)) {
205 return WFUT_WRITE_ERROR;
207 return WFUT_NO_ERROR;
211 assert (m_initialised ==
true);
216 const FileMap &server_map = server.
getFiles();
217 const FileMap &system_map = system.
getFiles();
218 const FileMap &local_map = local.
getFiles();
220 FileMap::const_iterator I = server_map.begin();
221 FileMap::const_iterator Iend = server_map.end();
223 for (; I != Iend; ++I) {
226 if (server_obj.deleted) {
227 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_DELETED);
231 FileMap::const_iterator sys_iter = system_map.find(I->first);
232 FileMap::const_iterator loc_iter = local_map.find(I->first);
234 if (loc_iter == local_map.end()) {
235 if (sys_iter == system_map.end()) {
237 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_NO_LOCAL);
239 }
else if (server_obj.version > sys_iter->second.version) {
241 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_SERVER_SYSTEM);
246 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_NONE);
248 }
else if (server_obj.version > loc_iter->second.version) {
249 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_SERVER_LOCAL);
255 if (calcCRC32(prefix + loc_iter->second.filename.c_str(), crc32) == -1) {
257 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_MISSING);
261 if (crc32 != server_obj.crc32) {
263 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_MODIFIED);
266 UpdateReason.emit(server_obj.filename, WFUT_UPDATE_NONE);
271 return WFUT_NO_ERROR;
std::string getName() const
void addFile(const FileObject &fo)
const FileMap & getFiles() const
sigc::signal< void, const std::string &, const std::string & > DownloadComplete
int queueFile(const std::string &path, const std::string &filename, const std::string &url, uLong expected_crc32, bool executable)
sigc::signal< void, const std::string &, const std::string &, const std::string & > DownloadFailed
int downloadFile(const std::string &filename, const std::string &url, uLong expected_crc32)
void abortDownload(const std::string &)
WFUTError getLocalList(const std::string &filename, ChannelFileList &files)
void abortDownload(const std::string &filename)
sigc::signal< void, const std::string &, const std::string & > DownloadComplete
WFUTError getFileList(const std::string &url, ChannelFileList &files)
sigc::signal< void, const std::string &, const std::string &, const std::string & > DownloadFailed
WFUTError getMirrorList(const std::string &url, MirrorList &mirrors)
WFUTError saveLocalList(const ChannelFileList &files, const std::string &filename)
sigc::signal< void, const std::string &, const WFUTUpdateReason > UpdateReason
WFUTError calculateUpdates(const ChannelFileList &server, const ChannelFileList &system, const ChannelFileList &local, ChannelFileList &updates, const std::string &prefix)
void updateFile(const FileObject &file, const std::string &urlPrefix, const std::string &pathPrefix)
WFUTError getChannelList(const std::string &url, ChannelList &channels)
void updateChannel(const ChannelFileList &updates, const std::string &urlPrefix, const std::string &pathPrefix)