|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 72513 (0x11b41) Types: TextFile Names: »sunint.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/others/quipu/uips/sunint/sunint.c«
/* sunint.c - sunview interface to directory */ #ifndef lint static char *rcsid = "$Header: /f/osi/others/quipu/uips/sunint/RCS/sunint.c,v 7.0 89/11/23 22:09:19 mrose Rel $"; #endif /* * $Header: /f/osi/others/quipu/uips/sunint/RCS/sunint.c,v 7.0 89/11/23 22:09:19 mrose Rel $ * * * $Log: sunint.c,v $ * Revision 7.0 89/11/23 22:09:19 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include <stdio.h> #include <ctype.h> #include <sgtty.h> #include <signal.h> #include <suntool/sunview.h> #include <suntool/panel.h> #include <suntool/tty.h> #include <suntool/scrollbar.h> #include <suntool/seln.h> #include <suntool/textsw.h> #include <suntool/canvas.h> #define foreach_av(a) for(eptr = a; eptr != NULLAV; eptr = eptr->avseq_next) #define foreach_as(a) for(eptr = a; eptr != NULLATTR; eptr = eptr->attr_link) #define ACTIVE 1 #define PASSIVE 0 #define DESCEND 1 #define READ 2 #define SET_NEW_DN 3 #define BACKTRACK 4 #define LIST 5 #define FORM_SEARCH 6 #define SEARCH 7 #define CURRENT_POS 8 #define SPECIFIED_POS 9 #define IGNORE 10 #define SIZELIMIT 500 #define SMALL_BUF 128 char *bitmap; #include <varargs.h> #include "quipu/util.h" #include "quipu/common.h" #include "quipu/entry.h" #include "quipu/dua.h" #include "quipu/photo.h" static void yes_no_proc (); static Frame init_get_arg_frame (); static int get_data (); static int get_string_specs (); Attr_Sequence sun_dua_get_1_as (); Filter get_filter (); Filter sun_dua_build_filter (); Frame base_frame, search_frame, read_frame, confirm_frame, get_args_form; static Frame init_get_args_form (); static Frame init_get_strings_form (); Panel dua_panel_win, control_panel, search_control_panel, read_control_panel, search_panel_win; Textsw read_text_win; extern Textsw_index textsw_insert(); extern Textsw_index textsw_delete(); Panel_item prompt_for, dua_message, search_message, read_message, search_button, quit_button, path_title, path_header, root_button, win_below_title, current_path_item[10], dua_panel_entry[LOTS], search_panel_entry[LOTS]; Panel_item /* passwd_text_item, yn_text_item, */ oc_text_item; Panel_setting put_data_proc (),put_base_object_string (); Panel_setting put_filter_text_proc (),put_base_object_select (); Panel_setting put_search_depth_select (), put_filter_type_select (); Panel_setting put_base_object_string_proc (); Panel_setting put_filter_string_proc (),put_string_base_object_select_proc (); Panel_setting put_string_search_depth_select (); Canvas read_canvas; char current_dn_buffer[SMALL_BUF], dua_textsw_buf[LOTS], arg_data_buf[SMALL_BUF]; char * sun_dua_get_search_string (); DN user_name; DN dn; DN ascend_proc (); DN sun_dua_getdn (); char * sun_dua_getyn (); void set_filter_specs_defaults (); void set_search_data_info_defaults (); void quit_proc (); void make_new_path (); void back_to_root (); void list_proc (); void read_proc (); void search_proc (); void form_search_proc (); void handle_root_button (); void dua_handle_search_button (); void clear_panel_win (); void filt_substr (); void clear_old_search_results (); void put_filter_match_proc (); void get_oc_bit (); void get_rdn_bit (); void clear_old_path (); void my_picture_print (); char *TidyString (); Attr_Sequence eis_as; int *approx; int display_item_count; int path_element_count; int search_item_count; int oidformat; int args_entered_flag; extern int PIC_LINESIZE; /* from libphoto.a */ typedef struct { AttributeType attr_struct; char print_string[SMALL_BUF]; char string_value[SMALL_BUF]; int match_type; } Temp_attr_bit; typedef struct { int depth; DN dn_ptr; } path_element_data, *PathElementData; #define TEMPLATE_SIZE 10 #define TEMPLATE_LIST_SIZE 10 #define MAX_TEMPLATES 10 typedef struct { /* char object_class[SMALL_BUF]; */ char oc_print_string[SMALL_BUF]; int attr_count; Temp_attr_bit Temp_attr_pieces[TEMPLATE_SIZE]; } Template; Template Template_list[MAX_TEMPLATES]; int no_templates; Menu search_menu, read_select_menu, path_select_menu, list_select_menu, root_button_menu; typedef struct { char attr_string[SMALL_BUF]; int match_choice; } filter_temp_attr; typedef struct filter_specs_data { int search_subset; int base_object_select; char base_object_string[SMALL_BUF]; int type; int filter_temp_choice; int filter_temp_attr_count; filter_temp_attr filter_temp_entries[10]; } filter_specs; filter_specs *sun_dua_get_form_data (); filter_specs the_filter_specs; typedef struct search_data_info_data { int search_subset; int base_object_select; char base_object_string[SMALL_BUF]; char filter_string[SMALL_BUF]; } search_data_info, *string_specs; string_specs sun_dua_get_string_specs (); search_data_info the_search_data_info; static struct ds_bind_arg bindarg; static struct ds_bind_arg bindresult; static struct ds_bind_error binderr; sunint_pictures(); int dn_print(); int sunint_dn_comp_print (); int oc_print (); char * sunint_error (); quipu_pe_cmp(); main(argc,argv) char **argv; int argc; { char * TidyString(); quipu_syntaxes (); dsap_init(&argc,&argv); set_attribute_syntax (str2syntax("photo"), (IFP)pe_cpy, NULLIFP, NULLIFP, sunint_pictures, (IFP)pe_cpy, quipu_pe_cmp, pe_free, NULLCP, NULLIFP, TRUE ); (void) fprintf (stderr,"Connecting to dsa, please wait ...\n"); bindarg.dba_version = DBA_VERSION_V1988; bindarg.dba_passwd_len = 0; bindarg.dba_passwd[0] = 0; bindarg.dba_dn = NULLDN; if (ds_bind (&bindarg, &binderr, &bindresult) != OK) { fatal (-1,"Can't get connection"); } user_name = NULLDN; set_up_templates (); base_frame = window_create ((Window) NULL, FRAME, FRAME_LABEL, "QUIPU Sunview DUA Interface",0); search_frame = window_create (base_frame, FRAME, FRAME_LABEL, "Search Results",0); read_frame = window_create (base_frame, FRAME, FRAME_LABEL, "Read Results",0); init_control_panel (); init_main_panel (); window_fit (base_frame); (void) window_set (base_frame, WIN_X, 10, WIN_Y, 10, 0); init_search_control_panel (); init_search_panel_win (); window_fit (search_frame); (void) window_set (search_frame, WIN_X, 150, WIN_Y, 150, 0); init_read_control_panel (); init_read_canvas (); init_read_text_win (); window_fit (read_frame); (void) window_set (read_frame, WIN_X, 250, WIN_Y, 250, 0); make_path_select_menu (); make_search_menu (); make_list_select_menu (); make_read_select_menu (); make_root_button_menu (); window_main_loop (base_frame); } set_up_templates () /* this procedure can later be replaced by a suitable tailoring procedure */ { (void) strcpy (Template_list[0].oc_print_string , "Country"); Template_list[0].attr_count = 1; (void) strcpy (Template_list[0].Temp_attr_pieces[0].print_string , "Country: "); (void) strcpy (Template_list[0].Temp_attr_pieces[0].string_value , "c"); Template_list[0].Temp_attr_pieces[0].attr_struct = AttrT_new ("c"); (void) strcpy (Template_list[1].oc_print_string , "Organization"); Template_list[1].attr_count = 4; (void) strcpy (Template_list[1].Temp_attr_pieces[0].print_string , "Organization: "); (void) strcpy (Template_list[1].Temp_attr_pieces[0].string_value , "o"); Template_list[1].Temp_attr_pieces[0].attr_struct = AttrT_new ("o"); (void) strcpy (Template_list[1].Temp_attr_pieces[1].print_string , "Business Category: "); (void) strcpy (Template_list[1].Temp_attr_pieces[1].string_value , "businessCategory"); Template_list[1].Temp_attr_pieces[1].attr_struct = AttrT_new ("businessCategory"); (void) strcpy (Template_list[1].Temp_attr_pieces[2].print_string , "Locality Name: "); (void) strcpy (Template_list[1].Temp_attr_pieces[2].string_value , "localityName"); Template_list[1].Temp_attr_pieces[2].attr_struct = AttrT_new ("localityName"); (void) strcpy (Template_list[1].Temp_attr_pieces[3].print_string , "State or Province Name: "); (void) strcpy (Template_list[1].Temp_attr_pieces[3].string_value , "stateOrProvinceName"); Template_list[1].Temp_attr_pieces[3].attr_struct = AttrT_new ("stateOrProvinceName"); (void) strcpy (Template_list[2].oc_print_string , "Organizational Unit"); Template_list[2].attr_count = 3; (void) strcpy (Template_list[2].Temp_attr_pieces[0].print_string , "Organizational Unit: "); (void) strcpy (Template_list[2].Temp_attr_pieces[0].string_value , "ou"); Template_list[2].Temp_attr_pieces[0].attr_struct = AttrT_new ("ou"); (void) strcpy (Template_list[2].Temp_attr_pieces[1].print_string , "Business Category: "); (void) strcpy (Template_list[2].Temp_attr_pieces[1].string_value , "businessCategory"); Template_list[2].Temp_attr_pieces[1].attr_struct = AttrT_new ("businessCategory"); (void) strcpy (Template_list[2].Temp_attr_pieces[2].print_string , "Locality Name: "); (void) strcpy (Template_list[2].Temp_attr_pieces[2].string_value , "localityName"); Template_list[2].Temp_attr_pieces[2].attr_struct = AttrT_new ("localityName"); (void) strcpy (Template_list[3].oc_print_string , "Person"); Template_list[3].attr_count = 3; (void) strcpy (Template_list[3].Temp_attr_pieces[0].print_string , "Name of Person: "); (void) strcpy (Template_list[3].Temp_attr_pieces[0].string_value , "cn"); Template_list[3].Temp_attr_pieces[0].attr_struct = AttrT_new ("cn"); (void) strcpy (Template_list[3].Temp_attr_pieces[1].print_string , "user id: "); (void) strcpy (Template_list[3].Temp_attr_pieces[1].string_value , "userid"); Template_list[3].Temp_attr_pieces[1].attr_struct = AttrT_new ("userid"); (void) strcpy (Template_list[3].Temp_attr_pieces[2].print_string , "Surname: "); (void) strcpy (Template_list[3].Temp_attr_pieces[2].string_value , "surname"); Template_list[3].Temp_attr_pieces[2].attr_struct = AttrT_new ("surname"); no_templates = 4; } /* Bits of code to create the menus to follow next ....*/ make_search_menu () { int i; search_menu = menu_create (0); for (i = 0; i < no_templates; i++) { (void) menu_set(search_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, Template_list[i].oc_print_string, MENU_FEEDBACK, TRUE, MENU_VALUE, i, 0), 0); } (void) menu_set(search_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "General Search", MENU_FEEDBACK, TRUE, MENU_VALUE, i, 0), 0); } make_read_select_menu () { read_select_menu = menu_create (0); (void) menu_set(read_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "set new position", MENU_FEEDBACK, TRUE, MENU_VALUE, SET_NEW_DN, 0), 0); (void) menu_set(read_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "show details", MENU_FEEDBACK, TRUE, MENU_VALUE, READ, 0), 0); } make_path_select_menu () { path_select_menu = menu_create (0); (void) menu_set(path_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "backtrack to here", MENU_FEEDBACK, TRUE, MENU_VALUE, BACKTRACK, 0), 0); (void) menu_set(path_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "show details", MENU_FEEDBACK, TRUE, MENU_VALUE, READ, 0), 0); (void) menu_set(path_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "show children", MENU_FEEDBACK, TRUE, MENU_VALUE, LIST, 0), 0); } make_root_button_menu () { root_button_menu = menu_create (0); (void) menu_set(root_button_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "backtrack to here", MENU_FEEDBACK, TRUE, MENU_VALUE, BACKTRACK, 0), 0); (void) menu_set(root_button_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "show children", MENU_FEEDBACK, TRUE, MENU_VALUE, LIST, 0), 0); } make_list_select_menu () { list_select_menu = menu_create (0); (void) menu_set(list_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "down to here", MENU_FEEDBACK, TRUE, MENU_VALUE, DESCEND, 0), 0); (void) menu_set(list_select_menu, MENU_APPEND_ITEM, menu_create_item ( MENU_STRING, "show details", MENU_FEEDBACK, TRUE, MENU_VALUE, READ, 0), 0); } /* bits of code to set up the various subwindows now follow */ init_search_control_panel () { search_control_panel = window_create (search_frame, PANEL, WIN_ROWS, 6 , WIN_COLUMNS, 90,0); search_message = panel_create_item (search_control_panel , PANEL_TEXT, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(1), PANEL_LAYOUT, PANEL_HORIZONTAL, PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "Message : ", PANEL_VALUE, "Search Results " , 0); } init_read_control_panel () { read_control_panel = window_create (read_frame, PANEL, WIN_ROWS, 15 , WIN_COLUMNS, 50,0); read_message = panel_create_item (read_control_panel , PANEL_TEXT, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(1), PANEL_LAYOUT, PANEL_HORIZONTAL, PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "Message : ", PANEL_VALUE, "Entry Information " , 0); } init_control_panel () { int i; control_panel = window_create (base_frame, PANEL, WIN_ROWS, 12 , WIN_COLUMNS, 90,0); dua_message = panel_create_item (control_panel , PANEL_TEXT, PANEL_ITEM_X, ATTR_COL(15), PANEL_ITEM_Y, ATTR_ROW(0), PANEL_LAYOUT, PANEL_HORIZONTAL, PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "Message : ", PANEL_VALUE, "" , 0); path_title = panel_create_item (control_panel , PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(1), PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "CURRENT PATH", 0); path_header = panel_create_item (control_panel , PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(2), PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "RDN OBJECT CLASS", 0); root_button = panel_create_item (control_panel , PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(3), PANEL_LABEL_BOLD, TRUE, PANEL_LABEL_STRING, "Root", PANEL_EVENT_PROC, handle_root_button, 0); search_button = panel_create_item (control_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(60), PANEL_ITEM_Y, ATTR_ROW(2), PANEL_LABEL_IMAGE, panel_button_image(control_panel, "SEARCH", 10 , (Pixfont *)NULL) , PANEL_SHOW_ITEM, TRUE, PANEL_EVENT_PROC , dua_handle_search_button, 0); quit_button = panel_create_item (control_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(75), PANEL_ITEM_Y, ATTR_ROW(2), PANEL_LABEL_IMAGE, panel_button_image(control_panel, "QUIT", 10 , (Pixfont *)NULL) , PANEL_SHOW_ITEM, TRUE, PANEL_NOTIFY_PROC , quit_proc, 0); win_below_title = panel_create_item (control_panel , PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(11), PANEL_LABEL_BOLD, TRUE, PANEL_SHOW_ITEM, TRUE, PANEL_LABEL_STRING, "Object Classes and rdn's of children underneath", 0); for (i = 0; i < 10; i++) current_path_item [i] = (Panel_item ) NULL; path_element_count = 0; } init_read_text_win () { read_text_win = window_create (read_frame, TEXTSW, WIN_ROWS, 15,WIN_COLUMNS, 100, WIN_BELOW, read_control_panel, WIN_X, 0, TEXTSW_LINE_BREAK_ACTION, TEXTSW_WRAP_AT_WORD, 0); } init_search_panel_win () { int i; search_panel_win = window_create (search_frame, PANEL, WIN_ROWS,20, WIN_COLUMNS, 90, WIN_X, 0, WIN_BELOW, search_control_panel, WIN_VERTICAL_SCROLLBAR, scrollbar_create(0),0); for (i = 0; i < LOTS; i++) search_panel_entry [i] = (Panel_item ) NULL; search_item_count = 0; } init_read_canvas () { read_canvas = window_create (read_frame, CANVAS, CANVAS_AUTO_SHRINK, FALSE, WIN_COLUMNS, 50, WIN_ROWS, 20, WIN_RIGHT_OF, read_control_panel, WIN_VERTICAL_SCROLLBAR, scrollbar_create(0), WIN_HORIZONTAL_SCROLLBAR, scrollbar_create(0), 0); } init_main_panel () { int i; dua_panel_win = window_create (base_frame, PANEL, WIN_ROWS, 20,WIN_COLUMNS, 90, WIN_X, 0, WIN_BELOW, control_panel, WIN_VERTICAL_SCROLLBAR, scrollbar_create(0),0); for (i = 0; i < LOTS; i++) dua_panel_entry [i] = (Panel_item ) NULL; display_item_count = 0; } /* procedures for displaying the menus associated with various buttons */ void dua_handle_search_button(item,event) Panel_item item; Event *event; { int choice; if (event_id(event) == MS_RIGHT && event_is_down (event)) { choice =(int)menu_show (search_menu, control_panel, event, 0); if (choice < no_templates) { form_search_proc (choice); } else { search_proc (); } } else (void) panel_default_handle_event (item,event); } handle_search_select(item,event) Panel_item item; Event *event; { int choice; if (event_id(event) == MS_RIGHT && event_is_down (event)) { choice =(int) menu_show (read_select_menu, search_panel_win, event, 0); switch (choice) { case SET_NEW_DN: set_new_dn_proc (item); break; case READ: read_proc (item); break; } } else (void) panel_default_handle_event (item,event); } void handle_path_select_button (item, event) Panel_item item; Event *event; { Menu_item mitem; int choice; PathElementData client_data; if (event_id(event) == MS_RIGHT && event_is_down (event)) { client_data = (PathElementData) panel_get (item, PANEL_CLIENT_DATA); if (client_data->depth < (path_element_count)) { mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 3); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 2); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 1); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); } else { mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 3); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 2); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 1); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); } choice =(int) menu_show (path_select_menu, control_panel , event, 0); switch (choice) { case BACKTRACK: backtrack_proc (item); break; case READ: read_proc (item); break; case LIST: list_proc (); break; } } else (void) panel_default_handle_event (item,event); } void quit_proc () { /* (void) textsw_delete (read_text_win, (Textsw_index)0 , (Textsw_index)window_get ((Window)read_text_win, TEXTSW_LENGTH)); */ textsw_reset (read_text_win,(Textsw_index)0 , (Textsw_index)window_get ((Window)read_text_win, TEXTSW_LENGTH)); (void) window_set (search_frame, FRAME_NO_CONFIRM, TRUE, 0); (void) window_set (read_frame, FRAME_NO_CONFIRM, TRUE, 0); (void) window_destroy (search_frame); (void) window_destroy (read_frame); (void) ds_unbind (); exit (0); } void handle_root_button (item, event) Panel_item item; Event *event; { Menu_item mitem; int choice; if (dn == NULLDN) { mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 1); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 2); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 3); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); } else { mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 1); (void) menu_set (mitem, MENU_INACTIVE, FALSE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 2); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); mitem = menu_get (path_select_menu, MENU_NTH_ITEM, 3); (void) menu_set (mitem, MENU_INACTIVE, TRUE, 0); } if (event_id(event) == MS_RIGHT && event_is_down (event)) { choice =(int) menu_show (path_select_menu, control_panel , event, 0); switch (choice) { case BACKTRACK: back_to_root(); break; case LIST: list_proc (); break; } } else (void) panel_default_handle_event (item,event); } handle_list_select (item, event) Panel_item item; Event *event; { int choice; if (event_id(event) == MS_RIGHT && event_is_down (event)) { choice =(int) menu_show (list_select_menu, dua_panel_win , event, 0); switch (choice) { case DESCEND: descend_proc (item); break; case READ: read_proc (item); break; } } else (void) panel_default_handle_event (item,event); } /* dua action procedures now follow*/ /* each parocedure is associated with a specific button in the*/ /* control panel of the dua interface or menu item */ descend_proc (item) Panel_item item; { int i; PathElementData client_data, got_client_data; char panel_label_string[SMALL_BUF]; client_data = (PathElementData) malloc (sizeof (path_element_data)); i = path_element_count; client_data->depth = i + 1; got_client_data = (PathElementData) panel_get (item, PANEL_CLIENT_DATA); client_data->dn_ptr = dn_cpy (got_client_data->dn_ptr); dn_free (dn); dn = dn_cpy (got_client_data->dn_ptr); (void) strcpy (panel_label_string, (panel_get (item, PANEL_LABEL_STRING))); current_path_item[i] = panel_create_item (control_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(i + 4), PANEL_LABEL_STRING, panel_label_string, PANEL_CLIENT_DATA, client_data, PANEL_SHOW_ITEM, TRUE, PANEL_EVENT_PROC , handle_path_select_button, 0); (void) panel_set (current_path_item[i], PANEL_PAINT, PANEL_CLEAR, 0); path_element_count++; for ( i = 0; i < display_item_count; i++) (void) panel_set (dua_panel_entry[i], PANEL_SHOW_ITEM, FALSE, 0); } set_new_dn_proc(item) Panel_item item; { DN newdn ; int i; PathElementData client_data; client_data = (PathElementData) panel_get (item, PANEL_CLIENT_DATA); newdn = dn_cpy (client_data->dn_ptr); if (search_item_count != 0) { for ( i = 0; i < search_item_count; i++ ) { (void) panel_set (search_panel_entry[i], PANEL_SHOW_ITEM, FALSE,0); } } (void) panel_set (search_message, PANEL_VALUE, " ", 0); make_new_path (newdn); dn_free (dn); dn = newdn; for ( i = 0; i < search_item_count; i++) (void) panel_set (search_panel_entry[i], PANEL_SHOW_ITEM, FALSE, 0); } backtrack_proc(item) Panel_item item; { DN newdn ; int i, pos; PathElementData client_data; client_data = (PathElementData) panel_get (item, PANEL_CLIENT_DATA); newdn = dn_cpy (client_data->dn_ptr); pos = client_data->depth; clear_old_path (pos); dn_free (dn); dn = newdn; for ( i = 0; i < display_item_count; i++) (void) panel_set (dua_panel_entry[i], PANEL_SHOW_ITEM, FALSE, 0); } /* This procedure uses the dsa search procedure to search forall */ /* entries at the next level down and returns a list of the dn's of all such entries */ /* together with the value of the corresponding object class. */ /* The object class descriptor together with the rdn get printed*/ /* out for each entry. */ void list_proc () { static struct ds_search_arg search_arg = { default_common_args, NULLDN, SRA_ONELEVEL, NULLFILTER, /* filter */ FALSE, { /* eis */ FALSE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct DSError error; struct ds_search_result result; int i; extern int sizelimit; PathElementData client_data; char panel_label_string[SMALL_BUF]; DN eptr, trail; Filter simple_filter; search_arg.sra_common.ca_servicecontrol.svc_sizelimit = SIZELIMIT; search_arg.sra_baseobject = dn; search_arg.sra_eis.eis_select = as_comp_new (AttrT_new ("objectclass"), NULLAV, NULLACL_INFO); simple_filter = filter_alloc (); simple_filter->flt_next = NULLFILTER; simple_filter->flt_type = FILTER_AND; simple_filter->flt_un.flt_un_filter = NULLFILTER; search_arg.sra_filter = simple_filter; (void) panel_set(dua_message, PANEL_VALUE, "",0); if (ds_search (&search_arg,&error,&result) != DS_OK) { /* deal with error */ (void) panel_set(dua_message, PANEL_VALUE, sunint_error(&error),0); } else { (void) panel_set(dua_message, PANEL_VALUE, "list operation succeeded",0); clear_panel_win (); i = 0; /* use data */ correlate_search_results (&result); if (result.CSR_entries != NULLENTRYINFO) { EntryInfo *ptr; if (result.CSR_common.cr_aliasdereferenced) { (void) strcat (panel_label_string , "Alias dereferenced - base object is"); (void) dn_decode (result.CSR_object); sunint_print (dn_print, (caddr_t)result.CSR_object, panel_label_string); dn_free (result.CSR_object); (void) panel_set(dua_message, PANEL_VALUE, panel_label_string,0); } for (ptr=result.CSR_entries;ptr!=NULLENTRYINFO;ptr=ptr->ent_next) { bzero (panel_label_string, SMALL_BUF); (void) dn_decode (ptr->ent_dn); (void) as_decode (ptr->ent_attr); client_data = (PathElementData) malloc (sizeof (path_element_data)); client_data->depth = i; client_data->dn_ptr = dn_cpy (ptr->ent_dn); for (eptr = ptr->ent_dn; eptr != NULLDN; eptr = eptr->dn_parent) trail = eptr; sunint_print (sunint_dn_comp_print, (caddr_t)trail, panel_label_string); if (ptr->ent_attr != NULLATTR) { (void) strcat (panel_label_string, " "); sunint_print (oc_print, (caddr_t)ptr->ent_attr->attr_value, panel_label_string); } dua_panel_entry[i] = panel_create_item (dua_panel_win, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(0), PANEL_ITEM_Y, ATTR_ROW(i), PANEL_LABEL_STRING, panel_label_string, PANEL_CLIENT_DATA, client_data , PANEL_EVENT_PROC, handle_list_select, PANEL_SHOW_ITEM, TRUE, 0); (void) panel_set (dua_panel_entry[i], PANEL_PAINT, PANEL_CLEAR, 0); i++; dn_free (ptr->ent_dn); free ((char *)ptr); as_free (ptr->ent_attr); free ((char *)ptr); } if (result.CSR_limitproblem != LSR_NOLIMITPROBLEM){ dua_panel_entry[i] = panel_create_item (dua_panel_win, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(0), PANEL_ITEM_Y, ATTR_ROW(i), PANEL_LABEL_IMAGE, panel_button_image(dua_panel_win, "Limit problem", 20 , (Pixfont *)0), PANEL_CLIENT_DATA, ACTIVE, PANEL_SHOW_ITEM, TRUE, 0); (void) panel_set (dua_panel_entry[i], PANEL_PAINT, PANEL_CLEAR, 0); i++; } (void) panel_update_scrolling_size (dua_panel_win); display_item_count = i; } /* entry_info_free (result.CSR_entries, 1); */ as_free (search_arg.sra_eis.eis_select); filter_free (search_arg.sra_filter); } } void read_proc (item) Panel_item item; { PathElementData client_data; static struct ds_read_arg read_arg = { default_common_args, NULLDN, /* read_arg DN */ { /* entry info selection */ TRUE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct ds_read_result result; struct DSError error; Pixwin *pw; char *msg1 = "No attributes !!!", *msg2 = "Result of look up ...", *msg3 = "Result of look up ...\n(Alias dereferenced)"; client_data = ( PathElementData) panel_get (item, PANEL_CLIENT_DATA); read_arg.rda_object = client_data->dn_ptr; (void) panel_set(dua_message, PANEL_VALUE, "",0); if (ds_read (&read_arg,&error,&result) != DS_OK) { /* deal with error */ (void) panel_set(dua_message, PANEL_VALUE, sunint_error(&error),0); } else { /* use data */ (void) textsw_delete ((Window)read_text_win, (Textsw_index)0 , (Textsw_index)window_get (read_text_win, TEXTSW_LENGTH)); (void) window_set (read_frame, WIN_SHOW, TRUE, 0); pw = canvas_pixwin (read_canvas); (void) pw_writebackground (pw, 20 , 20 , 300, 300 , PIX_CLR); bzero (dua_textsw_buf, LOTS); if (result.rdr_entry.ent_attr == NULLATTR) { (void) textsw_insert (read_text_win, msg1, (long)strlen(msg1)); return; } if (result.rdr_common.cr_aliasdereferenced) (void) panel_set (read_control_panel, PANEL_VALUE, msg3, 0); else (void) panel_set (read_control_panel, PANEL_VALUE, msg2, 0); add_entry_info_str (&result.rdr_entry, dua_textsw_buf); (void) textsw_insert (read_text_win, dua_textsw_buf, (long)strlen(dua_textsw_buf)); entryinfo_comp_free (&result.rdr_entry,0); } } void set_filter_specs_defaults () { int i; the_filter_specs.search_subset = SRA_ONELEVEL; the_filter_specs.type = FILTER_OR; the_filter_specs.base_object_select = CURRENT_POS; for (i = 0; i < 10; i++) { the_filter_specs.filter_temp_entries[i].match_choice = FILTERITEM_APPROX; (void) strcpy (the_filter_specs.filter_temp_entries[i].attr_string , "\n"); } } void set_search_data_info_defaults () { the_search_data_info.search_subset = SRA_ONELEVEL; the_search_data_info.base_object_select = CURRENT_POS; (void) strcpy (the_search_data_info.base_object_string , "\n"); (void) strcpy (the_search_data_info.filter_string , "\n"); } void search_proc() { static struct ds_search_arg search_arg = { default_common_args, NULLDN, SRA_ONELEVEL, NULLFILTER, /* filter */ FALSE, { /* eis */ FALSE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct DSError error; struct ds_search_result result; char * name; string_specs got_string_specs; extern int sizelimit; char panel_label_string[SMALL_BUF]; PathElementData client_data; int i; EntryInfo *ptr; DN eptr, trail; i = 0; /* if ((int)window_get (search_frame, WIN_SHOW) != TRUE) */ (void) window_set (search_frame, WIN_SHOW, TRUE, 0); clear_old_search_results (); search_arg.sra_common.ca_servicecontrol.svc_sizelimit = SIZELIMIT; set_search_data_info_defaults (); got_string_specs = sun_dua_get_string_specs (); if (got_string_specs == (search_data_info *)NULL) { (void) panel_set(dua_message, PANEL_VALUE, "no filter specified",0); return; } if (the_search_data_info.base_object_select == CURRENT_POS) search_arg.sra_baseobject = dn; else search_arg.sra_baseobject = str2dn (the_search_data_info.base_object_string); search_arg.sra_eis.eis_select = as_comp_new (AttrT_new ("objectclass"), NULLAV, NULLACL_INFO); if (the_search_data_info.search_subset == SRA_ONELEVEL) search_arg.sra_subset = SRA_ONELEVEL; else search_arg.sra_subset = SRA_WHOLESUBTREE; (void) panel_set(dua_message, PANEL_VALUE, "",0); name = the_search_data_info.filter_string ; if ((search_arg.sra_filter = get_filter (name)) == NULLFILTER) { (void) panel_set(dua_message, PANEL_VALUE, "incorrectly specified filter",0); return; } if (ds_search (&search_arg,&error,&result) != DS_OK) { /* deal with error */ (void) panel_set(dua_message, PANEL_VALUE, "search error ",0); (void) panel_set (search_message, PANEL_VALUE, sunint_error(&error),0); } else { correlate_search_results (&result); if (result.CSR_entries != NULLENTRYINFO) { /* pop the search result display frame if not already showing */ if ((int)window_get (search_frame, WIN_SHOW) != TRUE) (void) window_set (search_frame, WIN_SHOW, TRUE, 0); search_item_count = 0; (void) panel_set (search_message, PANEL_VALUE, "Result of search is ...",0); if (result.CSR_common.cr_aliasdereferenced) { (void) strcat (panel_label_string , "Alias dereferenced - base object is"); (void) dn_decode (result.CSR_object); sunint_print (dn_print, (caddr_t)result.CSR_object, panel_label_string); dn_free (result.CSR_object); (void) panel_set(search_message, PANEL_VALUE, panel_label_string,0); } for (ptr=result.CSR_entries;ptr!=NULLENTRYINFO;ptr=ptr->ent_next) { bzero (panel_label_string, SMALL_BUF); (void) dn_decode (ptr->ent_dn); (void) as_decode (ptr->ent_attr); client_data = (PathElementData) malloc (sizeof (path_element_data)); client_data->depth = i; client_data->dn_ptr = dn_cpy (ptr->ent_dn); for (eptr = ptr->ent_dn; eptr != NULLDN; eptr = eptr->dn_parent) trail = eptr; (void) strcat (panel_label_string, " "); sunint_print (sunint_dn_comp_print, (caddr_t) trail, panel_label_string); if (ptr->ent_attr != NULLATTR) { (void) strcat (panel_label_string, " "); sunint_print (oc_print, (caddr_t)ptr->ent_attr->attr_value, panel_label_string); } search_panel_entry[i] = panel_create_item (search_panel_win, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(0), PANEL_ITEM_Y, ATTR_ROW(i), PANEL_LABEL_STRING, panel_label_string, PANEL_CLIENT_DATA, client_data , PANEL_EVENT_PROC, handle_search_select, PANEL_SHOW_ITEM, TRUE, 0); (void) panel_set (search_panel_entry[i], PANEL_PAINT, PANEL_CLEAR, 0); i++; dn_free (ptr->ent_dn); free ((char *)ptr); as_free (ptr->ent_attr); free ((char *)ptr); } if (result.CSR_limitproblem != LSR_NOLIMITPROBLEM){ (void) panel_set (search_message, PANEL_VALUE, "may have limit problems ",0); (void) panel_set (dua_message, PANEL_VALUE, "possible limit problems ",0); } (void) panel_update_scrolling_size (search_panel_win); search_item_count = i; } else (void) panel_set (search_message, PANEL_VALUE, "no matches found ",0); /* entry_info_free (result.CSR_entries, 1); */ as_free (search_arg.sra_eis.eis_select); filter_free (search_arg.sra_filter); } } void form_search_proc(choice) int choice; { static struct ds_search_arg search_arg = { default_common_args, NULLDN, SRA_ONELEVEL, NULLFILTER, /* filter */ FALSE, { /* eis */ FALSE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct DSError error; struct ds_search_result result; filter_specs * specs; char panel_label_string[SMALL_BUF]; extern int sizelimit; PathElementData client_data; EntryInfo *ptr; int i; DN eptr,trail; i = 0; if ((int)window_get (search_frame, WIN_SHOW) != TRUE) (void) window_set (search_frame, WIN_SHOW, TRUE, 0); clear_old_search_results (); set_filter_specs_defaults (); search_arg.sra_common.ca_servicecontrol.svc_sizelimit = sizelimit; eis_as = NULLATTR; (void) panel_set(dua_message, PANEL_VALUE, "",0); specs = sun_dua_get_form_data (choice); if (specs == (filter_specs *)NULL) { (void) panel_set(dua_message, PANEL_VALUE, "no filter specified",0); return; } /* might later want to modify sun_dua_build_filter so that the filter specs are */ /* not a global variable, but are created dynamically */ if ((search_arg.sra_filter = sun_dua_build_filter ()) == NULLFILTER) { (void) panel_set(dua_message, PANEL_VALUE, "incorrect filter description",0); return; } if(the_filter_specs.base_object_select == CURRENT_POS) search_arg.sra_baseobject = dn; else search_arg.sra_baseobject = str2dn (the_filter_specs.base_object_string); search_arg.sra_subset = the_filter_specs.search_subset; search_arg.sra_eis.eis_select = as_comp_new (AttrT_new ("objectclass"), NULLAV, NULLACL_INFO); if (ds_search (&search_arg,&error,&result) != DS_OK) { /* deal with error */ (void) panel_set(dua_message, PANEL_VALUE, "search error ",0); (void) panel_set(search_message, PANEL_VALUE, sunint_error(&error),0); } else { correlate_search_results (&result); if (result.CSR_entries != NULLENTRYINFO) { /* pop the search result display frame if not already showing */ if ((int)window_get (search_frame, WIN_SHOW) != TRUE) (void) window_set (search_frame, WIN_SHOW, TRUE, 0); search_item_count = 0; (void) panel_set (search_message, PANEL_VALUE, "Result of search is ...",0); if (result.CSR_common.cr_aliasdereferenced) { (void) strcat (panel_label_string , "Alias dereferenced - base object is"); (void) dn_decode (result.CSR_object); sunint_print (dn_print, (caddr_t)result.CSR_object, panel_label_string); dn_free (result.CSR_object); (void) panel_set(search_message, PANEL_VALUE, panel_label_string,0); } for (ptr=result.CSR_entries;ptr!=NULLENTRYINFO;ptr=ptr->ent_next) { bzero (panel_label_string, SMALL_BUF); (void) dn_decode (ptr->ent_dn); (void) as_decode (ptr->ent_attr); client_data = (PathElementData) malloc (sizeof (path_element_data)); client_data->depth = i; client_data->dn_ptr = dn_cpy (ptr->ent_dn); for (eptr = ptr->ent_dn; eptr != NULLDN; eptr = eptr->dn_parent) trail = eptr; (void) strcat (panel_label_string, " "); sunint_print (sunint_dn_comp_print, (caddr_t) trail, panel_label_string); if (ptr->ent_attr != NULLATTR) { (void) strcat (panel_label_string, " "); sunint_print (oc_print, (caddr_t)ptr->ent_attr->attr_value, panel_label_string); } search_panel_entry[i] = panel_create_item (search_panel_win, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(0), PANEL_ITEM_Y, ATTR_ROW(i), PANEL_LABEL_STRING, panel_label_string, PANEL_CLIENT_DATA, client_data , PANEL_EVENT_PROC, handle_search_select, PANEL_SHOW_ITEM, TRUE, 0); (void) panel_set (search_panel_entry[i], PANEL_PAINT, PANEL_CLEAR, 0); i++; dn_free (ptr->ent_dn); free ((char *)ptr); as_free (ptr->ent_attr); free ((char *)ptr); } if (result.CSR_limitproblem != LSR_NOLIMITPROBLEM){ (void) panel_set (search_message, PANEL_VALUE, "may have limit problems ",0); (void) panel_set (dua_message, PANEL_VALUE, "possible limit problems ",0); } (void) panel_update_scrolling_size (search_panel_win); search_item_count = i; } else (void) panel_set (search_message, PANEL_VALUE, "no matches found ",0); /* entry_info_free (result.CSR_entries, 1); */ as_free (search_arg.sra_eis.eis_select); filter_free (search_arg.sra_filter); } } Filter sun_dua_build_filter() { int i, k ; Filter current_filter_item, succ_filter_item, start_filter_item; AttributeType at; current_filter_item = NULLFILTER; succ_filter_item = NULLFILTER; start_filter_item = NULLFILTER; k = the_filter_specs.filter_temp_choice; start_filter_item = filter_alloc (); start_filter_item->flt_next = NULLFILTER; start_filter_item->flt_type = the_filter_specs.type; start_filter_item->FUFILT = NULLFILTER; for (i = 0; i < the_filter_specs.filter_temp_attr_count; i++) { if (strlen (TidyString (the_filter_specs.filter_temp_entries[i].attr_string)) > 0) { if (the_filter_specs.filter_temp_entries[i].match_choice != IGNORE ) { if (current_filter_item == NULLFILTER) { current_filter_item = filter_alloc (); current_filter_item->flt_next = NULLFILTER; current_filter_item->flt_type = FILTER_ITEM; current_filter_item->FUITEM.fi_type = the_filter_specs.filter_temp_entries[i].match_choice; start_filter_item->FUFILT = current_filter_item; switch (current_filter_item->FUITEM.fi_type) { case FILTERITEM_PRESENT: current_filter_item->FUITEM.UNTYPE = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; break; case FILTERITEM_SUBSTRINGS: { at = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; if (! sub_string(at->at_table->oa_syntax)) { (void) panel_set (dua_message, PANEL_VALUE, "Cant do a substring search if the type is not a string !!!",0); return (NULLFILTER); } filt_substr(¤t_filter_item->FUITEM.UNSUB,at,the_filter_specs.filter_temp_entries[i].attr_string); break; } default: current_filter_item->FUITEM.UNAVA.ava_type = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct); current_filter_item->FUITEM.UNAVA.ava_value = str2AttrV (the_filter_specs.filter_temp_entries[i].attr_string, current_filter_item->FUITEM.UNAVA.ava_type->at_table->oa_syntax); break; } } else { succ_filter_item = filter_alloc (); succ_filter_item->flt_next = NULLFILTER; current_filter_item->flt_next = succ_filter_item; current_filter_item = succ_filter_item; current_filter_item->flt_type = FILTER_ITEM ; current_filter_item->FUITEM.fi_type = the_filter_specs.filter_temp_entries[i].match_choice; switch (current_filter_item->FUITEM.fi_type) { case FILTERITEM_PRESENT: current_filter_item->FUITEM.UNTYPE = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; break; case FILTERITEM_SUBSTRINGS: { at = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; if (! sub_string(at->at_table->oa_syntax)) { return NULLFILTER; } filt_substr(¤t_filter_item->FUITEM.UNSUB,at,the_filter_specs.filter_temp_entries[i].attr_string); break; } default: current_filter_item->FUITEM.UNAVA.ava_type = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct); current_filter_item->FUITEM.UNAVA.ava_value = str2AttrV (the_filter_specs.filter_temp_entries[i].attr_string, current_filter_item->FUITEM.UNAVA.ava_type->at_table->oa_syntax); break; } } } } else if (the_filter_specs.filter_temp_entries[i].match_choice == FILTERITEM_PRESENT) { if (current_filter_item == NULLFILTER) { current_filter_item = filter_alloc (); current_filter_item->flt_next = NULLFILTER; current_filter_item->flt_type = FILTER_ITEM; current_filter_item->FUITEM.fi_type = the_filter_specs.filter_temp_entries[i].match_choice; start_filter_item->FUFILT = current_filter_item; current_filter_item->FUITEM.UNTYPE = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; } else { succ_filter_item = filter_alloc (); succ_filter_item->flt_next = NULLFILTER; current_filter_item->flt_next = succ_filter_item; current_filter_item = succ_filter_item; current_filter_item->flt_type = FILTER_ITEM ; current_filter_item->FUITEM.fi_type = the_filter_specs.filter_temp_entries[i].match_choice; current_filter_item->FUITEM.UNTYPE = AttrT_cpy (Template_list[k].Temp_attr_pieces[i].attr_struct) ; } } } return start_filter_item; } void filt_substr (substr,at,str) Filter_Substrings * substr; AttributeType at; char *str; { char * ptr; AttributeValue av; if ((ptr = index (str,'*')) == NULLCP) ptr = str + strlen (str); substr->fi_sub_initial = NULLAV; substr->fi_sub_any = NULLAV; substr->fi_sub_final = NULLAV; substr->fi_sub_type = at; /* This is the 'initial' section of the string - maybe NULL */ *ptr = '\0'; str = TidyString (str); if (*str != 0) { av = str2AttrV (str, at->at_table->oa_syntax); substr->fi_sub_initial = avs_comp_new (av); } str = ptr + 1; /* Test for whether there are going to be any 'any' bits */ if ((ptr = rindex(str, '*')) == NULLCP) { str = TidyString (str); if (*str != 0) { av = str2AttrV (str, at->at_table->oa_syntax); substr->fi_sub_final = avs_comp_new (av); } return; } *ptr = '\0'; ptr = TidyString (ptr + 1); if ( *ptr != 0) { av = str2AttrV (str, at->at_table->oa_syntax); substr->fi_sub_final = avs_comp_new (av); } /* There are some internal 'any's to be found */ do { if ((ptr = index(str, '*')) != NULLCP) *ptr = '\0'; if (*str != 0) { str = TidyString (str); av = str2AttrV (str, at->at_table->oa_syntax); if (substr->fi_sub_any == NULLAV) substr->fi_sub_any = avs_comp_new (av); else substr->fi_sub_any = avs_merge (substr->fi_sub_any,avs_comp_new (av)); } if (ptr != NULLCP) str = ptr + 1; } while(ptr != NULLCP); } /*routines for getting the various argument strings from the sunview*/ /*dua interface.These are essentially, modifications of Colin's various*/ /*routines. For now they're all here, but you may want to put them in*/ /*with the relevant files later on, so I've put in comments telling you which*/ /*quipu procedures they're based on. */ DN sun_dua_getdn () /*based on getdn*/ { DN str2dn(); if (get_data ("Enter distinguished name", "dn:", 0 , 0)) return (str2dn (arg_data_buf)); else return NULLDN; } RDN sun_dua_getrdn() /*based on getrdn*/ { RDN str2rdn(); if (get_data ("Enter relative distinguished name", "rdn:", 0 , 0)) return (str2rdn (arg_data_buf)); else return NULLRDN; } char *sun_dua_get_attrT () { if (get_data ("Enter attribute type", "AttrT:", 0 , 0)) return arg_data_buf; else return (char *) NULL; } char *sun_dua_get_attrV () { if (get_data ("Enter attribute value", "AttrV:", 0 , 0)) return arg_data_buf; else return (char *) NULL; } sun_dua_get_ava (ava1) AVA *ava1; { char * name; char * TidyString(); name = sun_dua_get_attrT (); if ( name == NULLCP || *name == 0) return (NOTOK); ava1->ava_type = AttrT_new (TidyString(name)); if (ava1->ava_type == NULLAttrT) { (void) fprintf(stderr,"Invalid at %s",name); return (NOTOK); } if ( ! sub_string(ava1->ava_type->at_table->oa_syntax)) { (void) fprintf(stderr,"Can only compare string types"); AttrT_free (ava1->ava_type); return (NOTOK); } name = sun_dua_get_attrV (); ava1->ava_value = str2AttrV (TidyString(name), ava1->ava_type->at_table->oa_syntax); return (OK); } char *sun_dua_get_search_string () { if (get_data ("Enter search string", "Search string:", 0 , 0)) return arg_data_buf; else return (char *) NULL; } filter_specs *sun_dua_get_form_data (selector) int selector; { if (get_form (selector)) return (&the_filter_specs); else return ((filter_specs *) NULL); } string_specs sun_dua_get_string_specs () { if (get_string_specs ()) return (&the_search_data_info); else return ((string_specs ) NULL); } char *sun_dua_getyn () { if (get_data ("", "", 0 , 1)) return "y"; else return "n"; } char *sun_dua_get_passwd () { if (get_data ("Enter password", "Password:", 1 , 0)) return (arg_data_buf); else return ((char *) NULL); } Filter get_filter_aux (str) char *str; { int gotit, bracketed; char ch, och = '\0'; Filter result, next, ptr = NULLFILTER; result = filter_alloc (); result->FUFILT = NULLFILTER; result->flt_next = NULLFILTER; str = TidyString (str); /* Got a multiple-component string for parsing */ do { bracketed = FALSE; if ((gotit = getop (str, &ch)) == -2) return (NULLFILTER); if (gotit < 0) {/* Match an open bracket. */ if (*str == '(') if (str[strlen (str) - 1] == ')') { str[strlen (str) - 1] = '\0'; ++str; bracketed = TRUE; } else { return (NULLFILTER); } if (och == '\0') { if (bracketed == TRUE) { gotit = 0; /* Stop 'while' loop * falling */ continue; /* Parse the internals */ } else break; /* Single item only */ } else ch = och; /* Use last operation */ } if (och == '\0')/* Remember last operation */ och = ch; else if (och != ch) { return (NULLFILTER); } if (gotit >= 0) /* If got an op, make it null */ str[gotit] = '\0'; /* Recurse on the 'first' string */ if ((next = get_filter_aux (str)) == NULLFILTER) return (NULLFILTER); if (ptr == NULLFILTER) ptr = next; else filter_append (ptr, next); str += gotit + 1; if (gotit >= 0) { /* Match an and symbol */ if (och == '&') { result->flt_type = FILTER_AND; } else {/* Match an or symbol */ result->flt_type = FILTER_OR; } result->FUFILT = ptr; } } while (gotit >= 0); if (och == '\0') { if (*str == '!') { /* Match a not symbol */ result->flt_type = FILTER_NOT; if ((result->FUFILT = get_filter_aux (str + 1)) == NULLFILTER) return (NULLFILTER); } else if (filteritem (str, result) == NOTOK) return (NULLFILTER); } return (result); } Filter get_filter (str) char *str; { char * ptr; Filter f; ptr = strdup (str); f = get_filter_aux (ptr); free (ptr); return (f); } getop (str, ch) char *str, *ch; { int i, bracket = 0; for (i = 0; i < strlen (str); i++) { if (bracket == 0 && (str[i] == '&' || str[i] == '|')) { *ch = str[i]; return (i); } if (str[i] == '(') ++bracket; if (str[i] == ')') --bracket; if (bracket < 0) { return (-2); } } return (-1); } /* Regular Expression parser written by P.Sharpe */ /* Inca specific tailoring by CJR */ /* taken from dish */ #define debug(a,b) /* remove debug statements */ Filter get_filter (); char *TidyString (); filteritem (str, fltr) char *str; Filter fltr; { char *ptr, *index (), *rindex (); AttributeValue av; AttributeType at; fltr->flt_type = FILTER_ITEM; if ((ptr = index (str, '=')) == NULLCP) { /* set default (cn~=) */ fltr->FUITEM.fi_type = FILTERITEM_APPROX; at = AttrT_new (CN_OID); } else { switch (*--ptr) { case '~': fltr->FUITEM.fi_type = FILTERITEM_APPROX; *ptr = 0; break; /* > implies LESS THAN - read the standard ! */ case '>': fltr->FUITEM.fi_type = FILTERITEM_GREATEROREQUAL; *ptr = 0; break; case '<': fltr->FUITEM.fi_type = FILTERITEM_LESSOREQUAL; *ptr = 0; break; default: fltr->FUITEM.fi_type = FILTERITEM_EQUALITY; break; } *++ptr = '\0'; str = TidyString (str); at = AttrT_new (str); if (at == NULLAttrT) { return (NOTOK); } str = ptr + 1; } if (*str == '*') { if (*++str == 0) { fltr->FUITEM.fi_type = FILTERITEM_PRESENT; fltr->FUITEM.UNTYPE = at; return (OK); } else str--; } /* test for whether there is only the simple 'equality' case */ if ((ptr = index (str, '*')) == NULLCP) { debug (1, ("[EXACT(%s)]", str)); fltr->FUITEM.UNAVA.ava_type = at; str = TidyString (str); if ((fltr->FUITEM.UNAVA.ava_value = str2AttrV (str, at->at_table->oa_syntax)) == NULLAttrV) return (NOTOK); return (OK); } /* * We have to parse the string for 'initial', 'final' and 'any' * components */ fltr->FUITEM.UNSUB.fi_sub_initial = NULLAV; fltr->FUITEM.UNSUB.fi_sub_any = NULLAV; fltr->FUITEM.UNSUB.fi_sub_final = NULLAV; fltr->FUITEM.UNSUB.fi_sub_type = at; fltr->FUITEM.fi_type = FILTERITEM_SUBSTRINGS; if ( ! sub_string (at->at_table->oa_syntax)) { return (NOTOK); } debug (1, ("[ ")); /* This is the 'initial' section of the string - maybe NULL */ *ptr = '\0'; str = TidyString (str); if (*str != 0) { debug (1, ("INITIAL(%s) ", str)); av = str2AttrV (str, at->at_table->oa_syntax); fltr->FUITEM.UNSUB.fi_sub_initial = avs_comp_new (av); } str = ptr + 1; /* Test for whether there are going to be any 'any' bits */ if ((ptr = rindex (str, '*')) == NULLCP) { ptr = TidyString (str); if (*str != 0) { debug (1, ("FINAL(%s) ", str)); av = str2AttrV (str, at->at_table->oa_syntax); fltr->FUITEM.UNSUB.fi_sub_final = avs_comp_new (av); } debug (1, ("]")); return (OK); } *ptr = '\0'; ptr = TidyString (ptr + 1); if (*ptr != 0) { debug (1, ("FINAL(%s) ", ptr)); av = str2AttrV (ptr, at->at_table->oa_syntax); fltr->FUITEM.UNSUB.fi_sub_final = avs_comp_new (av); } /* There are some internal 'any's to be found */ do { AV_Sequence any_end; if ((ptr = index (str, '*')) != NULLCP) *ptr = '\0'; if (*str != 0) { str = TidyString (str); debug (1, ("ANY(%s) ", str)); av = str2AttrV (str, at->at_table->oa_syntax); if (fltr->FUITEM.UNSUB.fi_sub_any == NULLAV) { fltr->FUITEM.UNSUB.fi_sub_any = avs_comp_new (av); any_end = fltr->FUITEM.UNSUB.fi_sub_any; } else { any_end->avseq_next = avs_comp_new (av); any_end = any_end->avseq_next; } } if (ptr != NULLCP) str = ptr + 1; } while (ptr != NULLCP); debug (1, ("]")); return (OK); } void clear_panel_win () { int i; if (display_item_count != 0) { for ( i = 0; i < display_item_count; i++ ) { (void) panel_set (dua_panel_entry[i], PANEL_SHOW_ITEM, FALSE,0); (void) panel_destroy_item (dua_panel_entry[i]); dua_panel_entry[i] = (Panel_item ) NULL; } } display_item_count = 0; } void clear_old_search_results () { int i; if (search_item_count != 0) { for ( i = 0; i < search_item_count; i++ ) { (void) panel_set (search_panel_entry[i], PANEL_SHOW_ITEM, FALSE,0); (void) panel_destroy_item (search_panel_entry[i]); search_panel_entry[i] = (Panel_item ) NULL; } } search_item_count = 0; } /* These procedures are to do with creating and running a pop-up*/ /* window which reads in the requested argument. The argument */ /* required is prompted for by a suitable message. The argument*/ /* is typed in at the keyboard, and displayed in a TEXT_ITEM in*/ /* the pop-up window and entered into a buffer called arg_data_buffer */ /* when the user hits a carriage return. The user can then confirm */ /* or reject the input data by clicking on either the yes or no buttons*/ /* in the pop-up window */ static Frame init_data_getter (); static void yes_select (); static void no_select (); static int get_data ( message, title, mask_on, simple) char *message; char *title; int mask_on; int simple; { Frame get_arg_frame; int answer; /* create the frame for entering arguments */ get_arg_frame = init_get_arg_frame (message, title, mask_on, simple); args_entered_flag = 0; /* force the user to enter the argument */ answer = (int) window_loop (get_arg_frame); /* destroy the get_arg_frame */ (void) window_set (get_arg_frame , FRAME_NO_CONFIRM, TRUE, 0); (void) window_destroy (get_arg_frame); return answer; } static Frame init_get_arg_frame (message, title, mask_on, simple) char *message; char *title; int mask_on; int simple; { Frame get_arg_frame; Panel panel; int left, top, width, height; Rect *r; get_arg_frame = window_create ((Frame)0, FRAME, FRAME_SHOW_LABEL, FALSE, 0); panel = window_create (get_arg_frame, PANEL, WIN_ROWS, 15, WIN_COLUMNS, 60, 0); if (!simple) { (void) panel_create_item (panel, PANEL_MESSAGE, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (3), PANEL_LABEL_STRING, message, 0); if (mask_on) (void) panel_create_item (panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (6), PANEL_LABEL_STRING, title, PANEL_MASK_CHAR, '*', PANEL_NOTIFY_PROC, put_data_proc, 0); else (void) panel_create_item (panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (6), PANEL_LABEL_STRING, title, PANEL_NOTIFY_PROC, put_data_proc, 0); } (void) panel_create_item (panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (20), PANEL_ITEM_Y, ATTR_ROW (9), PANEL_LABEL_IMAGE, panel_button_image (panel, "YES", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 1, PANEL_NOTIFY_PROC, yes_no_proc, 0); (void) panel_create_item (panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (9), PANEL_LABEL_IMAGE, panel_button_image (panel, "NO", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 0, PANEL_NOTIFY_PROC, yes_no_proc, 0); window_fit (panel); window_fit (get_arg_frame); /* center get_arg_frame on the screen */ r = (Rect *) window_get ( get_arg_frame, WIN_SCREEN_RECT ); width = (int) window_get ( get_arg_frame, WIN_WIDTH ); height = (int) window_get ( get_arg_frame, WIN_HEIGHT ); left = (r->r_width - width) / 2; top = (r->r_height - height) / 2; if (left < 0) left = 0; if (top < 0) top = 0; (void) window_set (get_arg_frame, WIN_X, left, WIN_Y, top, 0); return get_arg_frame; } Panel_setting put_data_proc (item, event) Panel_item item; Event *event; { (void) strcpy (arg_data_buf, (char *) panel_get_value (item)); args_entered_flag = 1; return (panel_text_notify (item, event)); } /* ARGSUSED */ static void yes_no_proc (item, event) Panel_item item; Event *event; { window_return (panel_get (item, PANEL_CLIENT_DATA)); } static int get_form (form_selector) int form_selector; { Frame get_args_form1; int answer; /* create the frame for entering arguments */ get_args_form1 = init_get_args_form (form_selector); args_entered_flag = 0; /* force the user to enter the argument */ answer = (int) window_loop (get_args_form1); /* destroy the get_args_form */ (void) window_set (get_args_form1 , FRAME_NO_CONFIRM, TRUE, 0); (void) window_destroy (get_args_form1); return answer; } static int get_string_specs () { Frame get_strings_form; int answer; /* create the frame for entering arguments */ get_strings_form = init_get_strings_form (); args_entered_flag = 0; /* force the user to enter the argument */ answer = (int) window_loop (get_strings_form); /* destroy the get_args_form */ (void) window_set (get_strings_form , FRAME_NO_CONFIRM, TRUE, 0); (void) window_destroy (get_strings_form); return answer; } static Frame init_get_args_form (selector) int selector; { Frame get_args_form1; Panel get_args_panel; Panel_item at_text[10],match_type[10]; int left, top, width, height, i; Rect *r; the_filter_specs.filter_temp_choice = selector; the_filter_specs.filter_temp_attr_count = Template_list[selector].attr_count; get_args_form1 = window_create ((Frame)0, FRAME, FRAME_SHOW_LABEL, FALSE, 0); get_args_panel = window_create (get_args_form1, PANEL, WIN_ROWS, 20, WIN_COLUMNS, 80, 0); (void) panel_create_item (get_args_panel, PANEL_MESSAGE, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (0), PANEL_LABEL_STRING, "message", 0); for (i = 0; i < Template_list[selector].attr_count; i++) { at_text[i] = panel_create_item (get_args_panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (3 + i), PANEL_LABEL_STRING, Template_list[selector].Temp_attr_pieces[i].print_string, PANEL_VALUE_DISPLAY_LENGTH, 32, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_filter_text_proc, 0); match_type[i] = panel_create_item (get_args_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (60), PANEL_ITEM_Y, ATTR_ROW (3 + i), PANEL_LABEL_STRING, "match_type", PANEL_CHOICE_STRINGS,"approximate", "equal", "greater or equal", "less than or equal", "substrings", "present", "ignore",0, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_filter_match_proc, 0); } at_text[i] = panel_create_item (get_args_panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (3 + i), PANEL_LABEL_STRING, "alternative base object: ", PANEL_VALUE_DISPLAY_LENGTH, 32, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_base_object_string, 0); match_type[i] = panel_create_item (get_args_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (60), PANEL_ITEM_Y, ATTR_ROW (3 + i), PANEL_LABEL_STRING, "base_select", PANEL_CHOICE_STRINGS, "current position", "specified position",0, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_base_object_select , 0); i++; match_type[i] = panel_create_item (get_args_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (3 + i + 2), PANEL_LABEL_STRING, "DEPTH OF SEARCH", PANEL_CHOICE_STRINGS, "ONE LEVEL", "WHOLE SUBTREE",0, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_search_depth_select , 0); i++; match_type[i] = panel_create_item (get_args_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (3 + i + 2), PANEL_LABEL_STRING, "FILTER TYPE", PANEL_CHOICE_STRINGS,"OR", "AND",0, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_filter_type_select , 0); i++; (void) panel_create_item (get_args_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (20), PANEL_ITEM_Y, ATTR_ROW (3 + i + 2), PANEL_LABEL_IMAGE, panel_button_image (get_args_panel, "YES", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 1, PANEL_NOTIFY_PROC, yes_no_proc, 0); (void) panel_create_item (get_args_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (3 + i + 2), PANEL_LABEL_IMAGE, panel_button_image (get_args_panel, "NO", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 0, PANEL_NOTIFY_PROC, yes_no_proc, 0); i++; window_fit (get_args_panel); window_fit (get_args_form1); /* center get_args_form on the screen */ r = (Rect *) window_get ( get_args_form1, WIN_SCREEN_RECT ); width = (int) window_get ( get_args_form1, WIN_WIDTH ); height = (int) window_get ( get_args_form1, WIN_HEIGHT ); left = (r->r_width - width) / 2; top = (r->r_height - height) / 2; if (left < 0) left = 0; if (top < 0) top = 0; (void) window_set (get_args_form1, WIN_X, left, WIN_Y, top, 0); return get_args_form1; } static Frame init_get_strings_form () { Frame get_strings_form; Panel get_strings_panel; int left, top, width, height, i=0; Rect *r; get_strings_form = window_create ((Frame)0, FRAME, FRAME_SHOW_LABEL, FALSE, 0); get_strings_panel = window_create (get_strings_form, PANEL, WIN_ROWS, 10, WIN_COLUMNS, 80, 0); (void) panel_create_item (get_strings_panel, PANEL_MESSAGE, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (0), PANEL_LABEL_STRING, "message", 0); (void) panel_create_item (get_strings_panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (2), PANEL_LABEL_STRING, "Filter :", PANEL_VALUE_DISPLAY_LENGTH, 32, PANEL_NOTIFY_PROC, put_filter_string_proc, 0); (void) panel_create_item (get_strings_panel, PANEL_TEXT, PANEL_ITEM_X, ATTR_COL (3), PANEL_ITEM_Y, ATTR_ROW (4), PANEL_LABEL_STRING, "alternative base object: ", PANEL_VALUE_DISPLAY_LENGTH, 32, PANEL_CLIENT_DATA, i, PANEL_NOTIFY_PROC, put_base_object_string_proc, 0); (void) panel_create_item (get_strings_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (60), PANEL_ITEM_Y, ATTR_ROW (4), PANEL_LABEL_STRING, "base_select", PANEL_CHOICE_STRINGS, "current position", "specified position",0, PANEL_NOTIFY_PROC, put_string_base_object_select_proc , 0); (void) panel_create_item (get_strings_panel, PANEL_CYCLE, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (6), PANEL_LABEL_STRING, "DEPTH OF SEARCH", PANEL_CHOICE_STRINGS, "ONE LEVEL", "WHOLE SUBTREE",0, PANEL_NOTIFY_PROC, put_string_search_depth_select , 0); (void) panel_create_item (get_strings_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (20), PANEL_ITEM_Y, ATTR_ROW (8), PANEL_LABEL_IMAGE, panel_button_image (get_strings_panel, "YES", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 1, PANEL_NOTIFY_PROC, yes_no_proc, 0); (void) panel_create_item (get_strings_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL (40), PANEL_ITEM_Y, ATTR_ROW (8), PANEL_LABEL_IMAGE, panel_button_image (get_strings_panel, "NO", 3 , (Pixfont *)NULL ), PANEL_CLIENT_DATA, 0, PANEL_NOTIFY_PROC, yes_no_proc, 0); window_fit (get_strings_panel); window_fit (get_strings_form); /* center get_strings_form on the screen */ r = (Rect *) window_get ( get_strings_form, WIN_SCREEN_RECT ); width = (int) window_get ( get_strings_form, WIN_WIDTH ); height = (int) window_get ( get_strings_form, WIN_HEIGHT ); left = (r->r_width - width) / 2; top = (r->r_height - height) / 2; if (left < 0) left = 0; if (top < 0) top = 0; (void) window_set (get_strings_form, WIN_X, left, WIN_Y, top, 0); return get_strings_form; } Panel_setting put_filter_text_proc (item, event) Panel_item item; Event *event; { int offset; offset = (int) panel_get (item, PANEL_CLIENT_DATA); (void) strcpy (the_filter_specs.filter_temp_entries[offset].attr_string, panel_get_value (item)); return (panel_text_notify (item, event)); } Panel_setting put_filter_string_proc (item, event) Panel_item item; Event *event; { (void) strcpy (the_search_data_info.filter_string, panel_get_value (item)); return (panel_text_notify (item, event)); } Panel_setting put_base_object_string_proc (item, event) Panel_item item; Event *event; { (void) strcpy (the_search_data_info.base_object_string, panel_get_value (item)); return (panel_text_notify (item, event)); } Panel_setting put_filter_type_select (item,value, event) Panel_item item; int value; Event *event; { switch (value) { case 0 : the_filter_specs.type = FILTER_OR; break; case 1 : the_filter_specs.type = FILTER_AND; break; } return (panel_text_notify (item, event)); } Panel_setting put_base_object_string (item, event) Panel_item item; Event *event; { (void) strcpy (the_filter_specs.base_object_string, panel_get_value (item)); return (panel_text_notify (item, event)); } Panel_setting put_base_object_select (item,value, event) Panel_item item; int value; Event *event; { switch (value) { case 0 : the_filter_specs.base_object_select = CURRENT_POS; break; case 1 : the_filter_specs.base_object_select = SPECIFIED_POS; break; } return (panel_text_notify (item, event)); } Panel_setting put_string_base_object_select_proc (item,value, event) Panel_item item; int value; Event *event; { switch (value) { case 0 : the_search_data_info.base_object_select = CURRENT_POS; break; case 1 : the_search_data_info.base_object_select = SPECIFIED_POS; break; } return (panel_text_notify (item, event)); } Panel_setting put_search_depth_select (item,value, event) Panel_item item; int value; Event *event; { switch (value) { case 0 : the_filter_specs.search_subset = SRA_ONELEVEL; break; case 1 : the_filter_specs.search_subset = SRA_WHOLESUBTREE; break; } return (panel_text_notify (item, event)); } Panel_setting put_string_search_depth_select (item,value, event) Panel_item item; int value; Event *event; { switch (value) { case 0 : the_search_data_info.search_subset = SRA_ONELEVEL; break; case 1 : the_search_data_info.search_subset = SRA_WHOLESUBTREE; break; } return (panel_text_notify (item, event)); } /* ARGSUSED */ void put_filter_match_proc (item, value, event) Panel_item item; int value; Event *event; { int offset; offset = (int) panel_get (item, PANEL_CLIENT_DATA); switch (value) { case 0 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_APPROX; break; case 1 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_EQUALITY; break; case 2 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_LESSOREQUAL; break; case 3 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_GREATEROREQUAL; break; case 4 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_SUBSTRINGS; break; case 5 : the_filter_specs.filter_temp_entries[offset].match_choice = FILTERITEM_PRESENT; break; case 6 : the_filter_specs.filter_temp_entries[offset].match_choice = IGNORE; break; } } /* These routines display create and destroy the panel items */ /* which are involved in displaying the current path */ void make_new_path (adn) DN adn; { int i,j; /* might have to twiddle starting values of i and j */ DN copy, dnptr; DN dn_comp_bit[10]; DN dn_bit; char text_buf[SMALL_BUF]; PathElementData client_data; clear_old_path (0); copy = dn_cpy (adn); for (dnptr = copy, j = 0 ; dnptr != NULLDN; dnptr = dnptr->dn_parent) dn_comp_bit[j++] = dnptr; for (i = j ; i != 0; i--) { get_oc_bit (copy, text_buf); dn_bit = dn_cpy (copy); get_rdn_bit (dn_comp_bit[(i - 1)], text_buf); if ( i != 1 ) dn_comp_bit[(i - 2)]->dn_parent = NULLDN; dn_free (dn_comp_bit[(i - 1)]); client_data = (PathElementData) malloc (sizeof (path_element_data)); client_data->depth = i ; client_data->dn_ptr = dn_bit; current_path_item[(i - 1)] = panel_create_item (control_panel, PANEL_BUTTON, PANEL_ITEM_X, ATTR_COL(1), PANEL_ITEM_Y, ATTR_ROW(i + 3), PANEL_LABEL_STRING, text_buf, PANEL_CLIENT_DATA, client_data, PANEL_SHOW_ITEM, TRUE, PANEL_EVENT_PROC , handle_path_select_button, 0); (void) panel_set (current_path_item[(i - 1)], PANEL_PAINT, PANEL_CLEAR, 0); bzero (text_buf , SMALL_BUF); path_element_count = j; } } void get_oc_bit (adn, achar_buf) DN adn; char achar_buf[SMALL_BUF]; { static struct ds_read_arg read_arg = { default_common_args, NULLDN, /* read_arg DN */ { /* entry info selection */ FALSE, NULLATTR, EIS_ATTRIBUTESANDVALUES } }; struct ds_read_result result; struct DSError error; read_arg.rda_object = adn; read_arg.rda_eis.eis_allattributes = FALSE; read_arg.rda_eis.eis_select = as_comp_new (AttrT_new ("objectclass"), NULLAV, NULLACL_INFO); (void) panel_set(dua_message, PANEL_VALUE, "",0); if (ds_read (&read_arg,&error,&result) != DS_OK) { /* deal with error */ (void) panel_set(dua_message, PANEL_VALUE, "read operation failed",0); } else { /* use data */ (void) as_decode (result.rdr_entry.ent_attr); if (result.rdr_entry.ent_attr != NULLATTR) { (void) strcat (achar_buf, " "); sunint_print (oc_print, (caddr_t)result.rdr_entry.ent_attr->attr_value, achar_buf); } entryinfo_comp_free (&result.rdr_entry,0); } } void get_rdn_bit (adn, achar_buf) DN adn; char achar_buf[SMALL_BUF]; { DN eptr, trail; for (eptr = adn; eptr != NULLDN; eptr = eptr->dn_parent) trail = eptr; (void) strcat (achar_buf, " "); sunint_print (sunint_dn_comp_print, (caddr_t) trail, achar_buf); } void back_to_root () { int i; dn = NULLDN; clear_old_path (0); for ( i = 0; i < display_item_count; i++) (void) panel_set (dua_panel_entry[i], PANEL_SHOW_ITEM, FALSE, 0); } void clear_old_path (pos) int pos; { int n ; PathElementData client_data; if (pos > (path_element_count )) (void) panel_set (dua_message, PANEL_VALUE, "element greater than current depth",0); else { for (n = (pos + 1); n < (path_element_count + 1 ); n++) { client_data = (PathElementData) panel_get (current_path_item[(n - 1)], PANEL_CLIENT_DATA); (void) panel_set (current_path_item[(n - 1)], PANEL_SHOW_ITEM, FALSE,0); dn_free (client_data->dn_ptr); (void) panel_destroy_item (current_path_item[(n - 1)]); current_path_item[(n - 1)] = (Panel_item) NULL; } path_element_count = pos; } } photo_start () { return (0); } photo_end () { return (0); } photo_black () { } photo_white () { } photo_line_end (line) bit_string * line; { Pixrect * pix; Pixwin *pw; static int sy = 20; /* the end of a line has been reached */ /* A bit string is stored in line->dbuf_top */ pw = canvas_pixwin (read_canvas); pix = mem_point (PIC_LINESIZE,1,1,(short*)line->dbuf_top); (void) pw_write (pw, 20, sy, PIC_LINESIZE - 20, 1, PIX_SRC,pix,0,0); sy++; } /* ARGSUSED */ sunint_pictures (ps,picture,format) PS ps; char * picture; int format; { decode_t4 (picture,"photo",0); ps_print (ps,"(see sub window)"); } void advise (va_alist) va_dcl { int code; va_list ap; extern LLog *log_dsap; va_start (ap); code = va_arg (ap, int); (void) _ll_log (log_dsap, code, ap); va_end (ap); } add_entry_info_str (entryinfo, part_full_buf) EntryInfo *entryinfo; char *part_full_buf; { PS aps; if ((aps = ps_alloc (str_open)) == NULLPS) fatal (-1, "can't ps_alloc in add_entry_info_str"); if (str_setup (aps, part_full_buf, LOTS, 1) == NOTOK) fatal (-1, "can't str_setup in add_entry_info_str"); (void) as_decode (entryinfo->ent_attr); as_print (aps,entryinfo->ent_attr,READOUT); } sunint_print (func, ptr, buf) int (*func) (); caddr_t ptr; char * buf; { PS aps; int i; i = strlen(buf); buf += i; if ((aps = ps_alloc (str_open)) == NULLPS) fatal (-1, "can't ps_alloc in add_dn_comp_str"); if (str_setup (aps, buf, LOTS -i, 1) == NOTOK) fatal (-1, "can't str_setup in add_dn_comp_str"); (*func) (aps,ptr,READOUT); *aps->ps_ptr = 0; ps_free(aps); } sunint_dn_comp_print (x,y,z) /* real dn_comp_print is a macro */ PS x; DN y; int z; { if (y != NULLDN) rdn_print (x,y->dn_rdn,z); } char * sunint_error (err) struct DSError * err; { PS ps; static char buffer [LOTS]; if ((ps = ps_alloc (str_open)) == NULLPS) { return ("Wierdo error"); } if (str_setup (ps,buffer,LOTS,1) == NOTOK) { return ("Wierdo error (2)"); } ds_error (ps,err); *ps->ps_ptr = 0; return (buffer); }