In order to understand how an Enif client, including the SEnC program described later on, interacts with the Enif server, it is necessary to have some basic knowledge on Enif's general configuration mechanism. But note that the following explanations are limited to provide the bare minimum needed for a basic understanding. A more complete and detailed description of the concepts outlined below can be found in [2].
The fundamental building block of Enif's configurability is the
Parameter. In a nutshell, a parameter is defined by:
Enif's grouping mechanism is activated whenever the value of a parameter is changed. If the parameter has a non-empty send group, a group signal is propagated to other parameters, causing those parameters having the same receive group (and a compatible type) to synchronize automatically to this same value. Parameters having the same update group will, instead of changing their value, perform an update action, which depends on the type of the parameter and its properties.
The parameters are used to provide configurability to Enif's functionalities. Each of Enif's basic functionality (e.g. plot, mapper, list, configurable attribute, ..., or also the Enif TCP/IP server) constitutes a configurable object. Each configurable objects has it's own set of parameters, or, in other words, each parameter is owned by a configurable object.
The configurable objects are organized as an object tree, which implies that a configurable object has a parent object and can create its own child objects.
The parameter grouping mechanism described above is not restrained to the set of parameters of a single configurable object, but it can also be used to synchronize parameters belonging to different configurable objects. This is done by propagating the group signals along the configurable object tree. In order to control the propagation of the group signal, each configurable object has its own group filters (implemented themselves as string parameters) which define which groups can enter and leave the object. The figure below shows a typical Enif object tree, as it is displayed by Enif in configuration mode when selecting the option ``Show configurable object tree'':
Having understood the above mechanism, it is easy to see that storing or loading an Enif configuration (e.g. a plot or a list) can be done simply by writing or reading a file which contains the list of the corresponding configurable objects, and for each object the specification of its set of parameters. Given that the configurable object itself defines name, description and type for each of its parameters, the bulk of the configuration files (such as *.e2p plot configurations or *.e2l list configurations) consists in commands specifying the parameter's values and group specifications. In their simplest form, the groups of a parameter are specified with commands of the type
parameter : send[/receive[/update]]
and parameter values are specified with commands like
parameter = value
for non indexed parameters (i.e. value at index 0) or
parameter[index] = value
for setting the value for a specified index.
As explained later, the above parameter specification command are not only used in Enif's configuration files, but in exactly the same way they also constitute the basic Enif server mode commands for changing the values and characteristics of Enif parameters.