public inbox for cygwin-apps-cvs@sourceware.org
help / color / mirror / Atom feed
From: Jon TURNEY <jturney@sourceware.org>
To: cygwin-apps-cvs@sourceware.org
Subject: [setup - the official Cygwin setup program] branch master, updated. release_2.906
Date: Mon, 15 Mar 2021 17:58:27 +0000 (GMT)	[thread overview]
Message-ID: <20210315175827.28D1A3858D29@sourceware.org> (raw)




https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=2024cace3d41b80fb6cab9e84806cc2f012e1a60

commit 2024cace3d41b80fb6cab9e84806cc2f012e1a60
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Mon Mar 15 17:40:51 2021 +0000

    Update displayed copyright to 2021

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=898fa4a1437c234a969ae84d6a3944c37d711559

commit 898fa4a1437c234a969ae84d6a3944c37d711559
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Mon Mar 15 17:38:13 2021 +0000

    Revert "Remove pointless variable from do_download_site_info_thread()"
    
    This reverts commit d15c11e7954977ee27712989b36e7102fc70639e.
    
    This wasn't pointless, as it was causing the site list to be fetched
    only once, even if we passed through that page more than once.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=f34a20e7adaead364fd29c8f00393fdfcfba359b

commit f34a20e7adaead364fd29c8f00393fdfcfba359b
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Sun Sep 6 19:23:23 2020 +0100

    Move package action strings to string table resource
    
    Move package action strings to string table resource.
    Switch ListView control to wide-char.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=e32e0a4ac9805799abe9ceb08970a25b8343e40c

commit e32e0a4ac9805799abe9ceb08970a25b8343e40c
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Sep 16 22:21:08 2020 +0100

    Add a UTF-8 string to wstring utility function.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=cd8da753011e50126ba56cfeb7c55ead89fa7af7

commit cd8da753011e50126ba56cfeb7c55ead89fa7af7
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Sun Sep 6 17:04:20 2020 +0100

    Remove long-obsolete 'DISCARABLE' from resource file
    
    The 'DISCARDABLE' memory attribute was only signficant on Win16.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=b3cc8ab6692d0ff958a999fe690424fb90b79a8b

commit b3cc8ab6692d0ff958a999fe690424fb90b79a8b
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Tue Sep 1 01:43:53 2020 +0100

    Move installation progress strings to string table resource

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=207380f40cc6944fd40fe41862dc57eec0eac38d

commit 207380f40cc6944fd40fe41862dc57eec0eac38d
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Fri Sep 4 16:03:08 2020 +0100

    Allow progress status to be set directly from a resource
    
    Allow progress status to be set directly from a (localizable) resource.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=a2362bc587ca3152e4f6711a72afb5d291cd762a

commit a2362bc587ca3152e4f6711a72afb5d291cd762a
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Fri Sep 4 16:40:14 2020 +0100

    Add LoadStringW to std::wstring utility function

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=0a416c48c885e7a31920bf7d17821ce7494e9521

commit 0a416c48c885e7a31920bf7d17821ce7494e9521
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Mon Aug 31 20:34:24 2020 +0100

    Fix version used when not built from a git checkout

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=0af398cfca4f0dd461e9cd973b8fd9bb972509f3

commit 0af398cfca4f0dd461e9cd973b8fd9bb972509f3
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Aug 26 18:24:18 2020 +0100

    Warn about unknown package names
    
    Warn about unknown package names used with '--packages' or
    '--remove-packages' options.

https://sourceware.org/git/gitweb.cgi?p=cygwin-apps/setup.git;h=a692b7f48448efd96c8ff26ff106d3f774ee9686

commit a692b7f48448efd96c8ff26ff106d3f774ee9686
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date:   Wed Aug 26 18:10:24 2020 +0100

    Downgrade logging of looking for AV service
    
    Downgrade to debug always emitted logging about trying to find AV
    service.


Diff:
---
 ActionList.h        | 12 ++++++--
 AntiVirus.cc        |  4 +--
 ListView.cc         | 39 ++++++++++++++------------
 ListView.h          |  2 +-
 Makefile.am         |  2 +-
 PickCategoryLine.cc | 17 ++++++------
 PickCategoryLine.h  |  2 +-
 PickPackageLine.cc  | 16 +++++------
 PickPackageLine.h   |  2 +-
 String++.cc         | 18 ++++++++++++
 String++.h          |  2 ++
 download.cc         |  2 +-
 geturl.cc           |  4 +--
 ini.cc              |  6 ++--
 install.cc          |  8 +++---
 package_meta.cc     | 60 +++++++++++++++++++++++++---------------
 package_meta.h      |  4 +--
 package_source.cc   |  5 ++--
 postinstall.cc      |  2 +-
 prereq.cc           |  2 +-
 res.rc              | 79 +++++++++++++++++++++++++++++++++--------------------
 resource.h          | 25 +++++++++++++++--
 site.cc             |  6 ++--
 threebar.cc         | 24 ++++++++++++++++
 threebar.h          |  5 ++++
 win32.cc            | 12 ++++++++
 win32.h             |  2 ++
 27 files changed, 249 insertions(+), 113 deletions(-)

diff --git a/ActionList.h b/ActionList.h
index 2e2d424e..be424538 100644
--- a/ActionList.h
+++ b/ActionList.h
@@ -16,6 +16,7 @@
 
 #include <string>
 #include <vector>
+#include "win32.h"
 
 // ---------------------------------------------------------------------------
 // interface to class ActionList
