762 lines
18 KiB
C++
762 lines
18 KiB
C++
/********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1990,1991 **/
|
|
/********************************************************************/
|
|
|
|
/*
|
|
newprof.hxx
|
|
INI-file handling primitives
|
|
|
|
These classes deal with simple INI files. Most clients will prefer
|
|
to use the wrapper APIs in newprof.h, including all C clients.
|
|
The wrapper APIs provide almost all the functionality of the C++
|
|
APIs. The C++ APIs are more subject to change with changing
|
|
implementation (NT configuration manager, DS) than are the C-language
|
|
wrappers.
|
|
|
|
Clients needing to support more complex manipulation on more complex
|
|
text files may prefer the CFGFILE class hierarchy defined in
|
|
cfgfile.hxx. These classes require more code overhead, but will
|
|
provide more sophisticated support to overcome the following
|
|
restrictions of the classes defined here:
|
|
|
|
-- All lines must be either component headers ("[component]") or
|
|
parameter-value lines ("param=value"). Other lines will be
|
|
ignored and will not be written back out.
|
|
-- If two components share the same name, or if two parameters in a
|
|
component share the same name, the second will be inaccessible
|
|
until the first is deleted.
|
|
-- These classes ignore whitespace except as part of a parameter
|
|
name or value. They make no attempt to preserve it, even on
|
|
lines which are not manipulated.
|
|
|
|
These classes are defined in terms of CPSZ because NETLIB requires
|
|
character pointers to be explicitly far.
|
|
|
|
Note that all component name comparisons and parameter name
|
|
comparisons are case-insensitive. This may not apply to parameter
|
|
values, see the parameter type (INI_PARAM subclass) for details.
|
|
|
|
|
|
FILE HISTORY
|
|
jonn 29-May-1991 Created
|
|
|
|
*/
|
|
|
|
#ifndef _NEWPROF_HXX_
|
|
#define _NEWPROF_HXX_
|
|
|
|
#include <base.hxx>
|
|
|
|
/* Global constants and defines */
|
|
extern "C"
|
|
{
|
|
#include <newprofc.h>
|
|
}
|
|
|
|
/*
|
|
The internal include file contains stuff which needs to go before the
|
|
class definition of INI_FILE_IMAGE, but which clients of this class
|
|
don't need to know about.
|
|
*/
|
|
#include <newprofi.hxx>
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: INI_FILE_IMAGE
|
|
|
|
SYNOPSIS: Stores an image of a single INI file, including component
|
|
names, parameter names, and parameter values. Ignores blank
|
|
lines, comments, whitespace, and all lines not of either
|
|
"[section]" or "key = value" form.
|
|
|
|
INTERFACE: INI_FILE_IMAGE() - Constructs a blank file image and
|
|
remembers the specified filename.
|
|
~INI_FILE_IMAGE() - Destructs a file image.
|
|
Read() - Reads the file image from the remembered file.
|
|
Write() - Writes the file image to the remembered file.
|
|
|
|
The following members are meant for use of the
|
|
INI_PARAM classes rather than for external
|
|
clients.
|
|
|
|
QueryParam() - Asks after an individual parameter
|
|
SetParam() - Changes an individual parameter value
|
|
Clear() - Clears the file image
|
|
|
|
FindComponent() - Finds the first component with the
|
|
specified name
|
|
RemoveComponent() - Removes the specified component
|
|
SetFilename() - Change the remembered filename
|
|
Trim() - Remove all but named component
|
|
|
|
PARENT: BASE
|
|
|
|
CAVEATS: Clients may not use the QueryParam and SetParam methods;
|
|
these are for the use of the INI_PARAM classes.
|
|
|
|
INI_FILE_IMAGE does not in general provide support for
|
|
multiple parameters with the same name.
|
|
|
|
NOTES: Most clients should use the wrappers to these classes supplied
|
|
in newprof.h. Otherwise, LMUSER.INI clients should use the
|
|
LMINI_FILE_IMAGE subclass.
|
|
|
|
HISTORY:
|
|
jonn 29-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS INI_PARAM;
|
|
DLL_CLASS LMINI_PARAM;
|
|
DLL_CLASS INI_ITER;
|
|
|
|
DLL_CLASS INI_FILE_IMAGE: public BASE
|
|
{
|
|
|
|
friend INI_PARAM;
|
|
friend LMINI_PARAM; // must have access to SetParam
|
|
friend INI_ITER; // must have access to _slcomponent
|
|
|
|
private:
|
|
|
|
TCHAR * _pchFilename;
|
|
|
|
/*
|
|
Clients do not need to know about this member object.
|
|
COMPONENT is defined in newprofi.hxx.
|
|
*/
|
|
SLIST_OF(COMPONENT) _slcomponent;
|
|
|
|
APIERR QueryParam(
|
|
CPSZ pchComponent,
|
|
CPSZ pchParameter,
|
|
BYTE * pbBuffer,
|
|
USHORT cbBuffer
|
|
) const;
|
|
|
|
APIERR SetParam(
|
|
CPSZ pchComponent,
|
|
CPSZ pchParameter,
|
|
CPSZ pchValue
|
|
);
|
|
|
|
VOID Clear();
|
|
|
|
COMPONENT * FindComponent(
|
|
CPSZ pchComponent
|
|
) const;
|
|
|
|
COMPONENT * RemoveComponent(
|
|
COMPONENT * pcomponent
|
|
) const;
|
|
|
|
protected:
|
|
|
|
APIERR SetFilename( CPSZ pchFilename );
|
|
|
|
public:
|
|
|
|
INI_FILE_IMAGE( CPSZ pchFilename );
|
|
~INI_FILE_IMAGE();
|
|
|
|
APIERR Read();
|
|
|
|
APIERR Write() const;
|
|
|
|
APIERR Trim( CPSZ pchComponent );
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: LMINI_FILE_IMAGE
|
|
|
|
SYNOPSIS: Stores an image of the INI file used by the LanMan
|
|
interface, for the file LANROOT\LMUSER.INI. This is a
|
|
thin shell over INI_FILE_IMAGE, which uses WKSTA_1 to
|
|
determine LANROOT.
|
|
|
|
INTERFACE: LMINI_FILE_IMAGE() - Creates a blank file image.
|
|
|
|
PARENT: INI_FILE_IMAGE
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
classes supplied in newprof.h.
|
|
|
|
HISTORY:
|
|
jonn 30-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS LMINI_FILE_IMAGE: public INI_FILE_IMAGE
|
|
{
|
|
|
|
public:
|
|
|
|
LMINI_FILE_IMAGE();
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: INI_PARAM
|
|
|
|
SYNOPSIS: Stores an image of a single parameter in an INI file.
|
|
The INI_PARAM will remember the name of the component
|
|
and the parameter, as well as the value of the
|
|
parameter.
|
|
|
|
The image of the parameter is stored independently of
|
|
the INI_FILE_IMAGE; thus clients may delete the file
|
|
image while keeping the parameter image, transfer the
|
|
parameter image from one file image to another, etc.
|
|
|
|
This class is meant as a superclass for more strongly
|
|
typed parameter classes, and generally cannot be
|
|
directly instantiated. Clients should avoid
|
|
invoking INI_PARAM methods on objects of a subclass
|
|
which redefines those methods, as this may leave the
|
|
parameter with an invalid value for the parameter type
|
|
defined by the subclass.
|
|
|
|
INTERFACE: INI_PARAM()
|
|
~INI_PARAM()
|
|
|
|
Load() - Loads the parameter value from an
|
|
INI_FILE_IMAGE
|
|
Set() - Changes the parameter value
|
|
QueryValue() - Asks after the parameter value
|
|
Store() - Stores the parameter into an
|
|
INI_FILE_IMAGE
|
|
Remove() - Removes this parameter from a file image
|
|
|
|
PARENT: BASE
|
|
|
|
CAVEATS: Clients should not instantiate objects of type INI_PARAM;
|
|
they should use the subclasses instead. Clients should
|
|
not override methods redefined by descendant classes of
|
|
INI_PARAM with methods of INI_PARAM.
|
|
|
|
It is possible to instantiate a blank INI_PARAM, but
|
|
this is generally not possible for its descendant
|
|
classes. The descendant classes generally combine their
|
|
constructors with Load() or Set() operations.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
Users interested only in a single parameter should use
|
|
the LMINI_PARAM methods QuickLoad() and QuickStore()
|
|
instead of the corresponding LMINI_FILE_IMAGE operations.
|
|
These methods are easier to use and will be considerably
|
|
more efficient when the implementation shifts to the NT
|
|
Configuration Manager.
|
|
|
|
HISTORY:
|
|
jonn 29-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS INI_PARAM: public BASE
|
|
{
|
|
|
|
friend INI_ITER; // must have access to Set()
|
|
|
|
private:
|
|
|
|
PSZ _pchComponent;
|
|
PSZ _pchParameter;
|
|
PSZ _pchValue;
|
|
|
|
protected:
|
|
|
|
/* The constructor and destructor are protected */
|
|
|
|
// Starts with a blank INI_PARAM; for use by descendant classes.
|
|
INI_PARAM();
|
|
|
|
~INI_PARAM();
|
|
|
|
virtual APIERR Set(
|
|
CPSZ pchComponent,
|
|
CPSZ pchParameter,
|
|
CPSZ pchValue
|
|
);
|
|
|
|
CPSZ QueryComponent() const
|
|
{
|
|
UIASSERT( !QueryError() );
|
|
UIASSERT( _pchComponent != NULL );
|
|
return _pchComponent;
|
|
}
|
|
|
|
CPSZ QueryParamName() const
|
|
{
|
|
UIASSERT( !QueryError() );
|
|
UIASSERT( _pchParameter != NULL );
|
|
return _pchParameter;
|
|
}
|
|
|
|
CPSZ QueryParamValue() const
|
|
{
|
|
UIASSERT( !QueryError() );
|
|
UIASSERT( _pchValue != NULL );
|
|
return _pchValue;
|
|
}
|
|
|
|
APIERR QueryParamValue(
|
|
BYTE * pbBuffer,
|
|
USHORT cbBuffer
|
|
) const;
|
|
|
|
public:
|
|
|
|
APIERR Load(
|
|
const INI_FILE_IMAGE& inifile
|
|
);
|
|
|
|
APIERR Store(
|
|
INI_FILE_IMAGE * pinifile
|
|
) const;
|
|
|
|
APIERR Remove(
|
|
INI_FILE_IMAGE * pinifile
|
|
) const;
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: LMINI_PARAM
|
|
|
|
SYNOPSIS: Adds to LMINI_PARAM the methods QuickLoad and QuickStore.
|
|
|
|
INTERFACE: LMINI_PARAM()
|
|
~LMINI_PARAM()
|
|
|
|
QuickLoad() - Loads the parameter value directly
|
|
from a file.
|
|
QuickStore() - Writes the parameter value directly to
|
|
a file.
|
|
|
|
PARENT: INI_PARAM
|
|
|
|
CAVEATS: Clients should not instantiate objects of type LMINI_PARAM;
|
|
they should use the subclasses instead. Clients should
|
|
not override methods redefined by descendant classes of
|
|
LMINI_PARAM with methods of LMINI_PARAM.
|
|
|
|
It is possible to instantiate a blank LMINI_PARAM, but
|
|
this is generally not possible for its descendant
|
|
classes. The descendant classes generally combine their
|
|
constructors with Load() or Set() operations.
|
|
|
|
QuickLoad and QuickStore only work for LANROOT\LMUSER.INI.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
Users interested only in a single parameter should use
|
|
QuickLoad() and QuickStore() instead of the corresponding
|
|
LMINI_FILE_IMAGE operations. These methods are easier
|
|
to use and will be considerably more efficient when the
|
|
implementation shifts to the NT Configuration Manager.
|
|
|
|
HISTORY:
|
|
jonn 21-Jun-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS LMINI_PARAM: public INI_PARAM
|
|
{
|
|
|
|
public:
|
|
|
|
APIERR QuickLoad();
|
|
|
|
APIERR QuickStore() const;
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: KEYED_INI_PARAM
|
|
|
|
SYNOPSIS: Stores an image of a single string in an INI file. This
|
|
class takes a USHORT key for the item to be accessed,
|
|
rather than a component and parameter name; this key maps
|
|
directly to a component and parameter name. External
|
|
clients will use this in place of INI_PARAM for
|
|
general-string-valued items.
|
|
|
|
This class is protected; clients must use
|
|
STRING_INI_PARAM or BOOL_INI_PARAM instead.
|
|
|
|
INTERFACE: KEYED_INI_PARAM()
|
|
~KEYED_INI_PARAM()
|
|
|
|
TranslateKey() - Returns the component/parameter names
|
|
for a key
|
|
SetKeyed() - Changes the parameter value
|
|
|
|
PARENT: LMINI_PARAM
|
|
|
|
CAVEATS: Clients must use STRING_INI_PARAM instead of this class.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
These methods return ERROR_INVALID_PARAMETER for an
|
|
invalid key.
|
|
|
|
HISTORY:
|
|
jonn 29-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS KEYED_INI_PARAM: public LMINI_PARAM
|
|
{
|
|
|
|
protected:
|
|
|
|
KEYED_INI_PARAM(
|
|
USHORT usKey,
|
|
CPSZ pchValue
|
|
);
|
|
|
|
APIERR TranslateKey(
|
|
USHORT usKey,
|
|
CPSZ * ppchComponent,
|
|
CPSZ * ppchParameter
|
|
) const;
|
|
|
|
APIERR SetKeyed(
|
|
CPSZ pchValue
|
|
);
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: STRING_INI_PARAM
|
|
|
|
SYNOPSIS: Stores an image of a single string in an INI file. This
|
|
class is an accessor to KEYED_INI_PARAM.
|
|
|
|
INTERFACE: STRING_INI_PARAM()
|
|
~STRING_INI_PARAM()
|
|
|
|
SetString() - Changes the parameter value
|
|
QueryString() - Returns the parameter value
|
|
|
|
PARENT: KEYED_INI_PARAM
|
|
|
|
CAVEATS: Clients should use this class instead of INI_PARAM.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
These methods return ERROR_INVALID_PARAMETER for an
|
|
invalid key.
|
|
|
|
HISTORY:
|
|
jonn 18-Jun-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS STRING_INI_PARAM: public KEYED_INI_PARAM
|
|
{
|
|
|
|
public:
|
|
|
|
STRING_INI_PARAM(
|
|
USHORT usKey,
|
|
CPSZ pchValue
|
|
) : KEYED_INI_PARAM( usKey, pchValue )
|
|
{ }
|
|
|
|
APIERR SetString(
|
|
CPSZ pchValue
|
|
)
|
|
{ return KEYED_INI_PARAM::SetKeyed( pchValue ); }
|
|
|
|
CPSZ QueryString() const
|
|
{ return KEYED_INI_PARAM::QueryParamValue(); }
|
|
|
|
APIERR QueryString(
|
|
BYTE * pbBuffer,
|
|
USHORT cbBuffer
|
|
) const
|
|
{ return KEYED_INI_PARAM::QueryParamValue( pbBuffer, cbBuffer ); }
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: BOOL_INI_PARAM
|
|
|
|
SYNOPSIS: Stores an image of a single boolean parameter in an INI file.
|
|
This class takes a USHORT key for the item to be accessed,
|
|
rather than a component and parameter name; this key maps
|
|
directly to a component and parameter name. External
|
|
clients will use this in place of INI_PARAM for
|
|
boolean-valued items.
|
|
|
|
INTERFACE: BOOL_INI_PARAM()
|
|
~BOOL_INI_PARAM()
|
|
|
|
Set() - Changes the parameter value
|
|
|
|
EvaluateString()- Determines whether a string is a
|
|
valid boolean value ("yes" or "no").
|
|
|
|
QueryBool() - Asks after the parameter value
|
|
SetBool() - Changes the parameter value, for clients
|
|
|
|
PARENT: KEYED_INI_PARAM
|
|
|
|
CAVEATS: Clients should use this class instead of INI_PARAM.
|
|
|
|
Load() will return NERR_CfgParamNotFound for a parameter
|
|
whose value is not a valid boolean.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
HISTORY:
|
|
jonn 29-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS BOOL_INI_PARAM: public KEYED_INI_PARAM
|
|
{
|
|
|
|
private:
|
|
|
|
// returns ERROR_INVALID_PARAMETER for bad values
|
|
static APIERR EvaluateString(
|
|
CPSZ pchValue,
|
|
BOOL * pfValue
|
|
) const;
|
|
|
|
protected:
|
|
|
|
virtual APIERR Set(
|
|
CPSZ pchComponent,
|
|
CPSZ pchParameter,
|
|
CPSZ pchValue
|
|
);
|
|
|
|
public:
|
|
|
|
BOOL_INI_PARAM(
|
|
USHORT usKey,
|
|
BOOL fValue
|
|
);
|
|
|
|
APIERR QueryBool(
|
|
BOOL * pfValue
|
|
) const;
|
|
|
|
APIERR SetBool(
|
|
BOOL fValue
|
|
);
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: PROFILE_INI_PARAM
|
|
|
|
SYNOPSIS: Stores an image of a single device parameter in an INI file.
|
|
This class takes a device name for the item to be accessed,
|
|
and does not need a component name. External clients will
|
|
use this in place of INI_PARAM for device connections.
|
|
|
|
INTERFACE: PROFILE_INI_PARAM()
|
|
~PROFILE_INI_PARAM()
|
|
|
|
W_SetProfile() - Sets profile value assuming canonicalized
|
|
device name but not other params
|
|
QueryProfile() - Asks after the parameter value
|
|
Set() - Changes the parameter value
|
|
|
|
PARENT: LMINI_PARAM
|
|
|
|
CAVEATS: Clients should use this class instead of INI_PARAM.
|
|
|
|
Load() will return NERR_CfgParamNotFound for a parameter
|
|
whose value is not a valid boolean.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
The constructor variant without parameters can be used
|
|
to construct an instance of PROFILE_INI_PARAM which is
|
|
temporarily invalid. Such an instance should only be
|
|
used for SetProfile() and PROFILE_INI_ITER::Next().
|
|
This constructor is provided so that clients can create
|
|
in instance of PROFILE_INI_PARAM for use by
|
|
PROFILE_INI_ITER without having to fake initial data.
|
|
|
|
The constructor with only a devicename parameter also
|
|
creates an invalid instance. Such an instance should
|
|
only be used for Load() or Remove().
|
|
|
|
HISTORY:
|
|
jonn 29-May-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS PROFILE_INI_PARAM: public LMINI_PARAM
|
|
{
|
|
|
|
private:
|
|
|
|
APIERR W_SetProfile(
|
|
CPSZ pchCanonDeviceName,
|
|
CPSZ pchRemoteName,
|
|
short sAsgType,
|
|
unsigned short usResType
|
|
);
|
|
|
|
protected:
|
|
|
|
virtual APIERR Set(
|
|
CPSZ pchComponent,
|
|
CPSZ pchParameter,
|
|
CPSZ pchValue
|
|
);
|
|
|
|
public:
|
|
|
|
PROFILE_INI_PARAM(
|
|
CPSZ pchDeviceName,
|
|
CPSZ pchRemoteName,
|
|
short sAsgType,
|
|
unsigned short usResType
|
|
);
|
|
|
|
// Creates an instance which is temporarily invalid
|
|
PROFILE_INI_PARAM();
|
|
PROFILE_INI_PARAM(
|
|
CPSZ cpszDeviceName
|
|
);
|
|
|
|
APIERR QueryProfile(
|
|
BYTE * pbBuffer, // remote name
|
|
USHORT cbBuffer,
|
|
short * psAsgType,
|
|
unsigned short * pusResType
|
|
) const;
|
|
|
|
APIERR SetProfile(
|
|
CPSZ pchRemoteName,
|
|
short sAsgType,
|
|
unsigned short usResType
|
|
);
|
|
|
|
CPSZ QueryDeviceName()
|
|
{ return QueryParamName(); }
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: INI_ITER
|
|
|
|
SYNOPSIS: Iterates the parameters of the requested type. The
|
|
iterator must be provided with an INI_PARAM into which
|
|
to store each successive value. Use the INI_ITER
|
|
subclass corresponding to the INI_PARAM subclass; at
|
|
present, this means to use PROFILE_INI_ITER to
|
|
iterate PROFILE_INI_PARAMs.
|
|
|
|
INTERFACE: INI_ITER()
|
|
~INI_ITER()
|
|
|
|
Next() - Store the next param of the specified type into
|
|
the provided INI_PARAM *.
|
|
|
|
PARENT: BASE
|
|
|
|
CAVEATS: Next() requires a valid instance of PROFILE_INI_PARAM.
|
|
Create the instance with any valid initial value.
|
|
|
|
Do not modify the INI_FILE_IMAGE while the iterator is
|
|
in scope.
|
|
|
|
NOTES: Most clients should use the wrappers to these
|
|
routines supplied in newprof.h.
|
|
|
|
HISTORY:
|
|
jonn 26-Jun-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS INI_ITER: public BASE
|
|
{
|
|
|
|
private:
|
|
|
|
PSZ _pchComponent;
|
|
ITER_OF_PARAM *_piterparam;
|
|
BOOL _fComponentFound;
|
|
|
|
public:
|
|
|
|
INI_ITER(
|
|
const INI_FILE_IMAGE& inifile,
|
|
CPSZ pchComponent
|
|
);
|
|
~INI_ITER();
|
|
|
|
APIERR Next(
|
|
INI_PARAM * piniparam
|
|
);
|
|
|
|
};
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
NAME: PROFILE_INI_ITER
|
|
|
|
SYNOPSIS: Thin shell over INI_ITER; use for iterating
|
|
objects of type PROFILE_INI_PARAM.
|
|
|
|
INTERFACE: PROFILE_INI_ITER()
|
|
|
|
PARENT: INI_ITER
|
|
|
|
CAVEATS: When calling Next() on a PROFILE_INI_ITER, always pass
|
|
a pointer to a PROFILE_INI_PARAM, instead of a pointer to
|
|
another type of INI_PARAM. Use the PROFILE_INI_PARAM
|
|
constructor which takes no parameters.
|
|
|
|
HISTORY:
|
|
jonn 26-Jun-1991 Created
|
|
|
|
*************************************************************************/
|
|
|
|
DLL_CLASS PROFILE_INI_ITER: public INI_ITER
|
|
{
|
|
|
|
public:
|
|
|
|
PROFILE_INI_ITER(
|
|
const INI_FILE_IMAGE& inifile
|
|
);
|
|
|
|
};
|
|
|
|
#endif // _NEWPROF_HXX_- end of file
|