/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 1999-2021 Free Software Foundation, Inc.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General
Public License along with this library. If not, see
. */
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include
#include
int
mu_property_create (mu_property_t *pprop)
{
mu_property_t prop = calloc (1, sizeof (prop[0]));
if (!prop)
return ENOMEM;
*pprop = prop;
return 0;
}
int
mu_property_create_init (mu_property_t *pprop,
int (*initfun) (mu_property_t), void *initdata)
{
mu_property_t prop;
int rc = mu_property_create (&prop);
if (rc == 0)
{
mu_property_set_init (prop, initfun, initdata);
if (initdata)
{
rc = mu_property_init (prop);
if (rc)
return rc;
}
*pprop = prop;
}
return rc;
}
int
mu_property_set_init (mu_property_t prop,
int (*initfun) (mu_property_t), void *initdata)
{
if (!prop)
return ENOMEM;
if (prop->_prop_flags & MU_PROP_INIT)
return MU_ERR_SEQ;
prop->_prop_init = initfun;
prop->_prop_init_data = initdata;
return 0;
}
int
mu_property_set_init_data (mu_property_t prop, void *data, void **old_data)
{
if (!prop)
return ENOMEM;
if (prop->_prop_flags & MU_PROP_INIT)
return MU_ERR_SEQ;
if (old_data)
*old_data = prop->_prop_init_data;
prop->_prop_init_data = data;
return 0;
}
void
mu_property_destroy (mu_property_t *pprop)
{
if (pprop)
{
mu_property_t prop = *pprop;
if (prop && (prop->_prop_ref_count == 0 || --prop->_prop_ref_count == 0))
{
mu_property_save (prop);
if (prop->_prop_done)
prop->_prop_done (prop);
free (prop);
*pprop = NULL;
}
}
}
void
mu_property_ref (mu_property_t prop)
{
if (prop)
prop->_prop_ref_count++;
}
void
mu_property_unref (mu_property_t prop)
{
mu_property_destroy (&prop);
}
int
mu_property_save (mu_property_t prop)
{
int rc = 0;
if (!prop)
return EINVAL;
if (prop->_prop_flags & MU_PROP_MODIFIED)
{
if (prop->_prop_save)
rc = prop->_prop_save (prop);
if (rc == 0)
prop->_prop_flags &= ~MU_PROP_MODIFIED;
}
return rc;
}
int
mu_property_init (mu_property_t prop)
{
int rc = 0;
if (!(prop->_prop_flags & MU_PROP_INIT))
{
if (prop->_prop_init)
rc = prop->_prop_init (prop);
if (rc == 0)
prop->_prop_flags |= MU_PROP_INIT;
}
return rc;
}
static int
_mu_property_fill (mu_property_t prop)
{
int rc = 0;
if (!(prop->_prop_flags & MU_PROP_FILL))
{
if (prop->_prop_fill)
rc = prop->_prop_fill (prop);
if (rc == 0)
prop->_prop_flags |= MU_PROP_FILL;
}
return rc;
}
int
_mu_property_check (mu_property_t prop)
{
int rc;
if (!prop)
return EINVAL;
rc = mu_property_init (prop);
if (rc == 0)
rc = _mu_property_fill (prop);
return rc;
}