From a121d7205216f5b4b144264096e07104b5ad3172 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sun, 3 Oct 2004 22:55:08 +0000
Subject: [PATCH] added wxFileConfig::Save(stream); documented it in new,
 separate from wxConfig, wxFileConfig doc file (replaces patches 902372 and
 900889)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29632 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt           |  5 ++-
 docs/latex/wx/classes.tex  |  1 +
 docs/latex/wx/config.tex   | 56 ++++++++++++++++++++------
 docs/latex/wx/fileconf.tex | 81 ++++++++++++++++++++++++++++++++++++++
 include/wx/fileconf.h      |  8 ++++
 src/common/fileconf.cpp    | 24 +++++++++++
 6 files changed, 160 insertions(+), 15 deletions(-)
 create mode 100644 docs/latex/wx/fileconf.tex

diff --git a/docs/changes.txt b/docs/changes.txt
index 7fb57b1758..2294e2d263 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -217,8 +217,7 @@ All:
 - active mode support in wxFTP (Randall Fox)
 - sped up wxHTTP and wxFTP
 - added wxStringInput/OutputStreams
-- wxSystemSettings::GetMetric now returns -1 for metrics that are not
-  supported, instead of zero.
+- added wxFileConfig::Save(wxOutputStream)
 
 
 All (GUI):
@@ -247,6 +246,8 @@ All (GUI):
 - wx(Choice/List/Note)book controls send CHANG(ED/ING) events in SetSelection
 - it is now possible to create a wxFont with given size in pixels (d2walter)
 - added wxTopLevelWindow::IsActive()
+- wxSystemSettings::GetMetric now returns -1 for metrics that are not
+  supported, instead of zero.
 
 Unix:
 
diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex
index abc7ae3218..b8c8c0d829 100644
--- a/docs/latex/wx/classes.tex
+++ b/docs/latex/wx/classes.tex
@@ -95,6 +95,7 @@
 \input ffile.tex
 \input ffilestr.tex
 \input file.tex
+\input fileconf.tex
 \input fildatob.tex
 \input filedlg.tex
 \input fildrptg.tex
diff --git a/docs/latex/wx/config.tex b/docs/latex/wx/config.tex
index 1e7a62879c..19839abcc9 100644
--- a/docs/latex/wx/config.tex
+++ b/docs/latex/wx/config.tex
@@ -2,7 +2,8 @@
 
 wxConfigBase class defines the basic interface of all config classes. It can
 not be used by itself (it is an abstract base class) and you will always use one
-of its derivations: wxIniConfig, wxFileConfig, wxRegConfig or any other.
+of its derivations: wxIniConfig, \helpref{wxFileConfig}{wxfileconfig},
+wxRegConfig or any other.
 
 However, usually you don't even need to know the precise nature of the class
 you're working with but you would just use the wxConfigBase methods. This
@@ -78,6 +79,7 @@ physical storage where a wxConfigBase-derived class stores its data.
 
 \latexignore{\rtfignore{\wxheading{Function groups}}}
 
+
 \membersection{Static functions}\label{wxconfigstaticfunctions}
 
 These functions deal with the "default" config object. Although its usage is
@@ -105,11 +107,13 @@ of \helpref{wxFileDialog}{wxfiledialog} have ability to use wxConfig class.
 \helpref{Create}{wxconfigbasecreate}\\
 \helpref{DontCreateOnDemand}{wxconfigbasedontcreateondemand}
 
+
 \membersection{Constructor and destructor}
 
 \helpref{wxConfigBase}{wxconfigbasector}\\
 \helpref{\destruct{wxConfigBase}}{wxconfigbasedtor}
 
+
 \membersection{Path management}
 
 As explained in \helpref{config overview}{wxconfigoverview}, the config classes
