DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T m

⟦8be9b552f⟧ TextFile

    Length: 17398 (0x43f6)
    Types: TextFile
    Names: »mic_interface.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« 
        └─⟦d846658bd⟧ 
            └─⟦this⟧ »osimis/smap/mic_interface.c« 

TextFile

/*
 * Copyright (c) 1988 University College London
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * by the Department of Computer Science, University College London.
 * The name of the University may not be used to
 * endorse or promote products derived from this software without
 * specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/* SunView osimic interface */

/*
 * Initially by Andrew Eliasz, modified by  George Pavlou
 * October 1988
 */

#include <stdio.h>
#include <ctype.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 "isode/rosap.h"
#include "msap.h"
#include "microscope.h"
#include "config.h"

#define BUFFERSIZE ((ATTRLEN+1) * 2)


char *progname = "osimic";


int display_item_count;
int chosen_one;
int chosen_flag;

char valbuf[32];
int  valid_input;

AttrPairs *result;

Frame  base_frame, schema_frame, edit_frame;
Panel  control_panel, edit_control_panel, edit_panel_win;

Panel_item  mic_message, mic_panel_win;
Panel_item  view_button, list_button, modify_button,
	    up_button, down_button, schema_button, quit_button,
	    mod_add_button, mod_remove_button,
	    mod_replace_button, mod_quit_button;
Panel_item  pos_type_display, pos_value_display;
Panel_item  new_text_item, mic_panel_entry[100];
Textsw      schema_text_win;


int  view_proc(), list_proc(), up_proc(), down_proc(),
     modify_proc(), schema_proc(), quit_proc();
int  set_proc(), do_add(), do_remove(), do_replace(), do_abort();
AttrPairs *view_mobject(), *list_subords(), *modify_attribute();
Panel_setting  do_validate_input();

int  terminate();       	/* signal handler */


PositionD  position;
Error  error;

char host[HOSTLEN+1];		/* local host name */

char *hosts[MAXHOSTS];		/* hosts where SMAs run */
int   NofHosts;			/* how many */



main (argc, argv)
char **argv;
int argc;
{
    if (getconfig(hosts, &NofHosts) == NOTOK)
	advise(NULLCP, "Warning: failed to read configuration file");

    if (parse_args (argc, argv) == NOTOK) {
	advise(NULLCP, "host %s not supported", host);
	exit(1);
    }

    if (init_position (&position, &error) == NOTOK) {
	advise(NULLCP, "%s", error.err_msg);
	exit(1);
    }

    signal (SIGHUP,  terminate);
    signal (SIGINT,  terminate);
    signal (SIGQUIT, terminate);
    signal (SIGTERM, terminate);


    chosen_flag = 1;
    base_frame = window_create (NULL, FRAME, FRAME_LABEL,
				"INCA Sunview Microscope Interface", 0);

    schema_frame = window_create (base_frame, FRAME, FRAME_LABEL,
				"Read Results", 0);

    init_control_panel ();
    init_main_panel ();
    window_fit (base_frame);
    init_schema_text_win ();
    window_fit (schema_frame);

    window_main_loop (base_frame);

    terminate (0);
}


static  init_control_panel ()
{
    control_panel = window_create (base_frame, PANEL, WIN_ROWS, 8 ,
				WIN_COLUMNS, 90, 0);

    mic_message = panel_create_item (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,    "",
		0);

    view_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(1),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"VIEW", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , view_proc,
		0);

    list_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(15),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"LIST", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , list_proc,
		0);

    up_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(30),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"UP", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , up_proc,
		0);

    down_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(45),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"DOWN", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , down_proc,
		0);

    modify_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(60),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"MODIFY", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , modify_proc,
		0);

    quit_button = panel_create_item (control_panel,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(75),
		PANEL_ITEM_Y, ATTR_ROW(3),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"QUIT", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC , quit_proc,
		0);

    pos_type_display = panel_create_item (control_panel , PANEL_TEXT,
		PANEL_ITEM_X,   ATTR_COL(1),
		PANEL_ITEM_Y,   ATTR_ROW(5),
		PANEL_LAYOUT,   PANEL_HORIZONTAL,
		PANEL_LABEL_BOLD,  TRUE,
		PANEL_LABEL_STRING, "Pos_type  : ",
		PANEL_VALUE,   position.pos_type,
		0);

    pos_value_display = panel_create_item (control_panel , PANEL_TEXT,
		PANEL_ITEM_X,   ATTR_COL(1),
		PANEL_ITEM_Y,   ATTR_ROW(7),
		PANEL_LAYOUT,   PANEL_HORIZONTAL,
		PANEL_LABEL_BOLD,  TRUE,
		PANEL_LABEL_STRING,  "Pos_value : ",
		PANEL_VALUE, position.pos_value,
		0);
}


