r3445: made the gtk tooks use minimal includes. This approximately halves the
[jelmer/samba4-debian.git] / source / gtk / common / gtk-smb.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB-related GTK+ functions
4    
5    Copyright (C) Jelmer Vernooij 2004
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23 #include "gtk/common/select.h"
24 #include "gtk/common/gtk-smb.h"
25
26 void gtk_show_werror(GtkWidget *win, WERROR err) 
27 {
28         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
29                  GTK_DIALOG_DESTROY_WITH_PARENT,
30          GTK_MESSAGE_ERROR,
31          GTK_BUTTONS_CLOSE,
32                  "Windows error: %s\n", win_errstr(err));
33         gtk_dialog_run (GTK_DIALOG (dialog));
34         gtk_widget_destroy (dialog);
35 }
36                    
37 void gtk_show_ntstatus(GtkWidget *win, NTSTATUS status) 
38 {
39         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
40                  GTK_DIALOG_DESTROY_WITH_PARENT,
41          GTK_MESSAGE_ERROR,
42          GTK_BUTTONS_CLOSE,
43                  "Windows error: %s\n", nt_errstr(status));
44         gtk_dialog_run (GTK_DIALOG (dialog));
45         gtk_widget_destroy (dialog);
46 }
47
48 static void on_browse_activate  (GtkButton     *button,  gpointer         user_data)
49 {
50         GtkRpcBindingDialog *rbd = user_data;
51         GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe, TRUE);
52         if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) {
53                 gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd)));
54         }
55         
56         gtk_widget_destroy(GTK_WIDGET(shd));
57 }
58
59 static void on_krb5_toggled(GtkToggleButton *togglebutton, GtkRpcBindingDialog *d)
60 {
61         gtk_widget_set_sensitive(d->entry_password, !gtk_toggle_button_get_active(togglebutton));
62 }
63
64 static void on_ncalrpc_toggled(GtkToggleButton *tb, GtkRpcBindingDialog *d)
65 {
66         gtk_widget_set_sensitive(d->frame_host, !gtk_toggle_button_get_active(tb));
67 }
68
69 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
70 {
71         GtkWidget *dialog_vbox1;
72         GtkWidget *vbox1;
73         GtkWidget *vbox6;
74         GtkWidget *frame_transport;
75         GtkWidget *label1;
76         GtkWidget *hbox1;
77         GtkWidget *lbl_name;
78         GtkWidget *label2;
79         GtkWidget *frame_security;
80         GtkWidget *vbox2;
81         GtkWidget *label3;
82         GtkWidget *table1;
83         GtkWidget *lbl_username;
84         GtkWidget *lbl_password;
85         GtkWidget *btn_browse;
86         GtkWidget *label9;
87         GtkWidget *lbl_credentials;
88         GtkWidget *dialog_action_area1;
89         GtkWidget *btn_cancel;
90         GtkWidget *btn_connect;
91         GSList *transport_smb_group = NULL;
92
93         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
94         
95         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
96
97         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
98
99         vbox1 = gtk_vbox_new (FALSE, 0);
100         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
101
102         frame_transport = gtk_frame_new (NULL);
103         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
104
105         vbox6 = gtk_vbox_new (FALSE, 0);
106         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
107
108         gtk_rpc_binding_dialog->transport_ncalrpc = gtk_radio_button_new_with_mnemonic (NULL, "Local Host");
109         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_ncalrpc, FALSE, FALSE, 0);
110         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc), transport_smb_group);
111         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc));
112
113
114         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
115         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
116         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
117         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
118         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
119
120         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
121         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
122         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
123         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
124
125
126
127         label1 = gtk_label_new ("Transport");
128         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
129
130         gtk_rpc_binding_dialog->frame_host = gtk_frame_new (NULL);
131         gtk_box_pack_start (GTK_BOX (vbox1), gtk_rpc_binding_dialog->frame_host, TRUE, TRUE, 0);
132
133         hbox1 = gtk_hbox_new (FALSE, 0);
134         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_host), hbox1);
135
136         lbl_name = gtk_label_new ("Name");
137         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
138
139         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
140         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
141
142         if(gtk_rpc_binding_dialog->sam_pipe)
143         {
144                 btn_browse = gtk_button_new_with_label ("Browse");
145                 gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
146
147                 g_signal_connect ((gpointer) btn_browse, "pressed",
148                                                   G_CALLBACK (on_browse_activate),
149                                                   gtk_rpc_binding_dialog);
150         }
151
152         label2 = gtk_label_new ("Host");
153         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2);
154
155         frame_security = gtk_frame_new (NULL);
156         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
157
158         vbox2 = gtk_vbox_new (FALSE, 0);
159         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
160
161         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
162         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
163
164         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
165         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
166
167         label3 = gtk_label_new ("Security");
168         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
169
170         gtk_rpc_binding_dialog->frame_credentials = gtk_frame_new (NULL);
171         gtk_box_pack_start (GTK_BOX (dialog_vbox1), gtk_rpc_binding_dialog->frame_credentials, TRUE, TRUE, 0);
172
173         table1 = gtk_table_new (3, 2, FALSE);
174         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_credentials), table1);
175
176         lbl_username = gtk_label_new ("Username:");
177         gtk_table_attach (GTK_TABLE (table1), lbl_username, 0, 1, 0, 1,
178                                           (GtkAttachOptions) (GTK_FILL),
179                                           (GtkAttachOptions) (0), 0, 0);
180         gtk_misc_set_alignment (GTK_MISC (lbl_username), 0, 0.5);
181
182         lbl_password = gtk_label_new ("Password:");
183         gtk_table_attach (GTK_TABLE (table1), lbl_password, 0, 1, 1, 2,
184                                           (GtkAttachOptions) (GTK_FILL),
185                                           (GtkAttachOptions) (0), 0, 0);
186         gtk_misc_set_alignment (GTK_MISC (lbl_password), 0, 0.5);
187
188         label9 = gtk_label_new ("");
189         gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 2, 3,
190                                           (GtkAttachOptions) (GTK_FILL),
191                                           (GtkAttachOptions) (0), 0, 0);
192         gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
193
194         gtk_rpc_binding_dialog->entry_password = gtk_entry_new ();
195         gtk_entry_set_visibility (GTK_ENTRY (gtk_rpc_binding_dialog->entry_password), FALSE);
196         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_password, 1, 2, 1, 2,
197                                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
198                                           (GtkAttachOptions) (0), 0, 0);
199
200         gtk_rpc_binding_dialog->entry_username = gtk_entry_new ();
201         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_username, 1, 2, 0, 1,
202                                           (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
203                                           (GtkAttachOptions) (0), 0, 0);
204
205         gtk_entry_set_text(GTK_ENTRY(gtk_rpc_binding_dialog->entry_username), getenv("LOGNAME"));
206
207         gtk_rpc_binding_dialog->krb5_chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos");
208         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->krb5_chk_button, 1, 2, 2, 3,
209                                           (GtkAttachOptions) (GTK_FILL),
210                                           (GtkAttachOptions) (0), 0, 0);
211
212         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->krb5_chk_button, "toggled",
213                                           G_CALLBACK (on_krb5_toggled),
214                                           gtk_rpc_binding_dialog);
215
216         /* Poor man's autodetection */
217         if(getenv("KRB5CCNAME")) {
218                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->krb5_chk_button), TRUE);
219         }
220
221         lbl_credentials = gtk_label_new ("Credentials");
222         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_credentials), lbl_credentials);
223
224         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
225         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
226
227         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
228         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
229         GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
230
231         btn_connect = gtk_button_new_with_mnemonic ("_Connect");
232         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
233         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
234         GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
235
236         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->transport_ncalrpc, "toggled",
237                                                   G_CALLBACK (on_ncalrpc_toggled),
238                                                   gtk_rpc_binding_dialog);
239
240
241         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->transport_ncalrpc), TRUE);
242         gtk_widget_show_all(dialog_vbox1);
243
244         gtk_widget_grab_focus (btn_connect);
245         gtk_widget_grab_default (btn_connect);
246 }
247
248 GType gtk_rpc_binding_dialog_get_type (void)
249 {
250   static GType mytype = 0;
251
252   if (!mytype)
253     {
254       static const GTypeInfo myinfo =
255       {
256         sizeof (GtkRpcBindingDialogClass),
257         NULL,
258         NULL,
259         NULL,
260         NULL,
261         NULL,
262         sizeof(GtkRpcBindingDialog),
263         0,
264         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
265       };
266
267       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
268                 "GtkRpcBindingDialog", &myinfo, 0);
269     }
270
271   return mytype;
272 }
273
274 GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials, struct sam_pipe *sam_pipe)
275 {
276         GtkRpcBindingDialog *d = GTK_RPC_BINDING_DIALOG ( gtk_type_new (gtk_rpc_binding_dialog_get_type ()));
277         if (nocredentials) {
278                 gtk_widget_hide_all(d->frame_credentials);
279         }
280         d->sam_pipe = sam_pipe;
281         return GTK_WIDGET(d);
282 }
283
284 const char *gtk_rpc_binding_dialog_get_username(GtkRpcBindingDialog *d)
285 {
286         return gtk_entry_get_text(GTK_ENTRY(d->entry_username));
287 }
288
289 const char *gtk_rpc_binding_dialog_get_password(GtkRpcBindingDialog *d)
290 {
291         return gtk_entry_get_text(GTK_ENTRY(d->entry_password));
292 }
293
294 const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
295 {
296         return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
297 }
298
299 struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
300 {
301         struct dcerpc_binding *binding = talloc_p(mem_ctx, struct dcerpc_binding);
302
303         ZERO_STRUCT(binding->object);
304
305         /* Format: TRANSPORT:host[\pipe\foo,foo,foo] */
306
307         binding->host = talloc_strdup(mem_ctx, gtk_entry_get_text(GTK_ENTRY(d->entry_host)));
308         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip))) {
309                 binding->transport = NCACN_IP_TCP;
310         } else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_ncalrpc))) {
311                 binding->transport = NCALRPC;
312                 binding->host = NULL;
313         } else {
314                 binding->transport = NCACN_NP;
315         }
316
317         binding->options = NULL;
318         binding->flags = 0;
319         binding->endpoint = NULL;
320
321         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
322                 binding->flags |= DCERPC_SEAL;
323         }
324
325         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
326                 binding->flags |= DCERPC_SIGN;
327         }
328
329         return binding;
330 }
331
332 const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
333 {
334         return dcerpc_binding_string(mem_ctx, gtk_rpc_binding_dialog_get_binding(d, mem_ctx));
335 }
336
337 GtkWidget *create_gtk_samba_about_dialog (const char *appname)
338 {
339         GtkWidget *samba_about_dialog;
340         GtkWidget *dialog_vbox1;
341         GtkWidget *label1;
342         GtkWidget *label3;
343         GtkWidget *label2;
344         GtkWidget *dialog_action_area1;
345         GtkWidget *okbutton1;
346
347         samba_about_dialog = gtk_dialog_new ();
348         gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
349
350         dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
351
352         /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
353            gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
354
355         label1 = gtk_label_new (appname);
356         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
357
358         label3 = gtk_label_new_with_mnemonic ("Part of Samba <http://www.samba.org/>");
359         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
360
361         label2 = gtk_label_new ("\302\251 1992-2004 The Samba Team");
362         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
363
364         dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
365         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
366
367         okbutton1 = gtk_button_new_from_stock ("gtk-ok");
368         gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
369         GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
370         gtk_widget_show_all(dialog_vbox1);
371
372         return samba_about_dialog;
373 }