@@ -179,6 +183,7 @@ regardless of the platform (i.e. it is {\bf not} '$\backslash\backslash$' under
 \helpref{SetPath}{wxconfigbasesetpath}\\
 \helpref{GetPath}{wxconfigbasegetpath}
 
+
 \membersection{Enumeration}
 
 The functions in this section allow to enumerate all entries and groups in the
@@ -233,6 +238,7 @@ actually enumerating them, but you will probably never need them.
 \helpref{GetNumberOfEntries}{wxconfigbasegetnumberofentries}\\
 \helpref{GetNumberOfGroups}{wxconfigbasegetnumberofgroups}
 
+
 \membersection{Tests of existence}
 
 \helpref{HasGroup}{wxconfigbasehasgroup}\\
@@ -240,12 +246,14 @@ actually enumerating them, but you will probably never need them.
 \helpref{Exists}{wxconfigbaseexists}\\
 \helpref{GetEntryType}{wxconfigbasegetentrytype}
 
+
 \membersection{Miscellaneous functions}
 
 \helpref{GetAppName}{wxconfigbasegetappname}\\
 \helpref{GetVendorName}{wxconfigbasegetvendorname}\\
 \helpref{SetUmask}{wxfileconfigsetumask}
 
+
 \membersection{Key access}
 
 These function are the core of wxConfigBase class: they allow you to read and
@@ -272,6 +280,7 @@ arbitrary path (either relative or absolute), not just the key name.
 \helpref{Write}{wxconfigbasewrite}\\
 \helpref{Flush}{wxconfigbaseflush}
 
+
 \membersection{Rename entries/groups}
 
 The functions in this section allow to rename entries or subgroups of the
@@ -283,6 +292,7 @@ wxConfig implementation.
 \helpref{RenameEntry}{wxconfigbaserenameentry}\\
 \helpref{RenameGroup}{wxconfigbaserenamegroup}
 
+
 \membersection{Delete entries/groups}
 
 The functions in this section delete entries and/or groups of entries from the
@@ -293,6 +303,7 @@ traces of your program presence: for example, when you uninstall it.
 \helpref{DeleteGroup}{wxconfigbasedeletegroup}\\
 \helpref{DeleteAll}{wxconfigbasedeleteall}
 
+
 \membersection{Options}
 
 Some aspects of wxConfigBase behaviour can be changed during run-time. The
@@ -332,6 +343,7 @@ The following functions control this option:
 
 }}
 
+
 \membersection{wxConfigBase::wxConfigBase}\label{wxconfigbasector}
 
 \func{}{wxConfigBase}{\param{const wxString\& }{appName = wxEmptyString},
@@ -392,12 +404,14 @@ is written.}
 By default, environment variable expansion is on and recording defaults is
 off.
 
+
 \membersection{wxConfigBase::\destruct{wxConfigBase}}\label{wxconfigbasedtor}
 
 \func{}{\destruct{wxConfigBase}}{\void}
 
 Empty but ensures that dtor of all derived classes is virtual.
 
+
 \membersection{wxConfigBase::Create}\label{wxconfigbasecreate}
 
 \func{static wxConfigBase *}{Create}{\void}
@@ -407,6 +421,7 @@ implementation of wxConfig available for the current platform, see comments
 near the definition of wxCONFIG\_WIN32\_NATIVE for details. It returns the
 created object and also sets it as the current one.
 
+
 \membersection{wxConfigBase::DontCreateOnDemand}\label{wxconfigbasedontcreateondemand}
 
 \func{void}{DontCreateOnDemand}{\void}
@@ -415,6 +430,7 @@ Calling this function will prevent {\it Get()} from automatically creating a
 new config object if the current one is NULL. It might be useful to call it
 near the program end to prevent new config object "accidental" creation.
 
+
 \membersection{wxConfigBase::DeleteAll}\label{wxconfigbasedeleteall}
 
 \func{bool}{DeleteAll}{\void}
@@ -422,6 +438,7 @@ near the program end to prevent new config object "accidental" creation.
 Delete the whole underlying object (disk file, registry key, ...). Primarly
 for use by desinstallation routine.
 
+
 \membersection{wxConfigBase::DeleteEntry}\label{wxconfigbasedeleteentry}
 
 \func{bool}{DeleteEntry}{\param{const wxString\& }{ key}, \param{bool}{ bDeleteGroupIfEmpty = true}}
@@ -429,18 +446,21 @@ for use by desinstallation routine.
 Deletes the specified entry and the group it belongs to if it was the last key
 in it and the second parameter is true.
 
+
 \membersection{wxConfigBase::DeleteGroup}\label{wxconfigbasedeletegroup}
 
 \func{bool}{DeleteGroup}{\param{const wxString\& }{ key}}
 
 Delete the group (with all subgroups)
 
+
 \membersection{wxConfigBase::Exists}\label{wxconfigbaseexists}
 
 \constfunc{bool}{Exists}{\param{wxString\& }{strName}}
 
 returns true if either a group or an entry with a given name exists
 
