[PATCH setup v3 2/6] Use SitePage for cygwin.com mirrors only
Ken Brown
kbrown@cornell.edu
Wed Dec 6 20:46:00 GMT 2017
Keep separate lists of mirrors and user URLs. Rename several SiteList
variables to indicate that they now contain only mirrors.
Introduce a helper function remove_user_urls() to move non-mirrors
from the initial list of sites to the list of user URLs.
Set the initial state of allow_user_url depending on whether there are
any saved sites that are not mirrors.
Implement the appropriate action if the user unchecks
IDC_ALLOW_USER_URL.
As an unrelated bit of cleanup, define a helper function merge_site()
to avoid repeating the same code several times.
---
site.cc | 172 ++++++++++++++++++++++++++++++++++++++++++++--------------------
site.h | 4 +-
2 files changed, 120 insertions(+), 56 deletions(-)
diff --git a/site.cc b/site.cc
index 1b04343..85ae70c 100644
--- a/site.cc
+++ b/site.cc
@@ -84,14 +84,21 @@ string cache_warn_urls;
/* Selected sites */
SiteList site_list;
-/* Fresh mirrors + selected sites */
-SiteList all_site_list;
+/* Fresh mirrors + selected stale mirrors */
+SiteList all_mirror_list;
+
+/* Selected mirrors */
+SiteList selected_mirror_list;
/* Previously fresh + cached before */
-SiteList cached_site_list;
+SiteList cached_mirror_list;
+
+/* Stale selected mirrors to warn about and add to cache */
+SiteList dropped_mirror_list;
-/* Stale selected sites to warn about and add to cache */
-SiteList dropped_site_list;
+/* User URLs */
+SiteList all_usersite_list;
+SiteList selected_usersite_list;
StringArrayOption SiteOption('s', "site", "Download site");
@@ -221,8 +228,8 @@ site_list_type::operator < (site_list_type const &rhs) const
static void
save_dialog (HWND h)
{
- // Remove anything that was previously in the selected site list.
- site_list.clear ();
+ // Remove anything that was previously in the selected mirror list.
+ selected_mirror_list.clear ();
HWND listbox = GetDlgItem (h, IDC_URL_LIST);
int sel_count = SendMessage (listbox, LB_GETSELCOUNT, 0, 0);
@@ -234,9 +241,23 @@ save_dialog (HWND h)
{
int mirror =
SendMessage (listbox, LB_GETITEMDATA, sel_buffer[n], 0);
- site_list.push_back (all_site_list[mirror]);
+ selected_mirror_list.push_back (all_mirror_list[mirror]);
}
}
+ site_list = selected_mirror_list;
+ if (allow_user_url)
+ site_list.insert (site_list.end (), selected_usersite_list.begin (),
+ selected_usersite_list.end ());
+}
+
+static void
+merge_site (SiteList & sites, site_list_type newsite)
+{
+ SiteList result;
+ merge (sites.begin(), sites.end(),
+ &newsite, &newsite + 1,
+ inserter (result, result.begin()));
+ sites = result;
}
// This is called only for lists of mirrors that came (now or in a
@@ -295,13 +316,7 @@ load_site_list (SiteList& theSites, char *theString)
SiteList::iterator i = find (theSites.begin(),
theSites.end(), newsite);
if (i == theSites.end())
- {
- SiteList result;
- merge (theSites.begin(), theSites.end(),
- &newsite, &newsite + 1,
- inserter (result, result.begin()));
- theSites = result;
- }
+ merge_site (theSites, newsite);
else
//TODO: remove and remerge
*i = newsite;
@@ -313,6 +328,49 @@ load_site_list (SiteList& theSites, char *theString)
}
}
+static void
+remove_user_urls ()
+{
+ selected_mirror_list. clear ();
+ selected_usersite_list.clear ();
+ SiteList result;
+ for (SiteList::iterator i = all_mirror_list.begin ();
+ i != all_mirror_list.end (); i++)
+ {
+ bool mirror = false;
+ SiteList::iterator j;
+ if (i->from_mirrors_lst)
+ mirror = true;
+ else if ((j = find (cached_mirror_list.begin (), cached_mirror_list.end (), *i))
+ != cached_mirror_list.end ())
+ {
+ // It's a stale mirror.
+ mirror = true;
+ // Copy mirror info from cached version.
+ i->servername = j->servername;
+ i->area = j->area;
+ i->location = j->location;
+ // i->from_mirrors_lst stays false so we still know that *i is stale.
+ i->displayed_url = j->displayed_url;
+ i->key = j->key;
+ }
+ if (mirror)
+ {
+ result.push_back (*i);
+ if (find (site_list.begin (), site_list.end (), *i) != site_list.end ())
+ selected_mirror_list.push_back (*i);
+ }
+ else
+ {
+ merge_site (all_usersite_list, *i);
+ if (find (site_list.begin (), site_list.end (), *i) != site_list.end ())
+ selected_usersite_list.push_back (*i);
+ }
+ }
+ all_mirror_list = result;
+ allow_user_url = selected_usersite_list.size ();
+}
+
static int
get_site_list (HINSTANCE h, HWND owner)
{
@@ -357,12 +415,14 @@ get_site_list (HINSTANCE h, HWND owner)
theMirrorString = new_cstr_char_array (mirrors);
theCachedString = new_cstr_char_array (cached_mirrors);
- load_site_list (all_site_list, theMirrorString);
- load_site_list (cached_site_list, theCachedString);
+ load_site_list (all_mirror_list, theMirrorString);
+ load_site_list (cached_mirror_list, theCachedString);
delete[] theMirrorString;
delete[] theCachedString;
+ remove_user_urls ();
+
return 0;
}
@@ -379,9 +439,9 @@ void
SiteSetting::registerSavedSite (const char * site)
{
site_list_type tempSite(site, "", "", "", false);
- SiteList::iterator i = find (all_site_list.begin(),
- all_site_list.end(), tempSite);
- if (i == all_site_list.end())
+ SiteList::iterator i = find (all_mirror_list.begin(),
+ all_mirror_list.end(), tempSite);
+ if (i == all_mirror_list.end())
{
/* Don't default to certain machines if they suffer
from bandwidth limitations. */
@@ -389,11 +449,7 @@ SiteSetting::registerSavedSite (const char * site)
|| strnicmp (site, NOSAVE2, NOSAVE2_LEN) == 0
|| strnicmp (site, NOSAVE3, NOSAVE3_LEN) == 0)
return;
- SiteList result;
- merge (all_site_list.begin(), all_site_list.end(),
- &tempSite, &tempSite + 1,
- inserter (result, result.begin()));
- all_site_list = result;
+ merge_site (all_mirror_list, tempSite);
site_list.push_back (tempSite);
}
else
@@ -501,26 +557,20 @@ drop_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam)
int check_dropped_mirrors (HWND h)
{
cache_warn_urls = "";
- dropped_site_list.clear ();
+ dropped_mirror_list.clear ();
- for (SiteList::const_iterator n = site_list.begin ();
- n != site_list.end (); ++n)
+ for (SiteList::const_iterator n = selected_mirror_list.begin ();
+ n != selected_mirror_list.end (); ++n)
{
- SiteList::iterator i = find (all_site_list.begin(), all_site_list.end(),
+ SiteList::iterator i = find (all_mirror_list.begin(), all_mirror_list.end(),
*n);
- if (i == all_site_list.end() || !i->from_mirrors_lst)
+ if (i == all_mirror_list.end () || !i->from_mirrors_lst)
{
- SiteList::iterator j = find (cached_site_list.begin(),
- cached_site_list.end(), *n);
- if (j != cached_site_list.end())
- {
- Log (LOG_PLAIN) << "Dropped selected mirror: " << n->url
- << endLog;
- dropped_site_list.push_back (*j);
- if (cache_warn_urls.size())
- cache_warn_urls += "\r\n";
- cache_warn_urls += i->url;
- }
+ Log (LOG_PLAIN) << "Dropped selected mirror: " << n->url << endLog;
+ dropped_mirror_list.push_back (*i);
+ if (cache_warn_urls.size())
+ cache_warn_urls += "\r\n";
+ cache_warn_urls += i->url;
}
}
if (cache_warn_urls.size())
@@ -549,13 +599,13 @@ void save_cache_file (int cache_action)
io_stream *f = UserSettings::instance().open ("mirrors-lst");
if (f)
{
- write_cache_list (f, all_site_list);
+ write_cache_list (f, all_mirror_list);
if (cache_action == CACHE_ACCEPT_WARN)
{
Log (LOG_PLAIN) << "Adding dropped mirrors to cache to warn again."
<< endLog;
*f << "# Following mirrors re-added by setup.exe to warn again about dropped urls.";
- write_cache_list (f, dropped_site_list);
+ write_cache_list (f, dropped_mirror_list);
}
delete f;
}
@@ -566,6 +616,13 @@ bool SitePage::Create ()
return PropertyPage::Create (IDD_SITE);
}
+void
+SitePage::OnInit ()
+{
+ int a = allow_user_url ? BST_CHECKED : BST_UNCHECKED;
+ CheckDlgButton (GetHWND (), IDC_ALLOW_USER_URL, a);
+}
+
long
SitePage::OnNext ()
{
@@ -581,8 +638,8 @@ SitePage::OnNext ()
save_cache_file (cache_action);
// Log all the selected URLs from the list.
- for (SiteList::const_iterator n = site_list.begin ();
- n != site_list.end (); ++n)
+ for (SiteList::const_iterator n = selected_mirror_list.begin ();
+ n != selected_mirror_list.end (); ++n)
Log (LOG_PLAIN) << "site: " << n->url << endLog;
Progress.SetActivateTask (WM_APP_START_SETUP_INI_DOWNLOAD);
@@ -646,8 +703,8 @@ SitePage::PopulateListBox ()
// Populate the list box with the URLs.
SendMessage (listbox, LB_RESETCONTENT, 0, 0);
- for (SiteList::const_iterator i = all_site_list.begin ();
- i != all_site_list.end (); ++i)
+ for (SiteList::const_iterator i = all_mirror_list.begin ();
+ i != all_mirror_list.end (); ++i)
{
j = SendMessage (listbox, LB_ADDSTRING, 0,
(LPARAM) i->displayed_url.c_str());
@@ -655,14 +712,14 @@ SitePage::PopulateListBox ()
}
// Select the selected ones.
- for (SiteList::const_iterator n = site_list.begin ();
- n != site_list.end (); ++n)
+ for (SiteList::const_iterator n = selected_mirror_list.begin ();
+ n != selected_mirror_list.end (); ++n)
{
- SiteList::iterator i = find (all_site_list.begin(),
- all_site_list.end(), *n);
- if (i != all_site_list.end())
+ SiteList::iterator i = find (all_mirror_list.begin(),
+ all_mirror_list.end(), *n);
+ if (i != all_mirror_list.end())
{
- int index = i - all_site_list.begin();
+ int index = i - all_mirror_list.begin();
// Highlight the selected item
SendMessage (listbox, LB_SELITEMRANGE, TRUE, (index << 16) | index);
@@ -688,7 +745,14 @@ bool SitePage::OnMessageCmd (int id, HWND hwndctl, UINT code)
case IDC_ALLOW_USER_URL:
{
if (code == BN_CLICKED)
- allow_user_url = IsButtonChecked (IDC_ALLOW_USER_URL);
+ {
+ allow_user_url = IsButtonChecked (IDC_ALLOW_USER_URL);
+ if (!allow_user_url)
+ {
+ selected_usersite_list.clear ();
+ site_list = selected_mirror_list;
+ }
+ }
break;
}
default:
diff --git a/site.h b/site.h
index d16db8e..0b85caf 100644
--- a/site.h
+++ b/site.h
@@ -21,6 +21,7 @@
#include "proppage.h"
+// For mirrors of cygwin.com.
class SitePage : public PropertyPage
{
public:
@@ -31,6 +32,7 @@ public:
bool Create ();
+ virtual void OnInit ();
virtual void OnActivate ();
virtual long OnNext ();
virtual long OnBack ();
@@ -75,8 +77,6 @@ typedef std::vector <site_list_type> SiteList;
/* user chosen sites */
extern SiteList site_list;
-/* potential sites */
-extern SiteList all_site_list;
class SiteSetting
{
--
2.15.1
More information about the Cygwin-apps
mailing list