void UpdateDlg::InternetUpdate(bool forceDownload) { UpdateStatus(_("Please wait...")); m_HasUpdated = false; m_Net.SetServer(GetCurrentServer()); EnableButtons(false); forceDownload = forceDownload || !XRCCTRL(*this, "chkCache", wxCheckBox)->GetValue(); bool forceDownloadMirrors = forceDownload || !wxFileExists(GetMirrorsFilename()); if (forceDownloadMirrors) { if (!m_Net.DownloadFile(_T("mirrors.cfg"), GetMirrorsFilename())) { UpdateStatus(_("Error downloading list of mirrors"), 0, 0); return; } else { FillServers(); m_Net.SetServer(GetCurrentServer()); // update server based on mirrors } } wxString config = GetConfFilename(); forceDownload = forceDownload || !wxFileExists(config); if (forceDownload && !m_Net.DownloadFile(_T("webupdate.conf"), config)) { UpdateStatus(_("Error downloading list of updates"), 0, 0); return; } else { IniParser ini; if (!ini.ParseFile(config)) { UpdateStatus(_("Failed to retrieve the list of updates"), 0, 0); return; } ini.Sort(); if (m_Recs) delete[] m_Recs; // remember to delete[] m_Recs when we 're done with it!!! // it's our responsibility once given to us m_Recs = ReadConf(ini, &m_RecsCount, GetCurrentServer(), GetPackagePath()); FillGroups(); } EnableButtons(); UpdateStatus(_("Ready"), 0, 0); m_HasUpdated = true; }
void UpdateDlg::FillServers() { wxComboBox* cmb = XRCCTRL(*this, "cmbServer", wxComboBox); cmb->Clear(); m_Servers.Clear(); IniParser ini; ini.ParseFile(GetMirrorsFilename()); int group = ini.FindGroupByName(_T("WebUpdate mirrors")); for (int i = 0; group != -1 && i < ini.GetKeysCount(group); ++i) { cmb->Append(ini.GetKeyName(group, i)); m_Servers.Add(ini.GetKeyValue(group, i)); } if (cmb->GetCount() == 0) { cmb->Append(_("devpaks.org Community Devpaks")); m_Servers.Add(_T("http://devpaks.sourceforge.net/")); } cmb->SetSelection(0); }
UpdateRec* ReadConf(const IniParser& ini, int* recCount, const wxString& currentServer, const wxString& appPath) { *recCount = 0; int groupsCount = ini.GetGroupsCount(); if (groupsCount == 0) return 0; UpdateRec* list = new UpdateRec[ini.GetGroupsCount()]; for (int i = 0; i < groupsCount; ++i) { UpdateRec& rec = list[i]; rec.title = ini.GetGroupName(i); // fix title // devpaks.org has changed the title to contain some extra info // e.g.: [libunicows Library version: 1.1.1 Devpak revision: 1sid] int pos = rec.title.Lower().Find(_T("library version:")); if (pos != -1) { int revpos = rec.title.Lower().Find(_T("devpak revision:")); if (revpos != -1) { rec.revision = rec.title.Mid(revpos).AfterFirst(_T(':')).Trim(false); rec.revision.Replace(_T("\t"), _T(" ")); rec.revision = rec.revision.BeforeFirst(_T(' ')); } rec.title.Truncate(pos); rec.title = rec.title.Trim(false); rec.title = rec.title.Trim(true); } rec.name = ini.GetKeyValue(i, _T("Name")); rec.desc = ini.GetKeyValue(i, _T("Description")); rec.remote_file = ini.GetKeyValue(i, _T("RemoteFilename")); rec.local_file = ini.GetKeyValue(i, _T("LocalFilename")); rec.groups = GetArrayFromString(ini.GetKeyValue(i, _T("Group")), _T(",")); rec.install_path = ini.GetKeyValue(i, _T("InstallPath")); rec.version = ini.GetKeyValue(i, _T("Version")); ini.GetKeyValue(i, _T("Size")).ToLong(&rec.bytes); rec.date = ini.GetKeyValue(i, _T("Date")); rec.installable = ini.GetKeyValue(i, _T("Execute")) == _T("1"); // read .entry file (if exists) rec.entry = (!rec.name.IsEmpty() ? rec.name : wxFileName(rec.local_file).GetName()) + _T(".entry"); IniParser p; p.ParseFile(appPath + rec.entry); rec.installed_version = p.GetValue(_T("Setup"), _T("AppVersion")); rec.downloaded = wxFileExists(appPath + _T("/") + rec.local_file); rec.installed = !rec.installed_version.IsEmpty(); // calculate size rec.size = GetSizeString(rec.bytes); // fix-up if (rec.name.IsEmpty()) rec.name = rec.title; rec.desc.Replace(_T("<CR>"), _T("\n")); rec.desc.Replace(_T("<LF>"), _T("\r")); wxURL url(rec.remote_file); if (!url.GetServer().IsEmpty()) { rec.remote_server = url.GetScheme() + _T("://") + url.GetServer(); int pos = rec.remote_file.Find(url.GetServer()); if (pos != wxNOT_FOUND) rec.remote_file.Remove(0, pos + url.GetServer().Length() + 1); } else rec.remote_server = currentServer; } *recCount = groupsCount; return list; }