+
 \membersection{wxConfigBase::Flush}\label{wxconfigbaseflush}
 
 \func{bool}{Flush}{\param{bool }{bCurrentOnly = false}}
@@ -448,6 +468,7 @@ returns true if either a group or an entry with a given name exists
 permanently writes all changes (otherwise, they're only written from object's
 destructor)
 
+
 \membersection{wxConfigBase::Get}\label{wxconfigbaseget}
 
 \func{static wxConfigBase *}{Get}{\param{bool }{CreateOnDemand = true}}
@@ -456,12 +477,14 @@ Get the current config object. If there is no current object and
 {\it CreateOnDemand} is true, creates one
 (using {\it Create}) unless DontCreateOnDemand was called previously.
 
+
 \membersection{wxConfigBase::GetAppName}\label{wxconfigbasegetappname}
 
 \constfunc{wxString}{GetAppName}{\void}
 
 Returns the application name.
 
+
 \membersection{wxConfigBase::GetEntryType}\label{wxconfigbasegetentrytype}
 
 \constfunc{enum wxConfigBase::EntryType}{GetEntryType}{\param{const wxString\& }{name}}
@@ -485,6 +508,7 @@ The result is an element of enum EntryType:
   };
 \end{verbatim}
 
+
 \membersection{wxConfigBase::GetFirstGroup}\label{wxconfigbasegetfirstgroup}
 
 \constfunc{bool}{GetFirstGroup}{\param{wxString\& }{str}, \param{long\&}{ index}}
@@ -498,6 +522,7 @@ the next call.}
 \perlnote{In wxPerl this method takes no arguments and returns a 3-element
 list {\tt ( continue, str, index )}.}
 
+
 \membersection{wxConfigBase::GetFirstEntry}\label{wxconfigbasegetfirstentry}
 
 \constfunc{bool}{GetFirstEntry}{\param{wxString\& }{str}, \param{long\&}{ index}}
@@ -511,6 +536,7 @@ the next call.}
 \perlnote{In wxPerl this method takes no arguments and returns a 3-element
 list {\tt ( continue, str, index )}.}
 
+
 \membersection{wxConfigBase::GetNextGroup}\label{wxconfigbasegetnextgroup}
 
 \constfunc{bool}{GetNextGroup}{\param{wxString\& }{str}, \param{long\&}{ index}}
@@ -524,6 +550,7 @@ the next call.}
 \perlnote{In wxPerl this method only takes the {\tt index} parameter
 and returns a 3-element list {\tt ( continue, str, index )}.}
 
+
 \membersection{wxConfigBase::GetNextEntry}\label{wxconfigbasegetnextentry}
 
 \constfunc{bool}{GetNextEntry}{\param{wxString\& }{str}, \param{long\&}{ index}}
@@ -537,10 +564,12 @@ the next call.}
 \perlnote{In wxPerl this method only takes the {\tt index} parameter
 and returns a 3-element list {\tt ( continue, str, index )}.}
 
+
 \membersection{wxConfigBase::GetNumberOfEntries}\label{wxconfigbasegetnumberofentries}
 
 \constfunc{uint }{GetNumberOfEntries}{\param{bool }{bRecursive = false}}
 
+
 \membersection{wxConfigBase::GetNumberOfGroups}\label{wxconfigbasegetnumberofgroups}
 
 \constfunc{uint}{GetNumberOfGroups}{\param{bool }{bRecursive = false}}
@@ -548,42 +577,49 @@ and returns a 3-element list {\tt ( continue, str, index )}.}
 Get number of entries/subgroups in the current group, with or without its
 subgroups.
 
+
 \membersection{wxConfigBase::GetPath}\label{wxconfigbasegetpath}
 
 \constfunc{const wxString\&}{GetPath}{\void}
 
 Retrieve the current path (always as absolute path).
 
+
 \membersection{wxConfigBase::GetVendorName}\label{wxconfigbasegetvendorname}
 
 \constfunc{wxString}{GetVendorName}{\void}
 
 Returns the vendor name.
 
+
 \membersection{wxConfigBase::HasEntry}\label{wxconfigbasehasentry}
 
 \constfunc{bool}{HasEntry}{\param{wxString\& }{strName}}
 
 returns true if the entry by this name exists
 
+
 \membersection{wxConfigBase::HasGroup}\label{wxconfigbasehasgroup}
 
 \constfunc{bool}{HasGroup}{\param{const wxString\& }{strName}}
 
 returns true if the group by this name exists
 
