+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).
+