/******************************************************************** * FUNCTION clear_current_level * Clear the current level without changing it * * INPUTS: * session_cb == session control block to use *********************************************************************/ static void clear_current_level (session_cb_t *session_cb) { val_value_t *target = session_cb->config_ecurval; if (target == NULL) { return; } if (session_cb->config_estartval == NULL) { /* clear everything out */ val_free_value(session_cb->config_etree); session_cb->config_etree = NULL; session_cb->config_ecurval = NULL; return; } boolean islist = obj_is_list(target->obj); val_value_t *chval = val_get_first_child(target); val_value_t *nextval = NULL; for (; chval; chval = nextval) { nextval = val_get_next_child(chval); if (islist && obj_is_key(chval->obj)) { continue; } val_remove_child(chval); val_free_value(chval); } } /* clear_current_level */
/* * Resize object according to info in last resize rubberbanding */ int abobj_resize( ABObj obj, XEvent *event ) { Widget parent; Display *dpy; XRectangle p_rect; XRectangle adj_rect; Window rootwin; int orig_x, orig_y; int trans_x, trans_y; ABObj moveobj; ABObj pobj; if (!first_move) /* resize occurred */ { Window win; if (obj_is_item(obj)) obj = obj_get_parent(obj); obj = obj_get_root(obj); parent = XtParent(xy_widget); dpy = XtDisplay(xy_widget); orig_x = (int)resize_rect.x; orig_y = (int)resize_rect.y; first_move = TRUE; x_get_widget_rect(parent, &p_rect); rootwin = RootWindowOfScreen(XtScreen(xy_widget)); /* erase last rect outline */ x_fullscreen_box(xy_widget, rootwin, resize_rect.x, resize_rect.y, rect_right(&resize_rect), rect_bottom(&resize_rect)); /* translate from root coordinates to parent's */ XTranslateCoordinates(dpy, rootwin, XtWindow(parent), orig_x , orig_y, &trans_x, &trans_y, &win); resize_rect.width++; resize_rect.height++; /* Ensure new geometry fits within parent */ if (trans_x < 0) { resize_rect.x = 0; resize_rect.width += trans_x; if (obj_is_pane(obj) || obj_is_separator(obj)) /* If a pane, attach to parent's edge */ obj_set_attachment(xy_obj, AB_CP_WEST, AB_ATTACH_OBJ, obj_get_parent(xy_obj), 0); } else { resize_rect.x = trans_x; /* Break edge-attachment */ if ((obj_is_pane(obj) || obj_is_separator(obj)) && (obj_get_attach_type(xy_obj, AB_CP_WEST) == AB_ATTACH_OBJ && obj_get_attach_value(xy_obj, AB_CP_WEST) == (void*)obj_get_parent(xy_obj))) obj_set_attachment(xy_obj, AB_CP_WEST, AB_ATTACH_POINT, (void*)0, trans_x); } if (trans_y < 0) { resize_rect.y = 0; resize_rect.height += trans_y; if (obj_is_pane(obj) || obj_is_separator(obj)) /* If a pane, attach to parent's edge */ obj_set_attachment(xy_obj, AB_CP_NORTH, AB_ATTACH_OBJ, obj_get_parent(xy_obj), 0); } else { resize_rect.y = trans_y; /* Break edge-attachment */ if ((obj_is_pane(obj) || obj_is_separator(obj)) && (obj_get_attach_type(xy_obj, AB_CP_NORTH) == AB_ATTACH_OBJ && obj_get_attach_value(xy_obj, AB_CP_NORTH) == (void*)obj_get_parent(xy_obj))) obj_set_attachment(xy_obj, AB_CP_NORTH, AB_ATTACH_POINT, (void*)0, trans_y); } if (resize_rect.x + (short)resize_rect.width >= (short)p_rect.width) { resize_rect.width = (short)p_rect.width - resize_rect.x - 1; if (obj_is_pane(obj) || obj_is_separator(obj)) /* If a pane, attach to parent's edge */ obj_set_attachment(xy_obj, AB_CP_EAST, AB_ATTACH_OBJ, obj_get_parent(xy_obj), 0); } else { /* Break edge-attachment */ if ((obj_is_pane(obj) || obj_is_separator(obj)) && (obj_get_attach_type(xy_obj, AB_CP_EAST) == AB_ATTACH_OBJ && obj_get_attach_value(xy_obj, AB_CP_EAST) == (void*)obj_get_parent(xy_obj))) obj_set_attachment(xy_obj, AB_CP_EAST, AB_ATTACH_NONE, (void*)0, 0); } if (resize_rect.y + (short)resize_rect.height > (short)p_rect.height) { resize_rect.height = (short)p_rect.height - resize_rect.y - 1; if (obj_is_pane(obj) || obj_is_separator(obj)) /* If a pane, attach to parent's edge */ obj_set_attachment(xy_obj, AB_CP_SOUTH, AB_ATTACH_OBJ, obj_get_parent(xy_obj), 0); } else { /* Break edge-attachment */ if ((obj_is_pane(obj) || obj_is_separator(obj)) && (obj_get_attach_type(xy_obj, AB_CP_SOUTH) == AB_ATTACH_OBJ && obj_get_attach_value(xy_obj, AB_CP_SOUTH) == (void*)obj_get_parent(xy_obj))) obj_set_attachment(xy_obj, AB_CP_SOUTH, AB_ATTACH_NONE, (void*)0, 0); } (void)abobj_set_undo(&obj, 1, undo_resize, AB_UNDO_RESIZE); pobj = obj_get_parent(obj); if (obj_is_layers(pobj)) moveobj = pobj; else moveobj = obj; adj_rect = resize_rect; if (abobj_has_attached_label(obj)) subtract_attached_label(obj, &adj_rect); if (obj_is_drawing_area(obj) && obj_has_scrollbar(obj)) { int new_d_w = -1; int new_d_h = -1; int d_w = obj_get_drawarea_width(obj); int d_h = obj_get_drawarea_height(obj); /* If the overall DrawArea dimension is now larger than the internal * canvas dimension, resize the canvas dimension to be at least as large * as the overall DrawArea. */ if ((int)resize_rect.width != obj_get_width(obj) && (int)resize_rect.width > d_w) new_d_w = (int)resize_rect.width; if ((int)resize_rect.height != obj_get_height(obj) && (int)resize_rect.height > d_h) new_d_h = (int)resize_rect.height; if (new_d_w != -1 || new_d_h != -1) abobj_set_drawarea_size(obj, new_d_w != -1? new_d_w : d_w, new_d_h != -1? new_d_h : d_h); } /* * Resize the object ! */ if (obj_is_layers(pobj)) abobj_layer_set_size(pobj, resize_rect.width, resize_rect.height); else if ((obj_is_text(obj) || obj_is_term_pane(obj)) && obj_get_num_columns(obj) != -1) /* TextPane, TermPane, TextField with Character-based Sizing */ abobj_set_text_size(obj, (int)adj_rect.width, (int)adj_rect.height); else if (obj_is_list(obj) && obj_get_num_rows(obj) != -1) { /* List with Character-based height */ abobj_set_text_size(obj, (int)adj_rect.width, (int)adj_rect.height); abobj_set_pixel_width(obj, (int)adj_rect.width, border_w); } else /* else size is Pixel-based...*/ resize_in_pixels(obj, (int)adj_rect.width, (int)adj_rect.height, border_w); abobj_set_xy(moveobj, resize_rect.x, resize_rect.y); if (xy_obj->attachments) abobj_calculate_new_layout(xy_obj, resize_rect.x, resize_rect.y, resize_rect.width, resize_rect.height); /* Change obj size BEFORE changing attachments...*/ abobj_instantiate_changes(obj); abobj_tree_instantiate_changes(moveobj); /* WORKAROUND for Motif XmForm bug (it ignores child resize request * if x,y have not also changed). So, we have to force it. */ abobj_force_dang_form_resize(xy_obj); if (util_get_verbosity() > 3) objxm_dump_widget_geometry(xy_widget); return OK; } return ERROR; }
/******************************************************************** * FUNCTION parse_node * (config mode input received) * Parse the next word using the comstate and session_cb state * Expecting this word to represent a datastore node, not a key or value * * e.g., * interface eth0 mtu 1500 * ^ ^ ^ ^ * node key node value * * INPUTS: * tkc == token chain in progress * session_cb == session control block to use * done == address of return done flag * gotexit == address of return gotexit flag * gotapply == address of return gotapply flag * gotdo == address of return do command flag * * OUTPUTS: * *done == TRUE if parsing done; no more tokens; * ignore unless return NO_ERR * *gotexit == TRUE if got 'exit' command * ignore unless return NO_ERR and *done == TRUE * *gotapply == TRUE if got 'apply' command * ignore unless return NO_ERR and *done == TRUE * *gotdo == TRUE if got 'do' command * RETURNS: * status *********************************************************************/ static status_t parse_node (tk_chain_t *tkc, session_cb_t *session_cb, boolean *done, boolean *gotexit, boolean *gotapply, boolean *gotdo) { *done = FALSE; *gotexit = FALSE; *gotapply = FALSE; *gotdo = FALSE; /* get the next token to use */ status_t res = TK_ADV(tkc); if (res != NO_ERR) { if (res == ERR_NCX_EOF) { *done = TRUE; return NO_ERR; } else { log_error("\nError: Expecting node identifier\n"); return res; } } boolean first = tk_cur_is_first(tkc); /* check if the 'do' form of command was given */ if (first && TK_CUR_TYP(tkc) == TK_TT_TSTRING && !xml_strcmp(TK_CUR_VAL(tkc), NCX_EL_DO) && tk_next_typ(tkc) != TK_TT_NONE) { *gotdo = TRUE; *done = TRUE; return NO_ERR; } /* check if the 'no' form of command was given */ if (first && TK_CUR_TYP(tkc) == TK_TT_TSTRING && !xml_strcmp(TK_CUR_VAL(tkc), NCX_EL_NO) && tk_next_typ(tkc) != TK_TT_NONE) { /* get the next token to use as the first identifier */ res = TK_ADV(tkc); if (res != NO_ERR) { log_error("\nError: Expecting identifier token after " "'no' keyword\n"); return res; } first = FALSE; session_cb->config_no_active = TRUE; } /* check if the current token is an identifier */ if (!TK_CUR_ID(tkc)) { log_error("\nError: expecting a node identifier\n"); res = ERR_NCX_WRONG_TKTYPE; return res; } /* check if the exit command was given */ if (first && TK_CUR_TYP(tkc) == TK_TT_TSTRING && !xml_strcmp(TK_CUR_VAL(tkc), NCX_EL_EXIT) && tk_next_typ(tkc) == TK_TT_NONE) { *done = TRUE; *gotexit = TRUE; return NO_ERR; } /* check if the apply command was given */ if (first && TK_CUR_TYP(tkc) == TK_TT_TSTRING && !xml_strcmp(TK_CUR_VAL(tkc), NCX_EL_APPLY) && tk_next_typ(tkc) == TK_TT_NONE) { *done = TRUE; *gotapply = TRUE; return NO_ERR; } obj_template_t *startobj = session_cb->config_curobj; obj_template_t *topobj = NULL; if (startobj == NULL) { /* getting top-level config object */ topobj = find_top_obj(session_cb, TK_CUR_VAL(tkc)); if (topobj && !(obj_is_data_db(topobj) && obj_is_config(topobj))) { topobj = NULL; } } else { /* getting child node config object */ topobj = find_child_obj(session_cb, startobj, TK_CUR_VAL(tkc)); if (topobj && !obj_is_config(topobj)) { topobj = NULL; } } if (topobj == NULL) { log_error("\nError: No config object found matching '%s'\n", TK_CUR_VAL(tkc)); return ERR_NCX_UNKNOWN_OBJECT; } /* got a top object (relative to the current context) */ session_cb->config_curobj = topobj; /* make a template object for the edit operation for non-terminals */ val_value_t *newval = NULL; if (!obj_is_leafy(topobj)) { newval = val_new_value(); if (newval == NULL) { log_error("\nError: malloc failed for new value\n"); return ERR_INTERNAL_MEM; } val_init_from_template(newval, topobj); add_enode(session_cb, newval); } else if (session_cb->config_no_active && obj_is_leaf(topobj)) { /* no ... foo-leaf */ newval = xml_val_new_flag(obj_get_name(topobj), obj_get_nsid(topobj)); if (newval == NULL) { log_error("\nError: malloc failed for new value\n"); return ERR_INTERNAL_MEM; } add_enode(session_cb, newval); } if (obj_is_list(topobj)) { boolean anykeys = FALSE; obj_key_t *newkey = obj_first_key(topobj); while (newkey) { anykeys = TRUE; /* get the next token to use as the key value */ res = TK_ADV(tkc); if (res != NO_ERR) { log_error("\nError: Expecting value for '%s' key leaf\n", obj_get_name(newkey->keyobj)); return res; } /* parse the value as a key value */ /*** do something different if TK_CUR_MOD(tkc) is not NULL ***/ val_value_t *keyval = val_make_simval_obj(newkey->keyobj, TK_CUR_VAL(tkc), &res); if (res != NO_ERR) { log_error("\nError: Invalid value for '%s' key leaf\n", obj_get_name(newkey->keyobj)); val_free_value(keyval); return res; } /* save keyval */ if (newval) { val_add_child(keyval, newval); } else { val_free_value(keyval); } /* set up the next key in the list */ newkey = obj_next_key(newkey); } if (anykeys) { res = val_gen_index_chain(topobj, newval); } } if (res == NO_ERR && obj_is_leafy(topobj)) { /* expecting a value node to follow or done if 'no' command */ *done = TRUE; } return res; } /* parse_node */