@@ -26,14 +27,14 @@
 class Action
 {
  public:
-  Action(const std::string &_name, int _id, bool _selected, bool _enabled) :
+  Action(const std::wstring &_name, int _id, bool _selected, bool _enabled) :
     name(_name),
     id(_id),
     selected(_selected),
     enabled(_enabled)
   { };
 
-  std::string name;
+  std::wstring name;
   int id;
   bool selected;
   bool enabled;
@@ -44,11 +45,16 @@ typedef std::vector<Action> Actions;
 class ActionList
 {
  public:
-  void add(const std::string &name, int id, bool selected, bool enabled)
+  void add(const std::wstring &name, int id, bool selected, bool enabled)
   {
     Action act(name, id, selected, enabled);
     list.push_back(act);
   };
+  void add(unsigned int name_res, int id, bool selected, bool enabled)
+  {
+    const std::wstring name = LoadStringW(name_res);
+    add(name, id, selected, enabled);
+  };
   Actions list;
 };
 
diff --git a/AntiVirus.cc b/AntiVirus.cc
index 876eb027..051a434d 100644
--- a/AntiVirus.cc
+++ b/AntiVirus.cc
@@ -163,7 +163,7 @@ detect ()
     SCM = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
 
     if (!SCM) {
-	Log (LOG_PLAIN) << "Could not open Service control manager" << endLog;
+	Log (LOG_BABBLE) << "Could not open Service control manager" << endLog;
 	return;
     }
 
@@ -174,7 +174,7 @@ detect ()
 	SERVICE_QUERY_STATUS| SERVICE_STOP| SERVICE_START);
 
     if (!McAfeeService) {
-	Log (LOG_PLAIN) << "Could not open service McShield for query, start and stop. McAfee may not be installed, or we don't have access." << endLog;
+	Log (LOG_BABBLE) << "Could not open service McShield for query, start and stop. McAfee may not be installed, or we don't have access." << endLog;
 	CloseServiceHandle(SCM);
 	return;
     }
diff --git a/ListView.cc b/ListView.cc
index a6dc56d8..db99d98a 100644
--- a/ListView.cc
+++ b/ListView.cc
@@ -14,6 +14,7 @@
 #include "ListView.h"
 #include "LogSingleton.h"
 #include "resource.h"
+#include "String++.h"
 
 #include <commctrl.h>
 
@@ -95,6 +96,9 @@ ListView::init(HWND parent, int id, HeaderList headers)
   SendMessage(hWndTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, (LPARAM) MAKELONG (30000, 0));
   // match tip width used elsewhere
   SendMessage(hWndTip, TTM_SETMAXTIPWIDTH, 0, 450);
+
+  // switch to using wide-char WM_NOTIFY messages
+  ListView_SetUnicodeFormat(hWndListView, TRUE);
 }
 
 void
@@ -256,29 +260,30 @@ ListView::setContents(ListViewContents *_contents, bool tree)
   RedrawWindow(hWndListView, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
 }
 
-// Helper class: The char * pointer we hand back needs to remain valid for some
-// time after OnNotify returns, when the std::string we have retrieved has gone
-// out of scope, so a static instance of this class maintains a local cache.
-class StringCache
+// Helper class: The pointer we hand back needs to remain valid for some time
+// after OnNotify returns, when the string object we have retrieved has gone out
+// of scope, so a static instance of this class maintains a local cache.
+template <class T> class StringCache
 {
+  typedef typename T::traits_type::char_type char_type;
 public:
   StringCache() : cache(NULL), cache_size(0) { }
-  StringCache & operator = (const std::string & s)
+  StringCache & operator = (const T & s)
   {
     if ((s.length() + 1) > cache_size)
       {
         cache_size = s.length() + 1;
-        cache = (char *)realloc(cache, cache_size);
+        cache = (char_type *)realloc(cache, cache_size * sizeof(char_type));
       }
-    strcpy(cache, s.c_str());
+    memcpy(cache, s.c_str(), cache_size * sizeof(char_type));
     return *this;
   }
-  operator char *() const
+  operator char_type *() const
   {
     return cache;
   }
 private:
-  char *cache;
+  char_type *cache;
   size_t cache_size;
 };
 
