OSDN Git Service

Streamline the installation procedure.
[mingw/mingw-get.git] / ChangeLog
index a7ec048..c24b246 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2020-06-24  Keith Marshall  <keith@users.osdn.me>
+
+       Streamline the installation procedure.
+
+       * Makefile.in (LIBEXEC_DATA): Rename it as...
+       (LIBEXEC_DLLS): ...this; other data should be enumerated separately,
+       but there is currently none.  Update all references, as appropriate.
+       (install): Add dependency on "all".  Eliminate "for" loops, using...
+       (INSTALL_PROGRAM): ...this, to perform one-shot installation for...
+       (BIN_PROGRAMS, LIBEXEC_PROGRAMS): ...each of these sets, and...
+       (INSTALL_DATA): ...this, for one-shot installation of...
+       (LIBEXEC_SCRIPTS): ...these.
+       (install-strip): Reimplement recursively, appending "-s" to...
+       (INSTALL_PROGRAM): ...this; hence remove requirement for...
+       (STRIP): ...this; delete definition.
+
+       * configure.ac (STRIP): No longer used, so no need for...
+       (AC_CHECK_TOOL): ...this, to locate it; delete configuration check.
+
+2020-06-23  Keith Marshall  <keith@users.osdn.me>
+
+       Delete an unnecessary duplicate function call.
+
+       * src/guiexec.cpp (PROGRESS_METER_CLASS): In constructor, call...
+       (SetValue): ...this only once; delete redundant second call.
+
+2020-06-23  Keith Marshall  <keith@users.osdn.me>
+
+       Eliminate invalid comparisons of "this" with nullptr.
+
+       C++ forbids calling any non-static class member function through
+       a null pointer, but makes it impossible to verify, within any such
+       function; the result of comparing the "this" pointer with nullptr
+       is deemed to be undefined behaviour.
+
+       * src/climain.cpp (pkgActionItem::GetScheduledSourceArchives)
+       [this != NULL]: Do not test; execute dependent code unconditionally.
+
+       * src/dllhook.cpp (pkgXmlNodeStack::pop) [this == NULL]: Remove
+       invalid comparison; condition should never arise, at point of call.
+       (pkgSetupAction::UpdateDatabase) [this != NULL]: Relocate test...
+       (update_database) [setup == NULL]: ...to here; do not update.
+
+       * src/pkgbase.h (pkgXmlNode::GetName, pkgXmlNode::GetParent)
+       (pkgXmlNode::GetChildren, pkgXmlNode::GetNext, pkgXmlNode::GetPropVal)
+       (pkgXmlNode::GetDocumentRoot, pkgXmlNode::IsElementOfType)
+       (pkgXmlNode::AddChild, pkgXmlNode::DeleteChild): Do not implement...
+       [this ? result : fallback]: ...any such checks; the behaviour will be
+       undefined, and the "fallback" outcome can never be achieved; simply
+       return the "result" outcome unconditionally.
+       (pkgActionItem::HasAttribute, pkgActionItem::SelectPackage)
+       [this != NULL]: Cannot verify this; return result unconditionally.
+       (pkgActionItem::Selection) [this == NULL]: Test is invalid; remove it.
+       (pkgActionItem::CancelScheduledAction): Change return type to void.
+       (pkgXmlDocument::ExecuteActions) [actions == NULL]: Do not execute.
+
+       * src/pkgdata.cpp (pkgActionItem::EnumeratePendingActions)
+       [this != NULL]: Cannot verify; relocate test...
+       (AppWindowMaker::UpdatePackageMenuBindings): ...to here; verify...
+       [pkgData->Schedule() != NULL]: ...this, before attempting to invoke...
+       (pkgData->Schedule()->EnumeratePendingActions): ...this.
+       (AppWindowMaker::UnmarkSelectedPackage): Likewise, verify both...
+       [pkgData->Schedule() != NULL]: ...this, and then...
+       [pkgData->Schedule()->GetReference() != NULL]: ...this, before...
+       (pkgData->Schedule()->GetReference()->CancelScheduledAction): ...this.
+       (pkgActionItem::CancelScheduledAction) [this != NULL]: Remove test; it
+       results in undefined behaviour, and in any case, has become redundant.
+       Change return type to void; set flags, but otherwise return nothing.
+
+       * src/pkgdeps.cpp (pkgActionItem::GetReference) [this != NULL]: Remove
+       invalid test; it has been made redundant, by testing at point of call.
+       (pkgXmlDocument::Schedule) [this != NULL]: Likewise; additionally...
+       [component != NULL]: ...verify this, before attempting to test...
+       [component->FindNextAssociate() != NULL]: ...this.
+
+       * src/pkgexec.cpp (pkgActionItem::Execute) [this != NULL]
+       (pkgActionItem::Append, pkgActionItem::Insert) [this == NULL]: Remove
+       invalid tests; delegate onus for validation to respective call sites.
+       (pkgXmlDocument::Schedule): Validate referring pointers as required.
+
+       * src/guiexec.cpp (AppWindowMaker::LoadPackageData): Confirm that...
+       [pkgXmlDocument() != NULL]: ...is true, before evaluation of...
+       [pkgXmlDocument()->IsOK()]: ...this status check.
+       (AppWindowMaker::ConfirmActionRequest): Likewise, confirm that...
+       [pkgData->Schedule() != NULL]: ...is true, before evaluation of...
+       [pkgData->Schedule()->EnumeratePendingActions() > 0]: ...this.
+
+       * src/pkgunst.cpp (pkgManifest::GetSysRootReference) [this != NULL]
+       * src/pkginst.cpp (pkgManifest::AddEntry) [this != NULL]: Remove test;
+       assume that its outcome is always effectively true, requiring callers
+       to guarantee that this is so.
+
+       * src/setup.cpp (pkgSetupAction::HasAttribute) [this != NULL]: Remove
+       invalid test, assuming true; relocate inline implementation...
+       * src/setup.h: ...to here.
+
+2020-06-22  Keith Marshall  <keith@users.osdn.me>
+
+       Do not dereference nullptr in package directory trees.
+
+       * src/pkglist.h (pkgDirectory::Insert, pkgDirectory::InOrder):
+       Delegate them to static class methods, with inline wrappers passing
+       "this" pointer explicitly, thus obviating any need for...
+       [this != NULL]: ...this invalid comparison.
+
+       * src/pkgshow.cpp (pkgDirectory::Insert, pkgDirectory::InOrder):
+       Modify them, reimplementing as the requisite static class methods.
+       (pkgDirectoryViewer::Dispatch): Reorganize process flow.
+
+2020-06-22  Keith Marshall  <keith@users.osdn.me>
+
+       Ignore spin wait requests with no designated referrer.
+
+       * src/pkgstat.h (pkgSpinWait::UpdateIndex) [this]: Cannot test for
+       nullptr, since C++ specifies result as "undefined behaviour"; test...
+       [referrer]: ...this predesignated static class property instead.
+
+2020-06-22  Keith Marshall  <keith@users.osdn.me>
+
+       Support options interpretation from an unborn options object.
+
+       * src/pkgopts.h (pkgOpts::Test, pkgOpts::IsSet, pkgOpts::GetValue)
+       (pkgOpts::GetString, pkgOpts::SetFlags): Delegate then to static class
+       methods, with inline wrappers passing "this" pointer explicitly.
+
+       * src/pkgopts.cpp (pkgOpts::Test, pkgOpts::IsSet, pkgOpts::GetValue)
+       (pkgOpts::GetString, pkgOpts::SetFlags): Implement the static methods.
+       (pkgPreferenceEvaluator::PresetScriptHook) [! pkgOptions()]: Do not
+       evaluate pkgOptions()->IsSet(); assume that it would implicitly return
+       false, thus suppressing all dependent processing, including subsequent
+       evaluation of pkgOptions()->GetString().
+
+2020-06-21  Keith Marshall  <keith@users.osdn.me>
+
+       Declare functions as void when return value is immaterial.
+
+       * src/pkginet.h (pkgDownloadMeter::Update): Declare it as a pure
+       virtual void function, rather than as pure virtual int.
+
+       * src/pkginet.cpp (pkgDownloadMeterTTY::Update)
+       * src/pkgnget.cpp (pkgDownloadMeterGUI::Update): Amend derivative
+       implementations to match; do not return anything.
+
+2020-06-21  Keith Marshall  <keith@users.osdn.me>
+
+       Ensure non-void functions always return explicit values.
+
+       * src/guimain.cpp (WinMain): Remove explicit EXIT_FAILURE returns from
+       individual exception handlers; relocate it to the default execution
+       path, to which all such handlers will fall through.
+
+       * src/dmhguix.cpp (dmhTypeGUI::notify) [DMH_COMPILE_DIGEST]: Return
+       number of bytes added to message queue; fall through, to return zero,
+       on failure to extend the queue.
+
+2020-06-20  Keith Marshall  <keith@users.osdn.me>
+
+       Simplify numeric argument interpreter function.
+
+       * src/clistub.c (xatoi) [input != NULL]: Delegate to...
+       (strtol): ...this standard library function; hence delete redundant
+       local implementation, within the NULL pointer rejection guard.
+
+2020-06-19  Keith Marshall  <keith@users.osdn.me>
+
+       Accommodate C++11 string constant conflation limitations.
+
+       * src/dllhook.cpp (MSG_INTERNAL_ERROR)
+       * src/pkgexec.cpp (LUA_LIBEXEC_PATH): Insert white space, to separate
+       adjacent string constants in conflated text.
+
+2020-06-19  Keith Marshall  <keith@users.osdn.me>
+
+       Force "C" linkage for setup key definitions.
+
+       * src/setup.cpp (uri_key, mirror_key, value_none): Wrap them...
+       (BEGIN_C_DECLS, END_C_DECLS): ...between these.
+
+2020-06-19  Keith Marshall  <keith@users.osdn.me>
+
+       Support all-static linking with recent GCC versions.
+
+       * Makefile.in (LDFLAGS): Add "-static" unconditionally.
+       (LIBS, SETUP_TOOL_LIBS): Remove all "-Wl,-Bstatic" and "-Wl,-Bdynamic"
+       references; the latter, in particular, appears to induce dynamic
+       linking of libstdc++-6.dll, overriding "--static-libstdc++".
+
+2020-06-12  Keith Marshall  <keith@users.osdn.me>
+
+       Use XML templates to adapt to download host changes.
+
+       * configure.ac (MINGW_PACKAGE_DIST_URL): Update to OSDN host URL.
+
+       * xml/profile.xml: Rename it as...
+       * xml/profile.xml.in: ...this; replace hard-coded repository URL...
+       (%PACKAGE_LIST_URL%/%F.xml.lzma): ...this template.
+
+       * xml/setup.xml: Likewise, rename it as...
+       * xml/setup.xml.in: ...this, with corresponding URL update.
+
+       * Makefile.in (install-profile): Modify procedure, using...
+       (%.xml: %.xml.in): ...this new pattern rule, to generate installed XML
+       files, from source templates.
+
+       * src/setup.rc (STRINGTABLE) <ID_DOWNLOAD_HOST_URI>: Remove trailing
+       "?download" qualifier.
+
+2020-06-11  Keith Marshall  <keith@users.osdn.me>
+
+       Discontinue formal use of the build-aux submodule.
+
+       * .gitmodules .hgsub: Files are obsolete; delete them.
+       * .gitignore .hgignore (build-aux): Add to SCM exclusion list.
+
+       * aclocal.m4 (build_aux_prefix): New macro; define it.  This provides
+       a mechanism for informally locating an external, separately maintained
+       implementation of the requisite "build-aux" module; use it in...
+       (aux_include): ...this new macro; define, and use it, to access those
+       "build-aux" M4 macros which are required at configure generation time.
+       (MINGW_AC_CONFIG_AUX_DIR, MINGW_AC_CONFIG_AUX_DIRS): New macros;
+       define them.  Together, they implement a replacement for the standard
+       AC_CONFIG_AUX_DIR macro, but offering extended path search capability,
+       at configure run time, in addition to defining...
+       (buildauxdir): ...this new AC_SUBST variable.
+
+       * configure.ac (build_alias): Define it using...
+       (ac_aux_dir): ...this autoconf path reference, defined by using...
+       (MINGW_AC_CONFIG_AUX_DIR): ...this, instead of...
+       (AC_CONFIG_AUX_DIR): ...this.
+
+       * Makefile.in (buildauxdir): Use it, for M4 file references.
+
+2020-06-02  Keith Marshall  <keith@users.osdn.me>
+
+       Do not use .hgtags for repository tag tracking.
+
+       * .hgtags: Delete file; it serves no purpose within a git repository,
+       and may actually interfere with tag inheritance, when cloning from git
+       into hg.
+
+2017-09-05  Keith Marshall  <keith@users.osdn.me>
+
+       mingw-get-0.6.3-mingw32-pre-20170905-1 posted on OSDN.net
+
+       * All files (r0-6-3-beta-20170905-1): Tag assigned.
+
+2017-09-04  Keith Marshall  <keith@users.osdn.me>
+
+       Improve probability of establishing successful URL connections.
+
+       * src/pkginet.cpp (pkgInternetAgent::OpenURL): Add...
+       (INTERNET_FLAG_KEEP_CONNECTION, INTERNET_FLAG_IGNORE_CERT_CN_INVALID)
+       (INTERNET_FLAG_IGNORE_CERT_DATE_INVALID, INTERNET_FLAG_PRAGMA_NOCACHE)
+       (INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS)
+       (INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP): ...these flags, when calling
+       the InternetOpenUrl() function.
+
+2017-09-01  Keith Marshall  <keith@users.osdn.me>
+
+       Increment version for first OSDN hosted release.
+
+       * VERSION.m4 (VERSION_PATCH): Increment to 3; thus...
+       (__VERSION__): ...this is auto-incremented to 0.6.3
+
+2013-11-26  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Conflate name and class columns in GUI package list.
+
+       * src/pkglist.cpp (AppWindowMaker::InitPackageListView): Remove...
+       <ID_PKGTYPE_COLUMN_HEADING>: ...column with this heading; add its width
+       allocation to the original pixel count alloted for the width of...
+       <ID_PKGNAME_COLUMN_HEADING>: ...this column.
+       (pkgListViewMaker::UpdateItem): Conflate content of original name and
+       class columns into first column; renumber successive columns.
+
+2013-10-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Don't attempt to resolve dependencies for unidentified packages.
+
+       * src/pkgdeps.cpp (pkgXmlDocument::ResolveDependencies):
+       [selected == NULL]: Current dependency is unresolved; do not make any
+       recursive call for this unidentified requirement.  This avoids posting
+       misleading "can't get 'tarname' for non-release element <<<unknown>>>"
+       diagnostic messages, where the subsequent "unresolved dependency"
+       message is sufficient; include dmhmsgs.h, and add...
+       (PKGMSG_SPECIFICATION_ERROR): ...this preamble instead.
+
+2013-10-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement foundation for future NLS enabled diagnostics.
+
+       * src/dmhmsgs.h: New file; it declares the NLS capable DMH interface.
+       * src/dmhmsgs.c: New file; it implements rudimentary NLS hooks, (but
+       currently does not direct them to any NLS provider), together with an
+       initial subset of a default (compiled in) message catalogue.
+
+       * Makefile.in (CORE_DLL_OBJECTS): Add dmhmsgs.$OBJEXT
+
+       * src/pkgname.cpp (pkgArchiveName): Modify diagnostics, to use...
+       (PKGMSG_SPECIFICATION_ERROR): ...this dmhmsgs.h declared message.
+
+2013-10-15  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add automated build time configuration management.
+
+       * Makefile.in (Makefile): Add regeneration rules, depending on...
+       (VERSION.m4, configure.ac, aclocal.m4, missing.m4, makeopts.m4):
+       ...these, if modified by the package maintainer, directed via...
+       (config.status, configure): ...these, regenerated as required.
+
+2013-10-04  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       mingw-get-0.6.2-mingw32-beta-20131004-1 released.
+
+       * VERSION.m4 (VERSION_PATCH): Increment it.
+       * srcdist-doc/NEWS.in: Release notes updated.
+       * All files (r0-6-2-beta-20131004-1): Tag assigned.
+
+2013-10-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Propagate RELEASE_CLASS setting from mingw-get-setup.
+
+       * configure.ac (CLI_RELEASE_CLASS, GUI_RELEASE_CLASS): Adopt...
+       (RELEASE_CLASS) [defined]: ...this as default value.
+
+2013-10-02  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Support group affiliation with component package granularity.
+
+       * src/pkglist.cpp (pkgXmlNode::IsVisibleClass): Make it synonymous
+       with IsVisibleGroupMember(); this is a temporary adjustment, pending
+       the planned implementation of component class visibility filtering.
+       (pkgListViewMaker::Dispatch): Defer consideration of visibility until
+       traversal of component package directories, except in the particular
+       case of packages which lack defined components.
+
+2013-10-01  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Correct processing of package group associations.
+
+       * src/pkgtree.cpp (AppWindowMaker::IsPackageGroupAffiliate): Iterate
+       over "affiliate_key" elements in FindNextAssociate() calls; original
+       implementation was incorrectly iterating over "group_key" elements.
+
+2013-09-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Reorder controls within "Apply Changes" dialogue.
+
+       * src/guimain.rc (IDD_APPLY_APPROVE): Move definition of the "Okay to
+       proceed?" GROUPBOX, and its contained PUSHBUTTONs, to the top; we want
+       it to get the default focus.
+
+2013-09-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Reimplement wsh.lua in C/C++; (cf. MinGW-Bug #2057).
+
+       * src/pkgexec.cpp (LUA_INLINE): New function attribute definition.
+       (init_lua_path): Use it, reproducing the original function attributes.
+       (lua_isstringarg): New LUA_INLINE helper function; implement it.
+       (lua_wsh_libexec_path): New function; it implements wsh.libexec_path
+       (lua_wsh_execute): New function; it implements wsh.execute
+       (luaload_wsh): New function; it wraps references to lua_wsh_execute()
+       and lua_wsh_libexec_path() to provide the wsh module implementation.
+       (pkgXmlNode::DispatchScript): Preload it into the Lua interpreter.
+
+       * scripts/libexec/setup.lua (M.argwrap): New method; implement it.
+       (M.shlink, M.unlink): Use it to collect their arguments into a single
+       string, to be passed as the command to be invoked by wsh.execute
+
+       * scripts/libexec/wsh.lua: File is no longer required; delete it.
+       * Makefile.in (LIBEXEC_SCRIPTS): Remove reference to it.
+
+2013-09-20  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Establish default preferences for GUI; (cf. MinGW-Feature #2036)
+
+       * src/pkgbase.h (pkgXmlDocument::EstablishPreferences): Adjust its
+       prototype; add argument identifying prospective client classification.
+
+       * src/pkgopts.cpp (client_key): New XML property keyword; define it.
+       (pkgXmlDocument::EstablishPreferences): Implement filter, based on new
+       client classification argument, to restrict preference selection to a
+       matching client class specification.
+
+       * src/climain.cpp (dbase.EstablishPreferences): Filter on class "cli".
+       * src/guiexec.cpp (pkgData->EstablishPreferences): Likewise, on "gui".
+
+       * xml/profile.xml (preferences): Add client="cli" attribute for the
+       existing specification; add another for client="gui".
+
+2013-09-20  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Force canonical comparison of shell links; (cf. MinGW-Bug #2054)
+
+       * scripts/libexec/unlink.js [FileExists(filename) && (chklink != "")]:
+       The value of 'chklink' may not be canonical; instantiate an (unsaved)
+       link reference from it, then compare the canonicalized reference from
+       within it, to the reference within 'filename', thus avoiding possible
+       lexical mismatch between canonical and non-canonical forms.
+
+2013-09-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Correct LUA_PATH assignment for GUI; (cf. MinGW-Bug #2052)
+
+       * src/pkgexec.cpp (LUA_LIBEXEC_PATH): New manifest string; define it.
+       (init_lua_path) <LUA_PATH>: Use it; add guimain.exe app directory.
+
+2013-09-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Handle meta-package removal correctly; (cf. MinGW-Bug #2051)
+
+       * src/pkgunst.cpp (pkgRemove) [archive == none]: Ensure the pending
+       action flag is cleared; previously this was done during manifest clean
+       up, and since a meta-package has no manifest, it was overlooked.
+
+2013-09-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       mingw-get-0.6.1-mingw32-beta-20130910-1 released.
+
+       * srcdist-doc/NEWS.in: Release notes updated.
+       * All files (r0-6-1-beta-20130910-1): Tag assigned.
+
+2013-09-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Fix MinGW-Bug #2026.
+
+       * src/dmhguix.cpp (DMH_PTY_GUARDBYTES): New manifest constant.
+       (dmhTypePTY::printf) [buffer full]: Use it; it defines a reserved byte
+       count, at end of buffer, where expansion or scroll out is triggered;
+       use memcpy() for scroll out, but avoid overlapping regions.
+       (dmhTypePTY::printf) [output == '\r']: Handle it.
+
+       * src/tarproc.cpp (create_output_stream): Improve diagnostic messages;
+       discriminate between file collision and other privilege violations.
+       (pkgArchiveProcessor::ExtractFile): Don't return a zero status code,
+       when the output stream could not be successfully opened, so that...
+       (pkgTarArchiveInstaller::ProcessDataStream): ...we may avoid writing a
+       spurious manifest entry here.
+
+2013-09-06  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Update version, pre-empting subsequent release.
+
+       * VERSION.m4 (VERSION_PATCH): Bump from zero to 1.
+
+2013-09-04  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       mingw-get-0.6.0-mingw32-beta-20130904-1 released.
+
+       * srcdist-doc/NEWS.in srcdist-doc/README.in: Release notes updated.
+       * srcdist-doc/INSTALL.in: Installation instructions updated.
+       * All files (r0-6-0-beta-20130904-1): Tag assigned.
+
+2013-08-26  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement retry throttling for failed internet connections.
+
+       * src/pkginet.h (INTERNET_RETRY_ATTEMPTS): New macro; define it.
+       (INTERNET_RETRY_INTERVAL, INTERNET_DELAY_FACTOR): Likewise.
+
+       * src/pkginet.cpp (INTERNET_RETRY_REQUESTER): New typedef.
+       (pkgInternetAgent::connection_delay, pkgInternetAgent::delay_factor):
+       (pkgInternetAgent::retries, pkgInternetAgent::retry_interval): New
+       private member variables; declare them.
+       (pkgInternetAgent::OpenURL): Use them; they must be initialised by...
+       (pkgInternetAgent::SetRetryOptions): ...this new method; implement it.
+       (pkgActionItem::DownloadSingleArchive): Invoke it.
+       (pkgXmlDocument::SyncRepository): Likewise.
+
+2013-08-24  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Reassign default URL for download of setup tool components.
+
+       * aclocal.m4 (PACKAGE_DIST_DOMAIN, PACKAGE_DIST_DIR): New precious
+       variables; declare them as such, and assign default values by using...
+       (MINGW_AC_PACKAGE_DIST_URL): ...this new macro; implement it.
+
+       * configure.ac (MINGW_AC_PACKAGE_DIST_URL): Use it.
+       * Makefile.in (TAG_SCRIPT): Capture assigned URL; substitute it...
+       (PACKAGE_DIST_URL): ...for this replacement text marker...
+       * src/setup.rc (ID_DOWNLOAD_HOST_URI): ...here.
+
+2013-08-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Simplify guimain.exe duplicate instance prevention.
+
+       * src/guimain.cpp (WinMain): Delegate requisite checking to...
+       (WTK::RaiseAppWindow): ...this external toolkit function.
+
+2013-08-13  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Install licence as standard setup component.
+
+       * src/guimain.h src/setup.rc (ID_PACKAGE_GUI_DISTNAME): Macro
+       no longer required; delete definition.
+
+       * src/setup.cpp (pkgSetup::DoFirstTimeInstallation):
+       <pkgSetupAction> [ID_PACKAGE_GUI_DISTNAME]: Delete reference.
+       <pkgSetupAction> [ID_PACKAGE_BASE_DISTNAME]: Update reference; repeat
+       to explicitly address each of "bin", "gui", and "lic" components.
+
+       * Makefile.in (TAG_SCRIPT) [PACKAGE_GUI_DISTNAME]: Delete reference.
+       (TAG_SCRIPT) [PACKAGE_BASE_DISTNAME]: Redefine as template.
+
+2013-08-13  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       More dialogue box adjustments.
+
+       * src/guimain.rc: Generally clean up white-space distribution.
+       (All dialogue templates): Use WS_TABSTOP consistently.
+
+2013-08-13  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Circumvent Windows-7 "Program Compatibility Assistant" misbehaviour.
+
+       * src/manifest.rc (assembly) <compatibility>: Add <supportedOS>
+       declarations for each of Vista, Win7, and (tentatively) Win8.
+
+2013-07-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Minor modification to "about" dialogue dismissal button.
+
+       * src/guimain.rc (IDD_HELP_ABOUT) <DEFPUSHBUTTON>: Change label text
+       to "Dismiss"; add WS_TABSTOP style.
+
+2013-07-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Match "about" dialogue caption to main window.
+
+       * src/guimain.rc (IDM_HELP_ABOUT) <MENUITEM>: Match it to...
+       (IDD_HELP_ABOUT) <CAPTION>: ...this; make it representative of...
+       (ID_MAIN_WINDOW_CAPTION): ...this.
+
+2013-07-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement "icon legend" display as "help" menu item.
+
+       * src/guimain.rc (IDM_HELP_LEGEND): Make menu item active; define
+       template for the dialogue box which it is to call out.
+
+       * src/guiexec.cpp (AppWindowMaker::OnCommand) [IDM_HELP_LEGEND]: New
+       case handler; implement dialogue box call out, as a variation on...
+       [IDM_HELP_ABOUT]: ...this; modify it accordingly.
+
+2013-07-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid discarding pending changes when catalogue is updated.
+
+       * src/guimain.h (IDD_CONFIRMATION): New manifest constant; define it.
+       (AppWindowMaker::ConfirmActionDialogue): New static method; declare it.
+       (AppWindowMaker::ConfirmActionRequest): New method; declare it.
+
+       * src/guimain.rc (IDD_CONFIRMATION): Implement new dialogue template.
+
+       * src/guiexec.cpp (pkgConfirmAction, pkgConfirmActionClient): New
+       static variables; they are used as pseudo-arguments, together with...
+       (DIALOGUE_DISPATCH, DIALOGUE_RESPONSE, DIALOGUE_CHKSTATE): ...these
+       new macros; define them; they facilitate the implementation of...
+       (AppWindowMaker::ConfirmActionDialogue): ...this; implement it.
+       (AppWindowMaker::ConfirmActionRequest): Implement it; use it...
+       (AppWindowMaker::OnCommand) [IDM_REPO_UPDATE]: ...here, and...
+
+       * src/pkgdata.cpp (AppWindowMaker::OnClose): ...here.
+
+2013-07-26  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Make a minor GUI layout adjustment.
+
+       * src/pkgview.cpp (VSASH_INIT_POS): Increment from 0.30 to 0.35; this
+       sets the initial height of the package list pane to be 35% of the main
+       window height, which, at the default initial window size, neatly fits
+       the entire "Basic Setup" package group, without scrolling, on my
+       1366x768 pixel Win7-VM display.
+
+2013-07-25  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement setup tool installer "plugin".
+
+       * src/setup.h (SETUP_HOOK_RUN_INSTALLER): Define request code.
+
+       * src/dllhook.cpp (run_basic_system_installer): Implement handler...
+       (setup_hook) [SETUP_HOOK_RUN_INSTALLER]: ...and invoke it.
+       (setup_hook) [default]: Collect diagnostics in common message digest.
+       (AppWindowMaker::SetupHookInvoked): Define and initialise it; in this
+       context, which does not conflict with prior definition in guimain.exe,
+       it must always remain true.
+
+       * src/setup.cpp (SetupTool) [constructor]: Invoke...
+       (SetupTool::DispatchSetupHookRequest): ...this, on user's request...
+       (SETUP_HOOK_RUN_INSTALLER): ...with this action code; this replaces...
+       (SetupTool::RunInstalledProgram): ...one reference instance for this
+       external program fork, leaving only one such reference remaining;
+       declare it to be "inline".
+
+       * Makefile.in (GUIMAIN_LIB_OBJECTS): New macro; define it.  It
+       abstracts a subset of the object modules originally enumerated...
+       (GUIMAIN_OBJECTS): ...here, whence use it; also incorporate into...
+       (SETUP_DLL_OBJECTS): ...this.
+       (SETUP_DLL_LIBS): Make it equivalent to...
+       (GUIMAIN_LIBS): ...this.
+       (mingw-get-setup-0.dll): Use...
+       (GUI_LDFLAGS): ...this, to specify linking options, rather than...
+       (LDFLAGS): ...this.
+
+2013-07-25  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add "Basic Setup" as a built-in standard package group.
+
+       * src/guimain.h (AppWindowMaker::SetupToolInvoked): New private
+       static member variable; declare it.
+
+       * src/guimain.cpp (AppWindowMaker::SetupToolInvoked): Define and
+       initialise it; this instance is specific to guimain.exe, where it
+       must always remain false.
+
+       * src/pkgtree.cpp (PKG_AFFILIATE_ALL): New constant; define it.
+       (load_package_group_hierarchy): Use it to specify those groups which
+       have all packages as affiliates, rather than just first root group.
+       (group_attributes): New static inline function; implement it, then...
+       (is_affiliated) [PKG_AFFILIATE_ALL]: ...use it to identify groups
+       which are specified as having all packages as affiliates.
+       (AppWindowMaker::InitPackageTreeView): Construct a temporary XML
+       specification for the "Basic Setup" package group, thence add it to
+       the package tree view; mark it as default group selection when...
+       [AppWindowMaker::SetupToolInvoked]: ...this is true.
+
+2013-07-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI filtering of package list by group selection.
+
+       * src/pkgbase.h (pkgXmlNode::IsVisibleGroupMember):
+       (pkgXmlNode::IsVisibleClass): New inline methods; declare them.
+       (pkgXmlNode::MapPackageGroupHierarchy): New inline method; declare it.
+       (pkgXmlNode::SetPackageGroupHierarchyMapper): Likewise; it sets up...
+       (pkgXmlNode::PackageGroupHierarchyMapper): ...this new private static
+       function pointer; declare it as a function reference, in terms of...
+       (pkgXmlNode::GroupHierarchyMapper): ...this new typedef; define it.
+
+       * src/guimain.h (AppWindowMaker::PackageTreeView): Make it static.
+       (AppWindowMaker::IsPackageGroupAffiliate): Declare new static method.
+
+       * src/pkgbind.cpp (pkgRepository::GetPackageList): Make it invoke...
+       (pkgXmlNode::MapPackageGroupHierarchy): ...this; implement it.
+
+       * src/pkglist.cpp (pkgXmlNode::IsVisibleGroupMember): Implement it.
+       (pkgXmlNode::IsVisibleClass): Likewise; just provide a stub, for now.
+       (pkgListViewMaker::Dispatch): Use them to filter package list content.
+       (AppWindowMaker::UpdatePackageList): Redraw main window when done.
+
+       * src/pkgtree.cpp [_WIN32_IE >= 0x0400]: Require this.
+       (AppWindowMaker::PackageTreeView): Define and initialise it.
+       (AppWindowMaker::InitPackageTreeView): Extend implementation; use...
+       (map_package_group_hierarchy_recursive, load package_group_hierarchy):
+       (is_existing_group, map_package_group_hierarchy): ...these; implement
+       them locally, as file scoped static helper functions.
+       (select_key): New static local string constant; define it.
+       (pkgInitCategoryTreeGraft): Use it; also have it invoke...
+       (pkgXmlNode::SetPackageGroupHierarchyMapper): ...this; implement it.
+       (AppWindowMaker::IsPackageGroupAffiliate): Implement it; it uses...
+       (is_affiliated, is_child_affiliate): ...these helpers; provide them as
+       locally implemented, file scoped static functions.
+
+       * src/pkgdata.cpp (AppWindowMaker::OnNotify): Add handler for...
+       [ID_PACKAGE_TREEVIEW && TVN_SELCHANGED]: ...this notification.
+
+2013-07-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Correct a static string buffer aliasing issue.
+
+       * src/setup.cpp (SetupTool::setup_dll): New inline method; it ensures
+       that the buffer within approot_path() refers to the setup helper DLL.
+       (SetupTool::InitialiseSetupHookAPI): Use it, when loading the DLL.
+       (SetupTool::SetupTool): Use it again, when subsequently calling...
+       (_wunlink): ...this; it is now the preferred API, replacing...
+       (DeleteFileW): ...this; do not blindly assume that...
+       (SetupTool::dll_name): ...this remains unchanged between references;
+       it is an alias for the static buffer within approot_path().
+
+2013-07-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add a custom profile for use by the setup tool.
+
+       * xml/setup.xml: New file.
+
+2013-07-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Improve handling of workspace clean-up requests.
+
+       * Makefile.in (mostlyclean): New rule; it replaces...
+       (clean): ...original intent delegated to 'mostlyclean'; retained and
+       augmented to remove all content specified by 'mostlyclean', plus...
+       (version.c, verinfo.h): ...these additional generated files.
+       (distclean): Modified; 'version.c' now removed by 'clean'.
+
+2013-07-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Correct an omission from the source code distribution.
+
+       * Makefile.in (BUILD_AUX_FILES): Add makeopts.m4; this was omitted
+       from the 2013-04-10 modification to fix MinGW-Bug #1601.
+
+2013-07-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Incorporate foundation for setup tool implementation.
+
+       * src/setup.cpp: New file; it implements the setup program.
+       * src/setup.rc: New file; it implements setup program resources.
+       
+       * src/dllhook.cpp: New file; it implements a DLL bridging API to
+       facilitate invocation of mingw-get-0.dll functions from the setup
+       program, after both DLLs have been explicitly loaded at run time.
+
+       * src/setup.h: New file; it declares the interface between the
+       setup program and the preceding mingw-get bridging DLL.
+
+       * src/guimain.h: Add filter to exclude declarations specific to...
+       [IMPLEMENTATION_LEVEL == PACKAGE_BASE_COMPONENT]: ...this case, when
+       included by compilation units specific to the setup tool components.
+       (ID_MAIN_DIALOGUE_CAPTION, ID_DOWNLOAD_HOST_URI): New resource IDs.
+       (ID_PACKAGE_BASE_DISTNAME, ID_PACKAGE_DATA_DISTNAME): Likewise.
+       (ID_PACKAGE_GUI_DISTNAME): Likewise; define them.
+
+       * Makefile.in (all): Respecify it, in terms of...
+       (all-core, all-setup): ...these new rules; define them, and also...
+       (all-setup-exe, all-setup-dll): ...these, to force building of...
+       (mingw-get-setup.$EXEEXT, mingw-get-setup-0.dll): ...these binaries.
+       (setup.res.$OBJEXT): Specify prerequisites, as for guimain.res.$OBJEXT
+       (SETUP_TOOL_OBJECTS, SETUP_TOOL_LIBS): New macros; define them.
+       (SETUP_DLL_OBJECTS, SETUP_DLL_LIBS, SETUP_DISTNAME): Likewise.
+       (TAG_SCRIPT): Add resource script substitution definitions for...
+       (ID_PACKAGE_BASE_DISTNAME, ID_PACKAGE_DATA_DISTNAME): ...these...
+       (ID_PACKAGE_GUI_DISTNAME): ...and this.
+
+2013-07-01  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add subprocess argument vector construction helpers.
+
+       * src/argwrap.c src/argwrap.h: New files; they implement an API for
+       construction of argument vectors, with appropriate quoting, to be
+       passed to MS-Windows exec'd subprocesses.  Rewritten from scratch,
+       without reference to any prior GPL licensed implementation, with MIT
+       style licence, these provide the foundation for a possible future
+       libmingwex.a implementation; they are included here, since no such
+       implementation is currently available.
+
+2013-06-28  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid inadvertent overwrite of existing files.
+
+       * src/mkpath.c (_O_NEWFILE): Conditionally specify attributes...
+       [IMPLEMENTATION_LEVEL == SETUP_TOOL_COMPONENT]: ...as they were...
+       [IMPLEMENTATION_LEVEL != SETUP_TOOL_COMPONENT]: ...else, include
+       _O_EXCL in the specified set; exclude _O_TRUNC.
+
+       * src/tarproc.cpp (dmh_notify_extraction_failed): New static inline
+       function; it encapsulates the diagnostic message factored out from...
+       (pkgArchiveProcessor::ExtractFile): ...here, whence use it.
+       (create_output_stream): Also used in this new static inline function;
+       it adds an appropriate diagnostic wrapper around set_output_stream(),
+       when _O_EXCL prevents overwrite of an existing file.
+       (pkgArchiveProcessor::SetOutputStream): Use it.
+
+2013-06-27  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Improve diagnostics for tar archive processing faults.
+
+       * src/pkgproc.h (TAR_ARCHIVE_FORMAT_ERROR): New constant; define it.
+       (TAR_ARCHIVE_DATA_READ_ERROR, TAR_ARCHIVE_DATA_WRITE_ERROR): Likewise.
+
+       * src/tarproc.cpp (dmh_notify_archive_data_exhausted): New static
+       inline function; implement it.
+       (pkgTarArchiveProcessor::GetArchiveEntry) [short header]: Use it.
+       (pkgArchiveProcessor::ExtractFile) [TAR_ARCHIVE_DATA_READ_ERROR]:
+       Likewise, use it here; also explicitlycheck for, and diagnose...
+       [TAR_ARCHIVE_DATA_WRITE_ERROR]: ...this; also add a further catch all
+       case, to diagnose any other unexpected condition.
+       (pkgTarArchiveProcessor::GetArchiveEntry) [bad checksum]: Diagnose it.
+       (pkgTarArchiveProcessor::Process): Return appropriate status codes.
+       (pkgTarArchiveProcessor::ProcessEntityData): Likewise.
+
+2013-06-24  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Facilitate version synchronisation for mingw-get-setup.
+
+       * VERSION.m4: New file.
+       * configure.ac: Include it, and...
+       (AC_INIT): ...use it.
+
+2013-06-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Keep version strings clean when release class is unspecified.
+
+       * Makefile.in (RC_SCRIPT, VERSION_SCRIPT): Simplify; assign specified
+       release class to local variable; delegate release tag generation to...
+       (TAG_SCRIPT): ...this; check release class variable is not an empty
+       string, before inserting it into the generated release tag.
+
+2013-06-20  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Rework defective assignment of product version resources.
+
+       * Makefile.in (BUILD_TAG): Avoid creating an empty build.tag file.
+       (PACKAGE_VERINFO_SCRIPT): Ensure that the build tag is generated as a
+       string of non-zero length.  Do not assume that it comprises only two
+       elements; extract the final two, as the third and fourth elements
+       of the product version meta-data record.
+
+2013-06-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Rework defective package build time-stamping logic.
+
+       * Makefile.in (%.time): Make it explicitly touch its target; the
+       2013-05-15 changes, to reduce redundancy, didn't work as expected.
+       (%.tag): Add a side effect; make it also explicitly touch %.time.
+       (%.tagged.time): This is now redundant; remove it.
+
+2013-06-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Collect distributable package files in user specified directory.
+
+       * Makefile.in (distdir): New macro; define default as abs_builddir.
+       (srcdist, bindist, licdist): Use it; direct generated tarballs to it.
+       (%.txt.dist): New pattern rule; define, and use it to make a copy...
+       (readme.txt): ...of this, in distdir, when processing...
+       (dist): ...this build objective.
+
+2013-06-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Handle Microsoft's 32-bit vs. 64-bit time_t ambiguity.
+
+       * src/apihook.c: New file; it provides...
+       (have_api): ...this helper; it checks for availability of any specific
+       API function, within a specific system DLL, (MSVCRT.DLL by default).
+
+       * src/tarproc.cpp (have_utime64_api): New inline function; it wraps...
+       (have_api): ...this, to check whether MSVCRT.DLL provides...
+       (commit_saved_entity) [_utime64]: ...this; use if available, else...
+       (commit_saved_entity) [!_utime64]: ...fall back to using...
+       (utime): ...this.
+
+       * Makefile.in (CORE_DLL_OBJECTS): Add apihook.$OBJEXT
+
+2013-06-13  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Facilitate package extraction and registration at setup time.
+
+       * src/pkgproc.h (IMPLEMENTATION_LEVEL): Add filters to facilitate
+       implementation of distinct setup time archive processing behaviour.
+       (pkgArchiveProcessor::save_on_extract): New property; declare it.
+       (pkgArchiveProcessor::SaveExtractedFiles): New method; implement it.
+       (pkgArchiveProcessor::SetOutputStream): New method; declare it.
+
+       * src/tarproc.cpp (IMPLEMENTATION_LEVEL): Add filters to implement
+       distinct setup time specific archive processing behaviour.
+       (pkgArchiveProcessor::SetOutputStream): Implement it.
+       (pkgTarArchiveExtractor::ProcessDataStream): Use it.
+       (pkgTarArchiveInstaller::ProcessDataStream): Likewise.
+
+2013-06-13  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement some GUI progress metering dialogue enhancements.
+
+       * src/pkgbase.h (pkgProgressMeter): Don't pre-empt private features
+       of derived progress metering classes; hence, we no longer need this...
+       (AppWindowMaker): ...as a forward class declaration; delete it.
+
+       * src/guimain.rc (IDD_REPO_UPDATE): Resize, and adjust layout.
+       (IDD_PROGRESS_VAL, IDD_PROGRESS_MAX, IDD_PROGRESS_PCT): Add these
+       dialogue box progress counter display elements.
+
+       * src/pkgbind.cpp (pkgRepository::GetPackageList): Adjust style of
+       progress status messages, to suit reporting via GUI dialogue box or
+       CLI console, as appropriate.
+
+       * src/guiexec.cpp (ProgressMeterMaker): Redefine class, in terms of...
+       (PROGRESS_METER_CLASS): ...this new generic class name macro.
+       Reimplement private members, previously inherited from base class;
+       adjust class constructor to ensure that they are initialised.
+       Delete explicit destructor; a default destructor is now sufficient.
+       (ProgressMeterMaker::SetRange, ProgressMeterMaker::SetValue):
+       (ProgressMeterMaker::Annotate): Factor out; reimplement them...
+
+       * src/pmihook.cpp: ...in this new file, as generalised methods of...
+       (PROGRESS_METER_CLASS): ...the class named by this macro.
+       (PROGRESS_METER_CLASS::PutVal): New private method; implement it.
+
+2013-05-31  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid a potential macro definition conflict.
+
+       * src/pkgbase.h (strcasecmp) [__MINGW32__]: Use string.h definition.
+
+2013-05-15  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Streamline build-time dependency tracking procedures.
+
+       * Makefile.in (DEPFLAGS): Adjust for simultaneous .o/.d generation.
+       (RC_DEPFLAGS): New macro; define dependency generation flags for the
+       resource compiler, which can't handle the new DEPFLAGS methodology.
+       (%.c, %.cpp, %.rc): Simplify $OBJEXT generation procedures.
+       (%.time): Remove redundantly replicated build-time procedure from...
+       (%.tagged.time): ...this; just make it a prerequisite.
+
+2013-05-15  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add resources for specification of product version.
+
+       * src/verinfo.rc src/verinfo.h.in: New files; included by...
+       * src/guimain.rc: ...this, whence also specify version information...
+       (VERINFO_FILE_NAME, VERINFO_INTERNAL_NAME, VERINFO_FILE_DESCRIPTION):
+       (VERINFO_FILE_VERSION, VERINFO_FILE_VERSION_STRING): ...per these new
+       manifest constant macros; define them, with propagation to...
+       (ID_MAIN_WINDOW_CAPTION): ...this; keep it consistent.
+
+       * Makefile.in (TAG_SCRIPT): Include invocation for...
+       (PACKAGE_VERINFO_SCRIPT): ...this new macro; defined to interpret...
+       (PACKAGE_VERINFO_PRODUCT_VERSION): ...this new substitution template;
+       it is used in src/verinfo.h.in, whence verinfo.h is generated.
+       (RC_INCLUDES): Add current working directory, for...
+       (verinfo.h): ...this; add rule and dependencies to generate it.
+
+2013-05-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Make application manifest resource definition reusable.
+
+       * src/manifest.rc: New file; factor content from...
+       * src/guimain.rc: ...here, whence include it.
+
+2013-05-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Extend DMH services to delay-loaded DLL clients.
+
+       * src/dmhcore.h (dmh_bind): New function; declare it.
+       * src/dmhcore.cpp (dmh_bind): Implement it; it provides an API through
+       which the setup tool makes its existing DMH services available to post
+       install hooks in mingw-get-0.dll, which cannot be loaded until after
+       the providing package has been downloaded and unpacked.
+
+2013-05-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid unnecessary command line globbing in GUI applications.
+
+       * src/guimain.cpp src/guistub.cpp (_CRT_glob): Declare as extern "C";
+       initialise to zero, so overriding the runtime start-up default.
+
+       * src/rites.c [! IMPLEMENT_INITIATION_RITES] (_CRT_glob): Initialise
+       to zero here too; lastrites.exe doesn't need globbing either.
+
+2013-05-04  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Address some GCC-4.7 string initialisation warnings.
+
+       * src/pkglist.cpp (AppWindowMaker::InitPackageListView): Declare all
+       headings[].text initialisers as 'const'; cast to 'char *' as required.
+       (pkgListViewMaker::Dispatch): Ditto, when inserting the 'const' empty
+       string into the list, as a component class value.
+
+       * src/pkgdata.cpp (AppWindowMaker::InitPackageTabControl): Declare all
+       TabLegend[] initialisers as 'const'; cast to 'char *' as required.
+
+2013-05-02  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Correct a spin wait thread synchronisation issue.
+
+       * src/pkgnget.cpp (pkgDownloadMeterGUI::SpinWait): Handle stop
+       requests explicitly; acknowledge when waiting thread has stopped.
+       (pkgDownloadMeterGUI::SpinWaitAction): Raise explicit stop requests;
+       wait for acknowledgement that waiting thread has stopped.
+
+2013-04-23  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Select compressed data streaming filters for use by setup tool.
+
+       * src/pkgstrm.cpp [IMPLEMENTATION_LEVEL != PACKAGE_BASE_COMPONENT]:
+       Exclude the implementations of all decompression filters, except...
+       (pkgXzArchiveStream): ...this, together with its requisite methods...
+       (pkgArchiveStream, pkgLzmaArchiveStream): ...from these.
+
+2013-04-23  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Adapt internet download agent for use by setup tool.
+
+       * src/pkgbase.h: More code rearrangement, exposing...
+       (safe_strcmp): ...this in any implementation context, controlled...
+       [USES_SAFE_STRCMP && ! HAVE_SAFE_STRCMP]: ...by this; when true...
+       (HAVE_SAFE_STRCMP): ...define this to 1, (must be non-zero).
+       [IMPLEMENTATION_LEVEL == PACKAGE_BASE_COMPONENT]: Ensure that...
+       (USES_SAFE_STRCMP): ...this is defined to 1, (i.e. non-zero).
+       (EXTERN_C): Relocate macro definition...
+       * src/pkgimpl.h: ...to here; add complementary implementation of...
+       (BEGIN_C_DECLS, END_C_DECLS): ...these new macros; define them.
+
+       * src/pkginet.h (pkgDownloadMeter::SpinWait): New static method;
+       declare it as inline, to be implemented elsewhere, delegating to...
+       (pkgDownloadMeter::SpinWaitAction): ...this new protected virtual
+       method; declare and implement it inline, as a "do nothing" base
+       class method, to be optionally overridden in a derived class.
+
+       * src/pkginet.cpp (pkgDownloadMeter::SpinWait): Implement it.
+       (pkgInternetAgent::OpenURL): Use it to invoke SpinWaitAction().
+       (USES_SAFE_STRCMP): Define as 1; (safe_strcmp() is required).
+       [IMPLEMENTATION_LEVEL != PACKAGE_BASE_COMPONENT]: Filter out code
+       which may not be required in more specialised contexts, then...
+       [IMPLEMENTATION_LEVEL == SETUP_TOOL_COMPONENT]: ...add specialised
+       variants specific to this.
+
+       * src/pkgnget.cpp [IMPLEMENTATION_LEVEL != PACKAGE_BASE_COMPONENT]:
+       Filter out code which may not be required in more specialised context.
+       (dmh_setpty): Provide locally declared prototype for external function.
+       (pkgDownloadMeterGUI): Add pseudo-terminal diagnostic message window.
+       (pkgDownloadMeterGUI::SpinWaitAction): Declare and implement GUI
+       specific method specialisation; it invokes a thread, running...
+       (pkgDownloadMeterGUI::SpinWait): ...this new static method overload.
+
+2013-04-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement pre-emptive update issue number identification.
+
+       * src/pkgkeys.h (serial_number): Declare function prototype.
+       * src/pkginet.cpp (serial_number): Implementation remains here;
+       promote from static to extern "C".
+
+       * src/pkgbind.cpp (value_assumed_new): New char constant; define it.
+       (pkgRepository::expected_issue): New private member var; declare and...
+       (pkgRepository::pkgRepository): ...initialise it, assuming new.
+       (pkgRepository::GetPackageList): Assign pre-emptively declared issue
+       number, (from package-list references), to 'expected_issue'; compare it
+       with 'current_issue' number recorded within locally stored catalogue.
+       [current_issue >= expected_issue]: Suppress redundant download; adjust
+       diagnostic messages as appropriate.
+
+2013-04-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Fix MinGW-Bug #1601 (on new issues tracker).
+
+       * aclocal.m4 (makeopts.m4): New build-aux module; include it.
+       (MINGW_AC_PROG_LEX): New macro; implement it.
+       
+       * configure.ac (AC_INIT): Make version number tripartite.
+       (MINGW_AC_MAKE_NO_PRINT_DIRECTORY): Use this new makeopts.m4 macro.
+       (MINGW_AC_PROG_LEX): Use it, in place of...
+       (AC_PROG_LEX): ...this.
+
+       * Makefile.in (MAKE): New macro; assign using autoconf's SET_MAKE.
+       (QUIET_MAKE): New macro; derive it from $(MAKE) --no-print-directory.
+       (LEX_COMMAND, LEX_COMMAND_ABORT): New macros; define them.
+       (LEX_MISSING, LEX_MISSING_MESSAGE, LEX_OUTPUT): Likewise.
+       (FORMAT_MESSAGE, MESSAGE_FOLD_WIDTH): Likewise; implemented from...
+       (AWK_CLEAR_LINE_BUFFER, AWK_FLUSH_BUFFER, AWK_PRINT_AND_CLEAR_BUFFER):
+       (AWK_COLLECT_MESSAGE, AWK_COLLECT_BLANK_LINE, AWK_PRINT_LINE_BUFFER):
+       ...this collection of internal helper macros; define them.
+       (%.c: %.l): Replacement for built-in rule; it handles "missing lex" in
+       a manner consistent with expectations of autoconf's AC_PROG_LEX.
+       (execute-command): New phoney build goal; it is used with...
+       (WITH_REQUEST): ...this new macro, to invoke commands recursively.
+
+2013-03-25  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Adapt DMH for use in setup tool.
+
+       * src/dmh.cpp: File renamed to...
+       * src/dmhcore.cpp: ...this; some code rearranged, to facilitate...
+       [IMPLEMENTATION_LEVEL == PACKAGE_BASE_COMPONENT]: ...marking of code
+       sections which are required in the base package build, but which may
+       be filtered out of the build context for the setup tool.
+       
+       * src/guidmh.cpp: File renamed to this...
+       * src/dmhguix.cpp: ...this; also add marking for...
+       [IMPLEMENTATION_LEVEL == PACKAGE_BASE_COMPONENT]: ...sections which
+       may be filtered out of the build context for the setup tool.
+       (dmhTypePTY::printf): Improve stratagem for output.
+
+       * Makefile.in (CORE_DLL_OBJECTS, GUIMAIN_OBJECTS): Adjust references
+       to renamed source files.
+
+2013-03-22  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Enable context hooks for build time code filtering.
+
+       * src/pkgimpl.h: New file; it defines...
+       (PACKAGE_BASE_COMPONENT, SETUP_TOOL_COMPONENT): ...these contexts;
+       either of these may be selected, by defining as manifest value for...
+       (IMPLEMENTATION_LEVEL): ...this; default is PACKAGE_BASE_COMPONENT.
+
+       * src/pkgbase.h: Include pkgimpl.h
+       [IMPLEMENTATION_LEVEL != PACKAGE_BASE_COMPONENT]: Occlude content.
+
+2013-03-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Specify additional files for clean-up.
+
+       * Makefile.in (distclean): Additionally specify...
+       (build.tag, build.time): ...these, as removable files.
+
+2013-03-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add a missing distribution dependency.
+
+       * Makefile.in (srcdist): Explicitly require...
+       (pkginfo.c): ...this; previously, it was only an implicit build time
+       requirement, and may not have persisted until distribution time.
+
+2013-03-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement by-name association of resource scripts with programs.
+
+       * src/guidata.rc: Renamed as...
+       * src/guimain.rc: ...this, reflecting its association with...
+       * src/guimain.cpp: ...this program source.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Update dependency...
+       (%.$OBJEXT:%.rc): ...replacing use of this pattern rule...
+       (%.res.$OBJEXT:%.rc): ...with this.
+
+2013-01-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Make GUI support visual styles in current Windows versions.
+
+       * src/guidata.rc: Add an appropriate inline manifest resource.
+
+       * src/guiexec.cpp (AppWindowMaker::Invoked): Ensure UpdateWindow() is
+       called after the initial call to AdjustLayout(); this is required to
+       ensure that all child windows are properly displayed from the outset.
+
+       * src/pkgview.cpp (AppWindowMaker::LayoutEngine):
+       [ID_PACKAGE_DATASHEET]: Adjust the top position of the frame, to make
+       the border coincide with the bottom border of the tab strip above.
+
+2013-01-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Merge gui-dev branch head to master; close gui-dev branch.
+
+       * configure.ac (AC_INIT): Reset version to 0.6; reset all package
+       files to state prevailing at gui-dev branch head.
+
+2013-01-11  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Create release branch for further r0.5 development.
+
+       * configure.ac (AC_INIT): Bump version number to 0.5.1; assign branch
+       label (mercurial bookmark) as "r0-5-1" for all files; (this is not to
+       be released, at this time).
+
 2013-01-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
 
+       Implement data sheet compiler for list of installed files.
+
+       * src/pkgdata.cpp: #include pkgproc.h; it furnishes...
+       (pkgManifest): ...this class declaration, which is required by...
+       (DataSheetMaker::DisplayFilesManifest): ...this new private inline
+       method; declare and implement it; subsequently, invoke it...
+       (DataSheetMaker::OnPaint) [PKG_DATASHEET_INSTALLED_FILES]: ...here.
+       (pkgTroffLayoutEngine::WriteLn): Correct a defect in handling of
+       excess-length unbreakable "words" outside the viewport; previously
+       they were not dropped from the input queue, resulting in repeated
+       reprocessing in an infinite loop.
+
+2013-01-09  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Include release tags in GUI displayed package versions.
+
+       * src/pkglist.cpp (pkgVersionString) [ReleaseStatus != NULL]:
+       Append ReleaseStatus and ReleaseIndex to generated version string.
+
+2013-01-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Fix enumeration of pending install actions for scheduled upgrades.
+
+       * src/pkgdata.cpp (pkgActionItem::EnumeratePendingActions):
+       [action == ACTION_UPGRADE && classified == ACTION_INSTALL]: Enumerate
+       upgrade as a special case of the install classification.
+
+2013-01-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement "Mark All Upgrades" GUI capability.
+
+       * src/guimain.h (IDM_REPO_APPLY): Renumbered; make room for...
+       (IDM_REPO_MARK_UPGRADES): ...this new constant; define it.
+
+       * src/guidata.rc (IDM_REPO_MARK_UPGRADES): New option; add it...
+       (ID_MAIN_WINDOW_WINDOW) [Installation]: ...to this drop-down menu.
+
+       * src/pkgbase.h (pkgActionItem::SuppressRedundantUpgrades): New
+       public inline method; declare it.
+
+       * src/guiexec.cpp (AppWindowMaker::OnCommand):
+       [IDM_REPO_MARK_UPGRADES]: Add case handler for this menu selection.
+       (pkgActionItem::SuppressRedundantUpgrades): New method; implement it.
+
+2013-01-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid unnecessary reloading of package list.
+
+       * src/guiexec.cpp (AppWindowMaker::OnCommand) [IDM_REPO_APPLY]:
+       Do not reload package list after processing; update it in place.
+
+2013-01-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid potential heap corruption in action scheduler.
+
+       * src/guiexec.cpp (pkgActionItem::Clear): Factor out; relocate to...
+       * src/pkgexec.cpp (pkgActionItem::Clear): ...here; this keeps all use
+       of new and delete operators on the same side of the EXE/DLL boundary
+       as the constructor and destructor for pkgActionItem objects.
+       (pkgActionItem::Schedule): Ensure that all min_wanted and max_wanted
+       references are unique to each allocated pkgActionItem object, so that
+       the destructor may safely release their associated heap memory blocks.
+
+2013-01-07  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
        Update copyright notification for development in new year.
 
        * configure.ac (YEARS_OF_ISSUE): Add year 2013.
-       (COPYRIGHT_HOLDER): Augment project name; s/MinGW/MinGW.org/
+
+       * Makefile.in (version.c, guidata.$OBJEXT): Make them depend on...
+       (Makefile): ...this, so YEARS_OF_ISSUE propagates to built objects.
+
+2012-12-24  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Work around a GUI action scheduling instability.
+
+       * src/guimain.h (AppWindowMaker::UpdateDataSheet): Declare new method.
+       * src/pkgdata.cpp (AppWindowMaker::UpdateDataSheet): Implement it.
+       (AppWindowMaker::OnNotify): Use it.
+
+       * src/guiexec.cpp (AppWindowMaker::OnCommand) [IDD_REPO_APPLY]:
+       Don't refresh package list view in-place; clear and reload it instead.
+
+2012-12-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Update distribution build rules.
+
+       * Makefile.in (SRCDIST_FILES): Remove version.c.in; this was moved
+       to src/version.c.in, and is now automatically included via...
+       (SRCDIST_SUBDIRS): ...this; remove build-aux and build-aux/m4; we want
+       only selected files from these, as filtered by specification in...
+       (BUILD_AUX_DIRS, BUILD_AUX_FILES): ...these new macros; define them.
+       (BLDTAG, SCMTAG, GCMTAG): New release class macros; define them.
+       (bindist, licdist, srcdist): Use them.
+
+2012-12-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Update CLI implementation hooks for GUI integration.
+
+       * Makefile.in (LIBEXEC_PROGRAMS): Replace gui$EXEEXT with
+       guistub$EXEEXT; update make goal references accordingly.
+
+       * src/rites.c (MINGW_GET_GUI): Redefine to be guimain$EXEEXT.
+       (MINGW_GET_GFB): Define new fall-back; let it be guistub$EXEEXT.
+       (RITES_IMPLEMENTATION): Perform rites for MINGW_GET_GUI.
+
+       * src/clistub.c (main) [cannot exec MINGW_GET_GUI]: Try
+       MINGW_GET_GFB instead.
+
+2012-12-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Rename executive core file for GUI implementation.
+
+       * src/guixmld.cpp: File renamed...
+       * src/guiexec.cpp: ...to this; its function exceeds original intent.
+       * Makefile.in (GUIMAIN_OBJECTS): Update reference accordingly.
+
+2012-12-20  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Create foundation for implementation of package category tree view.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Add pkgtree.$OBJEXT reference to...
+       * src/pkgtree.cpp: ...incorporate this new file; it implements...
+       (AppWindowMaker::InitPackageTreeView): ...this new class method...
+       (pkgInitCategoryTreeGraft): ...and this new extern "C" function.
+
+       * src/guimain.h (pkgInitCategoryTreeGraft): Declare prototype.
+       (AppWindowMaker::InitPackageTreeView): New private method; declare it.
+       (AppWindowMaker::PackageTreeView): New member variable; declare it.
+
+       * src/guixmld.cpp (AppWindowMaker::LoadPackageData): Call
+       pkgInitCategoryTreeGraft(), after loading profile.xml
+       (AppWindowMaker::Invoked): Call InitPackageTreeView()
+
+       * src/pkgview.cpp (AppWindowMaker::LayoutEngine):
+       [ID_PACKAGE_TREEVIEW]: Handle it.
+
+2012-12-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Make the "Apply Changes" dialogue "failure-aware".
+
+       * src/pkgtask.h (ACTION_APPLY_FAILED): Redefine, in terms of...
+       (ACTION_INSTALL_FAILED, ACTION_REMOVE_FAILED): New manifest defines.
+       (ACTION_UNSUCCESSFUL): New manifest constant; define it.
+
+       * src/pkgdata.cpp (pkgActionItem::EnumeratePendingActions):
+       [ACTION_UNSUCCESSFUL]: Make it a special case for enumeration.
+
+       * src/guixmld.cpp (pkgApplyChanges): Enumerate...
+       [ACTION_UNSUCCESSFUL > 0]: ...all such cases; when true...
+       [IDD_AUTO_CLOSE_OPTION]: ...this; select alternative close-out
+       messages, as appropriate.
+       (pkgActionItem::Assert): Factor out; relocate to...
+       * src/pkgexec.cpp (pkgActionItem::Assert): ...here; this moves its
+       object code into the mingw-get DLL.
+
+       * src/pkgunst.cpp (pkgRemove) [ACTION_REMOVE_FAILED]:
+       * src/pkginst.cpp (pkgInstall) [ACTION_INSTALL_FAILED]:
+       Assert as appropriate.
+
+2012-12-19  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Improve progress reporting in "Apply Changes" dialogue.
+
+       * src/pkgstat.h: New header file; it declares...
+       (pkgSpinWait): ...this new pure abstract base class; it specifies an
+       infrastructure for posting arbitrary text to dialogue controls.
+
+       * src/pkgexec.cpp (pkgSpinWait): Implement its static elements.
+       (pkgActionItem::Execute): Dispatch progress reports, handled by...
+       (pkgSpinWait::Report, pkgSpinWait::Indicator): ...these.
+
+       * src/guixmld.cpp (pkgDialogueSpinWait): New class; declare it and
+       implement locally.  It is derived from, and provides a listener for...
+       (pkgSpinWait): ...this abstract class.
+       (pkgApplyChanges): Use it.
+
+       * src/tarproc.cpp (pkgTarArchiveInstaller::ProcessDataStream): Call...
+       (pkgSpinWait::Report): ...this, to report extracted files.
+
+       * src/pkgunst.cpp (pkg_unst): Call...
+       (pkgSpinWait::Report): ...this, to report deleted files.
+
+       * src/sysroot.cpp (pkgXmlDocument::UpdateSystemMap): Call...
+       (pkgSpinWait::Report, pkgSpinWait::Indicator): ...these, to confirm
+       continuing database update activity.
+
+2012-12-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Update tab display on right-click in package list view.
+
+       * src/pkgdata.cpp (AppWindowMaker::OnNotify) [NM_RCLICK]:
+       Call DataSheetMaker::DisplayData(), before invoking pop-up menu.
+
+2012-12-17  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add more protection against NULL pointer abuse.
+
+       * src/pkgbase.h (pkgActionItem::Reset): Method renamed to...
+       * src/guixmld.cpp (pkgActionItem::Assert): ...this; also renamed here.
+       (AppWindowMaker::OnCommand): When calling...
+       (pkgListViewMaker::MarkScheduledActions): ...this, pass argument as...
+       (pkgXmlDocument::ClearScheduledActions): ...pointer returned by this.
+
+       * src/pkgdata.cpp (AppWindowMaker::MarkSchedule):
+       [pending_actions == NULL]: Do not propagate invocation request to...
+       (pkgListViewMaker::MarkScheduledActions): ...this.
+
+       * src/pkglist.cpp (pkgListViewMaker::MarkScheduledActions):
+       [schedule == NULL]: Do nothing.
+
+2012-12-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement some additional permanent debugging support.
+
+       * src/pkgdeps.cpp (pkgXmlDocument::ResolveDependencies):
+       [DEBUG_TRACE_DEPENDENCIES]: Enable DMH digest mode for messages.
+
+       * src/tarproc.cpp (pkgTarArchiveInstaller::ProcessDataStream):
+       [DEBUG_TRACE_TRANSACTIONS]: Add logging of installed file path names.
+
+2012-12-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Insert a missing snprintf format effector.
+
+       * src/pkgnget.cpp (pkgDownloadMeterGUI::Update): Add omitted '%'
+       format specifier, in "%%", for formatting percentage-complete value.
+       Rename "size_buf" automatic variable as "buf"; this results in shorter
+       source lines, and consequently a tidier source code layout.
+       (pkgDownloadMeterGUI::ResetGUI): Likewise s/size_buf/buf/
+
+2012-12-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add a missing header reference.
+
+       * src/approot.h: Include stdint.h; this ensures that wchar_t is
+       properly typedef'd, before attempting to use it.
+
+2012-12-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Make a clone of the package menu available as a pop-up.
+
+       * src/guimain.h (AppWindowMaker::SelectPackageAction): New private
+       method; declare it.
+
+       * src/pkgdata.cpp (AppWindowMaker::SelectPackageAction): Implement it.
+       (AppWindowMaker::OnNotify) [ID_PACKAGE_LISTVIEW]: Use it.
+
+2012-12-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Improve conditionally enabled state manipulation for menu items.
+
+       * src/guidata.rc (IDM_REPO_APPLY): Set its initial state as GRAYED.
+
+       * src/pkgdata.cpp (AppWindowMaker::UpdatePackageMenuBindings):
+       [IDM_PACKAGE_REINSTALL]: Always leave it GRAYED; this is a temporary
+       provision, until the GUI is updated to support "reinstall" capability.
+       [IDM_REPO_APPLY && !(EnumeratePendingActions > 0)]: Make it GRAYED.
+       [IDM_REPO_APPLY && (EnumeratePendingActions > 0)]: Enable it.
+
+2012-12-11  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI bindings for processing a schedule of actions.
+
+       * src/guimain.h (IDD_DMH_CONSOLE): New resource ID; define it.
+       (IDD_APPLY_EXECUTE): New dialogue template resource ID; define it.
+       (AppWindowMaker::ExecuteScheduledActions): New method; declare it.
+
+       * src/guidata.rc (IDD_APPLY_EXECUTE): Implement dialogue template.
+
+       * src/guixmld.cpp (pkgApplyChanges): New thread function; implement it.
+       (AppWindowMaker::OnCommand) [IDD_REPO_APPLY]: Use it; it is invoked...
+       (IDD_APPLY_EXECUTE): ...via this dialogue box, subsequently calling...
+       (AppWindowMaker::ExecuteScheduledActions): ...this; implement it.
+
+       * src/pkgexec.cpp (pkgActionItem::Execute): Add argument; use it.
+       (pkgActionItem::~pkgActionItem): Unlink chained references.
+
+       * src/pkgbase.h (pkgActionItem::Execute): Adjust prototype.
+
+2012-12-11  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Do not preserve unnecessary download requests.
+
+       * src/pkginet.cpp (pkgActionItem::DownloadArchiveFiles):
+       [(flags & ACTION_INSTALL) != ACTION_INSTALL]: Actions having no
+       "install" effect do not require a download; cancel any associated
+       download request.
+
+2012-12-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI bindings for package download agent.
+
+       * src/guimain.h (IDD_PROGRESS_VAL, IDD_PROGRESS_MAX):
+       (IDD_PROGRESS_PCT): New manifest resource IDs; define them.  They will
+       be used to identify dialogue controls, to be associated with...
+       (IDD_APPLY_DOWNLOAD): ...this new dialogue template ID; define it.
+       (AppWindowMaker::DownloadArchiveFiles): New inline method; declare it.
+
+       * src/guidata.rc (IDD_APPLY_DOWNLOAD): Implement dialogue template.
+
+       * src/pkgbase.h (pkgActionItem::DownloadArchiveFiles): New public
+       inline method; declare it.  It overloads an existing private method of
+       the same name, which it subsequently invokes.
+
+       * src/pkginet.h: New header file; it declares...
+       (pkgInvokeDownload): ...this new extern "C" function prototype, and...
+       (pkgDownloadMeter): ...this abstract class; it is factored from its
+       original implementation in pkginet.cpp, augmented by addition of...
+       (pkgDownloadMeter::primary): New static member variable; declare it.
+       (pkgDownloadMeter::UseGUI): New public method; implement it inline.
+       (pkgDownloadMeter::ResetGUI): New public method; declare it, providing
+       a do-nothing inline default implementation.  Any derived class, which
+       supports GUI capability, should override this.
+
+       * src/pkgnget.cpp: New file; it implements...
+       (pkgDownloadMeterGUI): New class, derived from pkgDownloadMeter.
+       (pkgActionItem::DownloadArchiveFiles): New overloaded inline method.
+       (AppWindowMaker::DownloadArchiveFiles): New inline method.
+       (pkgInvokeDownload): New dialogue box worker thread handler.
+
+       * src/pkginet.cpp: Include pkginet.h; hence...
+       (pkgDownloadMeter): ...remove redundant class declaration.
+       (pkgDownloadMeter::primary): Define and initialise it.
+       (pkgInternetStreamingAgent::Get) [pkgDownloadMeter::UseGUI]: Delegate
+       progress metering to referenced pkgDownloadMeterGUI class instance.
+       [! pkgDownloadMeter::UseGUI]: Continue to use the existing built-in
+       pkgDownloadMeterTTY mechanism.
+       (pkgActionItem::DownloadSingleArchive) [ACTION_DOWLOAD_FAILED]: Assert
+       this initially; subsequently clear it on successful completion.
+       (pkgActionItem::DownloadArchiveFiles): Collect diagnostic messages
+       into a single DMH_BEGIN_DIGEST ... DMH_END_DIGEST group.
+
+       * src/guixmld.cpp: Include pkginet.h; it is required by...
+       (AppWindowMaker::OnCommand) [IDD_REPO_APPLY]: Use pkgInvokeDownload.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Include pkgnget.$OBJEXT
+
+2012-12-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement "Discard" handler for GUI "Apply Changes" dialogue.
+
+       * src/pkgbase.h (pkgActionItem::Reset): New public method; declare it.
+       (pkgActionItem::Clear): New public method; declare two overloaded
+       variants, of which implement one inline.
+       (pkgXmlDocument::ClearScheduledActions): New public method; declare
+       and implement it inline.
+
+       * src/pkgtask.h (ACTION_DOWNLOAD_FAILED, ACTION_APPLY_FAILED): New
+       manifest bit-flag constants; define them.  They provide a mechanism
+       for blocking the discard event in respect of failed actions.
+
+       * src/guixmld.cpp (pkgActionItem::Reset): Implement it.
+       (pkgActionItem::Clear): Implement second, out-of-line variant.
+       (ACTION_PRESERVE_FAILED): New local manifest bit-flag constant; define
+       it as an aggregate of ACTION_DOWNLOAD_FAILED and ACTION_APPLY_FAILED.
+       (AppWindowMaker::OnCommand) [IDD_REPO_APPLY]: Use them.
+
+2012-12-07  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI dialogue for "Apply Changes" action approval.
+
+       * src/guidata.rc (ID_MAIN_WINDOW_MENU): Rename...
+       ("&Repository"): ...this drop-down menu entry...
+       ("&Installation"): ...this; add...
+       ("&Apply Changes"): ...this new selection.
+       (IDD_APPLY_APPROVE): New dialogue box resource template; define it.
+       (SS_CTEXTBOX): New aggregate style convenience macro; define it.
+       (ES_VT100): Likewise.
+
+       * src/guimain.h (IDM_REPO_APPLY): New resource ID; define it.
+       (IDM_REPO_QUIT): Redefined resource ID; was 302; changed to 312.
+       (IDD_APPLY_APPROVE, IDD_PROGRESS_TXT): New resource IDs; define them.
+       (IDD_APPLY_REMOVES_PACKAGES, IDD_APPLY_REMOVES_SUMMARY): Likewise.
+       (IDD_APPLY_INSTALLS_PACKAGES, IDD_APPLY_INSTALLS_SUMMARY): Likewise.
+       (IDD_APPLY_UPGRADES_PACKAGES, IDD_APPLY_UPGRADES_SUMMARY): Likewise.
+       (ID_APPLY, ID_DISCARD, ID_DEFER): New response IDs; define them.
+       (AppWindowMaker::EnumerateActions): New inline method; declare it.
+       (AppWindowMaker::DialogueResponse): New inline method; declare and
+       implement it.
+
+       * src/guixmld.cpp (pkglist.h): #included.
+       (dmh_setpty): Add locally declared prototype.
+       (AppWindowMaker::EnumerateActions): Implement it.
+       (pkgActionCount): New static helper function; implement it.
+       (ACTION_APPLY, APPLIES_TO): New macros; define them.
+       (FMT_APPLY_REMOVES, FMT_APPLY_INSTALLS, FMT_APPLY_UPGRADES): New
+       manifest string constants; define them.
+       (pkgApplyApproved): New static call-back function; implement...
+       (AppWindowMaker::OnCommand) [IDM_REPO_APPLY]: ...and use it.
+
+2012-12-06  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement enhanced action item enumeration capability.
+
+       * src/pkgbase.h (pkgActionItem::EnumeratePendingActions): New public
+       method; declare it.  It provides the capability to enumerate scheduled
+       actions, filtered by action classification; when invoked such that it
+       selects all actions, it may be used as a replacement for...
+       (pkgActionItem::Unapplied): ...this; delete declaration.
+
+       * src/pkgdata.cpp (pkgActionItem::EnumeratePendingActions): Implement
+       it; it is derived, with enhancement, from original implementation...
+       (pkgActionItem::Unapplied): ...of this; delete it, and...
+       (AppWindowMaker::OnClose): ...update calling reference accordingly.
+
+2012-12-05  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement PTY display emulation for GUI mode DMH.
+
+       * src/dmhcore.h (dmhTypeGeneric::set_console_hook): New public virtual
+       method; declare it, providing inline default do-nothing implementation.
+       (dmhTypeGeneric::severity_tag): New protected static method; declare it.
+       (dmhTypeGeneric::notification_format): New protected static property;
+       declare it.
+
+       * src/dmh.cpp (dmhTypeGeneric::severity_tag): Implement it.
+       (dmhTypeGeneric::notification_format): Define and initialise it.
+       (dmhTypeTTY::notify): Use them.
+       (dmh_setpty): New function; declare prototype and implement it.
+
+       * src/guidmh.cpp (dmhTypePTY): New locally implemented class.
+       (dmhTypeGUI::set_console_hook): New virtual method; declare and
+       implement it; it stores a dmhTypePTY reference pointer into...
+       (dmhTypeGUI::console_hook): ...this new private member variable.
+       (dmhTypeGUI::dmhTypeGUI): Initialise it.
+       (dmhTypeGUI::notify) [console_hook != NULL]: Delegate to it.
+       (dmhTypeGUI::printf) [console_hook != NULL]: Likewise.
+
+2012-12-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement generalised API for dialogue boxes with worker threads.
+
+       * src/guimain.h (pkgDialogueThread): New typedef; declare it.
+       (AppWindowMaker::DialogueThread): New static property; declare it.
+       (AppWindowMaker::DispatchDialogueThread): New method; declare it.
+
+       * src/guixmld.cpp: Formatting of several comments adjusted.
+       (pkgUpdate, pkgInitDataLoad): Defunct functions; replaced by...
+       (pkgDialogue): ...this new static call-back function; implement it.
+       (AppWindowMaker::DialogueThread): Instantiate and initialise it.
+       (AppWindowMaker::DispatchDialogueThread): Implement it.
+       (AppWindowMaker::Invoked): Use it to invoke pkgInvokeInitDataLoad()...
+       (AppWindowMaker::OnCommand): ...and pkgInvokeUpdate().
+
+2012-12-03  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Consolidate GUI implementation for package list view management.
+
+       * src/pkglist.h (pkgListViewMaker::GetTitle): Disused overloaded
+       method; remove all declarations.
+       (pkgListViewMaker::GetVersionString): Disused method; remove
+       declaration.
+       (pkgListViewMaker::GetItem): New private inline method; declare it.
+       (pkgListViewMaker::UpdateItem): New private method; declare it.
+       (pkgListViewMaker::UpdateListView): New public method; declare it.
+       (pkgListViewMaker::MarkScheduledActions): Likewise.
+
+       * src/guimain.h (AppWindowMaker::MarkSchedule): New public inline
+       method; declare it, but defer implementation to...
+
+       * src/pkgdata.cpp (AppWindowMaker::MarkSchedule): ...here; not used
+       elsewhere, it is derived from, and replaces...
+       (pkgMarkSchedule): ...this function; factor out redundant code, in
+       favour of delegation to pkgListViewMaker::MarkScheduledActions(), with
+       following call to AppWindowMaker::UpdatePackageMenuBindings(); update
+       calling function references...
+       (AppWindowMaker::UnmarkSelectedPackage): ...here, and...
+       (AppWindowMaker::Schedule): ...here.
+
+       * src/pkglist.cpp (pkgVersionString): New static function; implement
+       it as a local replacement for...
+       (pkgListViewMaker::GetVersionString): ...this defunct class method.
+       (pkgGetTitle): New overloaded static function; implement two variants,
+       as local replacements for...
+       (pkgListViewMaker::GetTitle): ...this defunct overloaded class method.
+       (pkgListViewMaker::UpdateItem): Implement it; factor code from...
+       (pkgListViewMaker::InsertItem): ...here, whence use it.
+       (pkgListViewMaker::MarkScheduledActions): Implement it.
+       (pkgListViewMaker::UpdateListView): Implement it.
+       (pkgListViewMaker::pkgListViewMaker): Remove references to...
+       (LVIF_TEXT): ...this.
+
+2012-11-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Increase width of window sash bars by 50%.
+
+       * src/guimain.h (SASH_BAR_THICKNESS): Increase from 4 to 6; this makes
+       it easier to grab the sash bars, so they may be dragged; IMO, it also
+       results in a better appearance.
+
+2012-11-29  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Maintain consistent internal vs. external installation records.
+
+       * src/pkginst.cpp (pkgInstall): Set "installed" attribute on internal
+       package reference, to "yes", after installation; CLI didn't need this,
+       but GUI will do so, for any package revisited in a single session.
+
+       * src/pkgunst.cpp (pkgRemove): Similarly, negate "installed" attribute
+       after package removal.
+
+2012-11-17  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Refactor to consolidate three instances of duplicate code.
+
+       * src/pkglist.h (pkgGetStatus): New function; declare it.
+       * src/pkglist.cpp (pkgGetStatus): Implement it; factor out from...
+       (pkgListViewMaker::InsertItem): ...here, whence use it.
+       * src/pkgdata.cpp (pkgMarkSchedule): Likewise here...
+       (DataSheetMaker::DisplayGeneralData): ...and here.
+
+2012-11-16  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add GUI support for install, upgrade, and remove action scheduling.
+
+       * src/guimain.h (EXTERN_C): Ensure it is defined.
+       (pkgActionItem): Add forward declaration of class name.
+       (pkgMarkSchedule): New EXTERN_C function; declare and prototype it.
+       (AppWindowMaker::OnClose): New virtual method; declare it.
+       (AppWindowMaker::Schedule): New public method; declare it.
+       (AppWindowMaker::UnmarkSelectedPackage): Likewise.
+
+       * src/pkgbase.h (pkgActionItem::HasAttribute) [this == NULL]: Add
+       protective logic; ignore attempts to access non-existent objects.
+       (pkgActionItem::SelectPackage) [this == NULL]: Likewise.
+       (pkgActionItem::Selection) [this == NULL]: Likewise.
+       (pkgActionItem::GetReference): New overloaded public method; declare
+       prototype variant with argument type of pkgXmlNode*.
+       (pkgActionItem::Unapplied): New public method; declare it.
+       (pkgActionItem::CancelScheduledAction): Likewise.
+       (pkgXmlDocument::Schedule): Change return type from void to
+       pkgActionItem*; add default argument values.
+
+       * src/guixmld.cpp (AppWindowMaker::OnCommand): Add menu case hooks...
+       [IDM_PACKAGE_INSTALL]: ...to schedule package 'install' action...
+       [IDM_PACKAGE_UPGRADE]: ...package 'upgrade' action...
+       [IDM_PACKAGE_REMOVE]: ...package 'remove' action, or...
+       [IDM_PACKAGE_UNMARK]: ...to cancel any of these scheduling requests.
+       [IDM_REPO_QUIT]: Correct typo; s/WM_QUIT/WM_CLOSE/ in comment.
+
+       * src/pkgdata.cpp (pkgMarkSchedule): Implement it.
+       (pkgActionItem::CancelScheduledAction): Implement it.
+       (pkgActionItem::Unapplied): Implement it.
+       (AppWindowMaker::UpdatePackageMenuBindings): Improve comments.
+       (AppWindowMaker::UnmarkSelectedPackage): Implement it.
+       (AppWindowMaker::Schedule): Implement it.
+       (AppWindowMaker::OnClose): Implement it.
+
+       * src/pkgdeps.cpp (pkgActionItem::GetReference): Implement overload.
+       (pkgXmlDocument::Schedule): Change return type, and return value.
+       [this == NULL]: Add protective logic; ignore non-existent objects.
+       [name == NULL]: Do not schedule; just return existing action list.
+
+2012-11-02  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add dynamically enabled state control for package menu items.
+
+       * src/guimain.h (AppWindowMaker::UpdatePackageMenuBindings): New
+       private method; declare it.
+
+       * src/pkgdata.cpp (AppWindowMaker::UpdatePackageMenuBindings):
+       Implement it, and...
+       (AppWindowMaker::OnNotify): ...use it.
+
+2012-11-01  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid excessive inter-word spaces in adjusted text.
+
+       * src/pkgdata.cpp (pkgTroffLayoutEngine::WriteLn): Check extent of
+       padding to be added at each inter-word space, when adjusting text; do
+       not adjust, if it exceeds 5% of available display pane width.
+
+2012-11-01  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Elide unbreakable text which will not fit within display width.
+
+       * src/pkgdata.cpp (pkgTroffLayoutEngine::WriteLn): Add logic to detect
+       over-width unbreakable text; elide characters from the right, to make
+       it fit within the display width, with trailing ellipsis.
+
+2012-11-01  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add content compiler for package data sheet "general" tab.
+
+       * src/pkgbase.h (pkgActionItem::PrintURI): Make it public.  Add a
+       call-back reference argument, for output function; assign puts() as
+       default, where previously had hard coded printf() emulating puts()
+
+       * src/pkginet.cpp (pkgActionItem::PrintURI): Use call-back hook.
+
+       * src/pkgdata.cpp (DataSheetMaker::Display): New static property; it
+       stores a reference to the active class instance, so static call-back
+       methods may delegate processing requests to non-static methods.
+       (DataSheetMaker::Advance): New static property; it is used to instruct
+       call-back methods to interpose paragraph leading it the output stream.
+       (DataSheetMaker::FormatRecord): New private method; implement it.
+       (DataSheetMaker::FormatText): Don't pass "canvas" as an argument; we
+       can access it directly as a class property.  Update all callers as
+       necessary, to conform to modified function prototype.
+       (pkgListSelection): New static function; implement it, and...
+       (DataSheetMaker::OnPaint): ...use it in switch cases, when calling...
+       [PKG_DATASHEET_GENERAL]: DataSheetMaker::DisplayGeneralData(), and...
+       [PKG_DATASHEET_DESCRIPTION]: DataSheetMaker::DisplayDescription().
+       (DataSheetMaker::DisplayGeneralData): New public method; implement it.
+       (DataSheetMaker::DisplayPackageURL): New static method; implement it.
+       (DataSheetMaker::DisplayLicenceURL): Likewise.
+       (DataSheetMaker::DisplaySourceURL): Likewise.
+
+2012-10-30  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Fix error in counting of catalogue files during loading.
+
+       * src/pkgbind.cpp (pkgRepository::GetPackageList): Increment count
+       variable once only, at start of each cycle of the catalogue loading
+       loop; previous strategy of counting in discrete logic paths could
+       miss several required increments, particularly in CLI mode.
+
+2012-10-27  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Avoid DMH message digest fragmentation when downloading.
+
+       * src/dmh.h (DMH_GET_CONTROL_STATE): New macro; define it.
+       * src/pkginet.cpp (pkgInternetAgent::OpenURL): Use it; do not close
+       locally opened message digest, when called with one already open.
+
+2012-10-27  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Initiate progress metering for catalogue load and update operations.
+
+       * src/guidata.rc (IDD_REPO_UPDATE): New dialogue template; define it.
+       (IDM_REPO_UPDATE): Enable selection from "Repository" drop-down menu.
+
+       * src/guimain.h (IDD_REPO_UPDATE, IDD_CLOSE_OPTIONS):
+       (IDD_AUTO_CLOSE_OPTION, IDD_PROGRESS_BAR, IDD_PROGRESS_MSG): New
+       resource identification manifest constants; define them.
+       (pkgXmlNode, pkgProgressMeter): Add forward class declarations.
+       (AppWindowMaker::AttachedProgressMeter): New private data; define...
+       (AppWindowMaker::AppWindowMaker): ...and initialise it.
+       (AppWindowMaker::AttachProgressMeter): New public method; declare it.
+       (AppWindowMaker::DetachProgressMeter): Likewise.
+       (AppWindowMaker::LoadPackageData, AppWindowMaker::ClearPackageList):
+       (AppWindowMaker::UpdatePackageList): Make them public.
+
+       * src/pkgbase.h (pkgProgressMeter): New abstract class; declare it.
+       (AppWindowMaker) [GUIMAIN_H undefined]: Add forward class declaration.
+       (pkgXmlDocument::progress_meter): New private data member; declare...
+       (pkgXmlDocument::pkgXmlDocument): ...and initialise it.
+       (pkgXmlDocument::ProgressMeter, pkgXmlDocument::AttachProgressMeter):
+       (pkgXmlDocument::DetachProgressMeter): New public inline methods;
+       implement them.
+
+       * src/pkgview.cpp (WTK::GenericDialogue): Delete disused reference.
+       (AppWindowMaker::OnCommand): Factor out implementation; relocate it...
+       * src/guixmld.cpp: ...to here; thus it may utilise dependants of...
+       (ProgressMeterMaker): ...this new locally implemented class.
+       (AppWindowMaker::AttachProgressMeter): Implement it.
+       (AppWindowMaker::AttachProgressMeter): Likewise.
+       (pkgProgressMeter::~pkgProgressMeter): Likewise.
+       (pkgUpdate, pkgInvokeUpdate): New static functions; implement them.
+       (AppWindowMaker::Invoked): Replace direct call to LoadPackageData by
+       an indirect invocation, via a progress metering dialogue box using...
+       (pkgInitDataLoad): ...this new static callback function, invoking...
+       (pkgInvokeInitDataLoad): ...this new static thread function, whence...
+       (AppWindowMaker::LoadPackageData): ...this; add hook-up call to...
+       (pkgXmlDocument::AttachProgressMeter): ...incorporate this.
+
+       * src/pkgbind.cpp (pkgRepository::total, pkgRepository::count): New
+       private static properties; declare and instantiate them; provide...
+       (pkgRepository::Reset, pkgRepository::IncrementTotal): ...new public
+       static methods to manipulate them; declare and implement them inline.
+       (pkgRepository::GetPackageList): Use them to manage updates to the
+       pkgProgressMeter class instance, if any, which has been bound to
+       the controlling pkgXmlDocument class instance, when invoking...
+       (pkgXmlXmlDocument::BindRepositories): ...this.
+
+2012-10-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Associate DMH message boxes with active dialogues.
+
+       * src/guidmh.cpp (last_active_popup): New static inline function.
+       (dmhTypeGUI::dispatch_message): Use it.
+
+2012-10-18  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Fix Diagnostic Message Handler initialisation logic.
+
+       * src/dmh.cpp (dmh_init) [DMH_SUBSYSTEM_GUI]: Correct a logic error;
+       it previously fell through after any successful initialisation of the
+       DMH_SUBSYSTEM_GUI handler, replacing it with a DMH_SUBSYSTEM_TTY type
+       handler.  Also, assign a heap copy of the passed "progname" string
+       resource, which is volatile, to ensure that the handler retains a
+       valid reference.
+
+2012-10-11  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement preliminary GUI mode data sheet compiler.
+
+       * src/guimain.h (DataSheetMaker): New class; forward declare it.
+       (AppWindowMaker::InitPackageTabControl): New private method; declare it.
+       (AppWindowMaker::DataSheet, AppWindowMaker::PackageTabControl):
+       (AppWindowMaker::TabDataPane, AppWindowMaker::PackageTabPane): New
+       private data members; declare them.
+       (ID_SASH_WINDOW_PANE_CLASS): New string resource identifier; define it.
+       (ID_PACKAGE_DATASHEET, ID_PACKAGE_TABPANE): New window identifiers;
+       define them.
+
+       * src/guidata.rc (ID_SASH_WINDOW_PANE_CLASS): Specify string resource.
+
+       * src/pkgview.cpp (AppWindowMaker::OnSize): Add handler for...
+       (ID_PACKAGE_TABPANE, ID_PACKAGE_TABCONTROL, ID_PACKAGE_DATASHHET):
+       ...this group of sash pane child window entities.
+       (AppWindowMaker::OnNotify): Comment out disused stub implementation.
+
+       * src/pkgshow.cpp (pkgUTF8Parser): Factor out class declaration...
+       (UTF32_MAX, UTF32_OVERFLOW, UTF32_INVALID): ...these definitions...
+       (utf32_t): ...and this typedef; relocate to, and #include...
+       * src/pkgdata.h: ...this new header file.
+
+       * src/pkgdata.cpp (DataSheetMaker): New class; declare and implement it.
+       (AppWindowMaker::InitPackageTabControl): Implement it.
+       (AppWindowMaker::OnNotify): Reimplement it.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Add pkgdata.OBJEXT
+
+       * src/guixmld.cpp (AppWindowMaker::Invoked): Add call to invoke
+       AppWindowMaker::InitPackageTabControl()
+
+2012-10-09  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Remove a grossly heuristic list view hack.
+
+       * src/pkglist.cpp (pkgListViewMaker::GetTitle): Remove code for the
+       heuristic deletion of any redundant package name prefixes from package
+       title attributes; by now, all such prefixes should have been removed
+       from the catalogue, explicitly, at source.
+
+2012-10-08  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI list view compiler for XML catalogue.
+
+       * src/pkgview.cpp (AppWindowMaker::LayoutEngine): Add case handler...
+       [pane_id == ID_PACKAGE_LISTVIEW]: ...for this window pane class.
+
+       * src/guimain.h (ID_PKGLIST_TABLE_HEADINGS):
+       (ID_PKGNAME_COLUMN_HEADING, ID_PKGTYPE_COLUMN_HEADING):
+       (ID_INSTVER_COLUMN_HEADING, ID_REPOVER_COLUMN_HEADING):
+       (ID_PKGDESC_COLUMN_HEADING): New resource identifiers; define them.
+       (ID_PKGSTATE_AVAILABLE, ID_PKGSTATE_AVAILABLE_NEW):
+       (ID_PKGSTATE_AVAILABLE_LOCKED, ID_PKGSTATE_AVAILABLE_INSTALL):
+       (ID_PKGSTATE_INSTALLED_CURRENT, ID_PKGSTATE_INSTALLED_LOCKED):
+       (ID_PKGSTATE_INSTALLED_OLD, ID_PKGSTATE_UPGRADE, ID_PKGSTATE_REMOVE):
+       (ID_PKGSTATE_REINSTALL, ID_PKGSTATE_DOWNGRADE, ID_PKGSTATE_BROKEN):
+       (ID_PKGSTATE_PURGE): New icon resource identifiers; define them.
+       (AppWindowMaker::InitPackageListView): New private method; declare it.
+       (AppWindowMaker::UpdatePackageList): New private method; declare it.
+       (AppWindowMaker::ClearPackageList): New private method; declare and
+       implement it inline.
+
+       * src/guidata.rc (ID_PKGSTATE_AVAILABLE, ID_PKGSTATE_AVAILABLE_NEW):
+       (ID_PKGSTATE_AVAILABLE_LOCKED, ID_PKGSTATE_AVAILABLE_INSTALL):
+       (ID_PKGSTATE_INSTALLED_CURRENT, ID_PKGSTATE_INSTALLED_LOCKED):
+       (ID_PKGSTATE_INSTALLED_OLD, ID_PKGSTATE_UPGRADE, ID_PKGSTATE_REMOVE):
+       (ID_PKGSTATE_REINSTALL, ID_PKGSTATE_DOWNGRADE, ID_PKGSTATE_BROKEN):
+       (ID_PKGSTATE_PURGE): New icon resources; implement them.
+
+       * icons/state01.ico icons/state02.ico icons/state03.ico:
+       * icons/state04.ico icons/state05.ico icons/state06.ico:
+       * icons/state07.ico icons/state08.ico icons/state09.ico:
+       * icons/state10.ico icons/state11.ico icons/state12.ico:
+       * icons/state13.ico: New files.  All are cloned from synaptic icons;
+       see src/guimain.rc for symbolic/functional reference names.
+
+       * src/pkglist.h [GUIMAIN_H defined] (pkgListViewMaker): New class;
+       declare it for use in modules which #include guimain.h
+
+       * src/pkglist.cpp: New file; it implements...
+       (pkgListViewMaker): ...this new class, and its clients...
+       (AppWindowMaker::InitPackageListView): New method.
+       (AppWindowMaker::UpdatePackageList): Likewise.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Add pkglist.OBJEXT
+
+       * src/guixmld.cpp (AppWindowMaker::Invoke): Call InitCommonControls(),
+       as prerequisite to AppWindowMaker::InitPackageListView(); follow up by
+       calling AppWindowMaker::AdjustLayout().
+
+2012-10-07  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add GUI initialiser hook for XML catalogue interface.
+
+       * src/guimain.h (AppWindowMaker::Invoke): New public method; declare
+       it; it overrides the generic WTK::MainWindowMaker::Invoke() method, so
+       providing the initialiser hook which will invoke this...
+       (AppWindowMaker::LoadPackageData): ...new private method; declare it.
+
+       * src/guixmld.cpp: New file.
+       (AppWindowMaker::Invoke): Implement it.
+       (AppWindowMaker::LoadPackageData): Likewise.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Add guixmld.OBJEXT
+
+2012-09-29  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Add initial working GUI mode DMH class implementation.
+
+       * src/dmh.h (DMH_SEVERITY_MASK): New manifest constant; define it.
+       (DMH_DIGEST_MASK, DMH_COMPILE_DIGEST, DMH_DISPATCH_DIGEST): Likewise.
+       (DMH_BEGIN_DIGEST, DMH_END_DIGEST): Redefine in terms of above.
+
+       * src/dmhcore.h: New header file; it declares...
+       (dmhTypeGeneric): ...this abstract base class, factored from...
+
+       * src/dmh.cpp (dmhTypeGeneric): ...here, whence remove it; it is
+       still required, thus include dmhcore.h so that it remains visible.
+       (dmh_exception): Remove errant namespace qualifier from constructor.
+       (dmhTypeGUI): Delete class declaration and original constructor.
+       (dmh_init): Delete reference to dmhTypeGUI; replace by call to...
+       (dmh_init_gui): ...this new static function; it is a stub which
+       invokes a DLL import of the same name, to instantiate a dmhTypeGUI.
+       (dmhTypeGUI::control, dmhTypeGUI::notify, dmhTypeGUI::printf): Delete
+       original method stubs.
+
+       * src/guidmh.cpp: New file; it reimplements...
+       (dmhTypeGUI): ...this class; declare it and implement its constructor.
+       (dmh_init_gui): Provide its DLL exported implementation.
+       (dmhTypeGUI::dispatch_message): New private method; add it to the
+       class declaration and implement it; it is a helper method for...
+       (dmhTypeGUI::control, dmhTypeGUI::notify): ...these; implement them.
+       (dmhTypeGUI::printf): Provide a replacement stub.
+
+       * Makefile.in (GUIMAIN_OBJECTS): Add guidmh.OBJEXT
+
+       * src/guimain.h (AppWindowMaker::Create): New method; add it to the
+       class declaration; it overrides the default Create() method inherited
+       from WTK::MainWindowMaker
+
+       * src/pkgview.cpp (AppWindowMaker::Create): Implement it; it handles
+       window class registration and dmhTypeGUI initialisation, in addition
+       to the inherited CreateWindow() behaviour.
+
+       * src/guimain.cpp: Include dmh.h
+       (WinMain): Add catch block for dmh_exception.  Remove window class
+       registration request; it is now delegated to AppWindowMaker::Create()
 
 2012-09-26  Keith Marshall  <keithmarshall@users.sourceforge.net>
 
 
        * .hgignore: New file.
 
+2012-09-25  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Defer generation of version.c until "make" time.
+
+       * version.c.in: Move it...
+       * src/version.c.in: ...to here.
+       (PACKAGE_NAME, PACKAGE_VERSION, COPYRIGHT_HOLDER, YEARS_OF_ISSUE):
+       Change substitution field marker character from "@" to "%".
+
+       * configure.ac (AC_CONFIG_FILES): Remove version.c
+
+       * Makefile.in (TAG_SCRIPT): New macro, factored out from...
+       (RC_SCRIPT): ...here, whence use it; also use it to implement...
+       (VERSION_SCRIPT): ...this further new macro; use it in...
+       (%.c): ...this generic template rule for version.c
+       (time-stamp, %.time, %.tagged.time, %.tag): New generic build
+       goals; use them to track package release progression via...
+       (build.tag): ...this new intermediate; make it a pre-requisite...
+       (guidata.OBJEXT, version.c): ...of these.
+
+2012-09-21  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement framework for GUI sash window layout controller.
+
+       * configure.ac (AC_INIT): Bump version number to 0.6
+       (CLI_RELEASE_CLASS): New AC_SUBST variable; default to "beta".
+       (GUI_RELEASE_CLASS): New AC_SUBST variable; default to "alpha".
+       (SNAPSHOT_CLASS): Recognise as user specified environent variable
+       override for both CLI_RELEASE_CLASS and GUI_RELEASE_CLASS.
+       (RC): New AC_CHECK_TOOL substitution variable name; it replaces...
+       (WINDRES): ...this, as reference name for the resource compiler.
+       (MINGW_AC_ASSERT_MISSING): Add AC_CHECK_HEADER traps for missing
+       "lua-dev" and "wtklite-dev" support.
+
+       * Makefile.in (CLI_RELEASE_CLASS, GUI_RELEASE_CLASS): Use them.
+       (BUILD_TAG, RC_SCRIPT, RC_INCLUDES): New macros; define and use...
+       (RC): ...with this, to implement new target rule for compiling...
+       (%.rc): ...resource definition files to %.OBJEXT objects.
+       (GUIMAIN_OBJECTS, GUIMAIN_LIBS): New macros; define and use...
+       (guimain.EXEEXT): ...to implement build rule for this.
+       (LIBEXEC_PROGRAMS): Add guimain.EXEEXT
+       (lastrites.EXEEXT): Use GUI_LDFLAGS.
+       
+       * src/guimain.h src/guimain.cpp src/guidata.rc: New files.
+       * src/pkgview.cpp: New file.
+
+2012-09-20  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Adjust incorrectly resolved 2012-09-14 merge from master.
+
+       * src/Makefile.in: Restore lost reference to guistub.cpp
+
+2012-09-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Implement GUI hooks in "rites of passage" internal API.
+
+       * src/pkglock.h: New file; it adds the pkgLock() and pkgRelease()
+       inline wrapper functions, through which the GUI application acquires
+       and manages an exclusive access lock for the XML catalogue.
+
+       * src/rites.c (lockfile_name): Explicitly cast memory allocated for
+       the returned name to (char *), so this may be embedded in C++ code.
+       (pkgInitRites): Factor out lock acquisition failure diagnostics...
+       (pkgLockFail): ...to this inline helper function; conditionally...
+       [ifdef GUIMAIN_H]: ...provide one implementation for GUI use...
+       [ifndef GUIMAIN_H]: ...and an alternative for CLI use.
+
+2012-09-14  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Be case agnostic when matching shortcut targets.
+
+       * scripts/libexec/unlink.js [ref.TargetPath == chklink]: Apply
+       toLowerCase() on both sides of the comparison.
+
 2012-09-12  Keith Marshall  <keithmarshall@users.sourceforge.net>
 
        Note relocation of m4 when packaging source distribution.
 
        * Makefile.in (SRCDIST_SUBDIRS): Refer to build-aux/m4, not m4.
 
+2012-09-10  Keith Marshall  <keithmarshall@users.sourceforge.net>
+
+       Move guimain.cpp out of the way.
+
+       * src/guimain.cpp: Rename file as...
+       * src/guistub.cpp: ...this; we want to keep current features for now,
+       but to use the guimain.cpp name for main GUI application development.
+       * Makefile.in: Adjust references accordingly.
+
 2012-09-09  Keith Marshall  <keithmarshall@users.sourceforge.net>
 
        Fix typo, and update licensing terms for embedded getopt.c