Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

fields.cc

Go to the documentation of this file.
00001 
00002 #include <stdlib.h>
00003 #include <confdb.h>
00004 #include <translat.h>
00005 #include "ldapconf_defs.h"
00006 #include "ldapconf.m"
00007 #include "ldapconf.h"
00008 #include "fields.h"
00009 
00010 static HELP_FILE help_field ("formfield","field");
00011 
00012 static const char K_FORMCONF[]="formconf";
00013 static const char K_ID[]="id";
00014 static const char K_TITLE[]="title";
00015 static const char K_TYPE[]="type";
00016 static const char K_MINIMUM[]="minimum";
00017 static const char K_MAXIMUM[]="maximum";
00018 static const char K_MUSTFILL[]="mustfill";
00019 static const char K_VALUE[]="value";
00020 static const char K_DEFAULT[]="default"; // Default value
00021 static const char K_ORDER[]="order"; // Field order
00022 
00023 static const char *tbtype[7];
00024 
00025 PUBLIC FIELD_DEF::FIELD_DEF()
00026 {
00027     type = FLD_TYPE_STRING;
00028     minimum = 0;
00029     maximum = 8000000;
00030     must_fill = 0;
00031     val.sel = 0;
00032     val.num = 0;
00033     order = 100;
00034 }
00035 
00036 /*
00037 
00038   FIELD_DEF object - One field
00039 
00040 */
00041 
00042 /*
00043     Edit a field definition.
00044     Return -1 if edit cancelled, 0 if accepted, 1 if the field
00045     must be deleted
00046 */
00047 PUBLIC int FIELD_DEF::edit()
00048 {
00049     int ret = -1;
00050     DIALOG dia;
00051     dia.newf_str (MSG_U(F_ID,"Field ID"),id);
00052     dia.last_noempty();
00053     dia.newf_str (MSG_U(F_TITLE,"Field title"),title);
00054     dia.last_noempty();
00055     dia.newf_num (MSG_U(F_ORDER,"Field order"),order);
00056     FIELD_ENUM *fenum = dia.newf_enum (MSG_U(F_TYPE,"Field type"),type);
00057     for (int i=0; i<8; i++) fenum->addopt(tbtype[i]);
00058     dia.newf_chk (MSG_U(F_STRINGF,"String field"),must_fill
00059                   ,MSG_U(I_STRINGF,"must be filled"));
00060     dia.newf_num (MSG_U(F_MINIMUM,"Minimum value"),minimum);
00061     int field_maximum = dia.getnb();
00062     dia.newf_num (MSG_U(F_MAXIMUM,"Maximum value"),maximum);
00063     dia.newf_title ("",MSG_U(T_VALUES,"List values"));
00064     int field_value = dia.getnb();
00065     {
00066         // Make sure there are at least 4 empty value entries
00067         int nb_empty = 0;
00068         for (int i=0; i<values.getnb(); i++){
00069             if (values.getitem(i)->is_empty()) nb_empty++;
00070         }
00071         for (int i=nb_empty; i<4; i++) values.add (new SSTRING);
00072         for (int i=0; i<values.getnb(); i++){
00073             dia.newf_str ("",*values.getitem(i));
00074         }
00075     }
00076     int nof = 0;
00077     dia.delwhat (MSG_U(I_DELFIELD,"the field definition"));
00078     while (1){
00079         MENU_STATUS code = dia.edit (MSG_U(T_FIELD_DEF,"Field definition")
00080                                      ,MSG_U(I_FIELD_DEF,"You must describe one input field")
00081                                      ,help_field
00082                                      ,nof,MENUBUT_DEL|MENUBUT_CANCEL|MENUBUT_ACCEPT);
00083         if (code == MENU_CANCEL || code == MENU_ESCAPE){
00084             break;
00085         }else if (code == MENU_DEL){
00086             if (xconf_delok()){
00087                 ret = 1;
00088                 break;
00089             }
00090         }else if (minimum > maximum){
00091             xconf_error (MSG_U(E_RANGE,"Maximum must be greater than minimum"));
00092             nof = field_maximum;
00093         }else if (id.strchr(' ')!=NULL){
00094             xconf_error (MSG_U(E_NOSPACE,"No space allowed in ID"));
00095             nof = 0;
00096         }else{
00097             int nb_empty = 0;
00098             for (int i=0; i<values.getnb(); i++){
00099                 if (values.getitem(i)->is_empty()) nb_empty++;
00100             }
00101             if (values.getnb() - nb_empty < 2
00102                 && type == FLD_TYPE_LIST){
00103                 xconf_error (MSG_U(E_2ITEMS
00104                                    ,"You must define minimally 2 values\n"
00105                                    "for an enumeration field"));
00106                 nof = field_value;
00107             }else{
00108                 values.remove_empty();
00109                 ret = 0;
00110                 break;
00111             }
00112         }
00113     }
00114     return ret;
00115 }
00116 
00117 /*
00118     Load the value of a field for a given key
00119 */
00120 PUBLIC void FIELD_DEF::loadval(CONFDB *c_data, const char *key)
00121 {
00122     /* 
00123        Lower the case of the attribute name since confdb is case-sensitive 
00124        and we already lowered the name in ldap_object.
00125     */
00126  
00127     id.to_lower();
00128     const char *s = c_data->getval (key,id.get());
00129 
00130     D(debugf(6,"FIELD_DEF::loadval key=%s id=%s title=%s val=%s\n",key,id.get(),title.get(),s));
00131 
00132     if (s != NULL){
00133         if (type == FLD_TYPE_STRING || type == FLD_TYPE_COMBO || type == FLD_TYPE_LIST){
00134             val.str.setfrom (s);
00135         }else if (type == FLD_TYPE_BOOL){
00136             val.sel = atoi(s);
00137         }else if (type == FLD_TYPE_NUM || type == FLD_TYPE_ENUM){
00138             val.num = atoi(s);
00139         }
00140     }
00141 }
00142 /*
00143     Save the value of a field for a given key
00144 */
00145 PUBLIC void FIELD_DEF::saveval(CONFDB *c_data, const char *key)
00146 {
00147     const char *ptid = id.get();
00148     const int MAX_BUF=1000;
00149     char buf[MAX_BUF] = "";
00150     if (type == FLD_TYPE_STRING || type == FLD_TYPE_COMBO || type == FLD_TYPE_LIST){
00151         snprintf(buf,MAX_BUF-1,"%s",val.str.get());     
00152     }else if (type == FLD_TYPE_BOOL){
00153         snprintf(buf,MAX_BUF-1,"%s",&val.sel);
00154     }else if (type == FLD_TYPE_NUM || type == FLD_TYPE_ENUM){
00155         snprintf(buf,MAX_BUF-1,"%i",val.num);
00156     }else // Other fields are not for data and should not be saved
00157         return;
00158     c_data->add(key,ptid,buf);
00159 }
00160 
00161 /* Delete the value of a field for a given key */
00162 PUBLIC void FIELD_DEF::delval(CONFDB *c_data, const char *key)
00163 {
00164     c_data->removeall (key,id.get());
00165 }
00166 
00167 /* Find numbered field */
00168 PUBLIC FIELD_DEF *FIELD_DEFS::getitem(int no) const
00169 {
00170     return (FIELD_DEF*)ARRAY::getitem(no);
00171 }
00172 
00173 /* Get items for this key from the dataobject */
00174 PUBLIC void FIELD_DEFS::loadval(CONFDB *c_data, const char *key)
00175 {
00176     for (int i=0; i<getnb(); i++) getitem(i)->loadval(c_data,key);
00177 }
00178 
00179 /* Save items for this key in the dataobject */
00180 PUBLIC void FIELD_DEFS::saveval(CONFDB *c_data, const char *key)
00181 {   
00182     // Remove the old entry
00183     delval(c_data,key);
00184     for (int i=0; i<getnb(); i++) getitem(i)->saveval(c_data,key);
00185 }
00186 
00187 /* Delete items for this key in the dataobject */
00188 PUBLIC void FIELD_DEFS::delval(CONFDB *c_data, const char *key)
00189 {
00190     for (int i=0; i<getnb(); i++) getitem(i)->delval(c_data,key);
00191 }
00192 
00193 PUBLIC FIELD_DEFS::FIELD_DEFS()
00194 {
00195 
00196 }
00197 
00198 /* Init from confdb object */
00199 PUBLIC FIELD_DEFS::FIELD_DEFS(CONFDB *formconfig)
00200 {
00201     c_form = formconfig;
00202 }
00203 
00204 /* Init from config file */
00205 PUBLIC FIELD_DEFS::FIELD_DEFS(CONFIG_FILE *formfile)
00206 {
00207     c_form = new CONFDB(*formfile);
00208 }
00209 
00210 /* Init from filename */
00211 PUBLIC FIELD_DEFS::FIELD_DEFS(const char *filename)
00212 {   
00213     f_form = new CONFIG_FILE(filename,help_field
00214                              ,CONFIGF_MANAGED|CONFIGF_OPTIONAL
00215                              ,"root","root",0600);  
00216     c_form = new CONFDB(*f_form);
00217 }
00218 
00219 /*
00220   
00221   Read from form config
00222 
00223 */
00224 
00225 PUBLIC int FIELD_DEFS::read()
00226 {
00227     SSTRINGS tb;
00228     c_form->getall (K_FORMCONF,K_ID,tb,false);
00229     for (int i=0; i<tb.getnb(); i++){
00230         FIELD_DEF *d = new FIELD_DEF;
00231         add (d);
00232         const char *id = tb.getitem(i)->get();
00233         d->id.setfrom (id);
00234         char key[100];
00235         snprintf (key,sizeof(key)-1,"%s",id);
00236         d->title.setfrom (c_form->getval (key,K_TITLE));
00237         d->type = c_form->getvalnum (key,K_TYPE,FLD_TYPE_STRING);
00238         d->must_fill = c_form->getvalnum (key,K_MUSTFILL,0);
00239         d->minimum = c_form->getvalnum (key,K_MINIMUM,0);
00240         d->maximum = c_form->getvalnum (key,K_MAXIMUM,8000000);
00241         d->fdefault.setfrom (c_form->getval (key,K_DEFAULT));
00242         if (d->fdefault.getlen()>0) {
00243                 D(debugf(4,">>>FIELDS_DEFS::read key=%s, default=%s\n",key,d->fdefault.get()));
00244         }
00245         d->order = c_form->getvalnum (key,K_ORDER,100);
00246         c_form->getall (key,K_VALUE,d->values,true);
00247     }
00248     return 0;
00249 }
00250 
00251 /*
00252     Update form config file
00253 */
00254 
00255 PUBLIC int FIELD_DEFS::write()
00256 {
00257     SSTRINGS tb;
00258     c_form->getall (K_FORMCONF,K_ID,tb,false);
00259     for (int i=0; i<tb.getnb(); i++){
00260         char key[100];
00261         snprintf (key,sizeof(key)-1,"%s",tb.getitem(i)->get());
00262         c_form->removeall (key,K_TITLE);
00263         c_form->removeall (key,K_TYPE);
00264         c_form->removeall (key,K_MUSTFILL);
00265         c_form->removeall (key,K_MINIMUM);
00266         c_form->removeall (key,K_MAXIMUM);
00267         c_form->removeall (key,K_VALUE);
00268         c_form->removeall (key,K_ORDER);
00269         c_form->removeall (key,K_DEFAULT);
00270     }
00271     c_form->removeall (K_FORMCONF,K_ID);
00272     for (int i=0; i<getnb(); i++){
00273         FIELD_DEF *d = getitem(i);
00274         c_form->add (K_FORMCONF,K_ID,d->id);
00275         char key[100];
00276         snprintf (key,sizeof(key)-1,"%s",d->id.get());
00277         c_form->add (key,K_TITLE,d->title);
00278         c_form->add (key,K_TYPE,d->type);
00279         c_form->add (key,K_MUSTFILL,d->must_fill);
00280         c_form->add (key,K_MINIMUM,d->minimum);
00281         c_form->add (key,K_MAXIMUM,d->maximum);
00282         c_form->add (key,K_ORDER,d->order);
00283         c_form->add (key,K_DEFAULT,d->fdefault);
00284         c_form->replace (key,K_VALUE,d->values);
00285     }
00286     return c_form->save();
00287 }
00288 
00289 PUBLIC int FIELD_DEFS::edit()
00290 {
00291     tbtype[0] = MSG_U(I_STRING,"Text");        // String value
00292     tbtype[1] = MSG_U(I_BOOL,"Checkbox");      // Checkbox value
00293     tbtype[2] = MSG_U(I_NUM,"Numeric");        // Numeric value
00294     tbtype[3] = MSG_U(I_ENUM,"Enumeration");   // Enum value
00295     tbtype[4] = MSG_U(I_PAD,"Pad");            // Insert a pad
00296     tbtype[5] = MSG_U(I_TITLE,"Title");        // Insert a title
00297     tbtype[6] = MSG_U(I_COMBO,"Combo");        // String value from picklist or user
00298     tbtype[7] = MSG_U(I_LIST,"List");          // String value from picklist only
00299 
00300     int i;
00301     DIALOG_RECORDS dia;
00302     dia.newf_head ("",MSG_U(H_FIELDDEF,"Title\tType"));
00303     for (i=0; i<getnb(); i++){
00304         FIELD_DEF *d = getitem(i);
00305         dia.set_menuitem (i,d->title.get(),tbtype[d->type]);
00306     }
00307     dia.addwhat (MSG_U(I_ADDF,"a new field"));
00308 
00309     int nof = 0;
00310     while (1){
00311         MENU_STATUS code = dia.editmenu (MSG_U(T_FIELDDEFS
00312                                                ,"Field definitions")
00313                                          ,MSG_U(I_FIELDDEFS,"Define all the fields to be used in this form\n")
00314                                          ,help_field
00315                                          ,nof
00316                                          ,MENUBUT_ADD);
00317         if(code == MENU_QUIT || code == MENU_ESCAPE){
00318             break;
00319         }else if (code == MENU_ADD){
00320             FIELD_DEF *d = new FIELD_DEF;
00321             if (editone(d)==0) {
00322                 i++;
00323                 dia.set_menuitem (i,d->title.get(),tbtype[d->type]);
00324             }
00325         }else {
00326             editone(nof); 
00327         }
00328     }
00329     return 0;
00330 }
00331 
00332 PUBLIC SSTRING * FIELD_DEFS::getdefault(const char *sid)
00333 {
00334 // NOTE : we must compare with the id, not the title because the title may have been customized by user
00335   for (int i=0; i<getnb(); i++){
00336     FIELD_DEF *d = getitem(i);
00337     if (d && !strcasecmp(d->id.get(),sid)){
00338       if (d->fdefault.getlen()>0) {
00339         D(debugf(6,"FIELD_DEF::getdefault FOUND default for key %s : %s\n",sid,d->fdefault.get()));
00340         return &d->fdefault;
00341       }
00342     }
00343   }
00344   return NULL; // not found : this attribute is not defined in the form
00345 // or the value was empty so we didn't return in the loop
00346 }
00347 
00348 PUBLIC void FIELD_DEFS::setupdia(DIALOG &dia)
00349 {
00350     for (int i=0; i<getnb(); i++){
00351         FIELD_DEF *d = getitem(i);
00352         int type = d->type;
00353         const char *title = d->title.get();
00354         d->field_num = dia.getnb();
00355         if (type == FLD_TYPE_STRING){
00356             dia.newf_str (title,d->val.str);
00357             if (d->must_fill) dia.last_noempty();
00358         }else if (type == FLD_TYPE_BOOL){
00359             dia.newf_chk (title,d->val.sel,"");
00360         }else if (type == FLD_TYPE_NUM){
00361             dia.newf_num (title,d->val.num);
00362         }else if (type == FLD_TYPE_ENUM){
00363             FIELD_ENUM *fenum = dia.newf_enum (title,d->val.num);
00364             for (int j=0; j<d->values.getnb(); j++){
00365                 fenum->addopt (d->values.getitem(j)->get());
00366             }       
00367         }else if (type == FLD_TYPE_COMBO){
00368             FIELD_COMBO *fcombo = dia.newf_combo (title,d->val.str);
00369             for (int j=0; j<d->values.getnb(); j++){
00370                 fcombo->addopt (d->values.getitem(j)->get());
00371             }
00372         }else if (type == FLD_TYPE_LIST){
00373             FIELD_LIST *flist = dia.newf_list (title,d->val.str);
00374             for (int j=0; j<d->values.getnb(); j++){
00375                 flist->addopt (d->values.getitem(j)->get());
00376             }
00377         }else if (type == FLD_TYPE_PAD){
00378             dia.newf_title(title,1,"",title);
00379         }else if (type == FLD_TYPE_TITLE){
00380             dia.newf_title("",title);
00381         }
00382     }
00383 }   
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394 
00395 
00396 
00397 

Generated at Mon Jan 22 08:35:10 2001 for ldapconf by doxygen1.2.1 written by Dimitri van Heesch, © 1997-2000