+
 \membersection{wxConfigBase::IsExpandingEnvVars}\label{wxconfigbaseisexpandingenvvars}
 
 \constfunc{bool}{IsExpandingEnvVars}{\void}
 
 Returns true if we are expanding environment variables in key values.
 
+
 \membersection{wxConfigBase::IsRecordingDefaults}\label{wxconfigbaseisrecordingdefaults}
 
 \constfunc{bool}{IsRecordingDefaults}{\void}
 
 Returns true if we are writing defaults back to the config file.
 
+
 \membersection{wxConfigBase::Read}\label{wxconfigbaseread}
 
 \constfunc{bool}{Read}{\param{const wxString\& }{key}, \param{wxString*}{ str}}
@@ -676,6 +712,7 @@ implements the following methods:\par
 \end{twocollist}
 }}
 
+
 \membersection{wxConfigBase::RenameEntry}\label{wxconfigbaserenameentry}
 
 \func{bool}{RenameEntry}{\param{const wxString\& }{ oldName}, \param{const wxString\& }{ newName}}
@@ -687,6 +724,7 @@ arbitrary paths are accepted by this function.
 Returns false if the {\it oldName} doesn't exist or if {\it newName} already
 exists.
 
+
 \membersection{wxConfigBase::RenameGroup}\label{wxconfigbaserenamegroup}
 
 \func{bool}{RenameGroup}{\param{const wxString\& }{ oldName}, \param{const wxString\& }{ newName}}
@@ -698,6 +736,7 @@ arbitrary paths are accepted by this function.
 Returns false if the {\it oldName} doesn't exist or if {\it newName} already
 exists.
 
+
 \membersection{wxConfigBase::Set}\label{wxconfigbaseset}
 
 \func{static wxConfigBase *}{Set}{\param{wxConfigBase *}{pConfig}}
@@ -705,12 +744,14 @@ exists.
 Sets the config object as the current one, returns the pointer to the previous
 current object (both the parameter and returned value may be NULL)
 
+
 \membersection{wxConfigBase::SetExpandEnvVars}\label{wxconfigbasesetexpandenvvars}
 
 \func{void}{SetExpandEnvVars }{\param{bool }{bDoIt = true}}
 
 Determine whether we wish to expand environment variables in key values.
 
+
 \membersection{wxConfigBase::SetPath}\label{wxconfigbasesetpath}
 
 \func{void}{SetPath}{\param{const wxString\& }{strPath}}
@@ -719,6 +760,7 @@ Set current path: if the first character is '/', it is the absolute path,
 otherwise it is a relative path. '..' is supported. If the strPath doesn't
 exist it is created.
 
+
 \membersection{wxConfigBase::SetRecordDefaults}\label{wxconfigbasesetrecorddefaults}
 
 \func{void}{SetRecordDefaults}{\param{bool }{bDoIt = true}}
@@ -730,18 +772,6 @@ If on (default is off) all default values for the settings used by the program
 are written back to the config file. This allows the user to see what config
 options may be changed and is probably useful only for wxFileConfig.
 
-\membersection{wxConfigBase::SetUmask}\label{wxfileconfigsetumask}
-
-\func{void}{SetUmask}{\param{int }{mode}}
-
-{\bf NB:} this function is not in the base wxConfigBase class but is only
-implemented in wxFileConfig. Moreover, this function is Unix-specific and
-doesn't do anything on other platforms.
-
-SetUmask() allows to set the mode to be used for the config file creation.
-For example, to create a config file which is not readable by other users
-(useful if it stores some sensitive information, such as passwords), you
-should do {\tt SetUmask(0077)}.
 
 \membersection{wxConfigBase::Write}\label{wxconfigbasewrite}
 
