35
35
# include <config.h>
36
36
#endif /* HAVE_CONFIG_H */
38
#include "errorchain.h"
39
#include "gq-browser-model.h"
38
40
#include "gq-browser-node-dn.h"
41
#include "gq-export-dialog.h"
42
#include "gq-server-dn.h"
43
#include "gq-server-dialog.h"
39
44
#include "gq-tab-browse.h"
45
#include "gq-utilities.h" /* get_suffixes */
40
46
#include "prefs.h" /* create_edit_server_window */
41
#include "util.h" /* get_suffixes */
43
#include "browse-export.h"
44
#include "errorchain.h"
47
49
#include "browse-dnd.h"
51
53
* Really add a single suffix to the tree
53
static void add_suffix(GqBrowserNodeServer *entry,
54
GQTreeWidget *ctreeroot, GQTreeWidgetNode *node,
57
GQTreeWidgetNode *new_item;
58
GqBrowserNode *new_entry = gq_browser_node_dn_new(suffix);
60
new_item = gq_tree_insert_node (ctreeroot,
66
gq_tree_insert_dummy_node (ctreeroot,
71
server_browse_entry_destroy(GqBrowserNode *entry)
56
add_suffix(GqBrowserNodeServer* entry,
73
GqBrowserNodeServer* self;
74
g_return_if_fail(GQ_IS_BROWSER_NODE_SERVER(entry));
76
self = GQ_BROWSER_NODE_SERVER(entry);
77
g_object_unref(self->server);
61
GqServerDn * server_entry = gq_server_dn_new(suffix, entry->server);
62
GqBrowserNode * new_entry = gq_browser_node_dn_new(server_entry);
63
g_object_unref(server_entry);
64
gq_browser_model_add_node(GQ_BROWSER_MODEL(model), iter, new_entry);
83
67
static void server_browse_entry_expand(GqBrowserNode *e,
85
GQTreeWidget *ctree, GQTreeWidgetNode *node,
71
GQTreeWidgetNode *node,
76
gpointer dummy G_GNUC_UNUSED
88
80
GList *suffixes = NULL, *next;
89
81
GqBrowserNodeServer *entry;
91
g_assert(GQ_IS_BROWSER_NODE_SERVER(e));
83
g_return_if_fail(GQ_IS_BROWSER_NODE_SERVER(e));
92
84
entry = GQ_BROWSER_NODE_SERVER(e);
94
86
if (!entry->once_expanded) {
95
87
/* printf("expanding %s\n", entry->server->name); */
97
89
gq_tree_remove_children (ctree, node);
98
91
entry->once_expanded = 1;
100
93
suffixes = get_suffixes(error_context, entry->server);
102
95
gtk_clist_freeze(GTK_CLIST(ctree));
104
97
for (next = suffixes ; next ; next = g_list_next(next) ) {
105
add_suffix(entry, ctree, node, next->data);
106
105
g_free(next->data);
107
106
next->data = NULL;
108
#ifndef USE_TREE_VIEW
110
109
gtk_clist_thaw(GTK_CLIST(ctree));
112
111
g_list_free(suffixes);
121
120
static void server_browse_entry_selected(GqBrowserNode *be,
122
121
int error_context,
122
#ifndef USE_TREE_VIEW
123
123
GQTreeWidget *ctree,
124
124
GQTreeWidgetNode *node,
127
GtkWidget *pane2_scrwin, *pane2_vbox, *label, *e;
131
GtkWidget *pane2_vbox, *label, *e;
128
132
GtkWidget *table;
133
gchar const*server_name;
138
142
ld = open_connection(error_context, entry->server);
141
server_name = entry->server->name; /* dn_by_node(node); */
142
record_path(tab, GQ_BROWSER_NODE(entry), ctree, node);
144
pane2_scrwin = GQ_TAB_BROWSE(tab)->pane2_scrwin;
145
pane2_vbox = GQ_TAB_BROWSE(tab)->pane2_vbox;
147
/* gtk_widget_destroy(pane2_vbox); */
148
/* remove the viewport of the scrolled window. This should
149
_really_ destroy the widgets below it. The pane2_scrwin
150
is a GtkBin Object and thus has only one child, use this
151
to obtain the viewport */
153
gtk_container_remove(GTK_CONTAINER(pane2_scrwin),
154
GTK_BIN(pane2_scrwin)->child);
145
server_name = gq_server_get_name(entry->server); /* dn_by_node(node); */
147
#ifndef USE_TREE_VIEW
156
154
pane2_vbox = gtk_vbox_new(FALSE, 2);
157
GQ_TAB_BROWSE(tab)->pane2_vbox = pane2_vbox;
159
156
gtk_widget_show(pane2_vbox);
160
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pane2_scrwin),
157
gq_tab_browse_set_content(GQ_TAB_BROWSE(tab), pane2_vbox);
163
159
table = gtk_table_new(5, 2, FALSE);
164
160
gtk_container_border_width(GTK_CONTAINER(table), 5);
200
196
e = gtk_entry_new();
201
gtk_entry_set_text(GTK_ENTRY(e), entry->server->ldaphost);
197
gtk_entry_set_text(GTK_ENTRY(e), gq_server_get_host(entry->server));
202
198
gtk_widget_set_sensitive(e, FALSE);
203
199
gtk_widget_show(e);
204
200
gtk_table_attach(GTK_TABLE(table),
219
215
GTK_EXPAND | GTK_SHRINK | GTK_FILL,
222
g_snprintf(buf, sizeof(buf), "%d", entry->server->ldapport);
218
g_snprintf(buf, sizeof(buf), "%d", gq_server_get_port(entry->server));
223
219
e = gtk_entry_new();
224
220
gtk_entry_set_text(GTK_ENTRY(e), buf);
225
221
gtk_widget_set_sensitive(e, FALSE);
245
241
g_snprintf(buf, sizeof(buf), "%s",
246
entry->server->cacheconn ? _("on") : _("off"));
242
gq_server_get_cache_connection(entry->server) ? _("on") : _("off"));
247
243
e = gtk_entry_new();
248
244
gtk_entry_set_text(GTK_ENTRY(e), buf);
249
245
gtk_widget_set_sensitive(e, FALSE);
270
266
g_snprintf(buf, sizeof(buf), "%s",
271
entry->server->enabletls ? _("on") : _("off"));
267
gq_server_get_use_tls(entry->server) ? _("on") : _("off"));
272
268
e = gtk_entry_new();
273
269
gtk_entry_set_text(GTK_ENTRY(e), buf);
274
270
gtk_widget_set_sensitive(e, FALSE);
475
static void server_browse_entry_refresh(GqBrowserNode *e,
478
GQTreeWidgetNode *node,
472
server_browse_entry_refresh(GqBrowserNode * e,
474
GtkTreeModel * model,
481
GqBrowserNodeServer *entry;
478
GqBrowserNodeServer *entry;
483
g_assert(GQ_IS_BROWSER_NODE_SERVER(e));
484
entry = GQ_BROWSER_NODE_SERVER(e);
480
g_return_if_fail(GQ_IS_BROWSER_NODE_SERVER(e));
481
entry = GQ_BROWSER_NODE_SERVER(e);
486
483
entry->once_expanded = 0;
488
gtk_clist_freeze(GTK_CLIST(ctree));
490
server_browse_entry_selected(e, error_context, ctree, node, tab);
492
gq_tree_fire_expand_callback (ctree, node);
485
server_browse_entry_selected(e, error_context, model, iter, tab);
487
#warning "FIXME: enable the next line"
488
//gq_tree_fire_expand_callback (ctree, node);
494
489
/* server_browse_entry_expand(entry, ctree, node, tab); */
496
gtk_clist_thaw(GTK_CLIST(ctree));
501
static char* server_browse_entry_get_name(GqBrowserNode *entry,
494
server_browse_entry_get_name(GqBrowserNode const* entry,
495
gboolean long_form G_GNUC_UNUSED)
504
g_assert(GQ_IS_BROWSER_NODE_SERVER(entry));
497
g_return_val_if_fail(GQ_IS_BROWSER_NODE_SERVER(entry), NULL);
506
return g_strdup(GQ_BROWSER_NODE_SERVER(entry)->server->name);
499
return g_strdup(gq_server_get_name(GQ_BROWSER_NODE_SERVER(entry)->server));
509
502
struct edit_server_cb_data {
521
static void edit_server_activated(struct edit_server_cb_data *cbd)
515
edit_server_activated(struct edit_server_cb_data *cbd)
523
create_edit_server_window(cbd->server, cbd->tab->win->mainwin);
517
GtkWidget* dialog = gq_server_dialog_new(cbd->server, GTK_WINDOW(cbd->tab->win->mainwin));
518
gtk_dialog_run(GTK_DIALOG(dialog));
519
gtk_widget_destroy(dialog);
526
static void dump_server(GtkWidget *widget, GqTab *tab)
523
dump_server(GqTab* tab)
529
GQTreeWidgetNode *node;
530
526
GqBrowserNode *e;
531
527
GqServer *server;
532
528
GList *bases = NULL;
533
529
GList *to_export = NULL, *I;
534
struct dn_on_server *dos;
535
531
int error_context;
537
ctree = GQ_TAB_BROWSE(tab)->ctreeroot;
538
node = GQ_TAB_BROWSE(tab)->tree_row_popped_up;
539
e = GQ_BROWSER_NODE(gq_tree_get_node_data (ctree, node));
533
ctree = GTK_TREE_VIEW(GQ_TAB_BROWSE(tab)->ctreeroot);
534
e = gq_browser_model_get_node(GQ_BROWSER_MODEL(gtk_tree_view_get_model(ctree)),
535
&GQ_TAB_BROWSE(tab)->tree_row_popped_up);
541
537
g_assert(GQ_IS_BROWSER_NODE_SERVER(e));
543
server = server_from_node(ctree, node);
539
server = gq_browser_node_get_server(e);
545
541
if (e == NULL || server == NULL)
551
547
bases = get_suffixes(error_context, GQ_BROWSER_NODE_SERVER(e)->server);
553
/* turn suffixes list into a list of dn_on_server objects
549
/* turn suffixes list into a list of GqServerDn objects
554
550
(impedance match) */
555
551
for (I = g_list_first(bases) ; I ; I = g_list_next(I) ) {
556
dos = new_dn_on_server(I->data, server);
552
dos = gq_server_dn_new(I->data, server);
557
553
dos->flags = LDAP_SCOPE_SUBTREE; /* default is LDAP_SCOPE_BASE */
558
554
to_export = g_list_append(to_export, dos);
562
558
g_list_free(bases);
564
export_many(error_context, tab->win->mainwin, to_export);
560
gq_export_server_dns(error_context, GTK_WINDOW(tab->win->mainwin), to_export);
566
562
error_flush(error_context);
569
static void server_browse_entry_popup(GqBrowserNode *e,
571
GQTreeWidget *ctreeroot,
572
GQTreeWidgetNode *ctree_node,
566
server_browse_entry_popup(GqBrowserNode * e,
568
GtkTreeView * ctreeroot,
569
GtkTreeIter * ctree_node,
575
573
GtkWidget *menu_item;
576
574
GqServer *server;
577
575
struct edit_server_cb_data *cbd;
580
578
g_assert(GQ_IS_BROWSER_NODE_SERVER(e));
581
579
entry = GQ_BROWSER_NODE_SERVER(e);
583
server = server_from_node(ctreeroot, ctree_node);
581
model = gtk_tree_view_get_model(GTK_TREE_VIEW(ctreeroot));
582
server = server_from_node(model, ctree_node);
585
584
/* Edit Server settings */
586
585
menu_item = gtk_menu_item_new_with_label(_("Edit Server"));
606
605
gtk_widget_set_sensitive(menu_item, FALSE);
610
menu_item = gtk_menu_item_new_with_label(_("Export to LDIF"));
609
menu_item = gtk_image_menu_item_new_with_label(_("Export to LDIF"));
610
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),
611
gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU));
611
612
gtk_menu_append(GTK_MENU(menu), menu_item);
612
g_signal_connect(menu_item, "activate",
613
G_CALLBACK(dump_server),
613
g_signal_connect_swapped(menu_item, "activate",
614
G_CALLBACK(dump_server), tab);
615
615
gtk_widget_show(menu_item);
617
617
/* Close connection */
618
menu_item = gtk_menu_item_new_with_label(_("Close Connection"));
618
menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_DISCONNECT, NULL);
619
619
gtk_menu_append(GTK_MENU(menu), menu_item);
620
g_signal_connect(menu_item, "activate",
620
g_signal_connect_swapped(menu_item, "activate",
621
621
G_CALLBACK(tree_row_close_connection),
623
623
gtk_widget_show(menu_item);
625
if (server == NULL) {
626
gtk_widget_set_sensitive(menu_item, FALSE);
625
if(server == NULL || !gq_server_is_connected(server)) {
626
gtk_widget_set_sensitive(menu_item, FALSE);
645
gq_browser_node_server_init(GqBrowserNodeServer* self) {}
645
gq_browser_node_server_init(GqBrowserNodeServer* self G_GNUC_UNUSED) {}
648
browser_node_server_dispose(GObject* object)
650
GqBrowserNodeServer* self = GQ_BROWSER_NODE_SERVER(object);
653
g_object_unref(self->server);
657
G_OBJECT_CLASS(gq_browser_node_server_parent_class)->finalize(object);
648
661
server_node_get_property(GObject* object, guint pid, GValue* value, GParamSpec* pspec)
673
browser_node_server_notify_connected(GqBrowserNodeServer* self)
675
gq_browser_node_set_status(GQ_BROWSER_NODE(self),
676
gq_server_is_connected(self->server) ? GTK_STOCK_CONNECT : GTK_STOCK_DISCONNECT);
660
680
server_node_set_property(GObject* object, guint pid, GValue const* value, GParamSpec* pspec)
662
682
GqBrowserNodeServer* self = GQ_BROWSER_NODE_SERVER(object);
664
684
case PROP_SERVER:
665
685
if(self->server != g_value_get_object(value)) {
666
686
if(self->server) {
687
g_signal_handlers_disconnect_by_func(self->server,
688
browser_node_server_notify_connected,
667
690
g_object_unref(self->server);
668
691
self->server = NULL;
671
694
if(g_value_get_object(value)) {
672
695
self->server = g_object_ref(g_value_get_object(value));
696
g_signal_connect_swapped(self->server, "notify::connected",
697
G_CALLBACK(browser_node_server_notify_connected), self);
698
browser_node_server_notify_connected(self);
675
701
g_object_notify(object, "server");
692
718
GObjectClass* object_class = G_OBJECT_CLASS(self_class);
693
719
GqBrowserNodeClass* node_class = GQ_BROWSER_NODE_CLASS(self_class);
721
object_class->dispose = browser_node_server_dispose;
695
722
object_class->get_property = server_node_get_property;
696
723
object_class->set_property = server_node_set_property;
697
724
g_object_class_install_property(object_class,