//******************************************************************************
//* Taggit Metadata Editor (taggit) Version History                            *
//*                                                                            *
//* Author     : Mahlon R. Smith                                               *
//*              Copyright (c) 2016-2020 Mahlon R. Smith, The Software Samurai *
//*              On the web :            http://www.SoftwareSam.us/            *
//*                                                                            *
//*              Source code, binary, and CSS style definitions released under *
//*                 GNU GPL version 3.                                         *
//*              Documentation released under:                                 *
//*                 GNU FDL version 1.3                                        *
//*                                                                            *
//* Date       : 19-Oct-2020                                                   *
//*                                                                            *
//* -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  *
//* Copyright Notice:                                                          *
//* This program is free software: you can redistribute it and/or modify it    *
//* under the terms of the GNU General Public License as published by the Free *
//* Software Foundation, either version 3 of the License, or (at your option)  *
//* any later version.                                                         *
//*                                                                            *
//* This program is distributed in the hope that it will be useful, but        *
//* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *
//* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License   *
//* for more details.                                                          *
//*                                                                            *
//* You should have received a copy of the GNU General Public License along    *
//* with this program.  If not, see <http://www.gnu.org/licenses/>.            *
//*                                                                            *
//* -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  *
//* The full copyright notice for 'taggit' is located in 'taggit.info' and     *
//* 'taggit.html'.                                                             *
//*    Texinfo-format docs: info -f taggit.info -n 'Copyright Notice'          *
//*    HTML-format docs   : open 'taggit.html' in your favorite browser        *
//*                                                                            *
//* -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  *
//* Description:                                                               *
//* Please see the description of package components in the 'README' file      *
//*                                                                            *
//******************************************************************************

Version History (most recent first):
- - - - - - - - - - - - - - - - - -
v: 0.00.08 17-Sep-2020
  -- Implement support for Windows(tm) Media Audio (WMA) files.
  -- Integrate Wayland system clipboard access for all Textbox controls.
     (requires external wlClipboard utilities).
  -- Documentation update.
  -- Released 20-Oct-2020

v: 0.00.07 29-Sep-2019
  -- The compiler upgrade to GCC (G++) v:9.0.1 introduced some new 
     warning messages.
     -- The C function snprintf() now causes complaints about potential 
        buffer overrun.
            -Wformat-truncation, pragma -Wno-format-truncation 
        We now test for output truncation in snprintf() calls which use 
        an "%s" in the formatting template. This silences the compiler 
        warning.
     -- The C function readdir64_r() is deprecated.
            -Wdeprecated-declarations
        Switch to readdir64() which is now thread-safe under the GNU
        compiler. No functionality change.
  -- Bug Fix: Sorting by track number formerly assumed a single digit 
     for the track number.
  -- Add a "record-up" pushbutton to the Edit-Metadata dialog.
     Pushbuttons for all directions are now available:
      Left : previous field       Up   : previous file
      Right: next field           Down : next file
  -- Documentation update.
  -- Released 18-Dec-2019

v: 0.00.06 27-Nov-2018
  - Bug Fix: Command-line options '--artist' and '--album' were not being 
    properly inserted into the data stream for display on application startup.                                                               *
  - Bug Fix: If application binary, link or shell script used to invoke 
    the application is on the path, then the configuration file was not 
    being found. See gcaFindAppPath() method.
  - Correct logical error: Previously, using the '-d' option to specify a 
    source directory which contained no supported audio files would invoke 
    command-line help. Now the application dialog will open and display a 
    "no source files" warning.
  - Documentation update
  - Released 29-Nov-2018

v: 0.00.05 24-Oct-2017
  - A redundant temporary filename was being created. No change in 
    functionality.
  - Bug Fix: If target filename was specified, AND source preservation 
    WAS NOT specified, the old source file was not being deleted. Both 
    MP3 and OGG writes contained this error. Output file was not affected.
  - Updates required by switch to G++ v:5.4.0:
    - New warning that library functions 'tempnam' and 'tmpnam_r are 
      dangerous. While this is technically true, this application uses 
      them in such a way that negates the danger. In any case, silence the 
      compiler warning by updating methods which create temporary files.
  - Add a Pushbutton control to the uiEditMetadata() method which enables 
    the user to save the edited data (if any) for the current file and open 
    the corresponding field in the next audio file for editing.
    We have found that this is useful primarily for sequentially editing 
    the 'Title' fields, but may be useful for other non-duplicated fields 
    as well.
  - Documentation update
  - Released 05-Mar-2018

