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";
00021 static const char K_ORDER[]="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 00039 00040
00041
00042 00043 00044 00045 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
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 00119
00120 PUBLIC void FIELD_DEF::loadval(CONFDB *c_data, const char *key)
00121 {
00122 00123 00124 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 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
00157 return;
00158 c_data->add(key,ptid,buf);
00159 }
00160
00161
00162 PUBLIC void FIELD_DEF::delval(CONFDB *c_data, const char *key)
00163 {
00164 c_data->removeall (key,id.get());
00165 }
00166
00167
00168 PUBLIC FIELD_DEF *FIELD_DEFS::getitem(int no) const
00169 {
00170 return (FIELD_DEF*)ARRAY::getitem(no);
00171 }
00172
00173
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
00180 PUBLIC void FIELD_DEFS::saveval(CONFDB *c_data, const char *key)
00181 {
00182
00183 delval(c_data,key);
00184 for (int i=0; i<getnb(); i++) getitem(i)->saveval(c_data,key);
00185 }
00186
00187
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
00199 PUBLIC FIELD_DEFS::FIELD_DEFS(CONFDB *formconfig)
00200 {
00201 c_form = formconfig;
00202 }
00203
00204
00205 PUBLIC FIELD_DEFS::FIELD_DEFS(CONFIG_FILE *formfile)
00206 {
00207 c_form = new CONFDB(*formfile);
00208 }
00209
00210
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 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 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");
00292 tbtype[1] = MSG_U(I_BOOL,"Checkbox");
00293 tbtype[2] = MSG_U(I_NUM,"Numeric");
00294 tbtype[3] = MSG_U(I_ENUM,"Enumeration");
00295 tbtype[4] = MSG_U(I_PAD,"Pad");
00296 tbtype[5] = MSG_U(I_TITLE,"Title");
00297 tbtype[6] = MSG_U(I_COMBO,"Combo");
00298 tbtype[7] = MSG_U(I_LIST,"List");
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
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;
00345
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