// this is nothing just not to start from @
id_new=0;
@co_call(par_area,'"generic_acl"',"create",par_area=>par_area,par_class=>par_class,par_id=>par_id,callback=>callback,create_params=>create_params,dont_set_acl=>dont_set_acl);
id_new = *(int *) cou_getReturnValue(cnx, CO_INTEGER, &err);
NParams = coa_GetElementCount(cnx, create_params);
for(pos=0; pos<NParams; pos+=2)
{
if (!strcmp(coa_GetElement(cnx, create_params, pos),"name")) name = ap_pstrdup(p, coa_GetElement(cnx, create_params, pos+1));
if (!strcmp(coa_GetElement(cnx, create_params, pos),"login")) login = ap_pstrdup(p, coa_GetElement(cnx, create_params, pos+1));
if (!strcmp(coa_GetElement(cnx, create_params, pos),"password")) password = ap_pstrdup(p, coa_GetElement(cnx, create_params, pos+1));
if (!strcmp(coa_GetElement(cnx, create_params, pos),"id_parent")) str_id_parent = ap_pstrdup(p, coa_GetElement(cnx, create_params, pos+1));
}

// we switch off checking security to allow changing of name and password
old_check_security = cnx->check_security;
cnx->check_security = 0;
@co_call(par_area,par_class,"update",par_area=>par_area,par_class=>par_class,par_id=>id_new,par_prop=>'"name"',new_value=>name,version=>0);
@co_call(par_area,par_class,"update",par_area=>par_area,par_class=>par_class,par_id=>id_new,par_prop=>'"login"',new_value=>login,version=>1);
@co_call(par_area,'"generic_acl"',"update",par_area=>par_area,par_class=>par_class,par_id=>id_new,par_prop=>'"id_role"',new_value=>str_id_parent,version=>2);

@co_call(par_area,par_class,"changePasswd",par_area=>par_area,par_class=>par_class,par_id=>id_new,passwd_old=>'""',passwd_new=>password);

/* user is container for preference and preference uses iacl anyway */
/* so checking security does not make sense here */
@co_call(par_area,par_class,"insertChild",par_area=>par_area,par_class=>par_class,par_id=>id_new,child_class=>'"preference"',child_prop=>'"id_user"',foreign_prop=>'"id"');

cnx->check_security = old_check_security;

cou_setReturnValue(cnx, &id_new, CO_INTEGER);