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