This is the mail archive of the cygwin-apps mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH setup v3 2/6] Use SitePage for cygwin.com mirrors only


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]