3f818dae76f8f8133199228ad0b20547b6f65b79
[abartlet/samba.git/.git] / source4 / gtk / common / gtk-smb.c
1 /* 
2    Unix SMB/CIFS implementation.
3    SMB-related GTK+ functions
4    
5    Copyright (C) Jelmer Vernooij 2004-2005
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/gtk-smb.h"
24 #include "gtk/common/select.h"
25 #include "version.h"
26
27 void gtk_show_werror(GtkWidget *win, const char *message, WERROR err) 
28 {
29         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
30                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
31                                                     GTK_MESSAGE_ERROR,
32                                                     GTK_BUTTONS_CLOSE,
33                                                     "%s: %s\n", message?message: "Windows error",
34                                                     win_errstr(err));
35         gtk_dialog_run (GTK_DIALOG (dialog));
36         gtk_widget_destroy (dialog);
37 }
38                    
39 void gtk_show_ntstatus(GtkWidget *win, const char *message, NTSTATUS status) 
40 {
41         GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(win), 
42                                                     GTK_DIALOG_DESTROY_WITH_PARENT,
43                                                     GTK_MESSAGE_ERROR,
44                                                     GTK_BUTTONS_CLOSE,
45                                                     "%s: %s\n", message?message:"Windows error",
46                                                     nt_errstr(status));
47         gtk_dialog_run (GTK_DIALOG (dialog));
48         gtk_widget_destroy (dialog);
49 }
50
51 static void on_browse_activate  (GtkButton     *button,  gpointer         user_data)
52 {
53         GtkRpcBindingDialog *rbd = user_data;
54         GtkWidget *shd = gtk_select_host_dialog_new(rbd->sam_pipe);
55         if(gtk_dialog_run(GTK_DIALOG(shd)) == GTK_RESPONSE_ACCEPT) {
56                 gtk_entry_set_text(GTK_ENTRY(rbd->entry_host), gtk_select_host_dialog_get_host(GTK_SELECT_HOST_DIALOG(shd)));
57         }
58         
59         gtk_widget_destroy(GTK_WIDGET(shd));
60 }
61
62 static void on_ncalrpc_toggled(GtkToggleButton *tb, GtkRpcBindingDialog *d)
63 {
64         gtk_widget_set_sensitive(d->frame_host, !gtk_toggle_button_get_active(tb));
65 }
66
67 static void gtk_rpc_binding_dialog_init (GtkRpcBindingDialog *gtk_rpc_binding_dialog)
68 {
69         GtkWidget *dialog_vbox1;
70         GtkWidget *vbox1;
71         GtkWidget *vbox6;
72         GtkWidget *frame_transport;
73         GtkWidget *label1;
74         GtkWidget *hbox1;
75         GtkWidget *lbl_name;
76         GtkWidget *label2;
77         GtkWidget *label3;
78         GtkWidget *frame_security;
79         GtkWidget *vbox2;
80         GtkWidget *btn_browse;
81         GtkWidget *dialog_action_area1;
82         GtkWidget *btn_cancel;
83         GtkWidget *btn_connect;
84         GSList *transport_smb_group = NULL;
85
86         gtk_rpc_binding_dialog->mem_ctx = talloc_init("gtk_rcp_binding_dialog");
87
88         gtk_window_set_title (GTK_WINDOW (gtk_rpc_binding_dialog), "Connect");
89
90         dialog_vbox1 = GTK_DIALOG (gtk_rpc_binding_dialog)->vbox;
91
92         vbox1 = gtk_vbox_new (FALSE, 0);
93         gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0);
94
95         frame_transport = gtk_frame_new (NULL);
96         gtk_box_pack_start (GTK_BOX (vbox1), frame_transport, TRUE, TRUE, 0);
97
98         vbox6 = gtk_vbox_new (FALSE, 0);
99         gtk_container_add (GTK_CONTAINER (frame_transport), vbox6);
100
101         gtk_rpc_binding_dialog->transport_ncalrpc = gtk_radio_button_new_with_mnemonic (NULL, "Local Host");
102         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_ncalrpc, FALSE, FALSE, 0);
103         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc), transport_smb_group);
104         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_ncalrpc));
105
106
107         gtk_rpc_binding_dialog->transport_smb = gtk_radio_button_new_with_mnemonic (NULL, "RPC over SMB over TCP/IP");
108         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_smb, FALSE, FALSE, 0);
109         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb), transport_smb_group);
110         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_smb));
111         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_rpc_binding_dialog->transport_smb), TRUE);
112
113         gtk_rpc_binding_dialog->transport_tcp_ip = gtk_radio_button_new_with_mnemonic (NULL, "RPC over TCP/IP");
114         gtk_box_pack_start (GTK_BOX (vbox6), gtk_rpc_binding_dialog->transport_tcp_ip, FALSE, FALSE, 0);
115         gtk_radio_button_set_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip), transport_smb_group);
116         transport_smb_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (gtk_rpc_binding_dialog->transport_tcp_ip));
117
118
119
120         label1 = gtk_label_new ("Transport");
121         gtk_frame_set_label_widget (GTK_FRAME (frame_transport), label1);
122
123         gtk_rpc_binding_dialog->frame_host = gtk_frame_new (NULL);
124         gtk_box_pack_start (GTK_BOX (vbox1), gtk_rpc_binding_dialog->frame_host, TRUE, TRUE, 0);
125
126         hbox1 = gtk_hbox_new (FALSE, 0);
127         gtk_container_add (GTK_CONTAINER (gtk_rpc_binding_dialog->frame_host), hbox1);
128
129         lbl_name = gtk_label_new ("Name");
130         gtk_box_pack_start (GTK_BOX (hbox1), lbl_name, TRUE, TRUE, 0);
131
132         gtk_rpc_binding_dialog->entry_host = gtk_entry_new ();
133         gtk_box_pack_start (GTK_BOX (hbox1), gtk_rpc_binding_dialog->entry_host, TRUE, TRUE, 0);
134
135         if(gtk_rpc_binding_dialog->sam_pipe)
136         {
137                 btn_browse = gtk_button_new_with_label ("Browse");
138                 gtk_box_pack_start (GTK_BOX (hbox1), btn_browse, TRUE, TRUE, 0);
139
140                 g_signal_connect ((gpointer) btn_browse, "pressed",
141                                                   G_CALLBACK (on_browse_activate),
142                                                   gtk_rpc_binding_dialog);
143         }
144
145         label2 = gtk_label_new ("Host");
146         gtk_frame_set_label_widget (GTK_FRAME (gtk_rpc_binding_dialog->frame_host), label2);
147
148         frame_security = gtk_frame_new (NULL);
149
150         label3 = gtk_label_new ("Security");
151         gtk_frame_set_label_widget (GTK_FRAME (frame_security), label3);
152
153         gtk_box_pack_start (GTK_BOX (vbox1), frame_security, TRUE, TRUE, 0);
154
155         vbox2 = gtk_vbox_new (FALSE, 0);
156         gtk_container_add (GTK_CONTAINER (frame_security), vbox2);
157
158         gtk_rpc_binding_dialog->chk_sign = gtk_check_button_new_with_mnemonic ("S_ign");
159         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_sign, FALSE, FALSE, 0);
160
161         gtk_rpc_binding_dialog->chk_seal = gtk_check_button_new_with_mnemonic ("_Seal");
162         gtk_box_pack_start (GTK_BOX (vbox2), gtk_rpc_binding_dialog->chk_seal, FALSE, FALSE, 0);
163
164         dialog_action_area1 = GTK_DIALOG (gtk_rpc_binding_dialog)->action_area;
165         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
166
167         btn_cancel = gtk_button_new_from_stock ("gtk-cancel");
168         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_cancel, GTK_RESPONSE_CANCEL);
169         GTK_WIDGET_SET_FLAGS (btn_cancel, GTK_CAN_DEFAULT);
170
171         btn_connect = gtk_button_new_with_mnemonic ("_Connect");
172         gtk_dialog_add_action_widget (GTK_DIALOG (gtk_rpc_binding_dialog), btn_connect, GTK_RESPONSE_ACCEPT);
173         gtk_container_set_border_width (GTK_CONTAINER (btn_connect), 1);
174         GTK_WIDGET_SET_FLAGS (btn_connect, GTK_CAN_DEFAULT);
175
176         g_signal_connect ((gpointer) gtk_rpc_binding_dialog->transport_ncalrpc, "toggled",
177                                                   G_CALLBACK (on_ncalrpc_toggled),
178                                                   gtk_rpc_binding_dialog);
179
180
181         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(gtk_rpc_binding_dialog->transport_ncalrpc), TRUE);
182         gtk_widget_show_all(dialog_vbox1);
183
184         gtk_widget_grab_focus (btn_connect);
185         gtk_widget_grab_default (btn_connect);
186 }
187
188 GType gtk_rpc_binding_dialog_get_type (void)
189 {
190   static GType mytype = 0;
191
192   if (!mytype)
193     {
194       static const GTypeInfo myinfo =
195       {
196         sizeof (GtkRpcBindingDialogClass),
197         NULL,
198         NULL,
199         NULL,
200         NULL,
201         NULL,
202         sizeof(GtkRpcBindingDialog),
203         0,
204         (GInstanceInitFunc) gtk_rpc_binding_dialog_init,
205       };
206
207       mytype = g_type_register_static (GTK_TYPE_DIALOG, 
208                 "GtkRpcBindingDialog", &myinfo, 0);
209     }
210
211   return mytype;
212 }
213
214 GtkWidget *gtk_rpc_binding_dialog_new (struct dcerpc_pipe *sam_pipe)
215 {
216         GtkRpcBindingDialog *d = GTK_RPC_BINDING_DIALOG ( g_object_new (gtk_rpc_binding_dialog_get_type (), NULL));
217         d->sam_pipe = sam_pipe;
218         return GTK_WIDGET(d);
219 }
220
221 const char *gtk_rpc_binding_dialog_get_host(GtkRpcBindingDialog *d)
222 {
223         return gtk_entry_get_text(GTK_ENTRY(d->entry_host));
224 }
225
226 struct dcerpc_binding *gtk_rpc_binding_dialog_get_binding(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
227 {
228         struct dcerpc_binding *binding = talloc(mem_ctx, struct dcerpc_binding);
229
230         ZERO_STRUCT(binding->object);
231
232         /* Format: TRANSPORT:host[\pipe\foo,foo,foo] */
233
234         binding->host = talloc_strdup(mem_ctx, gtk_entry_get_text(GTK_ENTRY(d->entry_host)));
235         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_tcp_ip))) {
236                 binding->transport = NCACN_IP_TCP;
237         } else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->transport_ncalrpc))) {
238                 binding->transport = NCALRPC;
239                 binding->host = NULL;
240         } else {
241                 binding->transport = NCACN_NP;
242         }
243
244         binding->options = NULL;
245         binding->flags = 0;
246         binding->endpoint = NULL;
247
248         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_seal))) {
249                 binding->flags |= DCERPC_SEAL;
250         }
251
252         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->chk_sign))) {
253                 binding->flags |= DCERPC_SIGN;
254         }
255
256         return binding;
257 }
258
259 const char *gtk_rpc_binding_dialog_get_binding_string(GtkRpcBindingDialog *d, TALLOC_CTX *mem_ctx)
260 {
261         return dcerpc_binding_string(mem_ctx, gtk_rpc_binding_dialog_get_binding(d, mem_ctx));
262 }
263
264 GtkWidget *create_gtk_samba_about_dialog (const char *appname)
265 {
266         GtkWidget *samba_about_dialog;
267         GtkWidget *dialog_vbox1;
268         GtkWidget *label1;
269         GtkWidget *label2;
270         GtkWidget *label3;
271         GtkWidget *label4;
272         GtkWidget *dialog_action_area1;
273         GtkWidget *okbutton1;
274
275         samba_about_dialog = gtk_dialog_new ();
276         gtk_window_set_title (GTK_WINDOW (samba_about_dialog), "About");
277
278         dialog_vbox1 = GTK_DIALOG (samba_about_dialog)->vbox;
279
280         /* FIXME image1 = create_pixmap (samba_about_dialog, "slmed.png");
281            gtk_box_pack_start (GTK_BOX (dialog_vbox1), image1, TRUE, TRUE, 0);*/
282
283         label1 = gtk_label_new (appname);
284         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label1, FALSE, FALSE, 0);
285
286         label2 = gtk_label_new (SAMBA_VERSION_STRING);
287         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label2, FALSE, FALSE, 0);
288
289         label3 = gtk_label_new_with_mnemonic ("Part of Samba <http://www.samba.org/>");
290         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label3, FALSE, FALSE, 0);
291
292         label4 = gtk_label_new ("\302\251 1992-2005 The Samba Team");
293         gtk_box_pack_start (GTK_BOX (dialog_vbox1), label4, FALSE, FALSE, 0);
294
295         dialog_action_area1 = GTK_DIALOG (samba_about_dialog)->action_area;
296         gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
297
298         okbutton1 = gtk_button_new_from_stock ("gtk-ok");
299         gtk_dialog_add_action_widget (GTK_DIALOG (samba_about_dialog), okbutton1, GTK_RESPONSE_OK);
300         GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT);
301         gtk_widget_show_all(dialog_vbox1);
302
303         return samba_about_dialog;
304 }