#include #include #include "nt2linux.h" #include "nt2linux.m" #include static HELP_FILE help_intro ("nt2linux","intro"); PUBLIC SUBJECT::SUBJECT(const char *_name) { name.setfrom (_name); name.to_lower(); } PUBLIC SUBJECT *SUBJECTS::getitem (int no) const { return (SUBJECT*)ARRAY::getitem(no); } PUBLIC SUBJECT *SUBJECTS::locate (const char *name) const { SUBJECT *ret = NULL; for (int i=0; iname.cmp(name)==0){ ret = s; break; } } return ret; } static int parse_cmp_by_name (const ARRAY_OBJ *o1, const ARRAY_OBJ *o2) { SUBJECT *s1 = (SUBJECT*)o1; SUBJECT *s2 = (SUBJECT*)o2; return s1->name.cmp(s2->name); } PUBLIC SUBJECTS::SUBJECTS() { } void parse_unquote(char *s) { if (s[0] == '"'){ int last = strlen(s)-1; if (s[last] == '"') s[last] = '\0'; memmove (s,s+1,last); } } PUBLIC SUBJECTS::SUBJECTS(const char *fname) { FILE *fin = fopen (fname,"r"); if (fin != NULL){ char buf[1000]; SUBJECTS *sub = NULL; SUBJECTS *subsub = NULL; while (fgets(buf,sizeof(buf)-1,fin)!=NULL){ strip_end (buf); if (buf[0] == '['){ char *pt = strchr(buf,']'); if (pt != NULL) *pt = '\0'; parse_unquote(buf+1); SUBJECT *s = new SUBJECT (buf+1); add (s); sub = &s->values; }else if (buf[0] == '='){ if (sub != NULL){ char *pt = strchr(buf,','); char *desc = ""; if (pt != NULL){ *pt++ = '\0'; desc = pt; } parse_unquote(buf+2); SUBJECT *s = new SUBJECT (buf+2); s->desc.setfrom (desc); sub->add (s); subsub = &s->values; } }else if (buf[0] == '-'){ if (subsub != NULL){ char *pt = strchr(buf,','); char *desc = ""; if (pt != NULL){ *pt++ = '\0'; desc = pt; } parse_unquote(buf+2); SUBJECT *s = new SUBJECT (buf+2); s->desc.setfrom (desc); subsub->add (s); } } } fclose (fin); } } PUBLIC void SUBJECTS::browse( const char *type, int level, SUBJECTS *groups, NT_PARMS *parms) { SUBJECTS *subs; SUBJECTS *groups; NT_PARMS *parms; const char *type; int level; glocal.subs = this; glocal.groups = groups; glocal.parms = parms; glocal.type = type; glocal.level = level; sort (parse_cmp_by_name); (MSG_U(T_SUBJECT,"Pick a subject") ,glocal.type,help_intro); newf_head (MSG_U(H_SUBJECT,"Subject\tDetails")); if (glocal.level == 1){ setbutinfo (MENU_USR1,MSG_U(B_EXPORT,"Export") ,MSG_R(B_EXPORT)); } for (int i=0; igetnb(); i++){ SUBJECT *s = glocal.subs->getitem(i); new_menuitem (s->name.get(),s->desc.get()); } SUBJECT *s = glocal.subs->getitem(no); s->values.browse(s->name.get(), glocal.level+1 ,glocal.groups,glocal.parms); if (strcmp(glocal.type,"groups")==0){ groups_create (*glocal.subs); // groups_createldif (*glocal.subs); }else if (strcmp(glocal.type,"users")==0){ users_create (*glocal.subs); }else if (strcmp(glocal.type,"shares")==0){ shares_create (*glocal.subs,*glocal.groups,*glocal.parms); }else if (strcmp(glocal.type,"printers")==0){ printers_create (*glocal.subs); }else if (strcmp(glocal.type,"data")==0){ data_create (*glocal.subs,*glocal.groups,*glocal.parms); } } void browse (const char *fname) { SUBJECTS subs (fname); SUBJECT *gr = subs.locate("groups"); SUBJECTS *groups,tmp; if (gr != NULL){ groups = &gr->values; }else{ groups = &tmp; } NT_PARMS parms; parms.dataroot.setfrom ("/data"); subs.browse(MSG_U(T_TOPLEVEL,"Top level"),0,groups,&parms); }