static  init_main_panel ()
{
    int i;

    mic_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 < 100; i++)
	mic_panel_entry [i] = (Panel_item ) NULL;
    display_item_count = 0;
}


static  init_schema_text_win ()
{
    schema_text_win = window_create (schema_frame, TEXTSW, WIN_ROWS,
					40, WIN_COLUMNS, 60, 0);
}


static  view_proc ()
{
    chosen_flag = 1;
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    free_attrpairs (result);
    if ((result = view_mobject (&position, &error))
		== (AttrPairs *) NULL) {
	panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	if (error.err_type == objectDoesNotExist ) {
	    panel_set (pos_type_display, PANEL_VALUE, position.pos_type,0);
	    panel_set (pos_value_display, PANEL_VALUE,
						position.pos_value, 0);
	    clear_main_panel ();
	}
    }
    else {
	clear_main_panel ();
	display_view_results ();
    }
}


static  list_proc ()
{
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    free_attrpairs (result);
    if ((result = list_subords (&position, &error))
		== (AttrPairs *) NULL) {
	panel_set (mic_message, PANEL_VALUE, error.err_msg,0);
	if (error.err_type == objectDoesNotExist ) {
	    panel_set (pos_type_display, PANEL_VALUE, position.pos_type,0);
	    panel_set (pos_value_display, PANEL_VALUE,
						position.pos_value,0);
	    clear_main_panel ();
	}
    }
    else {
	clear_main_panel ();
	display_list_results ();
    }
    chosen_flag = 1;
}


static  up_proc ()
{
    chosen_flag = 1;
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    clear_main_panel ();
    if (mib_ascend (&position, &error) == NOTOK)
	panel_set (mic_message, PANEL_VALUE, error.err_msg,0);
    else {
	panel_set (pos_type_display, PANEL_VALUE, position.pos_type,0);
	panel_set (pos_value_display, PANEL_VALUE, position.pos_value,0);
    }
}


static  down_proc ()
{
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    if (chosen_flag == 0) {
	if (mib_descend (chosen_one, &position, &error) == NOTOK)
	    panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	else {
	     panel_set (pos_type_display, PANEL_VALUE, position.pos_type, 0);
	     panel_set (pos_value_display, PANEL_VALUE, position.pos_value,0);
	     clear_main_panel ();
	}
    }
    else
	panel_set (mic_message, PANEL_VALUE,
				"Error: no currently chosen entry", 0);
    chosen_flag = 1;
}


static  schema_proc ()
{
    char *schema, *create_schema();

    schema = create_schema();
    textsw_delete (schema_text_win, 0,
			window_get(schema_text_win, TEXTSW_LENGTH));
    window_set(schema_frame, WIN_SHOW, TRUE, 0);
    textsw_insert(schema_text_win, schema, strlen(schema));
    free(schema);
}


static  quit_proc ()
{
    terminate(OK);
}


static  modify_proc ()
{
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    if (chosen_flag == 0) {
	if (check_attribute (chosen_one, &error) == NOTOK)
	    panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	else 
	    call_modify ();
    }
    else
	panel_set (mic_message, PANEL_VALUE,
				"Error: no currently chosen entry", 0);
    chosen_flag = 1;
}


static  display_view_results ()
{
    int i,j;
    char panel_text_buf[BUFFERSIZE];
    AttrPairs *ap_ptr;

    mic_panel_entry[0] = panel_create_item (mic_panel_win,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(0),
		PANEL_ITEM_Y, ATTR_ROW(0),
		PANEL_LABEL_STRING, "Attribute Type                \
Attribute Value",
		PANEL_SHOW_ITEM,  TRUE,
		0);

    panel_set (mic_panel_entry[0], PANEL_PAINT, PANEL_CLEAR, 0);

    for (ap_ptr = result, i = 1; ap_ptr != (AttrPairs *) NULL;
						ap_ptr = ap_ptr->Next) {
	panel_text_buf[0] = '\0'  ;
	strcat (panel_text_buf, ap_ptr->attr_type);
	strcat (panel_text_buf, ap_ptr->attr_value);

	mic_panel_entry[i] = panel_create_item (mic_panel_win,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(0),
		PANEL_ITEM_Y, ATTR_ROW(i),
		PANEL_LABEL_STRING, panel_text_buf,
		PANEL_CLIENT_DATA, (i - 1),
		PANEL_NOTIFY_PROC, set_proc,
		PANEL_SHOW_ITEM,  TRUE,
		0);

	panel_set (mic_panel_entry[i++], PANEL_PAINT, PANEL_CLEAR, 0);
    }

    display_item_count = i;
    panel_update_scrolling_size (mic_panel_win);
}


