r1432: - Move the various Gtk-specific parts from the registry code into a directory...
[samba.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 #ifdef HAVE_CONFIG_H
23 #  include <config.h>
24 #endif
25
26 #include <sys/types.h>
27 #include <sys/stat.h>
28 #include <unistd.h>
29 #include <string.h>
30 #include <stdio.h>
31
32 #include <gdk/gdkkeysyms.h>
33 #include <gtk/gtk.h>
34 #include "includes.h"
35
36 void gtk_show_werror(GtkWidget *win, WERROR err) 
37 {
38         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
39                  GTK_DIALOG_DESTROY_WITH_PARENT,
40          GTK_MESSAGE_ERROR,
41          GTK_BUTTONS_CLOSE,
42                  "Windows error: %s\n", win_errstr(err));
43         gtk_dialog_run (GTK_DIALOG (dialog));
44         gtk_widget_destroy (dialog);
45 }
46                    
47 void gtk_show_ntstatus(GtkWidget *win, NTSTATUS status) 
48 {
49         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
50                  GTK_DIALOG_DESTROY_WITH_PARENT,
51          GTK_MESSAGE_ERROR,
52          GTK_BUTTONS_CLOSE,
53                  "Windows error: %s\n", nt_errstr(status));
54         gtk_dialog_run (GTK_DIALOG (dialog));
55         gtk_widget_destroy (dialog);
56 }
57
58 static void gtk_rpc_binding_dialog_class_init (GtkRpcBindingDialogClass *class)
59 {
60 }
61
62 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
63 {
64         GtkWidget *dialog_vbox1;
65         GtkWidget *vbox1;
66         GtkWidget *vbox6;
67         GtkWidget *frame_transport;
68         GtkWidget *hbox2;
69         GtkWidget *lbl_transport;
70         GtkWidget *label1;
71         GtkWidget *frame_host;
72         GtkWidget *hbox1;
73         GtkWidget *lbl_name;
74         GtkWidget *label2;
75         GtkWidget *frame_security;
76         GtkWidget *vbox2;
77         GtkWidget *label3;
78         GtkWidget *frame_credentials;
79         GtkWidget *table1;
80         GtkWidget *lbl_username;
81         GtkWidget *lbl_password;
82         GtkWidget *label9;
83         GtkWidget *chk_button;
84         GtkWidget *lbl_credentials;
85         GtkWidget *dialog_action_area1;
86         GtkWidget *btn_cancel;
87         GtkWidget *btn_connect;
88         GSList *transport_smb_group = NULL;
89
90         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
91         
92         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
93
94         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
95         gtk_widget_show (dialog_vbox1);
96
97         vbox1 = gtk_vbox_new (FALSE, 0);
98         gtk_widget_show (vbox1);
99         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
100
101         frame_transport = gtk_frame_new (NULL);
102         gtk_widget_show (frame_transport);
103         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
104
105         vbox6 = gtk_vbox_new (FALSE, 0);
106         gtk_widget_show (vbox6);
107         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
108
109         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
110         gtk_widget_show (gtk_rpc_binding_dialog->transport_smb);
111         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
112         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
113         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
114         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
115
116         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
117         gtk_widget_show (gtk_rpc_binding_dialog->transport_tcp_ip);
118         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
119         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
120         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
121
122         label1 = gtk_label_new ("Transport");
123         gtk_widget_show (label1);
124         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
125
126         frame_host = gtk_frame_new (NULL);
127         gtk_widget_show (frame_host);
128         gtk_box_pack_start (GTK_BOX (vbox1), frame_host, TRUE, TRUE, 0);
129
130         hbox1 = gtk_hbox_new (FALSE, 0);
131         gtk_widget_show (hbox1);
132         gtk_container_add (GTK_CONTAINER (frame_host), hbox1);
133
134         lbl_name = gtk_label_new ("Name");
135         gtk_widget_show (lbl_name);
136         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
137
138         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
139         gtk_widget_show (gtk_rpc_binding_dialog->entry_host);
140         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
141
142         label2 = gtk_label_new ("Host");
143         gtk_widget_show (label2);
144         gtk_frame_set_label_widget (GTK_FRAME (frame_host), label2);
145
146         frame_security = gtk_frame_new (NULL);
147         gtk_widget_show (frame_security);
148         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
149
150         vbox2 = gtk_vbox_new (FALSE, 0);
151         gtk_widget_show (vbox2);
152         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
153
154         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
155         gtk_widget_show (gtk_rpc_binding_dialog->chk_sign);
156         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
157
158         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
159         gtk_widget_show (gtk_rpc_binding_dialog->chk_seal);
160         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
161
162         label3 = gtk_label_new ("Security");
163         gtk_widget_show (label3);
164         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
165
166         frame_credentials = gtk_frame_new (NULL);
167         gtk_widget_show (frame_credentials);
168         gtk_box_pack_start (GTK_BOX (dialog_vbox1), frame_credentials, TRUE, TRUE, 0);
169
170         table1 = gtk_table_new (3, 2, FALSE);
171         gtk_widget_show (table1);
172         gtk_container_add (GTK_CONTAINER (frame_credentials), table1);
173
174         lbl_username = gtk_label_new ("Username:");
175         gtk_widget_show (lbl_username);
176         gtk_table_attach (GTK_TABLE (table1), lbl_username, 0, 1, 0, 1,
177                         (GtkAttachOptions) (GTK_FILL),
178                         (GtkAttachOptions) (0), 0, 0);
179         gtk_misc_set_alignment (GTK_MISC (lbl_username), 0, 0.5);
180
181         lbl_password = gtk_label_new ("Password:");
182         gtk_widget_show (lbl_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_widget_show (label9);
190         gtk_table_attach (GTK_TABLE (table1), label9, 0, 1, 2, 3,
191                         (GtkAttachOptions) (GTK_FILL),
192                         (GtkAttachOptions) (0), 0, 0);
193         gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5);
194
195         gtk_rpc_binding_dialog->entry_password = gtk_entry_new ();
196         gtk_entry_set_visibility (GTK_ENTRY (gtk_rpc_binding_dialog->entry_password), FALSE);
197         gtk_widget_show (gtk_rpc_binding_dialog->entry_password);
198         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_password, 1, 2, 1, 2,
199                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
200                         (GtkAttachOptions) (0), 0, 0);
201
202         gtk_rpc_binding_dialog->entry_username = gtk_entry_new ();
203         gtk_widget_show (gtk_rpc_binding_dialog->entry_username);
204         gtk_table_attach (GTK_TABLE (table1), gtk_rpc_binding_dialog->entry_username, 1, 2, 0, 1,
205                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
206                         (GtkAttachOptions) (0), 0, 0);
207
208         chk_button = gtk_check_button_new_with_mnemonic ("_Use kerberos");
209         gtk_widget_show (chk_button);
210         gtk_table_attach (GTK_TABLE (table1), chk_button, 1, 2, 2, 3,
211                         (GtkAttachOptions) (GTK_FILL),
212                         (GtkAttachOptions) (0), 0, 0);
213
214         lbl_credentials = gtk_label_new ("Credentials");
215         gtk_widget_show (lbl_credentials);
216         gtk_frame_set_label_widget (GTK_FRAME (frame_credentials), lbl_credentials);
217
218         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
219         gtk_widget_show (dialog_action_area1);
220         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
221
222         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
223         gtk_widget_show (btn_cancel);
224         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
225         GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
226
227         btn_connect = gtk_button_new_with_mnemonic ("_Connect");
228         gtk_widget_show (btn_connect);
229         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
230         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
231         GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
232
233         gtk_widget_grab_focus (btn_connect);
234         gtk_widget_grab_default (btn_connect);
235 }
236
237 GType gtk_rpc_binding_dialog_get_type ()
238 {
239   static GType mytype = 0;
240
241   if (!mytype)
242     {
243       static const GTypeInfo myinfo =
244       {
245         sizeof (GtkRpcBindingDialogClass),
246         NULL,
247         NULL,
248         (GClassInitFunc) gtk_rpc_binding_dialog_class_init,
249         NULL,
250         NULL,
251         sizeof(GtkRpcBindingDialog),
252         0,
253         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
254       };
255
256       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
257                 "GtkRpcBindingDialog", &myinfo, 0);
258     }
259
260   return mytype;
261 }
262
263 GtkWidget *gtk_rpc_binding_dialog_new (BOOL nocredentials)
264 {
265         return GTK_WIDGET ( gtk_type_new (gtk_rpc_binding_dialog_get_type ()));
266 }
267
268 const char *gtk_rpc_binding_dialog_get_username(GtkRpcBindingDialog *d)
269 {
270         return gtk_entry_get_text(GTK_ENTRY(d->entry_username));
271 }
272
273 const char *gtk_rpc_binding_dialog_get_password(GtkRpcBindingDialog *d)
274 {
275         return gtk_entry_get_text(GTK_ENTRY(d->entry_password));
276 }
277
278 const char *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, char *pipe)
279 {
280         const char *transport;
281         const char *host;
282         char *options = NULL;
283         char *binding = NULL;
284
285         host = gtk_entry_get_text(GTK_ENTRY(d->entry_host));
286         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip)))
287                 transport = "ncacn_tcp";
288         else 
289                 transport = "ncacn_np";
290         // Format: TRANSPORT:host:[\pipe\foo,foo,foo]
291         if(pipe != NULL) {
292                 options = talloc_asprintf(d->mem_ctx, "\\pipe\\%s", pipe);
293         }
294         
295         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
296                 options = talloc_asprintf_append(d->mem_ctx, options, ",seal");
297         }
298
299         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
300                 options = talloc_asprintf_append(d->mem_ctx, options, ",sign");
301         }
302
303         if(options) {
304                 return talloc_asprintf(d->mem_ctx, "%s:%s:[%s]", transport, host, options);
305         } else {
306                 return talloc_asprintf(d->mem_ctx, "%s:%s", transport, host);
307         }
308 }
309
310 GtkWidget* create_gtk_samba_about_dialog (char *appname)
311 {
312   GtkWidget *dialog_vbox1;
313   GtkWidget *image1;
314   GtkWidget *label1;
315   GtkWidget *label2;
316   GtkWidget *dialog_action_area1;
317   GtkWidget *closebutton1;
318   GtkWidget *aboutwin;
319
320   aboutwin = gtk_dialog_new ();
321   gtk_window_set_title (GTK_WINDOW (aboutwin), "About");
322   gtk_window_set_resizable (GTK_WINDOW (aboutwin), FALSE);
323
324   dialog_vbox1 = GTK_DIALOG (aboutwin)->vbox;
325   gtk_widget_show (dialog_vbox1);
326
327   /* FIXME: Samba logo ? 
328   image1 = create_pixmap (aboutwin, "samba.png");
329   gtk_widget_show (image1);
330   gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, FALSE, TRUE, 0); */
331
332   label1 = gtk_label_new (appname);
333   gtk_widget_show (label1);
334   gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
335   gtk_label_set_use_markup (GTK_LABEL (label1), TRUE);
336
337   label2 = gtk_label_new_with_mnemonic ("(C) 2004 Jelmer Vernooij <jelmer@samba.org>\nPart of Samba\nhttp://www.samba.org/\n");
338   gtk_widget_show (label2);
339   gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, TRUE, FALSE, 0);
340   gtk_label_set_use_markup (GTK_LABEL (label2), TRUE);
341
342   dialog_action_area1 = GTK_DIALOG (aboutwin)->action_area;
343   gtk_widget_show (dialog_action_area1);
344   gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
345
346   closebutton1 = gtk_button_new_from_stock ("gtk-close");
347   gtk_widget_show (closebutton1);
348   gtk_dialog_add_action_widget (GTK_DIALOG (aboutwin), closebutton1, GTK_RESPONSE_CLOSE);
349   GTK_WIDGET_SET_FLAGS (closebutton1, GTK_CAN_DEFAULT);
350
351   return aboutwin;
352 }