@@ -291,9 +296,9 @@ ListView::OnNotify (NMHDR *pNmHdr, LRESULT *pResult)
 
   switch (pNmHdr->code)
   {
-  case LVN_GETDISPINFO:
+  case LVN_GETDISPINFOW:
     {
-      NMLVDISPINFO *pNmLvDispInfo = (NMLVDISPINFO *)pNmHdr;
+      NMLVDISPINFOW *pNmLvDispInfo = (NMLVDISPINFOW *)pNmHdr;
 #if DEBUG
       Log (LOG_BABBLE) << "LVN_GETDISPINFO " << pNmLvDispInfo->item.iItem << endLog;
 #endif
@@ -302,7 +307,7 @@ ListView::OnNotify (NMHDR *pNmHdr, LRESULT *pResult)
           int iRow = pNmLvDispInfo->item.iItem;
           int iCol = pNmLvDispInfo->item.iSubItem;
 
-          static StringCache s;
+          static StringCache<std::wstring> s;
           s = (*contents)[iRow]->get_text(iCol);
           pNmLvDispInfo->item.pszText = s;
 
@@ -429,7 +434,7 @@ ListView::OnNotify (NMHDR *pNmHdr, LRESULT *pResult)
 
               case ListView::ControlType::checkbox:
                 {
-                  // get the subitem text
+                  // get the subitem text (as ASCII)
                   char buf[3];
                   ListView_GetItemText(hWndListView, iRow, iCol, buf, _countof(buf));
 
@@ -592,7 +597,7 @@ ListView::OnNotify (NMHDR *pNmHdr, LRESULT *pResult)
 #endif
 
       // get the tooltip text for that item/subitem
-      static StringCache tooltip;
+      static StringCache<std::string> tooltip;
       tooltip = "";
       if (contents)
         tooltip = (*contents)[iRow]->get_tooltip(iCol);
@@ -631,7 +636,7 @@ ListView::popup_menu(int iRow, int iCol, POINT p)
   // construct menu
   HMENU hMenu = CreatePopupMenu();
 
-  MENUITEMINFO mii;
+  MENUITEMINFOW mii;
   memset(&mii, 0, sizeof(mii));
   mii.cbSize = sizeof(mii);
   mii.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_STRING | MIIM_ID;
@@ -644,12 +649,12 @@ ListView::popup_menu(int iRow, int iCol, POINT p)
   for (i = al->list.begin (); i != al->list.end (); ++i, ++j)
     {
       BOOL res;
-      mii.dwTypeData = (char *)i->name.c_str();
+      mii.dwTypeData = const_cast <wchar_t *> (i->name.c_str());
       mii.fState = (i->selected ? MFS_CHECKED : MFS_UNCHECKED |
                     i->enabled ? MFS_ENABLED : MFS_DISABLED);
       mii.wID = j;
 
-      res = InsertMenuItem(hMenu, -1, TRUE, &mii);
+      res = InsertMenuItemW(hMenu, -1, TRUE, &mii);
       if (!res) Log (LOG_BABBLE) << "InsertMenuItem failed " << endLog;
     }
 
diff --git a/ListView.h b/ListView.h
index 519b61a4..d6a5e32f 100644
--- a/ListView.h
+++ b/ListView.h
@@ -31,7 +31,7 @@ class ListViewLine
   enum class State { collapsed, expanded, nothing=-1 };
 
   virtual ~ListViewLine() {};
-  virtual const std::string get_text(int col) const = 0;
+  virtual const std::wstring get_text(int col) const = 0;
   virtual State get_state() const = 0;
   virtual const std::string get_tooltip(int col) const = 0;
   virtual int get_indent() const = 0;
diff --git a/Makefile.am b/Makefile.am
index b316764f..1a2171c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -259,7 +259,7 @@ inilint_SOURCES = \
 	csu_util/version_compare.cc \
 	csu_util/version_compare.h
 
-GITVER := $(shell cd $(srcdir) && git describe --match release_\* --abbrev=6 --dirty || "N/A")
+GITVER := $(shell cd $(srcdir) && git describe --match release_\* --abbrev=6 --dirty || echo "N/A")
 VER := $(subst release_,,$(GITVER))
 ARCH := @ARCH@
 
diff --git a/PickCategoryLine.cc b/PickCategoryLine.cc
index 7c1d464b..d2ac8992 100644
--- a/PickCategoryLine.cc
+++ b/PickCategoryLine.cc
@@ -18,9 +18,10 @@
 #include "PickView.h"
 #include "window.h"
 #include "package_meta.h"
+#include "resource.h"
 #include <sstream>
 
-const std::string
+const std::wstring
 PickCategoryLine::get_text (int col_num) const
 {
   if (col_num == pkgname_col)
@@ -29,13 +30,13 @@ PickCategoryLine::get_text (int col_num) const
       s << cat_tree->category().first;
       if (pkgcount)
         s << " (" << pkgcount << ")";
-      return s.str();
+      return string_to_wstring(s.str());
     }
   else if (col_num == new_col)
     {
-      return packagemeta::action_caption (cat_tree->action());
+      return LoadStringW(packagemeta::action_caption (cat_tree->action()));
     }
-  return "";
+  return L"";
 }
 
 int
@@ -68,11 +69,11 @@ PickCategoryLine::get_actions(int col) const
   ActionList *al = new ActionList();
   packagemeta::_actions current_default = cat_tree->action();
 
-  al->add("Default", (int)packagemeta::NoChange_action, (current_default == packagemeta::NoChange_action), TRUE);
-  al->add("Install", (int)packagemeta::Install_action, (current_default == packagemeta::Install_action), TRUE);
-  al->add(packagedb::task == PackageDB_Install ? "Reinstall" : "Retrieve",
+  al->add(IDS_ACTION_DEFAULT, (int)packagemeta::NoChange_action, (current_default == packagemeta::NoChange_action), TRUE);
+  al->add(IDS_ACTION_INSTALL, (int)packagemeta::Install_action, (current_default == packagemeta::Install_action), TRUE);
+  al->add(packagedb::task == PackageDB_Install ? IDS_ACTION_REINSTALL : IDS_ACTION_RETRIEVE,
           (int)packagemeta::Reinstall_action, (current_default == packagemeta::Reinstall_action), TRUE);
-  al->add("Uninstall", (int)packagemeta::Uninstall_action, (current_default == packagemeta::Uninstall_action), TRUE);
+  al->add(IDS_ACTION_UNINSTALL, (int)packagemeta::Uninstall_action, (current_default == packagemeta::Uninstall_action), TRUE);
 
   return al;
 }
diff --git a/PickCategoryLine.h b/PickCategoryLine.h
index 35b90e68..6a7321d1 100644
--- a/PickCategoryLine.h
+++ b/PickCategoryLine.h
@@ -34,7 +34,7 @@ public:
   {
   }
 
-  const std::string get_text(int col) const;
+  const std::wstring get_text(int col) const;
   State get_state() const;
   const std::string get_tooltip(int col) const;
   int get_indent() const;
diff --git a/PickPackageLine.cc b/PickPackageLine.cc
index f64c1012..ae1e5204 100644
--- a/PickPackageLine.cc
+++ b/PickPackageLine.cc
@@ -17,16 +17,16 @@
 #include "PickView.h"
 #include "package_db.h"
 
-const std::string
+const std::wstring
 PickPackageLine::get_text(int col_num) const
 {
   if (col_num == pkgname_col)
     {
-      return pkg.name;
+      return string_to_wstring(pkg.name);
     }
   else if (col_num == current_col)
     {
-      return pkg.installed.Canonical_version ();
+      return string_to_wstring(pkg.installed.Canonical_version());
     }
   else if (col_num == new_col)
     {
@@ -44,11 +44,11 @@ PickPackageLine::get_text(int col_num) const
       else
         srctick = "no";
 
-      return srctick;
+      return string_to_wstring(srctick);
     }
   else if (col_num == cat_col)
     {
-      return pkg.getReadableCategoryList();
+      return string_to_wstring(pkg.getReadableCategoryList());
     }
   else if (col_num == size_col)
     {
@@ -75,14 +75,14 @@ PickPackageLine::get_text(int col_num) const
       /* If size still 0, size must be unknown.  */
       std::string size = (sz == 0) ? "?" : format_1000s((sz+1023)/1024) + "k";
 
-      return size;
+      return string_to_wstring(size);
     }
   else if (col_num == pkg_col)
     {
-      return pkg.SDesc();
+      return string_to_wstring(pkg.SDesc());
     }
 
-  return "unknown";
+  return L"unknown";
 }
 
 const std::string
diff --git a/PickPackageLine.h b/PickPackageLine.h
index 3877a4b8..2c59e902 100644
--- a/PickPackageLine.h
+++ b/PickPackageLine.h
@@ -30,7 +30,7 @@ public:
     indent (aindent)
   {
   };
-  const std::string get_text(int col) const;
+  const std::wstring get_text(int col) const;
   State get_state() const { return State::nothing; }
   const std::string get_tooltip(int col) const;
   int get_indent() const;
diff --git a/String++.cc b/String++.cc
index 35106e54..0f88c61d 100644
--- a/String++.cc
+++ b/String++.cc
@@ -11,6 +11,7 @@
  */
 
 #include "String++.h"
+#include "win32.h"
 #include <string.h>
 #include <sstream>
 #include <algorithm>
@@ -96,3 +97,20 @@ replace(const std::string& haystack, const std::string& needle,
     search_start = pos + r_len;
   }
 }
+
+// convert a UTF-8 string to a UTF-16 wstring
+std::wstring string_to_wstring(const std::string &s)
+{
+  int n = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0);
+
+  if (n <= 0)
+    return L"conversion failed";
+
+  wchar_t *buf = new wchar_t[n+1];
+  MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buf, n);
+
+  std::wstring w(buf);
+  delete[] buf;
+
+  return w;
+}
diff --git a/String++.h b/String++.h
index e93252ab..3d977e9e 100644
--- a/String++.h
+++ b/String++.h
@@ -42,4 +42,6 @@ class casecompare_lt_op
 inline std::string operator+ (const char *a, const std::string& b)
 { return std::string(a) + b; }
 