static  display_list_results ()
{
    int i,j;
    char panel_text_buf[BUFFERSIZE];
    AttrPairs *ap_ptr;

    mic_panel_entry[0] = panel_create_item (mic_panel_win,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(0),
		PANEL_ITEM_Y, ATTR_ROW(0),
		PANEL_LABEL_STRING, "Subordinate Type              \
Subordinate Value",
		PANEL_SHOW_ITEM,  TRUE,
		0);

    panel_set (mic_panel_entry[0], PANEL_PAINT, PANEL_CLEAR, 0);

    for (ap_ptr = result, i = 1; ap_ptr != (AttrPairs *) NULL;
						ap_ptr = ap_ptr->Next) {
	panel_text_buf[0] = '\0';
	strcat (panel_text_buf, ap_ptr->attr_type);
	strcat (panel_text_buf, ap_ptr->attr_value);

	mic_panel_entry[i] = panel_create_item (mic_panel_win,
		PANEL_BUTTON,
		PANEL_ITEM_X, ATTR_COL(0),
		PANEL_ITEM_Y, ATTR_ROW(i),
		PANEL_LABEL_STRING, panel_text_buf,
		PANEL_CLIENT_DATA, (i - 1),
		PANEL_NOTIFY_PROC, set_proc,
		PANEL_SHOW_ITEM,  TRUE,
		0);

	panel_set (mic_panel_entry[i++], PANEL_PAINT, PANEL_CLEAR, 0);
    }

    display_item_count = i;
    panel_update_scrolling_size (mic_panel_win);
}


static  set_proc (item, event)
Panel_item item;
Event *event;
{
    chosen_one = (int ) panel_get (item, PANEL_CLIENT_DATA);
    chosen_flag = 0;
}


static  clear_main_panel ()
{
    int i;

    if (display_item_count != 0) {
	for ( i = 0; i < display_item_count; i++ ) {
	    panel_set (mic_panel_entry[i], PANEL_SHOW_ITEM, FALSE, 0);
	    panel_destroy_item (mic_panel_entry[i]);
	    mic_panel_entry[i] = (Panel_item ) NULL;
	}
	panel_update_scrolling_size (mic_panel_win);
    }
    display_item_count = 0;
}


static  call_modify ()
{
    Frame edit_frame, init_edit_frame();
    edit_frame = init_edit_frame ();
    panel_set (mic_message, PANEL_VALUE,
			"hit RETURN after you enter value", 0);
    window_loop (edit_frame);
    window_set (edit_frame , FRAME_NO_CONFIRM, TRUE, 0);
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    window_destroy (edit_frame);
    clear_main_panel();
    display_view_results ();
}