v: 0.00.04 17-Oct-2017
  - Bug Fix: Corrected sizing error in encoding an OGG embedded image.
    This had caused the image to be truncated under some circumstances, 
    which in turn caused media players to incorrectly parse the OGG 
    comment header.
  - Temporary Fix: The id3v2.3 tag specification (MP3 files) defines an 
    Extended Header which has two functions:
       1) If the seldom used CRC is enabled, it contains the CRC value.
       2) Indicates the number of padding bytes which follow the tag data.
    - The Extended Header is specified as "optional," which all media 
      players we have tested interpret as "it will never be there, even if 
      the tag header says that it is, so don't bother to look for it."
      We are seriously offended by this unprofessional approach to the 
      standard, but in practical terms, this means that if the Extended 
      Header is present, the media players choke and discard ALL the tag 
      data. The playback is fully functional, but all tag fields will be 
      displayed as "unknown."
    - The id3v2.4 specification makes more extensive use of the Extended 
      Header, so id3v2.4-compliant players should parse it correctly; 
      however, the media player industry has been slow to adopt id3v2.4.
    - Our temporary fix is to disable creation of the extended header, and 
      only _optionally_ add padding to the end of the MP3 tag data.
      This is done using conditional-compile flags, ENABLE_EXTHDR and 
      ENABLE_PADDING, which are defined in the WriteMetadataMP3() method.
    - With the Extended Header disabled, the tag data become visible in 
      all our media players, whether or not the padding block is present.
  - Documentation update.
  - Released 24-Oct-2017

v: 0.00.03 11-Oct-2017
  - Bug Fix: Customized target filename was being ignored during write to 
    target, and without the '-Preserve' option, the target filename was 
    always the same as source filename. This error had been masked by 
    active debugging code.
  - Bug Fix: If custom target filename, do not rename the source file as 
    a backup file. Formerly the source file was always renamed as backup, 
    but if source will not be modified, it is more user friendly to retain 
    its original name. A tip-o'-the-hat on this one to creative muse and 
    best friend, 楚瑶.
  - Bug Fix: If source file's internal format does not correspond to the 
    source filename extension, alert user and declare a fatal error.
    This was a rookie mistake and your author has egg-on-face: It is ALWAYS 
    a basic logical error to assume that the user has a brain or that 
    he/she/it will never name a file as something it is not.
  - Bug Fix: Corrected a logical error in identification of an MP3 source 
    file which contains no tag header. This error caused the application 
    to see the source file as having an invalid format.
    See the id3v2_audioframe class.
  - Bug Fix: For OGG file writes, the edits-pending indicators were not 
    being reset after write to target was complete.
  - Bug Fix: For Popularimeter dialog, the data fields were not being 
    initialized to existing values when the dialog opened.
  - For validation of path/filename strings:
    Filenames for music files often contain odd characters in keeping with 
    the tone or mood of the music itself. For example, Ridin'.oga by 
    Rascal Flatts. Some of these characters can cause problems with various
    system functions and utilities. To reduce the chance of these errors
    we have enhanced our filespec parsing to handle special characters:
      '('  ')'  '&'  '|'  ';'  '<'  '>'  '?'  '"' (double-quote) and
      ''' (singlequote) as normal filename characters.
      See the Realpath() method for more information.
  - Documentation update.

v: 0.00.02 13-Sep-2017
  - Update user interface translations.
  - Finish implementation of the 'Set All Fields Active' menu item.
  - Implement decoding and encoding of popularity meter and play count.
    Implement Cmd_Popularimeter() method so user can edit values.
  - Implement a method for deleting a single image from the source file.
    See Cmd_InsertImage() method.
  - Begin implementation of OGG/Vorbis embedded image support. INCOMPLETE.
  - Disable debugging code.
  - Documentation update.
  - First public release 11-Oct-2017.

v: 0.00.01 05-Nov-2016
  - First pass. Source file parsing for MP3 and OGG media files based on 
    the FileMangler View-File code, but with enhanced efficiency and error 
    checking.
  - Startup code, config file format and command-line parsing also adapted 
    from FileMangler.
  - Dynamic resizing of application dialog is a new design based on 
    encapsulation of display data formatting.
  - Translations are rudimentary and need review by native speakers of 
    those languages.
  - ConfigOptions::rtl indicates whether the user-interface language is 
    LTR or RTL. Currently, there is no RTL user-interface language defined, 
    but we have tested the application window and most sub-dialogs using 
    simulated data. Note that ConfigOptions::rtlf indicates whether 
    field contents will be displayed and edited as RTL.
  - Released to beta-testers 12-July-2017.
  - Documentation only posted to website.