+std::wstring string_to_wstring(const std::string &s);
+
 #endif /* SETUP_STRING___H */
diff --git a/download.cc b/download.cc
index e1512b41..3c3df7ec 100644
--- a/download.cc
+++ b/download.cc
@@ -278,7 +278,7 @@ do_download_thread (HINSTANCE h, HWND owner)
   total_download_bytes_sofar = 0;
   download_failures.clear ();
 
-  Progress.SetText1 ("Checking for packages to download...");
+  Progress.SetText1 (IDS_PROGRESS_CHECKING);
   Progress.SetText2 ("");
   Progress.SetText3 ("");
 
diff --git a/geturl.cc b/geturl.cc
index 78b7ce7e..321259e8 100644
--- a/geturl.cc
+++ b/geturl.cc
@@ -62,10 +62,10 @@ init_dialog (const std::string &url, int length)
 
   std::string::size_type divide = url.find_last_of('/');
   max_bytes = length;
-  Progress.SetText1("Downloading...");
+  Progress.SetText1(IDS_PROGRESS_DOWNLOADING);
   Progress.SetText2((url.substr(divide + 1) + " from "
                      + url.substr(0, divide)).c_str());
-  Progress.SetText3("Connecting...");
+  Progress.SetText3(IDS_PROGRESS_CONNECTING);
   Progress.SetBar1(0);
   start_tics = GetTickCount ();
 }
diff --git a/ini.cc b/ini.cc
index ee9c6482..54128342 100644
--- a/ini.cc
+++ b/ini.cc
@@ -71,7 +71,7 @@ public:
     {
       Progress.SetText2 ("");
       Progress.SetText3 ("");
-      Progress.SetText4 ("Progress:");
+      Progress.SetText4 (IDS_PROGRESS_PARSING);
 
       yyerror_count = 0;
       yyerror_messages.clear ();
@@ -98,7 +98,7 @@ public:
     }
   virtual void iniName (const std::string& name)
     {
-      Progress.SetText1 ("Parsing...");
+      Progress.SetText1 (IDS_PROGRESS_PARSING);
       Progress.SetText2 (name.c_str ());
       Progress.SetText3 ("");
       filename = name;
@@ -134,7 +134,7 @@ public:
     }
   virtual ~ GuiParseFeedback ()
     {
-      Progress.SetText4 ("Package:");
+      Progress.SetText4 (IDS_PROGRESS_PACKAGE);
     }
 private:
   unsigned int lastpct;
