[gq-commit] gq/src browse-dnd.c,1.19,1.20 browse-export.c,1.3,1.4 browse-export.h,1.2,1.3 browse.c,1
Status: Beta
Brought to you by:
sur5r
Update of /cvsroot/gqclient/gq/src In directory sc8-pr-cvs1:/tmp/cvs-serv17477 Modified Files: browse-dnd.c browse-export.c browse-export.h browse.c browse.h configfile.c configfile.h dn-browse.c dn-browse.h dt_binary.c dt_binary.h dt_clist.c dt_clist.h dt_entry.c dt_entry.h dt_generic_binary.c dt_generic_binary.h dt_int.c dt_int.h dt_numstr.c dt_numstr.h dt_oc.c dt_oc.h dt_password.c dt_password.h dt_text.c dt_text.h dt_time.c errorchain.c errorchain.h filter.c filter.h formfill.c formfill.h gq.c input.c input.h ldapops.c ldapops.h mainwin.c mainwin.h prefs.c ref-browse.c ref-browse.h schema.c schema.h schemabrowse.c search.c search.h server-browse.c server-browse.h state.c syntax.c syntax.h template.c template.h tinput.c tinput.h util.c util.h Log Message: A HUGE checkin. It was not possible to separate the following changes into separate change-sets, unfortunately: * error_context There was a problem with error-popups in the presence of modal/transient windows. In case an error was popping up, the modal window caused the error popups to be unaccessible for the user (The "OK" button was unclickable). This required MASSIVE changes all over, but now gq is more user-friendly as well. The new policy is: Whenever an error can be caused by some function, it must take an error context id as a argument. GTK Callbacks calling such functions must create such an error context and must register the error with its associated top-level widget. After doing all operations it must call error_flush, which might pop up a modal error-popup. Never should ANY execution path lead to the existance of two or more nested error contexts. This way, the user always gets a nice feedback about what operation in the end really caused the error. * slighly changed browse_entry data type handling - Added macros to cast a browse_entry to the proper subtype in a gtk-style - All methods now take browse_entry * arguments. That way the compile can do compile-time checks on the method table init assignments. * changed handling of saving configuration The new policy is: If a save fails, the old configuration MUST be restored. This might be an unpleasant thing to do, but users do not understand it if the configuration gets changed, an error pops up informing of a saving error and the configuration stays changed. This policy has not yet been implemented 100% in the current source. Needs to be fixed. (TODO) * Various cleanups along the way - made some functions static - fixed some memory leaks - updated copyright messages Testing required! Index: browse-dnd.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse-dnd.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** browse-dnd.c 23 Oct 2003 05:46:23 -0000 1.19 --- browse-dnd.c 2 Nov 2003 07:20:42 -0000 1.20 *************** *** 347,351 **** ! static void do_refresh(struct tab *tab) { GList *l; dnd_refresh *at_end = NULL; --- 347,351 ---- ! static void do_refresh(int error_context, struct tab *tab) { GList *l; dnd_refresh *at_end = NULL; *************** *** 364,368 **** if (dr->dn == NULL) continue; ! refresh_subtree_with_options(dr->tree, tree_node_from_server_dn(dr->tree, dr->server, --- 364,369 ---- if (dr->dn == NULL) continue; ! refresh_subtree_with_options(error_context, ! dr->tree, tree_node_from_server_dn(dr->tree, dr->server, *************** *** 401,404 **** --- 402,406 ---- struct tab *tab) { + int ctx; #ifdef DEBUG if (debug & GQ_DEBUG_BROWSER_DND) { *************** *** 417,421 **** "drag-and-selection-data"); ! do_refresh(tab); } --- 419,425 ---- "drag-and-selection-data"); ! ctx = error_new_context(_("Refreshing entry after dragging"), ctreeroot); ! do_refresh(ctx, tab); ! error_flush(ctx); } *************** *** 533,537 **** --- 537,543 ---- struct ldapserver *source_server; char *newdn = NULL; + int context; + context = error_new_context(_("Moving entry"), ctreeroot); #ifdef DEBUG if (debug & GQ_DEBUG_BROWSER_DND) { *************** *** 562,570 **** if ((source_server == target_server) && ( strcasecmp(dn, target_entry->dn) == 0)) { ! statusbar_msg(_("Cannot move/copy entry onto itself!")); ! error_popup(_("Cannot move/copy entry onto itself!"), ! _("Cannot move/copy entry onto itself!")); ! ! return; } --- 568,574 ---- if ((source_server == target_server) && ( strcasecmp(dn, target_entry->dn) == 0)) { ! error_push(context, _("Cannot move/copy entry onto itself!")); ! ! goto done; } *************** *** 572,589 **** (source_server == target_server) && is_ancestor(target_entry->dn, dn)) { ! statusbar_msg(_("Cannot recursively move/copy entry onto or below itself!")); ! error_popup(_("Cannot recursively move/copy entry onto or below itself!"), ! _("Cannot recursively move/copy entry onto or below itself!")); ! return; } - - if (IS_DN_ENTRY(target_entry)) { newdn = move_entry(dn, source_server, target_entry->dn, target_server, ! flags, move_progress); ! /* register that we have to refresh the target node */ dnd_refresh_list = --- 576,590 ---- (source_server == target_server) && is_ancestor(target_entry->dn, dn)) { ! error_push(context, ! _("Cannot recursively move/copy entry onto or below itself!")); ! goto done; } if (IS_DN_ENTRY(target_entry)) { newdn = move_entry(dn, source_server, target_entry->dn, target_server, ! flags, move_progress, context); ! /* register that we have to refresh the target node */ dnd_refresh_list = *************** *** 627,630 **** --- 628,633 ---- } } + done: + error_flush(context); } *************** *** 877,881 **** }; ! int ctx = error_new_context(_("Getting selection string")); #ifdef DEBUG --- 880,884 ---- }; ! int ctx = error_new_context(_("Getting selection string"), ctree); #ifdef DEBUG *************** *** 893,897 **** /* retrieve from server ... */ ! if( (ld = open_connection(server)) == NULL) goto fail; /* use ManageDSAit: we want to move/copy refs intact */ --- 896,900 ---- /* retrieve from server ... */ ! if( (ld = open_connection(ctx, server)) == NULL) goto fail; /* use ManageDSAit: we want to move/copy refs intact */ *************** *** 1022,1025 **** --- 1025,1029 ---- { GtkWidget *ctree; + int ctx; ctree = GTK_WIDGET(BROWSETAB(tab)->ctreeroot); *************** *** 1034,1039 **** gdk_atom_intern("gq-browse-ctree", FALSE), GDK_CURRENT_TIME); - do_refresh(tab); } --- 1038,1046 ---- gdk_atom_intern("gq-browse-ctree", FALSE), GDK_CURRENT_TIME); + + ctx = error_new_context(_("Refreshing entry after pasting"), ctree); + do_refresh(ctx, tab); + error_flush(ctx); } Index: browse-export.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse-export.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** browse-export.c 28 Oct 2003 19:16:01 -0000 1.3 --- browse-export.c 2 Nov 2003 07:20:43 -0000 1.4 *************** *** 60,63 **** --- 60,64 ---- GList *to_export; GtkWidget *filesel; + GtkWidget *transient_for; }; *************** *** 104,108 **** /* } */ ! ctx = error_new_context(_("Dump subtree")); if(g_list_length(ex->to_export) == 0) { --- 105,109 ---- /* } */ ! ctx = error_new_context(_("Dump subtree"), ex->transient_for); if(g_list_length(ex->to_export) == 0) { *************** *** 168,172 **** } ! if( (ld = open_connection(dos->server)) == NULL) { /* no extra error, open_connection does error reporting itself... */ --- 169,173 ---- } ! if( (ld = open_connection(ctx, dos->server)) == NULL) { /* no extra error, open_connection does error reporting itself... */ *************** *** 200,204 **** _("%1$d of %2$d bytes written"), written, out->len); ! error_popup(_("Save failed"), gmessage->str); ldap_msgfree(res); --- 201,206 ---- _("%1$d of %2$d bytes written"), written, out->len); ! error_popup(_("Save failed"), gmessage->str, ! ex->transient_for); ldap_msgfree(res); *************** *** 253,256 **** --- 255,259 ---- ex->to_export = to_export; ex->filesel = filesel; + ex->transient_for = transient_for; gtk_object_set_data_full(GTK_OBJECT(filesel), "export", Index: browse-export.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse-export.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** browse-export.h 28 Oct 2003 19:18:50 -0000 1.2 --- browse-export.h 2 Nov 2003 07:20:43 -0000 1.3 *************** *** 35,39 **** /* to_export is a GList of dn_on_server objects */ ! void export_many(GtkWidget *widget, GList *to_export); #endif --- 35,40 ---- /* to_export is a GList of dn_on_server objects */ ! void export_many(int error_context, GtkWidget *transient_for, ! GList *to_export); #endif Index: browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.c,v retrieving revision 1.91 retrieving revision 1.92 diff -C2 -d -r1.91 -r1.92 *** browse.c 28 Oct 2003 19:23:52 -0000 1.91 --- browse.c 2 Nov 2003 07:20:43 -0000 1.92 *************** *** 138,142 **** int ctx; ! ctx = error_new_context(_("Exploding DN")); if (config->show_rdn_only) { --- 138,142 ---- int ctx; ! ctx = error_new_context(_("Exploding DN"), GTK_WIDGET(ctree)); if (config->show_rdn_only) { *************** *** 286,291 **** assert(entry->base_methods); if (entry->base_methods->expand) { ! entry->base_methods->expand(entry, ctree, ctree_node, tab); record_path(tab, entry, ctree, ctree_node); } } --- 286,296 ---- assert(entry->base_methods); if (entry->base_methods->expand) { ! int ctx = error_new_context(_("Expanding subtree"), ! GTK_WIDGET(ctree)); ! ! entry->base_methods->expand(entry, ctx, ctree, ctree_node, tab); record_path(tab, entry, ctree, ctree_node); + + error_flush(ctx); } } *************** *** 340,344 **** /* do not update right-hand pane if update-lock is set */ if (! BROWSETAB(tab)->update_lock) { ! entry->base_methods->select(entry, ctree, node, tab); } } --- 345,352 ---- /* do not update right-hand pane if update-lock is set */ if (! BROWSETAB(tab)->update_lock) { ! int ctx = error_new_context(_("Selecting entry"), ! GTK_WIDGET(ctree)); ! entry->base_methods->select(entry, ctx, ctree, node, tab); ! error_flush(ctx); } } *************** *** 364,368 **** assert(entry->base_methods); if (entry->base_methods->refresh) { ! entry->base_methods->refresh(entry, ctree, node, tab); } --- 372,380 ---- assert(entry->base_methods); if (entry->base_methods->refresh) { ! int ctx = error_new_context(_("Refreshing entry"), ! GTK_WIDGET(ctree)); ! ! entry->base_methods->refresh(entry, ctx, ctree, node, tab); ! error_flush(ctx); } *************** *** 408,412 **** } ! static void browse_save_snapshot(char *state_name, struct tab *tab) { char *tmp; --- 420,425 ---- } ! static void browse_save_snapshot(int error_context, ! char *state_name, struct tab *tab) { char *tmp; *************** *** 426,430 **** if (BROWSETAB(tab)->inputform) { ! save_input_snapshot(BROWSETAB(tab)->inputform, tmp); } else { rm_value(tmp); --- 439,443 ---- if (BROWSETAB(tab)->inputform) { ! save_input_snapshot(error_context, BROWSETAB(tab)->inputform, tmp); } else { rm_value(tmp); *************** *** 446,450 **** } ! static void browse_restore_snapshot(char *state_name, struct tab *tab, struct pbar_win *progress) { --- 459,464 ---- } ! static void browse_restore_snapshot(int context, ! char *state_name, struct tab *tab, struct pbar_win *progress) { *************** *** 474,481 **** if (c == ep) { switch(type) { ! case DN_BROWSE_ENTRY: ! node = show_dn(ctree, node, c + 1, FALSE); break; ! case REF_BROWSE_ENTRY: gtk_ctree_expand(ctree, node); node = --- 488,495 ---- if (c == ep) { switch(type) { ! case DN_BROWSE_ENTRY_ID: ! node = show_dn(context, ctree, node, c + 1, FALSE); break; ! case REF_BROWSE_ENTRY_ID: gtk_ctree_expand(ctree, node); node = *************** *** 485,489 **** (GCompareFunc) cmp_name); break; ! case SERVER_BROWSE_ENTRY: server = server_by_name(c + 1); if (server != NULL) { --- 499,503 ---- (GCompareFunc) cmp_name); break; ! case SERVER_BROWSE_ENTRY_ID: server = server_by_name(c + 1); if (server != NULL) { *************** *** 516,520 **** if (BROWSETAB(tab)->inputform) { ! restore_input_snapshot(BROWSETAB(tab)->inputform, tmp); } --- 530,534 ---- if (BROWSETAB(tab)->inputform) { ! restore_input_snapshot(context, BROWSETAB(tab)->inputform, tmp); } *************** *** 780,784 **** ! void refresh_subtree_new_dn(GtkCTree *ctree, GtkCTreeNode *node, const char *newdn, --- 794,799 ---- ! void refresh_subtree_new_dn(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node, const char *newdn, *************** *** 893,897 **** } ! show_server_dn(ctree, server_from_node(ctree, node), e->dn, TRUE); --- 908,913 ---- } ! show_server_dn(error_context, ! ctree, server_from_node(ctree, node), e->dn, TRUE); *************** *** 900,917 **** } ! void refresh_subtree(GtkCTree *ctree, GtkCTreeNode *node) { ! refresh_subtree_new_dn(ctree, node, NULL, 0); } ! void refresh_subtree_with_options(GtkCTree *ctree, GtkCTreeNode *node, int options) { ! refresh_subtree_new_dn(ctree, node, NULL, options); } ! GtkCTreeNode *show_server_dn(GtkCTree *tree, struct ldapserver *server, const char *dn, gboolean select_node) --- 916,936 ---- } ! void refresh_subtree(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node) { ! refresh_subtree_new_dn(error_context, ctree, node, NULL, 0); } ! void refresh_subtree_with_options(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node, int options) { ! refresh_subtree_new_dn(error_context, ctree, node, NULL, options); } ! GtkCTreeNode *show_server_dn(int context, ! GtkCTree *tree, struct ldapserver *server, const char *dn, gboolean select_node) *************** *** 920,929 **** if (node) { gtk_ctree_expand(tree, node); ! return show_dn(tree, node, dn, select_node); } return NULL; } ! GtkCTreeNode *show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, gboolean select_node) { --- 939,949 ---- if (node) { gtk_ctree_expand(tree, node); ! return show_dn(context, tree, node, dn, select_node); } return NULL; } ! GtkCTreeNode *show_dn(int error_context, ! GtkCTree *tree, GtkCTreeNode *node, const char *dn, gboolean select_node) { *************** *** 962,966 **** LDAP *ld; ! if ((ld = open_connection(server)) != NULL) { LDAPMessage *res, *e; LDAPControl c; --- 982,986 ---- LDAP *ld; ! if ((ld = open_connection(error_context, server)) != NULL) { LDAPMessage *res, *e; LDAPControl c; Index: browse.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/browse.h,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** browse.h 28 Oct 2003 19:23:52 -0000 1.36 --- browse.h 2 Nov 2003 07:20:43 -0000 1.37 *************** *** 73,85 **** --- 73,89 ---- virtual function table */ typedef void (*browse_entry_destructor)(browse_entry *entry); + typedef void (*browse_entry_expand)(browse_entry *entry, + int error_context, GtkCTree *ctreeroot, GtkCTreeNode *node, struct tab *tab); typedef void (*browse_entry_select)(browse_entry *entry, + int error_context, GtkCTree *ctreeroot, GtkCTreeNode *node, struct tab *tab); typedef void (*browse_entry_refresh)(browse_entry *entry, + int error_context, GtkCTree *ctreeroot, GtkCTreeNode *node, *************** *** 87,91 **** typedef char* (*browse_entry_get_name)(browse_entry *entry, gboolean long_form); ! typedef void (*browse_entry_popup)(browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, --- 91,96 ---- typedef char* (*browse_entry_get_name)(browse_entry *entry, gboolean long_form); ! typedef void (*browse_entry_popup)(browse_entry *entry, ! GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, *************** *** 133,145 **** struct tab *new_browsemode(); ! void refresh_subtree(GtkCTree *ctree, GtkCTreeNode *node); ! void refresh_subtree_new_dn(GtkCTree *ctree, GtkCTreeNode *node, const char *newdn, int options); ! void refresh_subtree_with_options(GtkCTree *ctree, GtkCTreeNode *node, int options); --- 138,153 ---- struct tab *new_browsemode(); ! void refresh_subtree(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node); ! void refresh_subtree_new_dn(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node, const char *newdn, int options); ! void refresh_subtree_with_options(int error_context, ! GtkCTree *ctree, GtkCTreeNode *node, int options); *************** *** 148,155 **** GtkCTreeNode *node); ! GtkCTreeNode *show_server_dn(GtkCTree *tree, struct ldapserver *server, const char *dn, gboolean select_node); ! GtkCTreeNode *show_dn(GtkCTree *tree, GtkCTreeNode *node, const char *dn, gboolean select_node); --- 156,165 ---- GtkCTreeNode *node); ! GtkCTreeNode *show_server_dn(int error_context, ! GtkCTree *tree, struct ldapserver *server, const char *dn, gboolean select_node); ! GtkCTreeNode *show_dn(int error_context, ! GtkCTree *tree, GtkCTreeNode *node, const char *dn, gboolean select_node); Index: configfile.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.c,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** configfile.c 23 Oct 2003 05:26:37 -0000 1.47 --- configfile.c 2 Nov 2003 07:20:43 -0000 1.48 *************** *** 294,298 **** char *rcpath; ! load_context = error_new_context(_("Error loading configfile")); rcpath = filename_config(load_context); --- 294,298 ---- char *rcpath; ! load_context = error_new_context(_("Error loading configfile"), NULL); rcpath = filename_config(load_context); *************** *** 504,510 **** } ! void save_config_internal(int write_context, ! struct gq_config *cfg, ! const char *rcpath) { GList *templatelist, *oclist, *filterlist; --- 504,510 ---- } ! gboolean save_config_internal(int write_context, ! struct gq_config *cfg, ! const char *rcpath) { GList *templatelist, *oclist, *filterlist; *************** *** 517,525 **** int mode = S_IRUSR|S_IWUSR; GList *I; if (cfg->config_version > CURRENT_CONFIG_VERSION) { error_push(write_context, _("Configuration file version too high - saving the configuration is not possible")); ! return; } --- 517,526 ---- int mode = S_IRUSR|S_IWUSR; GList *I; + gboolean ok = FALSE; if (cfg->config_version > CURRENT_CONFIG_VERSION) { error_push(write_context, _("Configuration file version too high - saving the configuration is not possible")); ! return FALSE; } *************** *** 543,547 **** strerror(errno)); g_free(tmprcpath); ! return; } fchmod(fileno(wc->outfile), mode); --- 544,548 ---- strerror(errno)); g_free(tmprcpath); ! return FALSE; } fchmod(fileno(wc->outfile), mode); *************** *** 716,745 **** if (rename(tmprcpath, rcpath) == 0) { ! cfg->changed = 0; } else { error_push(write_context, _("Could not replace old configuration (%1$s) with the new one (%2$s):\n%3$s\n"), rcpath, tmprcpath, strerror(errno)); } g_free(tmprcpath); } ! void save_config() { char *rcpath; ! int write_context = error_new_context(_("Error writing configfile")); rcpath = filename_config(write_context); if(!rcpath) { ! error_flush(write_context); ! return; } ! save_config_internal(write_context, config, rcpath); - error_flush(write_context); g_free(rcpath); } --- 717,766 ---- if (rename(tmprcpath, rcpath) == 0) { ! ok =TRUE; } else { error_push(write_context, _("Could not replace old configuration (%1$s) with the new one (%2$s):\n%3$s\n"), rcpath, tmprcpath, strerror(errno)); + ok = FALSE; + } + + if (ok) { + statusbar_msg(_("Configuration saved to '%s'"), rcpath); + } else { + statusbar_msg(_("Saving configuration to '%s' failed."), rcpath); } g_free(tmprcpath); + + return ok; } + gboolean save_config(GtkWidget *transient_for) + { + int write_context = error_new_context(_("Error writing configfile"), + transient_for); + + gboolean ok = save_config_ext(write_context); ! error_flush(write_context); ! ! return ok; ! } ! ! gboolean save_config_ext(int write_context) { char *rcpath; ! gboolean ok; rcpath = filename_config(write_context); if(!rcpath) { ! return FALSE; } ! ok = save_config_internal(write_context, config, rcpath); g_free(rcpath); + + return ok; } *************** *** 766,770 **** cfg->schemaserver = g_strdup(""); /* [0] = '\0'; */ cfg->defaultDT = g_hash_table_new(g_str_hash, g_str_equal); - cfg->changed = 0; cfg->restore_window_sizes = DEFAULT_RESTORE_SIZES; --- 787,790 ---- *************** *** 825,829 **** /* actually do the upgrade if requested */ ! if (dosave) save_config(); } --- 845,849 ---- /* actually do the upgrade if requested */ ! if (dosave) save_config(NULL); } Index: configfile.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/configfile.h,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** configfile.h 23 Oct 2003 05:26:37 -0000 1.34 --- configfile.h 2 Nov 2003 07:20:43 -0000 1.35 *************** *** 115,119 **** GHashTable *defaultDT; - int changed; }; --- 115,118 ---- *************** *** 179,183 **** void load_config(void); ! void save_config(void); void init_config(void); --- 178,183 ---- void load_config(void); ! gboolean save_config(GtkWidget *transient_for); ! gboolean save_config_ext(int error_context); void init_config(void); Index: dn-browse.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** dn-browse.c 28 Oct 2003 19:23:52 -0000 1.8 --- dn-browse.c 2 Nov 2003 07:20:43 -0000 1.9 *************** *** 136,145 **** if (IS_DN_ENTRY(entry)) { char *dn = entry->dn; struct ldapserver *server = (struct ldapserver *) gtk_object_get_data(GTK_OBJECT(widget), "server"); ! new_from_entry(server, dn); } } --- 136,150 ---- if (IS_DN_ENTRY(entry)) { char *dn = entry->dn; + int error_context = + error_new_context(_("Creating new entry from existing entry"), + GTK_WIDGET(widget)); struct ldapserver *server = (struct ldapserver *) gtk_object_get_data(GTK_OBJECT(widget), "server"); + + new_from_entry(error_context, server, dn); ! error_flush(error_context); } } *************** *** 153,156 **** --- 158,162 ---- struct inputform *iform; dn_browse_entry *entry; + int error_context; server = (struct ldapserver *) gtk_object_get_data(GTK_OBJECT(widget), *************** *** 160,163 **** --- 166,174 ---- if (!IS_DN_ENTRY(entry)) return; + error_context = + error_new_context(_("Creating now entry from template"), + widget); + + iform = new_inputform(); iform->dn = NULL; *************** *** 165,169 **** ldapserver_ref(server); ! formlist = formfill_from_template(server, template); if(formlist) { iform->formlist = formlist; --- 176,180 ---- ldapserver_ref(server); ! formlist = formfill_from_template(error_context, server, template); if(formlist) { iform->formlist = formlist; *************** *** 179,186 **** create_form_window(iform); create_form_content(iform); ! build_inputform(iform); } else { free_inputform(iform); } #endif /* HAVE_LDAP_STR2OBJECTCLASS */ } --- 190,200 ---- create_form_window(iform); create_form_content(iform); ! ! build_inputform(error_context, iform); } else { free_inputform(iform); } + + error_flush(error_context); #endif /* HAVE_LDAP_STR2OBJECTCLASS */ } *************** *** 194,197 **** --- 208,212 ---- GList *to_export = NULL; struct dn_on_server *dos; + int error_context; ctree = BROWSETAB(tab)->ctreeroot; *************** *** 206,214 **** return; dos = new_dn_on_server(((dn_browse_entry *)e)->dn, server); dos->flags = LDAP_SCOPE_SUBTREE; /* default is LDAP_SCOPE_BASE */ to_export = g_list_append(to_export, dos); ! export_many(tab->win->mainwin, to_export); } --- 221,234 ---- return; + error_context = error_new_context(_("Exporting entry to LDIF"), + tab->win->mainwin); + dos = new_dn_on_server(((dn_browse_entry *)e)->dn, server); dos->flags = LDAP_SCOPE_SUBTREE; /* default is LDAP_SCOPE_BASE */ to_export = g_list_append(to_export, dos); ! export_many(error_context, tab->win->mainwin, to_export); ! ! error_flush(error_context); } *************** *** 262,266 **** if (do_delete) { ! if (delete_entry_full(server, entry->dn, TRUE)) { browse_entry *p_entry; GtkCTreeNode *parent = GTK_CTREE_ROW(node)->parent; --- 282,288 ---- if (do_delete) { ! int ctx = error_new_context(_("Deleting entry/subtree"), ! GTK_WIDGET(ctree)); ! if (delete_entry_full(ctx, server, entry->dn, TRUE)) { browse_entry *p_entry; GtkCTreeNode *parent = GTK_CTREE_ROW(node)->parent; *************** *** 276,283 **** assert(p_entry->base_methods); if (p_entry->base_methods->refresh) ! p_entry->base_methods->refresh(p_entry, ctree, parent, tab); } } } gtk_clist_thaw(GTK_CLIST(ctree)); --- 298,306 ---- assert(p_entry->base_methods); if (p_entry->base_methods->refresh) ! p_entry->base_methods->refresh(p_entry, ctx, ctree, parent, tab); } } + error_flush(ctx); } gtk_clist_thaw(GTK_CLIST(ctree)); *************** *** 295,301 **** * Destructor for dn_browse_entry objects */ ! static void destroy_dn_browse_entry(dn_browse_entry *entry) { ! if (!entry) return; if (entry->dn) g_free(entry->dn); free(entry); --- 318,330 ---- * Destructor for dn_browse_entry objects */ ! static void destroy_dn_browse_entry(browse_entry *e) { ! dn_browse_entry *entry; ! ! if (!e) return; ! ! assert(IS_DN_ENTRY(e)); ! entry = DN_BROWSE_ENTRY(e); ! if (entry->dn) g_free(entry->dn); free(entry); *************** *** 303,307 **** ! static void dn_browse_entry_expand(dn_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, --- 332,337 ---- ! static void dn_browse_entry_expand(browse_entry *be, ! int error_context, GtkCTree *ctree, GtkCTreeNode *node, *************** *** 316,324 **** char *ref[] = { "ref", NULL }; char *c, **refs; ! int context = error_new_context(_("Expand entry")); LDAPControl ct; LDAPControl *ctrls[2] = { NULL, NULL } ; ! assert(IS_DN_ENTRY(entry)); if (!entry->seen) { --- 346,356 ---- char *ref[] = { "ref", NULL }; char *c, **refs; ! dn_browse_entry *entry; ! LDAPControl ct; LDAPControl *ctrls[2] = { NULL, NULL } ; ! assert(IS_DN_ENTRY(be)); ! entry = DN_BROWSE_ENTRY(be); if (!entry->seen) { *************** *** 334,340 **** } ! if( (ld = open_connection(server)) == NULL) { gtk_clist_thaw(GTK_CLIST(ctree)); - error_flush(context); return; } --- 366,371 ---- } ! if( (ld = open_connection(error_context, server)) == NULL) { gtk_clist_thaw(GTK_CLIST(ctree)); return; } *************** *** 489,494 **** if (rc != LDAP_SUCCESS) { /* FIXME: better error message (but what is the exact cause?)*/ ! error_push(context, ldap_err2string(rc)); ! push_ldap_addl_error(ld, context); if (rc == LDAP_SERVER_DOWN) { --- 520,525 ---- if (rc != LDAP_SUCCESS) { /* FIXME: better error message (but what is the exact cause?)*/ ! error_push(error_context, ldap_err2string(rc)); ! push_ldap_addl_error(ld, error_context); if (rc == LDAP_SERVER_DOWN) { *************** *** 505,517 **** " - %s", _("time limit exceeded")); } else if (err != LDAP_SUCCESS) { ! error_push(context, ldap_err2string(err)); ! push_ldap_addl_error(ld, context); if (c && strlen(c)) { ! error_push(context, _("Matched DN: %s"), c); } if (refs) { int i; for (i = 0 ; refs[i] ; i++) { ! error_push(context, _("Referral to: %s"), refs[i]); } --- 536,548 ---- " - %s", _("time limit exceeded")); } else if (err != LDAP_SUCCESS) { ! error_push(error_context, ldap_err2string(err)); ! push_ldap_addl_error(ld, error_context); if (c && strlen(c)) { ! error_push(error_context, _("Matched DN: %s"), c); } if (refs) { int i; for (i = 0 ; refs[i] ; i++) { ! error_push(error_context, _("Referral to: %s"), refs[i]); } *************** *** 540,545 **** */ - error_flush(context); - done: if (res) ldap_msgfree(res); --- 571,574 ---- *************** *** 547,551 **** } ! static void browse_edit_from_entry(dn_browse_entry *entry, GtkCTree *ctreeroot, GtkCTreeNode *ctreenode, --- 576,581 ---- } ! static void browse_edit_from_entry(browse_entry *e, ! int error_context, GtkCTree *ctreeroot, GtkCTreeNode *ctreenode, *************** *** 558,563 **** char *dn; /* int hidden = 0; */ ! assert(IS_DN_ENTRY(entry)); if (ctreenode == NULL) --- 588,595 ---- char *dn; /* int hidden = 0; */ + dn_browse_entry *entry; ! assert(IS_DN_ENTRY(e)); ! entry = DN_BROWSE_ENTRY(e); if (ctreenode == NULL) *************** *** 593,599 **** tmplist = NULL; ! oldlist = formlist_from_entry(server, dn, 0); #ifdef HAVE_LDAP_STR2OBJECTCLASS ! oldlist = add_schema_attrs(server, oldlist); #endif --- 625,631 ---- tmplist = NULL; ! oldlist = formlist_from_entry(error_context, server, dn, 0); #ifdef HAVE_LDAP_STR2OBJECTCLASS ! oldlist = add_schema_attrs(error_context, server, oldlist); #endif *************** *** 624,628 **** create_form_content(iform); ! build_inputform(iform); } else { inputform_free(iform); --- 656,660 ---- create_form_content(iform); ! build_inputform(error_context, iform); } else { inputform_free(iform); *************** *** 632,647 **** } ! static void dn_browse_entry_refresh(dn_browse_entry *entry, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { ! refresh_subtree(ctree, node); ! entry->base_methods->select((browse_entry *) entry, ctree, node, tab); ! } ! static char* dn_browse_entry_get_name(dn_browse_entry *entry, gboolean long_form) { --- 664,682 ---- } ! static void dn_browse_entry_refresh(browse_entry *entry, ! int error_context, GtkCTree *ctree, GtkCTreeNode *node, struct tab *tab) { + assert(IS_DN_ENTRY(entry)); ! refresh_subtree(error_context, ctree, node); ! DN_BROWSE_ENTRY(entry)->base_methods->select(entry, ! error_context, ! ctree, node, tab); } ! static char* dn_browse_entry_get_name(browse_entry *entry, gboolean long_form) { *************** *** 655,661 **** if (long_form) { ! return g_strdup(entry->dn); } else { ! exploded_dn = gq_ldap_explode_dn(entry->dn, FALSE); #if GTK_MAJOR >= 2 --- 690,696 ---- if (long_form) { ! return g_strdup(DN_BROWSE_ENTRY(entry)->dn); } else { ! exploded_dn = gq_ldap_explode_dn(DN_BROWSE_ENTRY(entry)->dn, FALSE); #if GTK_MAJOR >= 2 *************** *** 674,678 **** } ! static void dn_browse_entry_popup(dn_browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, --- 709,713 ---- } ! static void dn_browse_entry_popup(browse_entry *entry, GtkWidget *menu, GtkWidget *ctreeroot, GtkCTreeNode *ctree_node, *************** *** 840,849 **** static struct browse_entry_vtab dn_vtab = { ! (browse_entry_destructor) destroy_dn_browse_entry, /* destroy */ ! (browse_entry_expand) dn_browse_entry_expand, /* expand */ ! (browse_entry_select) browse_edit_from_entry, /* select */ ! (browse_entry_refresh) dn_browse_entry_refresh, /* refresh */ ! (browse_entry_get_name) dn_browse_entry_get_name, /* get_name */ ! (browse_entry_popup) dn_browse_entry_popup, /* popup */ }; --- 875,884 ---- static struct browse_entry_vtab dn_vtab = { ! destroy_dn_browse_entry, /* destroy */ ! dn_browse_entry_expand, /* expand */ ! browse_edit_from_entry, /* select */ ! dn_browse_entry_refresh, /* refresh */ ! dn_browse_entry_get_name, /* get_name */ ! dn_browse_entry_popup, /* popup */ }; *************** *** 857,861 **** e = g_malloc0(sizeof(dn_browse_entry)); ! e->type = DN_BROWSE_ENTRY; e->base_methods = &dn_vtab; --- 892,896 ---- e = g_malloc0(sizeof(dn_browse_entry)); ! e->type = DN_BROWSE_ENTRY_ID; e->base_methods = &dn_vtab; Index: dn-browse.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dn-browse.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dn-browse.h 17 Oct 2003 07:26:25 -0000 1.1 --- dn-browse.h 2 Nov 2003 07:20:43 -0000 1.2 *************** *** 35,39 **** * A browse_entry describing a singe DN (eg. a single LDAP object) */ ! #define DN_BROWSE_ENTRY 1 typedef struct { /* common */ --- 35,39 ---- * A browse_entry describing a singe DN (eg. a single LDAP object) */ ! #define DN_BROWSE_ENTRY_ID 1 typedef struct { /* common */ *************** *** 51,55 **** } dn_browse_entry; ! #define IS_DN_ENTRY(entry) IS_ENTRY((entry), DN_BROWSE_ENTRY) browse_entry *new_dn_browse_entry(const char *dn); --- 51,56 ---- } dn_browse_entry; ! #define IS_DN_ENTRY(entry) IS_ENTRY((entry), DN_BROWSE_ENTRY_ID) ! #define DN_BROWSE_ENTRY(x) ((dn_browse_entry*)(x)) browse_entry *new_dn_browse_entry(const char *dn); Index: dt_binary.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_binary.c,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** dt_binary.c 12 Oct 2003 06:14:18 -0000 1.15 --- dt_binary.c 2 Nov 2003 07:20:43 -0000 1.16 *************** *** 160,169 **** } ! GtkWidget *dt_binary_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) { ! GtkWidget *w = dt_generic_binary_get_widget(form, data, activatefunc, funcdata); --- 160,170 ---- } ! GtkWidget *dt_binary_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) { ! GtkWidget *w = dt_generic_binary_get_widget(error_context, form, data, activatefunc, funcdata); Index: dt_binary.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_binary.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dt_binary.h 28 Sep 2003 03:26:25 -0000 1.5 --- dt_binary.h 2 Nov 2003 07:20:43 -0000 1.6 *************** *** 41,45 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_binary_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, --- 41,46 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_binary_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, Index: dt_clist.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_clist.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dt_clist.c 24 Oct 2003 19:09:30 -0000 1.7 --- dt_clist.c 2 Nov 2003 07:20:43 -0000 1.8 *************** *** 90,99 **** GtkWidget *data_widget); ! GtkWidget *dt_clist_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) { ! GtkWidget *w = dt_generic_binary_get_widget(form, data, activatefunc, funcdata); --- 90,100 ---- GtkWidget *data_widget); ! GtkWidget *dt_clist_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) { ! GtkWidget *w = dt_generic_binary_get_widget(error_context, form, data, activatefunc, funcdata); Index: dt_clist.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_clist.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dt_clist.h 28 Sep 2003 03:26:25 -0000 1.2 --- dt_clist.h 2 Nov 2003 07:20:43 -0000 1.3 *************** *** 58,62 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_clist_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, --- 58,63 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_clist_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, Index: dt_entry.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_entry.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** dt_entry.c 12 Oct 2003 06:14:18 -0000 1.11 --- dt_entry.c 2 Nov 2003 07:20:43 -0000 1.12 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_entry.c) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 79,83 **** ! GtkWidget *dt_entry_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) --- 77,82 ---- ! GtkWidget *dt_entry_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) Index: dt_entry.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_entry.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dt_entry.h 2 Oct 2003 16:16:25 -0000 1.6 --- dt_entry.h 2 Nov 2003 07:20:43 -0000 1.7 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_entry.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 45,49 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_entry_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 43,48 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_entry_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_generic_binary.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_generic_binary.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** dt_generic_binary.c 12 Oct 2003 06:14:18 -0000 1.11 --- dt_generic_binary.c 2 Nov 2003 07:20:43 -0000 1.12 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_generic_binary.c) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 180,184 **** } ! GtkWidget *dt_generic_binary_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, --- 178,183 ---- } ! GtkWidget *dt_generic_binary_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, Index: dt_generic_binary.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_generic_binary.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dt_generic_binary.h 28 Sep 2003 03:26:25 -0000 1.6 --- dt_generic_binary.h 2 Nov 2003 07:20:43 -0000 1.7 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_generic_binary.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 56,60 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_generic_binary_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, --- 54,59 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_generic_binary_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, Index: dt_int.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_int.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dt_int.c 21 Oct 2003 20:53:42 -0000 1.2 --- dt_int.c 2 Nov 2003 07:20:43 -0000 1.3 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_entry.c) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 130,134 **** } ! GtkWidget *dt_int_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) --- 128,133 ---- } ! GtkWidget *dt_int_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) Index: dt_int.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_int.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dt_int.h 21 Oct 2003 04:46:41 -0000 1.1 --- dt_int.h 2 Nov 2003 07:20:43 -0000 1.2 *************** *** 40,44 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_int_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 40,45 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_int_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_numstr.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_numstr.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dt_numstr.c 21 Oct 2003 04:46:41 -0000 1.1 --- dt_numstr.c 2 Nov 2003 07:20:43 -0000 1.2 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_entry.c) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 112,118 **** } ! GtkWidget *dt_numstr_get_widget(struct formfill *form, GByteArray *data, ! GtkSignalFunc *activatefunc, ! gpointer funcdata) { GtkWidget *hbox, *inputbox, *label; --- 110,117 ---- } ! GtkWidget *dt_numstr_get_widget(int error_context, ! struct formfill *form, GByteArray *data, ! GtkSignalFunc *activatefunc, ! gpointer funcdata) { GtkWidget *hbox, *inputbox, *label; Index: dt_numstr.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_numstr.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dt_numstr.h 21 Oct 2003 04:46:41 -0000 1.1 --- dt_numstr.h 2 Nov 2003 07:20:43 -0000 1.2 *************** *** 40,44 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_numstr_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 40,45 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_numstr_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_oc.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_oc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** dt_oc.c 18 Oct 2003 08:13:17 -0000 1.19 --- dt_oc.c 2 Nov 2003 07:20:43 -0000 1.20 *************** *** 105,109 **** ! static gboolean do_change(struct change_info *ci); /* Oh what a dirty hack - in order to allow browse selection to work --- 105,109 ---- ! static gboolean do_change(int error_context, struct change_info *ci); /* Oh what a dirty hack - in order to allow browse selection to work *************** *** 132,135 **** --- 132,136 ---- gchar *newtext; gboolean rebuild = FALSE; + int ctx; gtk_timeout_remove(ci->id); *************** *** 142,149 **** ci->newtext = newtext; ! rebuild = do_change(ci); if (rebuild) { ! build_or_update_inputform(ci->iform, FALSE); } return FALSE; } --- 143,155 ---- ci->newtext = newtext; ! ctx = error_new_context(_("Changing objectClass attribute"), ! GTK_WIDGET(c)); ! ! rebuild = do_change(ctx, ci); if (rebuild) { ! build_or_update_inputform(ctx, ci->iform, FALSE); } + + error_flush(ctx); return FALSE; } *************** *** 189,193 **** } ! static gboolean do_change(struct change_info *ci) { gchar *newtext = ci->newtext; --- 195,199 ---- } ! static gboolean do_change(int error_context, struct change_info *ci) { gchar *newtext = ci->newtext; *************** *** 218,222 **** up an error message */ ! ss = get_schema(server); if (strlen(newtext) > 0) { --- 224,228 ---- up an error message */ ! ss = get_schema(error_context, server); if (strlen(newtext) > 0) { *************** *** 243,251 **** if (!found) { - GString *msg = g_string_sized_new(200); - g_string_sprintf(msg, - _("Missing superior objectClass %s"), - *cp); - /* this will fire the change signals again, thus the changeinfo data structure may not be freed */ --- 249,252 ---- *************** *** 254,260 **** ci->newtext = NULL; ! error_popup(_("Missing superior objectClass"), ! msg->str); ! g_string_free(msg, TRUE); return FALSE; --- 255,260 ---- ci->newtext = NULL; ! error_push(error_context, ! _("Missing superior objectClass %s"), *cp); return FALSE; *************** *** 361,369 **** continue; } ! if( (form = new_formfill()) == NULL) { ! error_popup(_("Oops!"), ! _("Not enough memory to make form.")); ! return TRUE; /* ?? */ ! } form->server = server; ldapserver_ref(server); --- 361,367 ---- continue; } ! form = new_formfill(); ! assert(form); ! form->server = server; ldapserver_ref(server); *************** *** 378,382 **** form->flags |= FLAG_NO_USER_MOD; } ! set_displaytype(server, form); formlist = formlist_append(formlist, form); n++; --- 376,380 ---- form->flags |= FLAG_NO_USER_MOD; } ! set_displaytype(error_context, server, form); formlist = formlist_append(formlist, form); n++; *************** *** 393,401 **** } ! if( (form = new_formfill()) == NULL) { ! error_popup(_("Oops!"), ! _("Not enough memory to make form.")); ! return TRUE; /* ?? */ ! } form->server = server; ldapserver_ref(server); --- 391,397 ---- } ! form = new_formfill(); ! assert(form); ! form->server = server; ldapserver_ref(server); *************** *** 409,413 **** form->flags |= FLAG_NO_USER_MOD; } ! set_displaytype(server, form); formlist = formlist_append(formlist, form); n++; --- 405,409 ---- form->flags |= FLAG_NO_USER_MOD; } ! set_displaytype(error_context, server, form); formlist = formlist_append(formlist, form); n++; *************** *** 426,430 **** ! GtkWidget *dt_oc_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) --- 422,427 ---- ! GtkWidget *dt_oc_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) *************** *** 446,450 **** pop = NULL; pop = g_list_append(pop, ""); ! ss = get_schema(server); if (ss) { --- 443,448 ---- pop = NULL; pop = g_list_append(pop, ""); ! ! ss = get_schema(error_context, server); if (ss) { Index: dt_oc.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_oc.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dt_oc.h 28 Sep 2003 03:26:25 -0000 1.3 --- dt_oc.h 2 Nov 2003 07:20:43 -0000 1.4 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_oc.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 40,44 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_oc_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 38,43 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_oc_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_password.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_password.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** dt_password.c 27 Oct 2003 22:08:03 -0000 1.20 --- dt_password.c 2 Nov 2003 07:20:43 -0000 1.21 *************** *** 371,375 **** #endif /* HAVE_LIBCRYPTO */ ! GtkWidget *dt_password_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) --- 371,376 ---- #endif /* HAVE_LIBCRYPTO */ ! GtkWidget *dt_password_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) Index: dt_password.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_password.h,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** dt_password.h 17 Oct 2003 10:07:40 -0000 1.8 --- dt_password.h 2 Nov 2003 07:20:43 -0000 1.9 *************** *** 2,8 **** GQ -- a GTK-based LDAP client Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_password.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 2,6 ---- GQ -- a GTK-based LDAP client Copyright (C) 1998-2001 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 43,47 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_password_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 41,46 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_password_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_text.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_text.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** dt_text.c 13 Oct 2003 07:25:00 -0000 1.14 --- dt_text.c 2 Nov 2003 07:20:43 -0000 1.15 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_text.c) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 87,91 **** } ! GtkWidget *dt_text_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) --- 85,90 ---- } ! GtkWidget *dt_text_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata) Index: dt_text.h =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_text.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dt_text.h 13 Oct 2003 07:25:01 -0000 1.7 --- dt_text.h 2 Nov 2003 07:20:43 -0000 1.8 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Bert Vermeulen ! ! This file (dt_text.h) is ! Copyright (C) 2002 by Peter Stamfest and Bert Vermeulen This program is released under the Gnu General Public License with --- 1,6 ---- /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2003 Bert Vermeulen ! Copyright (C) 2002-2003 Peter Stamfest This program is released under the Gnu General Public License with *************** *** 38,42 **** /* Methods, only to be used by subclasses */ ! GtkWidget *dt_text_get_widget(struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); --- 36,41 ---- /* Methods, only to be used by subclasses */ ! GtkWidget *dt_text_get_widget(int error_context, ! struct formfill *form, GByteArray *data, GtkSignalFunc *activatefunc, gpointer funcdata); Index: dt_time.c =================================================================== RCS file: /cvsroot/gqclient/gq/src/dt_time.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dt_time.c 12 Oct 2003 06:14:18 -0000 1.10 --- dt_time.c 2 Nov 2003 07:20:43 -0000 1.11 *************** *** 1,8 **** /* GQ -- a GTK-based LDAP client ! Copyright (C) 1998-2001 Ber... [truncated message content] |