diff --git a/docs/latex/wx/fileconf.tex b/docs/latex/wx/fileconf.tex
new file mode 100644
index 0000000000..f914d1f156
--- /dev/null
+++ b/docs/latex/wx/fileconf.tex
@@ -0,0 +1,81 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name:        fileconf.tex
+%% Purpose:     wxFileConfig documentation
+%% Author:      Vadim Zeitlin
+%% Modified by:
+%% Created:     2004-10-04
+%% RCS-ID:      $Id$
+%% Copyright:   (c) 2004 Vadim Zeitlin
+%% License:     wxWidgets license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\class{wxFileConfig}}\label{wxfileconfig}
+
+wxFileConfig implements \helpref{wxConfigBase}{wxconfigbase} interface for
+storing and retrieving configuration information using plain text files. The
+files have a simple format reminiscent of Windows INI files with lines of the
+form \texttt{key = value} defining the keys and lines of special form
+\texttt{$[$group$]$} indicating the start of each group.
+
+This class is used by default for wxConfig on Unix platforms but may also be
+used explicitly if you want to use files and not the registry even under
+Windows.
+
+\wxheading{Derived from}
+
+\helpref{wxConfigBase}{wxconfigbase}
+
+\wxheading{Include files}
+
+<wx/fileconf.h>
+
+
+\helponly{\insertatlevel{2}{\wxheading{Members}}}
+
+\membersection{wxFileConfig::wxFileConfig}{wxfileconfigctorstream}
+
+\func{}{wxFileConfig}{\param{wxInputStream\& }{is}, \param{wxMBConv\& }{conv = wxConvUTF8}}
+
+Read the config data from the specified stream instead of the associated file,
+as usual.
+
+\wxheading{See also}
+
+\helpref{Save}{wxfileconfigsave}
+
+
+\membersection{wxFileConfig::Save}{wxfileconfigsave}
+
+\func{bool}{Save}{\param{wxOutputStream\& }{os}, \param{wxMBConv\& }{conv = wxConvUTF8}}
+
+Saves all config data to the given stream, returns \true if data was saved
+successfully or \false on error.
+
+Note the interaction of this function with the internal ``dirty flag'': the
+data is saved unconditionally, i.e. even if the object is not dirty. However
+after saving it successfully, the dirty flag is reset so no changes will be
+written back to the file this object is associated with until you change its
+contents again.
+
+\wxheading{See also}
+
+\helpref{Flush}{wxconfigbaseflush}
+
+
+\membersection{wxFileConfig::SetUmask}\label{wxfileconfigsetumask}
+
+\func{void}{SetUmask}{\param{int }{mode}}
+
+Allows to set the mode to be used for the config file creation. For example, to
+create a config file which is not readable by other users (useful if it stores
+some sensitive information, such as passwords), you could use 
+{\tt SetUmask(0077)}.
+
+This function doesn't do anything on non-Unix platforms.
+
+\wxheading{See also}
+
+\helpref{wxCHANGE\_UMASK}{wxchangeumask}
+
+
+
diff --git a/include/wx/fileconf.h b/include/wx/fileconf.h
index 0c8944ce4c..67296ab956 100644
--- a/include/wx/fileconf.h
+++ b/include/wx/fileconf.h
@@ -164,6 +164,14 @@ public:
   virtual bool DeleteGroup(const wxString& szKey);
   virtual bool DeleteAll();
 
+  // additional, wxFileConfig-specific, functionality
+#if wxUSE_STREAMS
+  // save the entire config file text to the given stream, note that the text
+  // won't be saved again in dtor when Flush() is called if you use this method
+  // as it won't be "changed" any more
+  virtual bool Save(wxOutputStream& os, wxMBConv& conv = wxConvUTF8);
+#endif // wxUSE_STREAMS
+
 public:
   // functions to work with this list
   wxFileConfigLineList *LineListAppend(const wxString& str);
diff --git a/src/common/fileconf.cpp b/src/common/fileconf.cpp
index 4592781a63..5e445db8ce 100644
--- a/src/common/fileconf.cpp
+++ b/src/common/fileconf.cpp
@@ -994,6 +994,30 @@ bool wxFileConfig::Flush(bool /* bCurrentOnly */)
   return true;
 }
 
+#if wxUSE_STREAMS
+
+bool wxFileConfig::Save(wxOutputStream& os, wxMBConv& conv)
+{
+    // save unconditionally, even if not dirty
+    for ( wxFileConfigLineList *p = m_linesHead; p != NULL; p = p->Next() )
+    {
+        wxString line = p->Text();
+        line += wxTextFile::GetEOL();
+        if ( !os.Write(line.mb_str(conv), line.length()) )
+        {
+            wxLogError(_("Error saving user configuration data."));
+
+            return false;
+        }
+    }
+
+    ResetDirty();
+
+    return true;
+}
+
+#endif // wxUSE_STREAMS
+
 // ----------------------------------------------------------------------------
 // renaming groups/entries
 // ----------------------------------------------------------------------------
-- 
2.50.0