Frame  init_edit_frame ()
{
    Frame get_arg_frame;
    Panel panel;
    Panel_item message_item, arg_text, yes_button, no_button;
    int left, top, width, height, i = chosen_one;
    AttrPairs *attr = result;
    Rect *r;
    edit_frame = window_create (0, FRAME, FRAME_SHOW_LABEL, FALSE, 0);
    edit_control_panel = window_create (edit_frame, PANEL,
					WIN_ROWS, 3,
					WIN_COLUMNS, 60, 0);

    mod_replace_button = panel_create_item (edit_control_panel , PANEL_BUTTON,
		PANEL_ITEM_X,   ATTR_COL(1),
		PANEL_ITEM_Y,   ATTR_ROW(1),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"ADD", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC,  do_add,
		0);

    mod_add_button = panel_create_item (edit_control_panel , PANEL_BUTTON,
		PANEL_ITEM_X,   ATTR_COL(15),
		PANEL_ITEM_Y,   ATTR_ROW(1),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"REMOVE", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC,  do_remove,
		0);

    mod_remove_button = panel_create_item (edit_control_panel , PANEL_BUTTON,
		PANEL_ITEM_X,   ATTR_COL(30),
		PANEL_ITEM_Y,   ATTR_ROW(1),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"REPLACE", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC,  do_replace,
		0);

    mod_quit_button = panel_create_item (edit_control_panel , PANEL_BUTTON,
		PANEL_ITEM_X,   ATTR_COL(45),
		PANEL_ITEM_Y,   ATTR_ROW(1),
		PANEL_LABEL_IMAGE, panel_button_image(control_panel,
						"ABORT", 10 , NULL),
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC,  do_abort,
		0);

    while (i--)
	attr = attr->Next;

    new_text_item = panel_create_item (edit_control_panel , PANEL_TEXT,
		PANEL_ITEM_X,   ATTR_COL(1),
		PANEL_ITEM_Y,   ATTR_ROW(3),
		PANEL_LABEL_STRING, attr->attr_type,
		PANEL_VALUE, attr->attr_value,
		PANEL_SHOW_ITEM,  TRUE,
		PANEL_NOTIFY_PROC,  do_validate_input,
		0);

    edit_panel_win = window_create (edit_frame,
		PANEL, WIN_ROWS,3,
		WIN_COLUMNS, 60,  WIN_X, 0,
		WIN_BELOW, edit_control_panel, 0);

    window_fit (edit_control_panel);
    window_fit (edit_panel_win);
    window_fit (edit_frame);

    r = (Rect *) window_get (edit_frame, WIN_SCREEN_RECT );

    /* center edit_frame on the screen */

    width = (int) window_get ( edit_frame, WIN_WIDTH );
    height = (int) window_get ( edit_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;
    window_set (edit_frame, WIN_X, left, WIN_Y, top, 0);

    return edit_frame;
}


Panel_setting  do_validate_input (item, event)
Panel_item item;
Event *event;
{
    strcpy(valbuf, panel_get_value(item));
    if (validate_input(valbuf) == NOTOK)
	panel_set (mic_message, PANEL_VALUE, "Error: invalid input", 0);
    else
	valid_input = TRUE;
    return (panel_text_notify(item, event));
}


static  do_add ()
{
    AttrPairs *tmpres;

    panel_set (mic_message, PANEL_VALUE, " ", 0);

    if (!valid_input)
	return;

    if ((tmpres = modify_attribute(chosen_one, m_addValue, valbuf,
						&position, &error))
		== (AttrPairs *) NULL) {
	panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	if (error.err_type == objectDoesNotExist) {
	    panel_set (pos_type_display, PANEL_VALUE, position.pos_type, 0);
	    panel_set (pos_value_display, PANEL_VALUE, position.pos_value, 0);
	}
	if (error.err_type != illegalOperation) {
	    free_attrpairs (result);
	    result = (AttrPairs *) NULL;
	    window_return();
	}
    }
    else {
	free_attrpairs (result);
	result = tmpres;
	window_set(edit_frame, FRAME_NO_CONFIRM, TRUE, 0);
	window_return();
    }
}


static  do_remove ()
{
    AttrPairs *tmpres;

    panel_set (mic_message, PANEL_VALUE, " ", 0);

    if (!valid_input)
	return;

    if ((tmpres = modify_attribute(chosen_one, m_removeValue, valbuf,
						&position, &error))
		== (AttrPairs *) NULL) {
	panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	if (error.err_type == objectDoesNotExist) {
	    panel_set (pos_type_display, PANEL_VALUE, position.pos_type, 0);
	    panel_set (pos_value_display, PANEL_VALUE, position.pos_value, 0);
	}
	if (error.err_type != illegalOperation) {
	    free_attrpairs (result);
	    result = (AttrPairs *) NULL;
	    window_return();
	}
    }
    else {
	free_attrpairs (result);
	result = tmpres;
	window_set(edit_frame, FRAME_NO_CONFIRM, TRUE, 0);
	window_return();
    }
}


static  do_replace ()
{
    AttrPairs *tmpres;

    panel_set (mic_message, PANEL_VALUE, " ", 0);

    if (!valid_input)
	return;

    if ((tmpres = modify_attribute(chosen_one, m_replace, valbuf,
						&position, &error))
		== (AttrPairs *) NULL) {
	panel_set (mic_message, PANEL_VALUE, error.err_msg, 0);
	if (error.err_type == objectDoesNotExist) {
	    panel_set (pos_type_display, PANEL_VALUE, position.pos_type, 0);
	    panel_set (pos_value_display, PANEL_VALUE, position.pos_value, 0);
	}
	if (error.err_type != illegalOperation) {
	    free_attrpairs (result);
	    result = (AttrPairs *) NULL;
	    window_return();
	}
    }
    else {
	free_attrpairs (result);
	result = tmpres;
	window_set(edit_frame, FRAME_NO_CONFIRM, TRUE, 0);
	window_return();
    }
}


static  do_abort (item, event)
Panel_item item;
Event *event;
{
    panel_set (mic_message, PANEL_VALUE, " ", 0);
    window_return ();
}