diff --git a/install.cc b/install.cc
index d1fb2ddf..51ec4b57 100644
--- a/install.cc
+++ b/install.cc
@@ -148,7 +148,7 @@ static int num_installs, num_uninstalls;
 void
 Installer::preremoveOne (packagemeta & pkg)
 {
-  Progress.SetText1 ("Running preremove script...");
+  Progress.SetText1 (IDS_PROGRESS_PREREMOVE);
   Progress.SetText2 (pkg.name.c_str());
   Log (LOG_BABBLE) << "Running preremove script for " << pkg.name << endLog;
   const unsigned numexts = 4;
@@ -163,7 +163,7 @@ Installer::uninstallOne (packagemeta & pkg)
   if (!pkg.installed)
     return;
 
-  Progress.SetText1 ("Uninstalling...");
+  Progress.SetText1 (IDS_PROGRESS_UNINSTALL);
   Progress.SetText2 (pkg.name.c_str());
   Log (LOG_PLAIN) << "Uninstalling " << pkg.name << endLog;
 
@@ -427,7 +427,7 @@ Installer::installOne (packagemeta &pkgm, const packageversion &ver,
 {
   if (!source.Canonical())
     return;
-  Progress.SetText1 ("Installing");
+  Progress.SetText1 (IDS_PROGRESS_INSTALL);
   Progress.SetText2 ((pkgm.name + "-" + ver.Canonical_version()).c_str());
 
   io_stream *pkgfile = NULL;
@@ -818,7 +818,7 @@ do_install_thread (HINSTANCE h, HWND owner)
   const SolverTransactionList &t = db.solution.transactions();
 
   /* Calculate the amount of data to md5sum */
-  Progress.SetText1("Calculating...");
+  Progress.SetText1(IDS_PROGRESS_CALCULATING);
   long long int md5sum_total_bytes = 0;
   for (SolverTransactionList::const_iterator i = t.begin (); i != t.end (); ++i)
   {
diff --git a/package_meta.cc b/package_meta.cc
index 61b7620b..73239f18 100644
--- a/package_meta.cc
+++ b/package_meta.cc
@@ -52,22 +52,22 @@ bool hasManualSelections = 0;
 /*****************/
 
 /* Return an appropriate category caption given the action */
-char const *
+unsigned int
 packagemeta::action_caption (_actions _value)
 {
   switch (_value)
     {
     case NoChange_action:
-      return "Default";
+      return IDS_ACTION_DEFAULT;
     case Install_action:
-      return "Install";
+      return IDS_ACTION_INSTALL;
     case Reinstall_action:
-      return "Reinstall";
+      return IDS_ACTION_REINSTALL;
     case Uninstall_action:
-      return "Uninstall";
+      return IDS_ACTION_UNINSTALL;
     }
 
-  return "Unknown";
+  return IDS_ACTION_UNKNOWN;
 }
 
 packagemeta::packagemeta (packagemeta const &rhs) :
@@ -295,6 +295,21 @@ parseNames (std::set<std::string> &parsed, std::string &option)
     parsed.insert (option);
 }
 
+static void
+validatePackageNames (std::set<std::string> &names)
+{
+  packagedb db;
+  for (std::set<std::string>::iterator n = names.begin();
+       n != names.end();
+       ++n)
+    {
+      if (db.packages.find(*n) == db.packages.end())
+        {
+          Log(LOG_PLAIN) << "Package '" << *n << "' not found." << endLog;
+        }
+    }
+}
+
 bool packagemeta::isManuallyWanted() const
 {
   static bool parsed_yet = false;
@@ -315,6 +330,7 @@ bool packagemeta::isManuallyWanted() const
       {
 	parseNames (parsed_names, *n);
       }
+    validatePackageNames (parsed_names);
     for (std::vector<std::string>::iterator n = categories_options.begin ();
 		n != categories_options.end (); ++n)
       {
@@ -365,6 +381,7 @@ bool packagemeta::isManuallyDeleted() const
       {
 	parseNames (parsed_delete, *n);
       }
+    validatePackageNames (parsed_delete);
     for (std::vector<std::string>::iterator n = categories_options.begin ();
 		n != categories_options.end (); ++n)
       {
@@ -423,26 +440,26 @@ packagemeta::LDesc () const
 };
 
 /* Return an appropriate caption given the current action. */
-std::string
+std::wstring
 packagemeta::action_caption () const
 {
   switch (_action)
     {
     case Uninstall_action:
-      return "Uninstall";
+      return LoadStringW(IDS_ACTION_UNINSTALL);
     case NoChange_action:
       if (!desired)
-        return "Skip";
+        return LoadStringW(IDS_ACTION_SKIP);
       if (desired.sourcePackage() && srcpicked())
         /* FIXME: Redo source should come up if the tarball is already present locally */
-        return "Source";
-      return "Keep";
+        return LoadStringW(IDS_ACTION_SOURCE);
+      return LoadStringW(IDS_ACTION_KEEP);
     case Reinstall_action:
-      return packagedb::task == PackageDB_Install ? "Reinstall" : "Retrieve";
+      return LoadStringW(packagedb::task == PackageDB_Install ? IDS_ACTION_REINSTALL : IDS_ACTION_RETRIEVE);
     case Install_action:
-      return desired.Canonical_version ();
+      return string_to_wstring(desired.Canonical_version());
     }
-  return "Unknown";
+  return LoadStringW(IDS_ACTION_UNKNOWN);
 }
 
 void
@@ -493,23 +510,23 @@ packagemeta::list_actions(trusts const trust)
   // build the list of possible actions
   ActionList *al = new ActionList();
 
-  al->add("Uninstall", (int)Uninstall_action, (_action == Uninstall_action), bool(installed));
-  al->add("Skip", (int)NoChange_action, (_action == NoChange_action) && !installed, !installed);
+  al->add(IDS_ACTION_UNINSTALL, (int)Uninstall_action, (_action == Uninstall_action), bool(installed));
+  al->add(IDS_ACTION_SKIP, (int)NoChange_action, (_action == NoChange_action) && !installed, !installed);
 
   std::set<packageversion>::iterator i;
   for (i = versions.begin (); i != versions.end (); ++i)
     {
       if (*i == installed)
         {
-          al->add("Keep", (int)NoChange_action, (_action == NoChange_action), TRUE);
-          al->add(packagedb::task == PackageDB_Install ? "Reinstall" : "Retrieve",
+          al->add(IDS_ACTION_KEEP, (int)NoChange_action, (_action == NoChange_action), TRUE);
+          al->add(packagedb::task == PackageDB_Install ? IDS_ACTION_REINSTALL : IDS_ACTION_RETRIEVE,
                   (int)Reinstall_action, (_action == Reinstall_action), TRUE);
         }
       else
         {
-          std::string label = i->Canonical_version().c_str();
+          std::wstring label = string_to_wstring(i->Canonical_version());
           if (packagedb::solver.is_test_package(*i))
-            label += " (Test)";
+            label += L" (Test)";
           al->add(label,
                   -std::distance(versions.begin (), i),
                   (_action == Install_action) && (*i == desired),
@@ -711,11 +728,10 @@ packagemeta::logSelectionStatus() const
   packagemeta const & pkg = *this;
   const char *trust = ((pkg.desired == pkg.curr) ? "curr"
                : (pkg.desired == pkg.exp) ? "test" : "unknown");
-  std::string action = pkg.action_caption ();
   const std::string installed =
    pkg.installed ? pkg.installed.Canonical_version () : "none";
 
-  Log (LOG_BABBLE) << "[" << pkg.name << "] action=" << action << " trust=" << trust << " installed=" << installed << " src?=" << (pkg.desired && srcpicked() ? "yes" : "no") << endLog;
+  Log (LOG_BABBLE) << "[" << pkg.name << "] action=" << _action << " trust=" << trust << " installed=" << installed << " src?=" << (pkg.desired && srcpicked() ? "yes" : "no") << endLog;
   if (pkg.categories.size ())
     Log (LOG_BABBLE) << "     categories=" << for_each(pkg.categories.begin(), pkg.categories.end(), StringConcatenator(", ")).result << endLog;
 #if 0
diff --git a/package_meta.h b/package_meta.h
index 1f4f3be9..4faff410 100644
--- a/package_meta.h
+++ b/package_meta.h
@@ -58,7 +58,7 @@ public:
      Reinstall_action,
      Uninstall_action,
     };
-  static const char *action_caption (_actions value);
+  static unsigned int action_caption (_actions value);
 
   void set_action (_actions, packageversion const & default_version,
                    bool useraction = false);
@@ -77,7 +77,7 @@ public:
     version_blacklist = _list;
   }
 
-  std::string action_caption () const;
+  std::wstring action_caption () const;
   packageversion trustp (bool _default, trusts const t) const
   {
     /* If the user chose "test" and a "test" version is available, return it. */
diff --git a/package_source.cc b/package_source.cc
index dca1945e..9ae08cb7 100644
--- a/package_source.cc
+++ b/package_source.cc
@@ -25,6 +25,7 @@
 #include "Exception.h"
 #include "filemanip.h"
 #include "io_stream.h"
+#include "resource.h"
 
 extern ThreeBarProgressPage Progress;
 
@@ -113,7 +114,7 @@ packagesource::check_sha512 (const std::string fullname) const
   Log (LOG_BABBLE) << "Checking SHA512 for " << fullname << endLog;
 
   Progress.SetText1 (("Checking SHA512 for " + shortname).c_str ());
-  Progress.SetText4 ("Progress:");
+  Progress.SetText4 (IDS_PROGRESS_PROGRESS);
   Progress.SetBar1 (0);
 
   unsigned char buffer[64 * 1024];
@@ -162,7 +163,7 @@ packagesource::check_md5 (const std::string fullname) const
   Log (LOG_BABBLE) << "Checking MD5 for " << fullname << endLog;
 
   Progress.SetText1 (("Checking MD5 for " + shortname).c_str ());
-  Progress.SetText4 ("Progress:");
+  Progress.SetText4 (IDS_PROGRESS_PROGRESS);
   Progress.SetBar1 (0);
 
   unsigned char buffer[64 * 1024];
diff --git a/postinstall.cc b/postinstall.cc
index b4e0981a..136f40f1 100644
--- a/postinstall.cc
+++ b/postinstall.cc
@@ -145,7 +145,7 @@ private:
 static std::string
 do_postinstall_thread (HINSTANCE h, HWND owner)
 {
-  Progress.SetText1 ("Running...");
+  Progress.SetText1 (IDS_PROGRESS_POSTINSTALL);
   Progress.SetText2 ("");
   Progress.SetText3 ("");
   Progress.SetBar1 (0, 1);
diff --git a/prereq.cc b/prereq.cc
index a9aab21a..2382ee21 100644
--- a/prereq.cc
+++ b/prereq.cc
@@ -163,7 +163,7 @@ PrereqChecker::isMet ()
 {
   packagedb db;
 
-  Progress.SetText1 ("Solving dependencies...");
+  Progress.SetText1 (IDS_PROGRESS_SOLVING);
   Progress.SetText2 ("");
   Progress.SetText3 ("");
 
diff --git a/res.rc b/res.rc
index 2165545a..8739278d 100644
--- a/res.rc
+++ b/res.rc
@@ -28,7 +28,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 // this topic is at:
 //   http://sources.redhat.com/ml/cygwin-apps/2003-05/msg00177.html
 
-IDD_SOURCE DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_SOURCE DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Choose Installation Type"
 FONT 8, "MS Shell Dlg"
@@ -58,7 +58,7 @@ BEGIN
                     21, 9, 239, 16, NOT WS_GROUP
 END
 
-IDD_VIRUS DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_VIRUS DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Disable Virus Scanner?"
 FONT 8, "MS Shell Dlg"
@@ -78,7 +78,7 @@ BEGIN
                     IDC_STATIC,21,32,239,24,NOT WS_GROUP
 END
 
-IDD_LOCAL_DIR DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_LOCAL_DIR DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Select Local Package Directory"
 FONT 8, "MS Shell Dlg"
@@ -95,7 +95,7 @@ BEGIN
     PUSHBUTTON      "B&rowse...",IDC_LOCAL_DIR_BROWSE,285,47,44,14,WS_TABSTOP
 END
 
-IDD_ROOT DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_ROOT DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Choose Installation Directory"
 FONT 8, "MS Shell Dlg"
@@ -128,7 +128,7 @@ BEGIN
                     IDC_JUSTME_TEXT,25,140,300,32
 END
 
-IDD_SITE DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_SITE DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_CHILD | WS_VISIBLE | 
     WS_CAPTION | WS_SYSMENU
 EXSTYLE WS_EX_CONTROLPARENT
@@ -153,7 +153,7 @@ BEGIN
     PUSHBUTTON      "Add",IDC_BUTTON_ADD_URL,255,160,50,14
 END
 
-IDD_NET DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_NET DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Select Connection Type"
 FONT 8, "MS Shell Dlg"
@@ -182,7 +182,7 @@ BEGIN
                     IDC_STATIC_HEADER_TITLE,7,0,258,8,NOT WS_GROUP
 END
 
-IDD_INSTATUS DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_INSTATUS DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_CHILD | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
 CAPTION "Cygwin Setup"
@@ -209,7 +209,7 @@ BEGIN
                     WS_GROUP
 END
 
-IDD_PROXY_AUTH DIALOG DISCARDABLE  0, 0, SETUP_SMALL_DIALOG_DIMS
+IDD_PROXY_AUTH DIALOG 0, 0, SETUP_SMALL_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Proxy Authentication required"
 FONT 8, "MS Shell Dlg"
@@ -226,7 +226,7 @@ BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,165,75,45,15
 END
 
-IDD_NET_AUTH DIALOG DISCARDABLE  0, 0, SETUP_SMALL_DIALOG_DIMS
+IDD_NET_AUTH DIALOG 0, 0, SETUP_SMALL_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Server Authentication required"
 FONT 8, "MS Shell Dlg"
@@ -243,7 +243,7 @@ BEGIN
     PUSHBUTTON      "Cancel",IDCANCEL,165,75,45,15
 END
 
-IDD_SPLASH DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_SPLASH DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_CHILD | WS_VISIBLE | 
     WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup"
@@ -266,11 +266,11 @@ BEGIN
                     "necessary.",IDC_SPLASH_TEXT,115,25,195,90
     ICON            IDI_CYGWIN,IDC_SPLASH_ICON,4,6,0,0,SS_ICON | SS_REALSIZEIMAGE
     LTEXT           "Version (unknown)",IDC_VERSION,115,127,195,10
-    LTEXT           "Copyright 2000-2020",IDC_SPLASH_COPYR,115,140,195,8
+    LTEXT           "Copyright 2000-2021",IDC_SPLASH_COPYR,115,140,195,8
     LTEXT           "https://cygwin.com/",IDC_SPLASH_URL,115,152,90,8
 END
 
-IDD_DESKTOP DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_DESKTOP DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_CHILD | WS_VISIBLE | 
     WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Installation Status and Create Icons"
@@ -294,7 +294,7 @@ BEGIN
                     21,149,279,36,NOT WS_GROUP
 END
 
-IDD_FTP_AUTH DIALOG DISCARDABLE  0, 0, SETUP_SMALL_DIALOG_DIMS
+IDD_FTP_AUTH DIALOG 0, 0, SETUP_SMALL_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "FTP Authentication required"
 FONT 8, "MS Shell Dlg"
@@ -332,7 +332,7 @@ END
 #define SETUP_CLEAR_X		(SETUP_SEARCHTEXT_X + SETUP_SEARCHTEXT_W + 2)
 #define SETUP_CLEAR_W		(22)
 
-IDD_CHOOSE DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_CHOOSE DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
 CAPTION "Cygwin Setup - Select Packages"
@@ -371,7 +371,7 @@ BEGIN
                     NOT WS_GROUP
 END
 
-IDD_PREREQ DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_PREREQ DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_VISIBLE | WS_CAPTION | 
     WS_SYSMENU
 CAPTION "Cygwin Setup - Resolving Dependencies"
@@ -393,7 +393,7 @@ BEGIN
 
 END
 
-IDD_CONFIRM DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_CONFIRM DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_3DLOOK | WS_CHILD | WS_VISIBLE | WS_CAPTION |
     WS_SYSMENU
 CAPTION "Cygwin Setup - Review and confirm changes"
@@ -409,7 +409,7 @@ BEGIN
                     ES_AUTOVSCROLL
 END
 
-IDD_DROPPED DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_W, 142
+IDD_DROPPED DIALOG 0, 0, SETUP_STANDARD_DIALOG_W, 142
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Use dropped mirrors?"
 FONT 8, "MS Shell Dlg"
@@ -435,7 +435,7 @@ BEGIN
 
 END
 
-IDD_DOWNLOAD_ERROR DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_DIMS
+IDD_DOWNLOAD_ERROR DIALOG 0, 0, SETUP_STANDARD_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
 CAPTION "Download Incomplete"
 FONT 8, "MS Shell Dlg"
@@ -457,7 +457,7 @@ BEGIN
     PUSHBUTTON      "Cancel",IDABORT,240,150,50,15
 END
 
-IDD_POSTINSTALL DIALOG DISCARDABLE  0, 0, SETUP_STANDARD_DIALOG_W, 142
+IDD_POSTINSTALL DIALOG 0, 0, SETUP_STANDARD_DIALOG_W, 142
 STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_CHILD | WS_VISIBLE |
     WS_CAPTION | WS_SYSMENU
 CAPTION "Cygwin Setup - Running postinstall scripts"
@@ -478,7 +478,7 @@ BEGIN
 
 END
 
-IDD_FILE_INUSE DIALOG DISCARDABLE  0, 0, SETUP_MEDIUM_DIALOG_DIMS
+IDD_FILE_INUSE DIALOG 0, 0, SETUP_MEDIUM_DIALOG_DIMS
 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION
 CAPTION "In-use file detected"
 FONT 8, "MS Shell Dlg"
@@ -514,27 +514,27 @@ CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "setup.exe.manifest"
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_CYGWIN_SETUP        ICON    DISCARDABLE     "cygwin-setup.ico"
-IDI_CYGWIN              ICON    DISCARDABLE     "cygwin.ico"
-IDI_CYGWIN_TERMINAL     ICON    DISCARDABLE     "cygwin-terminal.ico"
-IDI_TREE_PLUS           ICON    DISCARDABLE     "tree-plus.ico"
-IDI_TREE_MINUS          ICON    DISCARDABLE     "tree-minus.ico"
+IDI_CYGWIN_SETUP        ICON    "cygwin-setup.ico"
+IDI_CYGWIN              ICON    "cygwin.ico"
+IDI_CYGWIN_TERMINAL     ICON    "cygwin-terminal.ico"
+IDI_TREE_PLUS           ICON    "tree-plus.ico"
+IDI_TREE_MINUS          ICON    "tree-minus.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // FILE
 //
 
-CYGWIN-SETUP.ICON       FILE    DISCARDABLE     "cygwin-setup.ico"
-CYGWIN.ICON             FILE    DISCARDABLE     "cygwin.ico"
-CYGWIN-TERMINAL.ICON    FILE    DISCARDABLE     "cygwin-terminal.ico"
+CYGWIN-SETUP.ICON       FILE    "cygwin-setup.ico"
+CYGWIN.ICON             FILE    "cygwin.ico"
+CYGWIN-TERMINAL.ICON    FILE    "cygwin-terminal.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // String Table
 //
 
-STRINGTABLE DISCARDABLE 
+STRINGTABLE
 BEGIN
     IDS_ROOT_SLASH          "Warning: we recommend you do not use the root of your hard drive as the cygwin root, to prevent possible conflicts with other programs.  Proceed anyway?"
     IDS_ROOT_SPACE          "You should not choose a root path that include spaces in directory names.  Proceed anyway?"
@@ -607,4 +607,25 @@ BEGIN
     IDS_ELEVATED       "Hand installation over to elevated child process."
     IDS_INSTALLEDB_VERSION "Unknown INSTALLED.DB version"
     IDS_NO_MIRROR_LST  "Could not download mirror sites list"
+    IDS_PROGRESS_PROGRESS "Progress:"
+    IDS_PROGRESS_PACKAGE "Package:"
+    IDS_PROGRESS_CONNECTING "Connecting..."
+    IDS_PROGRESS_CHECKING "Checking for packages to download..."
+    IDS_PROGRESS_DOWNLOADING "Downloading..."
+    IDS_PROGRESS_PARSING "Parsing..."
+    IDS_PROGRESS_PREREMOVE "Running preremove script..."
+    IDS_PROGRESS_UNINSTALL "Uninstalling..."
+    IDS_PROGRESS_INSTALL "Installing..."
+    IDS_PROGRESS_CALCULATING "Calculating..."
+    IDS_PROGRESS_POSTINSTALL "Running..."
+    IDS_PROGRESS_SOLVING "Solving dependencies..."
+    IDS_ACTION_DEFAULT "Default"
+    IDS_ACTION_INSTALL "Install"
+    IDS_ACTION_UNINSTALL "Uninstall"
+    IDS_ACTION_SKIP "Skip"
+    IDS_ACTION_KEEP "Keep"
+    IDS_ACTION_REINSTALL "Reinstall"
+    IDS_ACTION_RETRIEVE "Retrieve"
+    IDS_ACTION_UNKNOWN "Unknown"
+    IDS_ACTION_SOURCE "Source"
 END
diff --git a/resource.h b/resource.h
index a98924cc..f377e572 100644
--- a/resource.h
+++ b/resource.h
@@ -35,13 +35,34 @@
 #define IDS_LOCAL_DIR_INSTALL             135
 #define IDS_MAYBE_MKDIR                   136
 #define IDS_CANT_MKDIR                    137
-#define IDS_NO_LOCALDIR			  138
-#define IDS_ELEVATED			  139
+#define IDS_NO_LOCALDIR                   138
+#define IDS_ELEVATED                      139
 #define IDS_INSTALLEDB_VERSION            140
 #define IDS_DOWNLOAD_INCOMPLETE_EXIT      141
 #define IDS_QUERY_CORRUPT                 142
 #define IDS_TRUSTSYNC_TOOLTIP             143
 #define IDS_NO_MIRROR_LST                 144
+#define IDS_PROGRESS_PROGRESS             145
+#define IDS_PROGRESS_PACKAGE              146
+#define IDS_PROGRESS_CONNECTING           147
+#define IDS_PROGRESS_CHECKING             148
+#define IDS_PROGRESS_DOWNLOADING          149
+#define IDS_PROGRESS_PARSING              150
+#define IDS_PROGRESS_PREREMOVE            151
+#define IDS_PROGRESS_UNINSTALL            152
+#define IDS_PROGRESS_INSTALL              153
+#define IDS_PROGRESS_CALCULATING          154
+#define IDS_PROGRESS_POSTINSTALL          155
+#define IDS_PROGRESS_SOLVING              156
+#define IDS_ACTION_DEFAULT                157
+#define IDS_ACTION_SKIP                   158
+#define IDS_ACTION_KEEP                   159
+#define IDS_ACTION_INSTALL                160
+#define IDS_ACTION_UNINSTALL              161
+#define IDS_ACTION_REINSTALL              162
+#define IDS_ACTION_RETRIEVE               163
+#define IDS_ACTION_UNKNOWN                164
+#define IDS_ACTION_SOURCE                 165
 
 // Dialogs
 
diff --git a/site.cc b/site.cc
index d5cd1e0e..ed3b95f2 100644
--- a/site.cc
+++ b/site.cc
@@ -457,7 +457,8 @@ do_download_site_info_thread (void *p)
   {
     hinst = (HINSTANCE) (context[0]);
     h = (HWND) (context[1]);
-    if (get_site_list (hinst, h))
+    static bool downloaded = false;
+    if (!downloaded && get_site_list (hinst, h))
     {
       // Error: Couldn't download the site info.
       // Go back to the Net setup page.
@@ -468,8 +469,9 @@ do_download_site_info_thread (void *p)
       // Tell the progress page that we're done downloading
       Progress.PostMessageNow (WM_APP_SITE_INFO_DOWNLOAD_COMPLETE, 0, IDD_NET);
     }
-    else
+    else 
     {
+      downloaded = true;
       // Everything worked, go to the site select page
       // Tell the progress page that we're done downloading
       Progress.PostMessageNow (WM_APP_SITE_INFO_DOWNLOAD_COMPLETE, 0, IDD_SITE);
diff --git a/threebar.cc b/threebar.cc
index cadf3e70..f0f7473e 100644
--- a/threebar.cc
+++ b/threebar.cc
@@ -99,6 +99,30 @@ ThreeBarProgressPage::SetText4 (const TCHAR * t)
   ::SetWindowText (ins_bl_package, t);
 }
 
+void
+ThreeBarProgressPage::SetText1 (unsigned int id)
+{
+  ::SetWindowTextW (ins_action, LoadStringW(id).c_str());
+}
+
+void
+ThreeBarProgressPage::SetText2 (unsigned int id)
+{
+  ::SetWindowTextW (ins_pkgname, LoadStringW(id).c_str());
+}
+
+void
+ThreeBarProgressPage::SetText3 (unsigned int id)
+{
+  ::SetWindowTextW (ins_filename, LoadStringW(id).c_str());
+}
+
+void
+ThreeBarProgressPage::SetText4 (unsigned int id)
+{
+  ::SetWindowTextW (ins_bl_package, LoadStringW(id).c_str());
+}
+
 void
 ThreeBarProgressPage::SetBar1 (long progress, long max)
 {
diff --git a/threebar.h b/threebar.h
index 744eb1d4..8f03f6bc 100644
--- a/threebar.h
+++ b/threebar.h
@@ -74,6 +74,11 @@ public:
   void SetText3 (const TCHAR * t);
   void SetText4 (const TCHAR * t);
 
+  void SetText1 (unsigned int id);
+  void SetText2 (unsigned int id);
+  void SetText3 (unsigned int id);
+  void SetText4 (unsigned int id);
+
   void SetBar1 (long progress, long max = 100);
   void SetBar2 (long long progress, long long max = 100);
   void SetBar3 (long progress, long max = 100);
diff --git a/win32.cc b/win32.cc
index 45c7bf1b..acc01bf8 100644
--- a/win32.cc
+++ b/win32.cc
@@ -419,3 +419,15 @@ WowNativeMachine ()
   return IMAGE_FILE_MACHINE_I386;
 #endif
 }
+
+const std::wstring
+LoadStringW(unsigned int uID)
+{
+  wchar_t *buf;
+
+  int len = ::LoadStringW(GetModuleHandle(NULL), uID, (LPWSTR)&buf, 0);
+  if (len > 0)
+    return std::wstring(buf, len);
+
+  return L"";
+}
diff --git a/win32.h b/win32.h
index a7d025d2..daebf2e6 100644
--- a/win32.h
+++ b/win32.h
@@ -193,4 +193,6 @@ SetDlgItemRect (HWND h, int item, LPRECT r)
 	      r->right - r->left, r->bottom - r->top, TRUE);
 }
 
+const std::wstring LoadStringW(unsigned int uID);
+
 #endif /* SETUP_WIN32_H */



             reply	other threads:[~2021-03-15 17:58 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-15 17:58 Jon TURNEY [this message]
2021-03-16 18:31 Jon TURNEY

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210315175827.28D1A3858D29@sourceware.org \
    --to=jturney@sourceware.org \
    --cc=cygwin-apps-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).