]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/gnome2-console/callbacks.c
First cut restore GUI
[bacula/bacula] / bacula / src / gnome2-console / callbacks.c
1 /* 
2  *    Version $Id$
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #  include <config.h>
7 #endif
8
9 #include "bacula.h"
10 #include "console.h"
11
12 #include "callbacks.h"
13 #include "interface.h"
14 #include "support.h"
15
16 #define KEY_Enter 65293
17 #define KEY_Up    65362
18 #define KEY_Down  65364
19 #define KEY_Left  65361
20 #define KEY_Right 65363
21
22 gboolean
23 on_console_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
24 {
25    gtk_main_quit();
26    return FALSE;
27 }
28
29 void
30 on_connect_activate(GtkMenuItem *menuitem, gpointer user_data)
31 {
32    if (connect_to_director(user_data)) {
33       start_director_reader(user_data);
34    }
35 }
36
37
38 void
39 on_disconnect_activate(GtkMenuItem *menuitem, gpointer user_data)
40 {
41    if (disconnect_from_director(user_data)) {
42       stop_director_reader(user_data);
43    }
44 }
45
46
47 void
48 on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
49 {
50    gtk_main_quit();
51 }
52
53
54 void
55 on_cut1_activate(GtkMenuItem *menuitem, gpointer user_data)
56 {
57
58 }
59
60
61 void
62 on_copy1_activate(GtkMenuItem *menuitem, gpointer user_data)
63 {
64
65 }
66
67
68 void
69 on_paste1_activate(GtkMenuItem *menuitem, gpointer user_data)
70 {
71
72 }
73
74
75 void
76 on_clear1_activate(GtkMenuItem *menuitem, gpointer user_data)
77 {
78
79 }
80
81 void
82 on_preferences1_activate(GtkMenuItem *menuitem, gpointer user_data)
83 {
84 }
85
86
87 void
88 on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
89 {
90    gtk_widget_show(about1);
91    gtk_main();
92 }
93
94
95 void
96 on_connect_button_clicked(GtkButton *button, gpointer user_data)
97 {
98    if (connect_to_director(user_data)) {
99       start_director_reader(user_data);
100    }
101 }
102
103 /* Define max length of history and how many to delete when it gets there.  
104  * If you make HIST_DEL > HIST_MAX, you shoot yourself in the foot. 
105  */
106 #define HIST_MAX 2500
107 #define HIST_DEL  500
108
109 static GList *hist = NULL;
110 static GList *hc = NULL;
111 static int hist_len = 0;
112
113 static void add_to_history(gchar *ecmd)
114 {
115    int len = strlen(ecmd);
116
117    if (len > 0) {
118       hist = g_list_append(hist, bstrdup(ecmd));
119       hist_len++;
120    }
121    if (hist_len >= HIST_MAX) {
122       int i;
123       GList *hp;
124       for (i=0; i<HIST_DEL; i++) {
125          hp = g_list_next(hist);
126          free(hp->data);
127          hist = g_list_remove(hist, hp->data);
128       }
129       hist_len -= HIST_DEL;
130    }
131    hc = NULL;             
132 }
133
134 /*
135  * Note, apparently there is a bug in GNOME where some of the
136  *  key press events are lost -- at least it loses every other
137  *  up arrow!
138  */
139 gboolean
140 on_entry1_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
141 {
142    if (event->keyval == KEY_Enter) {
143       char *ecmd = (char *)gtk_entry_get_text((GtkEntry *)entry1);
144       set_text(ecmd, strlen(ecmd));
145       set_text("\n", 1);
146       add_to_history(ecmd);
147       write_director(ecmd);
148       gtk_entry_set_text((GtkEntry *)entry1, "");
149    } else if (event->keyval == KEY_Up) {
150       if (!hc) {
151          hc = g_list_last(hist);
152       } else {
153          hc = g_list_previous(hc);
154       }
155       if (!hc) {
156          hc = g_list_first(hist);
157       }
158       gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
159    } else if (event->keyval == KEY_Down) {
160       if (!hc) {
161          hc = g_list_first(hist);
162       } else {
163          hc = g_list_next(hc);
164       }
165       if (!hc) {
166          hc = g_list_last(hist);
167       }
168       gtk_entry_set_text((GtkEntry *)entry1, (gchar *)hc->data);
169    }
170 // gtk_entry_set_position((GtkEntry *)entry1, -1);
171 // gtk_window_set_focus((GtkWindow *)app1, entry1);
172    return FALSE;
173 }
174
175
176 void
177 on_app1_show(GtkWidget *widget, gpointer user_data)
178 {
179 }
180
181
182
183 void
184 on_msgs_button_clicked(GtkButton *button, gpointer user_data)
185 {
186    write_director("messages");
187 }
188
189 void
190 on_msgs_activate(GtkMenuItem *menuitem, gpointer user_data)
191 {
192    write_director("messages");
193 }
194
195 void
196 on_about_button_clicked(GtkButton *button, gpointer user_data)
197 {
198    gtk_widget_hide(about1);
199    gtk_main_quit();
200    set_status_ready();
201 }
202
203 void
204 on_select_director_OK_clicked(GtkButton *button, gpointer user_data)
205 {
206    reply = OK;
207    gtk_widget_hide(dir_dialog);
208    gtk_main_quit();
209    set_status_ready();
210 }
211
212
213 void
214 on_select_director_cancel_clicked(GtkButton *button, gpointer user_data)
215 {
216    reply = CANCEL;
217    gtk_widget_hide(dir_dialog);
218    gtk_main_quit();
219    set_status_ready();
220 }
221
222 /*
223  * Compare list string items
224  */
225 static gint compare_func(const void *data1, const void *data2)
226 {
227    return strcmp((const char *)data1, (const char *)data2);
228 }
229
230 static GList *find_combo_list(char *name)
231 {
232    if (strcmp(name, "job") == 0) {
233       return job_list;
234    }
235    if (strcmp(name, "pool") == 0) {
236       return pool_list;
237    }
238    if (strcmp(name, "client") == 0) {
239       return client_list;
240    }
241    if (strcmp(name, "storage") == 0) {
242       return storage_list;
243    }
244    if (strcmp(name, "fileset") == 0) {
245       return fileset_list;
246    }
247    if (strcmp(name, "messages") == 0) {
248       return messages_list;
249    }
250    if (strcmp(name, "type") == 0) {
251       return type_list;
252    }
253    if (strcmp(name, "level") == 0) {
254       return level_list;
255    }
256    return NULL;
257 }
258
259 /*
260  * Set correct default values in the Run dialog box
261  */
262 static void set_run_defaults()
263 {
264    GtkWidget *combo, *entry;
265    char *job, *def;
266    GList *item, *list;
267    char cmd[1000];
268    int pos;
269
270    stop_director_reader(NULL);
271
272    combo = lookup_widget(run_dialog, "combo_job");
273    job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
274    bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
275    write_director(cmd);
276    while (bnet_recv(UA_sock) > 0) {
277       def = strchr(UA_sock->msg, '=');
278       if (!def) {
279          continue;
280       }
281       *def++ = 0;
282       if (strcmp(UA_sock->msg, "job") == 0 ||
283           strcmp(UA_sock->msg, "when") == 0) {
284          continue;
285       }
286       /* Where is an entry box */
287       if (strcmp(UA_sock->msg, "where") == 0) {
288          entry = lookup_widget(run_dialog, "entry_where");
289          gtk_entry_set_text(GTK_ENTRY(entry), def);
290          continue;
291       }
292
293       /* Now handle combo boxes */
294       list = find_combo_list(UA_sock->msg);
295       if (!list) {
296          continue;
297       }
298       item = g_list_find_custom(list, def, compare_func);
299       bsnprintf(cmd, sizeof(cmd), "combo_%s", UA_sock->msg);
300       combo = lookup_widget(run_dialog, cmd);
301       if (!combo) {
302          continue;
303       }
304       pos = g_list_position(list, item);
305       gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
306    }
307    start_director_reader(NULL);
308 }
309
310 void
311 on_entry_job_changed(GtkEditable *editable, gpointer user_data)
312 {
313    set_run_defaults();
314 }
315
316
317 void
318 on_run_button_clicked(GtkButton *button, gpointer user_data)
319 {
320    char dt[50];
321    GtkWidget *entry;
322
323    bstrutime(dt, sizeof(dt), time(NULL));
324    entry = lookup_widget(run_dialog, "entry_when");
325    gtk_entry_set_text(GTK_ENTRY(entry), dt);
326    set_run_defaults();
327    gtk_widget_show(run_dialog);
328    gtk_main();
329 }
330
331
332 static char *get_combo_text(GtkWidget *dialog, char *combo_name)
333 {
334    GtkWidget *combo;
335    combo = lookup_widget(dialog, combo_name);
336    if (!combo) {
337       return NULL;
338    }
339    return (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
340 }
341
342 static char *get_entry_text(GtkWidget *dialog, char *entry_name)
343 {
344    GtkWidget *entry;
345    entry = lookup_widget(dialog, entry_name);
346    if (!entry) {
347       return NULL;
348    }
349    return (char *)gtk_entry_get_text(GTK_ENTRY(entry));
350 }
351
352 static char *get_spin_text(GtkWidget *dialog, char *spin_name)
353 {
354    GtkSpinButton *spin;
355    spin = (GtkSpinButton *)lookup_widget(dialog, spin_name);
356    if (!spin) {
357       return NULL;
358    }
359    return (char *)gtk_entry_get_text(GTK_ENTRY(&spin->entry));
360 }
361
362
363
364
365 void
366 on_run_ok_clicked(GtkButton *button, gpointer user_data)
367 {
368    char *job, *fileset, *level, *client, *pool, *when, *where, *storage;
369
370    gtk_widget_hide(run_dialog);
371    gtk_main_quit();
372
373    job     = get_combo_text(run_dialog, "combo_job");
374    fileset = get_combo_text(run_dialog, "combo_fileset");
375    client  = get_combo_text(run_dialog, "combo_client");
376    pool    = get_combo_text(run_dialog, "combo_pool");
377    storage = get_combo_text(run_dialog, "combo_storage");
378    level   = get_combo_text(run_dialog, "combo_level");
379
380    when    = get_entry_text(run_dialog, "entry_when");
381    where   = get_entry_text(run_dialog, "entry_where");
382
383    if (!job || !fileset || !client || !pool || !storage ||
384        !level || !when || !where) {
385       set_status_ready();
386       return;
387    }
388       
389    bsnprintf(cmd, sizeof(cmd), 
390              "run job=\"%s\" fileset=\"%s\" level=%s client=\"%s\" pool=\"%s\" "
391              "when=\"%s\" where=\"%s\" storage=\"%s\"", 
392              job, fileset, level, client, pool, when, where, storage);
393    write_director(cmd);
394    write_director("yes");
395    return;
396 }
397
398
399 void
400 on_run_cancel_clicked(GtkButton *button, gpointer user_data)
401 {
402    gtk_widget_hide(run_dialog);
403    gtk_main_quit();
404    set_status_ready();
405 }
406
407 gboolean
408 on_entry1_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
409 {
410   return FALSE;
411 }
412
413 void
414 on_restore_button_clicked(GtkButton *button, gpointer user_data)
415 {
416    gtk_widget_show(restore_dialog);
417    gtk_main();
418 }
419
420 void
421 on_view_fileset_clicked(GtkButton *button, gpointer user_data)
422 {
423 }
424
425
426 void
427 on_restore_cancel_clicked(GtkButton *button, gpointer user_data)
428 {
429    gtk_widget_hide(restore_dialog);
430    gtk_main_quit();
431    set_status_ready();
432 }
433
434
435 void
436 on_label_button_clicked(GtkButton *button, gpointer user_data)
437 {
438    gtk_widget_show(label_dialog);
439    gtk_main();
440 }
441
442 void
443 on_label_ok_clicked(GtkButton *button, gpointer user_data)
444 {
445    char *pool, *volume, *storage, *slot;
446
447    gtk_widget_hide(label_dialog);
448    gtk_main_quit();
449
450    pool    = get_combo_text(label_dialog, "label_combo_pool");
451    storage = get_combo_text(label_dialog, "label_combo_storage");
452
453    volume  = get_entry_text(label_dialog, "label_entry_volume");
454
455    slot    = get_spin_text(label_dialog, "label_slot");
456
457    if (!pool || !storage || !volume || !(*volume)) {
458       set_status_ready();
459       return;
460    }
461       
462    bsnprintf(cmd, sizeof(cmd), 
463              "label name=\"%s\" pool=\"%s\" storage=\"%s\" slot=%s", 
464              volume, pool, storage, slot);
465    write_director(cmd);
466 }
467
468
469 void
470 on_label_cancel_clicked(GtkButton *button, gpointer user_data)
471 {
472    gtk_widget_hide(label_dialog);
473    gtk_main_quit();
474    set_status_ready();
475 }
476
477
478 void
479 on_select_files_button_clicked(GtkButton *button, gpointer user_data)
480 {
481    char *job, *fileset, *client, *pool, *before, *storage;
482
483    gtk_widget_hide(restore_dialog);
484
485    job     = get_combo_text(restore_dialog, "combo_restore_job");
486    fileset = get_combo_text(restore_dialog, "combo_restore_fileset");
487    client  = get_combo_text(restore_dialog, "combo_restore_client");
488    pool    = get_combo_text(restore_dialog, "combo_restore_pool");
489    storage = get_combo_text(restore_dialog, "combo_restore_storage");
490
491    before  = get_entry_text(restore_dialog, "restore_before_entry");
492
493    if (!job || !fileset || !client || !pool || !storage || !before) {
494       set_status_ready();
495       return;
496    }
497       
498    bsnprintf(cmd, sizeof(cmd), 
499              "restore select current fileset=\"%s\" client=\"%s\" pool=\"%s\" "
500              "storage=\"%s\"", fileset, client, pool, storage);
501    write_director(cmd);
502    gtk_widget_show(restore_file_selection);
503    select_restore_files();            /* put up select files dialog */
504 }
505
506 void
507 on_restore_select_ok_clicked(GtkButton *button, gpointer user_data)
508 {
509    gtk_widget_hide(restore_file_selection);
510    write_director("done");
511    gtk_main_quit();
512    set_status_ready();
513 }
514
515
516 void
517 on_restore_select_cancel_clicked(GtkButton *button, gpointer user_data)
518 {
519    gtk_widget_hide(restore_file_selection);
520    write_director("quit");
521    gtk_main_quit();
522    set_status_ready();
523 }
524
525 gboolean
526 on_restore_files_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
527 {
528    gtk_widget_hide(restore_file_selection);
529    gtk_main_quit();
530    set_status_ready();
531    return FALSE;
532 }
533
534
535 void
536 on_new1_activate                       (GtkMenuItem     *menuitem,
537                                         gpointer         user_data)
538 {
539
540 }
541
542
543 void
544 on_open1_activate                      (GtkMenuItem     *menuitem,
545                                         gpointer         user_data)
546 {
547
548 }
549
550
551 void
552 on_save1_activate                      (GtkMenuItem     *menuitem,
553                                         gpointer         user_data)
554 {
555
556 }
557
558
559 void
560 on_save_as1_activate                   (GtkMenuItem     *menuitem,
561                                         gpointer         user_data)
562 {
563
564 }
565
566
567 void
568 on_quit1_activate                      (GtkMenuItem     *menuitem,
569                                         gpointer         user_data)
570 {
571
572 }
573
574
575 void
576 on_cut2_activate                       (GtkMenuItem     *menuitem,
577                                         gpointer         user_data)
578 {
579
580 }
581
582
583 void
584 on_copy2_activate                      (GtkMenuItem     *menuitem,
585                                         gpointer         user_data)
586 {
587
588 }
589
590
591 void
592 on_paste2_activate                     (GtkMenuItem     *menuitem,
593                                         gpointer         user_data)
594 {
595
596 }
597
598
599 void
600 on_clear2_activate                     (GtkMenuItem     *menuitem,
601                                         gpointer         user_data)
602 {
603
604 }
605
606
607 void
608 on_properties1_activate                (GtkMenuItem     *menuitem,
609                                         gpointer         user_data)
610 {
611
612 }
613
614
615 void
616 on_preferences2_activate               (GtkMenuItem     *menuitem,
617                                         gpointer         user_data)
618 {
619
620 }
621
622
623 void
624 on_about2_activate                     (GtkMenuItem     *menuitem,
625                                         gpointer         user_data)
626 {
627
628 }
629
630 /*
631  * Set correct default values in the Restore dialog box
632  */
633 void set_restore_dialog_defaults()
634 {
635    GtkWidget *combo;
636    char *job, *def;
637    GList *item, *list;
638    char cmd[1000];
639    int pos;
640
641    stop_director_reader(NULL);
642
643    combo = lookup_widget(restore_dialog, "combo_restore_job");
644    job = (char *)gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
645    bsnprintf(cmd, sizeof(cmd), ".defaults job=\"%s\"", job);
646    write_director(cmd);
647    while (bnet_recv(UA_sock) > 0) {
648       def = strchr(UA_sock->msg, '=');
649       if (!def) {
650          continue;
651       }
652       *def++ = 0;
653       if (strcmp(UA_sock->msg, "job") == 0 ||
654           strcmp(UA_sock->msg, "when") == 0 ||
655           strcmp(UA_sock->msg, "where") == 0 ||
656           strcmp(UA_sock->msg, "messages") == 0 ||
657           strcmp(UA_sock->msg, "level") == 0 ||
658           strcmp(UA_sock->msg, "type") == 0) {
659          continue;
660       }
661
662       /* Now handle combo boxes */
663       list = find_combo_list(UA_sock->msg);
664       if (!list) {
665          continue;
666       }
667       item = g_list_find_custom(list, def, compare_func);
668       bsnprintf(cmd, sizeof(cmd), "combo_restore_%s", UA_sock->msg);
669       combo = lookup_widget(restore_dialog, cmd);
670       if (!combo) {
671          continue;
672       }
673       pos = g_list_position(list, item);
674       gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), pos);
675    }
676    start_director_reader(NULL);
677 }
678
679
680 void
681 on_restore_job_entry_changed(GtkEditable *editable, gpointer user_data)
682 {
683    /* Set defaults that correspond to new job selection */
684    set_restore_dialog_defaults();
685 }