00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "heraia_types.h"
00026
00027 static gboolean delete_data_type_window_event(GtkWidget *widget, GdkEvent *event, gpointer data);
00028 static void destroy_data_type_window(GtkWidget *widget, GdkEvent *event, gpointer data);
00029 static void dt_ok_button_clicked(GtkWidget *widget, gpointer data);
00030 static void dt_cancel_button_clicked(GtkWidget *widget, gpointer data);
00031 static void connect_data_type_signals(heraia_window_t *main_window);
00032
00033 static void set_spinbutton_max_range(heraia_window_t *main_window);
00034
00035 static void close_data_type_window(heraia_window_t *main_window);
00036 static void destroy_container_widget(treatment_container_t *tment_c, gboolean all);
00037 static treatment_container_t *new_treatment_container(heraia_window_t *main_window);
00038 static void create_treatment_container_widget(heraia_window_t *main_window, treatment_container_t *tment_c);
00039 static guchar *print_bin_to_hex(GtkWidget *entry, GList *values_list);
00040
00041
00042 static void add_treatment_container_widget(GtkWidget *widget, gpointer data);
00043 static void remove_treatment_container_widget(GtkWidget *widget, gpointer data);
00044 static void cb_changed_in_treatment_container_widget(GtkWidget *widget, gpointer data);
00045
00049 data_type_t *new_data_type(gchar *name, guint size)
00050 {
00051 data_type_t *a_data_type = NULL;
00052
00053 a_data_type = (data_type_t *) g_malloc0(sizeof(data_type_t));
00054
00055 if (name != NULL)
00056 {
00057 a_data_type->name = g_strdup(name);
00058 }
00059 else
00060 {
00061 a_data_type->name = NULL;
00062 }
00063
00064 a_data_type->size = size;
00065
00066
00067 a_data_type->di_label = NULL;
00068 a_data_type->di_entry = NULL;
00069
00070 return a_data_type;
00071 }
00072
00073
00077 void free_data_type(data_type_t *a_data_type)
00078 {
00079 if (a_data_type != NULL)
00080 {
00081 if (a_data_type->name != NULL)
00082 {
00083 g_free(a_data_type->name);
00084 }
00085
00086 g_free(a_data_type);
00087 }
00088 }
00089
00090
00096 data_type_t *copy_data_type_struct(heraia_window_t *main_window, data_type_t *a_data_type)
00097 {
00098 data_type_t *data_type = NULL;
00099 treatment_container_t *tment_c = NULL;
00100 GList *list = NULL;
00101 GList *list2 = NULL;
00102
00103 if (a_data_type != NULL)
00104 {
00105 data_type = new_data_type(a_data_type->name, a_data_type->size);
00106 list = a_data_type->treatment_c_list;
00107
00108 while (list != NULL)
00109 {
00114 tment_c = new_treatment_container(main_window);
00115 tment_c->treatment = copy_treatment(((treatment_container_t *)list->data)->treatment);
00116 list2 = g_list_append(list2, tment_c);
00117 list = g_list_next(list);
00118 }
00119
00120 data_type->treatment_c_list = list2;
00121
00122
00123 create_ud_data_interpretor_widgets(main_window, data_type);
00124 gtk_label_set_text(GTK_LABEL(data_type->di_label), gtk_label_get_text(GTK_LABEL(a_data_type->di_label)));
00125 }
00126
00127 return data_type;
00128 }
00129
00130
00137 static void set_spinbutton_max_range(heraia_window_t *main_window)
00138 {
00139 data_window_t *data_window = main_window->current_DW;
00140 guint64 till_end = 0;
00141 GtkSpinButton *size_spin_button = NULL;
00142 GtkHex *gh = NULL;
00143
00144 gh = GTK_HEX(data_window->current_hexwidget);
00145
00146 if (gh != NULL)
00147 {
00148 size_spin_button = GTK_SPIN_BUTTON(heraia_get_widget(main_window->xmls->main, "dt_size_spinbutton"));
00149 till_end = ghex_file_size(gh) - gtk_hex_get_cursor(gh);
00150
00151 if (till_end >= DT_SPIN_MIN && till_end <= DT_SPIN_MAX)
00152 {
00153 gtk_spin_button_set_range(size_spin_button, DT_SPIN_MIN, till_end);
00154 }
00155 else
00156 {
00157 gtk_spin_button_set_range(size_spin_button, DT_SPIN_MIN, DT_SPIN_MAX);
00158 }
00159 }
00160 }
00161
00162
00167 static void fill_treatment_combobox(GtkWidget *tment_list, GList *available_list)
00168 {
00169 treatment_t *tment = NULL;
00170
00171 while (available_list != NULL)
00172 {
00173 tment = (treatment_t *) available_list->data;
00174 if (tment->name != NULL)
00175 {
00176 gtk_combo_box_append_text(GTK_COMBO_BOX(tment_list), tment->name);
00177 }
00178
00179 available_list = g_list_next(available_list);
00180 }
00181
00182
00183 gtk_combo_box_set_active(GTK_COMBO_BOX(tment_list), -1);
00184 }
00185
00189 static void set_active_text_item(GtkWidget *combo_box, gchar *name)
00190 {
00191 GtkTreeIter iter;
00192 GtkTreeModel *model = NULL;
00193 gchar *list_name = NULL;
00194 gboolean ok = TRUE;
00195 gboolean stop = FALSE;
00196
00197 if (name != NULL)
00198 {
00199
00200 model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo_box));
00201
00202 ok = gtk_tree_model_get_iter_first(model, &iter);
00203
00204 while (ok == TRUE && stop == FALSE)
00205 {
00206 gtk_tree_model_get(model, &iter, 0, &list_name, -1);
00207 if (g_ascii_strcasecmp(list_name, name) == 0)
00208 {
00209 stop = TRUE;
00210 }
00211 else
00212 {
00213 ok = gtk_tree_model_iter_next(model, &iter);
00214 }
00215 }
00216
00217 if (stop == TRUE)
00218 {
00219 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo_box), &iter);
00220 }
00221 }
00222 }
00223
00224
00230 static treatment_container_t *new_treatment_container(heraia_window_t *main_window)
00231 {
00232 treatment_container_t *tment_c;
00233
00234 tment_c = (treatment_container_t *) g_malloc0(sizeof(treatment_container_t));
00235 tment_c->treatment = NULL;
00236
00237
00238 tment_c->container_box = gtk_hbox_new(FALSE, DT_BOX_SPACING);
00239 tment_c->combo_box = gtk_vbox_new(FALSE, DT_BOX_SPACING);
00240 tment_c->button_box = gtk_hbox_new(FALSE, DT_BOX_SPACING);
00241 tment_c->tment_list = gtk_combo_box_new_text();
00242 fill_treatment_combobox(tment_c->tment_list, main_window->available_treatment_list);
00243
00244 tment_c->result = gtk_entry_new();
00245 gtk_entry_set_editable(GTK_ENTRY(tment_c->result), FALSE);
00246 tment_c->moins = gtk_button_new_with_label(" - ");
00247 tment_c->plus = gtk_button_new_with_label(" + ");
00248
00249
00250 g_signal_connect(G_OBJECT(tment_c->plus), "clicked",
00251 G_CALLBACK(add_treatment_container_widget), main_window);
00252 g_signal_connect(G_OBJECT(tment_c->moins), "clicked",
00253 G_CALLBACK(remove_treatment_container_widget), main_window);
00254 g_signal_connect(G_OBJECT(tment_c->tment_list), "changed",
00255 G_CALLBACK(cb_changed_in_treatment_container_widget), main_window);
00256
00257
00258 gtk_box_pack_start(GTK_BOX(tment_c->button_box), tment_c->moins, FALSE, FALSE, DT_BOX_PADDING);
00259 gtk_box_pack_start(GTK_BOX(tment_c->button_box), tment_c->plus, FALSE, FALSE, DT_BOX_PADDING);
00260 gtk_box_pack_start(GTK_BOX(tment_c->button_box), tment_c->result, FALSE, FALSE, DT_BOX_PADDING);
00261 gtk_box_pack_start(GTK_BOX(tment_c->combo_box), tment_c->tment_list, FALSE, FALSE, DT_BOX_PADDING);
00262 gtk_box_pack_end(GTK_BOX(tment_c->container_box), tment_c->button_box, FALSE, FALSE, DT_BOX_PADDING);
00263 gtk_box_pack_start(GTK_BOX(tment_c->container_box), tment_c->combo_box, FALSE, FALSE, DT_BOX_PADDING);
00264
00265 return tment_c;
00266 }
00267
00268
00272 static void create_treatment_container_widget(heraia_window_t *main_window, treatment_container_t *tment_c)
00273 {
00274 GtkWidget *vbox = NULL;
00275
00276 vbox = heraia_get_widget(main_window->xmls->main, "dt_treatment_vbox");
00277
00278 gtk_box_pack_start(GTK_BOX(vbox), tment_c->container_box, FALSE, FALSE, DT_BOX_PADDING);
00279
00280 if (tment_c->treatment != NULL)
00281 {
00282
00283 tment_c->treatment->init(tment_c->treatment);
00284 set_active_text_item(tment_c->tment_list, tment_c->treatment->name);
00285 }
00286 }
00287
00288
00294 static void add_treatment_container_widget(GtkWidget *widget, gpointer data)
00295 {
00296 heraia_window_t *main_window = (heraia_window_t *) data;
00297 treatment_container_t *new_container = NULL;
00298 data_type_t *a_data_type = NULL;
00299
00300 a_data_type = main_window->current_data_type;
00301
00302
00303 new_container = new_treatment_container(main_window);
00304
00305
00306 create_treatment_container_widget(main_window, new_container);
00307
00308 gtk_widget_show_all(new_container->container_box);
00309
00310
00311 a_data_type->treatment_c_list = g_list_append(a_data_type->treatment_c_list, (gpointer) new_container);
00312
00313
00314 refresh_hex_datas_entry(main_window);
00315 }
00316
00320 static GList *find_treatment_container_from_widget(GList *container_list, GtkWidget *widget)
00321 {
00322 gboolean stop = FALSE;
00323 treatment_container_t *tment_c = NULL;
00324
00325 while (container_list != NULL && stop == FALSE)
00326 {
00327 tment_c = (treatment_container_t *) container_list->data;
00328 if (tment_c->moins == widget || tment_c->tment_list == widget)
00329 {
00330 stop = TRUE;
00331 }
00332 else
00333 {
00334 container_list = g_list_next(container_list);
00335 }
00336 }
00337
00338 return container_list;
00339 }
00340
00341
00345 static void remove_treatment_container_widget(GtkWidget *widget, gpointer data)
00346 {
00347 heraia_window_t *main_window = (heraia_window_t *) data;
00348 data_type_t *a_data_type = NULL;
00349 treatment_container_t *tment_c = NULL;
00350 GList *list = NULL;
00351
00352 a_data_type = main_window->current_data_type;
00353 list = find_treatment_container_from_widget(a_data_type->treatment_c_list, widget);
00354 if (list != NULL)
00355 {
00356 tment_c = (treatment_container_t *) list->data;
00357
00358
00359 destroy_container_widget(tment_c, TRUE);
00360
00361
00362 a_data_type->treatment_c_list = g_list_delete_link(a_data_type->treatment_c_list, list);
00363
00364
00365 refresh_hex_datas_entry(main_window);
00366 }
00367 }
00368
00372 static guchar *update_treatment_container_list_entries(GList *tment_c_list, GList *values_list)
00373 {
00374 treatment_container_t *tment_c = NULL;
00375 guchar *final = NULL;
00376
00377 while (tment_c_list != NULL)
00378 {
00379 tment_c = (treatment_container_t *) tment_c_list->data;
00380
00381 if (tment_c->treatment != NULL && tment_c->treatment->do_it != NULL)
00382 {
00383 values_list = tment_c->treatment->do_it(values_list);
00384 final = print_bin_to_hex(tment_c->result, values_list);
00385 }
00386
00387 tment_c_list = g_list_next(tment_c_list);
00388 }
00389
00390 return final;
00391 }
00392
00393
00398 static void cb_changed_in_treatment_container_widget(GtkWidget *widget, gpointer data)
00399 {
00400 heraia_window_t *main_window = (heraia_window_t *) data;
00401 data_type_t *a_data_type = NULL;
00402 treatment_container_t *tment_c = NULL;
00403 treatment_t *tment = NULL;
00404 gchar *tment_name = NULL;
00405 GList *list = NULL;
00406
00407
00408 a_data_type = main_window->current_data_type;
00409 list = find_treatment_container_from_widget(a_data_type->treatment_c_list, widget);
00410 if (list != NULL)
00411 {
00412 tment_c = (treatment_container_t *) list->data;
00413
00414
00415 tment_name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(tment_c->tment_list));
00416
00417
00418 tment = find_treatment(main_window->available_treatment_list, tment_name);
00419
00420 if (tment != NULL)
00421 {
00422
00423
00424 tment_c->treatment = copy_treatment(tment);
00425
00426
00427 refresh_hex_datas_entry(main_window);
00428 }
00429 }
00430 }
00431
00435 void create_ud_data_interpretor_widgets(heraia_window_t *main_window, data_type_t *a_data_type)
00436 {
00437 GtkWidget *vbox = NULL;
00438
00439
00440 a_data_type->di_label = gtk_label_new(NULL);
00441 gtk_misc_set_padding(GTK_MISC(a_data_type->di_label), 4, 4);
00442 gtk_misc_set_alignment(GTK_MISC(a_data_type->di_label), 0.5, 0.5);
00443
00444 a_data_type->di_entry = gtk_entry_new();
00445
00446 vbox = heraia_get_widget(main_window->xmls->main, "ud_type_vbox");
00447 gtk_box_pack_start(GTK_BOX(vbox), a_data_type->di_label, FALSE, FALSE, DT_BOX_PADDING);
00448
00449 vbox = heraia_get_widget(main_window->xmls->main, "ud_value_vbox");
00450 gtk_box_pack_start(GTK_BOX(vbox), a_data_type->di_entry, FALSE, FALSE, DT_BOX_PADDING);
00451
00452 gtk_widget_show(a_data_type->di_label);
00453 gtk_widget_show(a_data_type->di_entry);
00454 }
00455
00456
00463 void show_data_type_window(heraia_window_t *main_window, data_type_t *a_data_type)
00464 {
00465 treatment_container_t *new_container = NULL;
00466 GList *list = NULL;
00467
00468
00469 list = a_data_type->treatment_c_list;
00470
00471 if (list == NULL)
00472 {
00473 log_message(main_window, G_LOG_LEVEL_DEBUG, "Creating a new treatment container");
00474
00475
00476 new_container = new_treatment_container(main_window);
00477
00478
00479 create_treatment_container_widget(main_window, new_container);
00480
00481
00482 a_data_type->treatment_c_list = g_list_append(a_data_type->treatment_c_list, (gpointer) new_container);
00483 }
00484 else
00485 {
00486 while (list != NULL)
00487 {
00488
00489 new_container = (treatment_container_t *) list->data;
00490
00491 log_message(main_window, G_LOG_LEVEL_DEBUG, "Creating a treatment container");
00492
00493 create_treatment_container_widget(main_window, new_container);
00494 gtk_widget_show_all(new_container->container_box);
00495
00496 list = g_list_next(list);
00497 }
00498 }
00499
00500
00501 fill_data_type_widgets(main_window, a_data_type);
00502 set_spinbutton_max_range(main_window);
00503
00504 gtk_widget_show_all(heraia_get_widget(main_window->xmls->main, "data_type_window"));
00505 }
00506
00507
00514 static guchar *print_bin_to_hex(GtkWidget *entry, GList *values_list)
00515 {
00516 guint i = 0;
00517 guchar *aux = NULL;
00518 guchar *hex = NULL;
00519 guchar *final = NULL;
00520 value_t *a_value = NULL;
00521
00522 while (values_list != NULL)
00523 {
00524 a_value = (value_t *) values_list->data;
00525
00526 aux = (guchar *) g_malloc0(sizeof(guchar) * 3);
00527 hex = (guchar *) g_malloc0(sizeof(guchar) * ((a_value->length * 2) + 1) );
00528
00529 for(i = 0; i < a_value->length; i++)
00530 {
00531 sprintf((char *) aux, "%02x", a_value->bytes[i]);
00532 memcpy(hex+(i*2), aux, 2);
00533 }
00534
00535 hex[i*2+1] = '\0';
00536 g_free(aux);
00537
00538 if (final == NULL)
00539 {
00540 final = (guchar *) g_strdup((gchar *) hex);
00541 }
00542 else
00543 {
00544 aux = final;
00545 final = (guchar *) g_strconcat((gchar *) aux, " / ", (gchar *) hex);
00546 g_free(aux);
00547 }
00548
00549 g_free(hex);
00550
00551 values_list = g_list_next(values_list);
00552 }
00553
00554 if (entry != NULL)
00555 {
00556 gtk_entry_set_text(GTK_ENTRY(entry), (gchar *) final);
00557 }
00558
00559 return final;
00560 }
00561
00562
00567 static void refresh_one_ud_data_interpretor(data_type_t *a_data_type, value_t *a_value)
00568 {
00569 treatment_container_t *tment_c = NULL;
00570 GList *tment_c_list = NULL;
00571 guchar *final = NULL;
00572 GList *values_list = NULL;
00573
00574 values_list = g_list_append(values_list, (gpointer) a_value);
00575
00576 if (a_data_type != NULL)
00577 {
00578 tment_c_list = a_data_type->treatment_c_list;
00579
00580 while (tment_c_list != NULL)
00581 {
00582 tment_c = (treatment_container_t *) tment_c_list->data;
00583
00584 if (tment_c->treatment != NULL && tment_c->treatment->do_it != NULL)
00585 {
00586 values_list = tment_c->treatment->do_it(values_list);
00587 }
00588
00589 tment_c_list = g_list_next(tment_c_list);
00590 }
00591
00592 final = print_bin_to_hex(a_data_type->di_entry, values_list);
00593 g_free(final);
00594 }
00595 }
00596
00597
00602 void refresh_all_ud_data_interpretor(heraia_window_t *main_window, guint endianness)
00603 {
00604 data_window_t *data_window = main_window->current_DW;
00605 value_t *a_value = NULL;
00606 guchar *bin_datas = NULL;
00607 GList *data_type_list = NULL;
00608 data_type_t *a_data_type = NULL;
00609 guint length = 0;
00610 gboolean result = FALSE;
00611 gchar *text = NULL;
00612
00613 data_type_list = main_window->data_type_list;
00614
00615 while (data_type_list != NULL)
00616 {
00617 a_data_type = (data_type_t *) data_type_list->data;
00618
00619 if (a_data_type != NULL)
00620 {
00621 length = a_data_type->size;
00622 bin_datas = (guchar *) g_malloc0(sizeof(guchar) * length);
00623 result = ghex_get_data(data_window, length, endianness, bin_datas);
00624
00625 if (result == TRUE)
00626 {
00627 a_value = new_value_t(length, bin_datas);
00628 refresh_one_ud_data_interpretor(a_data_type, a_value);
00629 }
00630 else
00631 {
00632 text = g_strdup_printf("Cannot copy %d bytes in order to interpret them !", length);
00633 gtk_entry_set_text(GTK_ENTRY(a_data_type->di_entry), text);
00634 g_free(text);
00635 }
00636 g_free(bin_datas);
00637 }
00638
00639 data_type_list = g_list_next(data_type_list);
00640 }
00641
00642 }
00643
00644
00653 void refresh_hex_datas_entry(heraia_window_t *main_window)
00654 {
00655 guchar *bin_datas = NULL;
00656 data_window_t *data_window = main_window->current_DW;
00657 guint length = 0;
00658 gboolean result = FALSE;
00659 GtkWidget *entry = NULL;
00660 value_t *a_value = NULL;
00661 GList *values_list = NULL;
00662 GList *tment_c_list = NULL;
00663 guchar *final = NULL;
00664
00665 length = main_window->current_data_type->size;
00666
00667 if (data_window->current_hexwidget != NULL)
00668 {
00669 bin_datas = (guchar *) g_malloc0(sizeof(guchar) * length);
00670 result = ghex_get_data(data_window, length, H_DI_LITTLE_ENDIAN, bin_datas);
00671
00672 if (result == TRUE)
00673 {
00674 entry = heraia_get_widget(main_window->xmls->main, "hex_datas_entry");
00675 a_value = new_value_t(length, bin_datas);
00676 values_list = g_list_append(values_list, (gpointer) a_value);
00677
00678 print_bin_to_hex(entry, values_list);
00679
00680
00681 tment_c_list = main_window->current_data_type->treatment_c_list;
00682 final = update_treatment_container_list_entries(tment_c_list, values_list);
00683
00684
00685 if (final != NULL)
00686 {
00687 gtk_entry_set_text(GTK_ENTRY(main_window->current_data_type->di_entry), (gchar *) final);
00688 }
00689 }
00690
00691 g_free(bin_datas);
00692 }
00693 }
00694
00695
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00724 void fill_data_type_widgets(heraia_window_t *main_window, data_type_t *a_data_type)
00725 {
00726 GtkEntry *entry = NULL;
00727 GtkSpinButton *size_spin_button = NULL;
00728 gdouble min = 0.0;
00729 gdouble max = 0.0;
00730
00731
00732 entry = GTK_ENTRY(heraia_get_widget(main_window->xmls->main, "dt_name_entry"));
00733 gtk_entry_set_text(entry, a_data_type->name);
00734
00735
00736 size_spin_button = GTK_SPIN_BUTTON(heraia_get_widget(main_window->xmls->main, "dt_size_spinbutton"));
00737 gtk_spin_button_get_range(size_spin_button, &min, &max);
00738
00739 if (a_data_type->size >= min && a_data_type->size <= max)
00740 {
00741 gtk_spin_button_set_value(size_spin_button, a_data_type->size);
00742 }
00743 else
00744 {
00745 if (a_data_type->size > max)
00746 {
00747 gtk_spin_button_set_value(size_spin_button, max);
00748 }
00749 else
00750 {
00751 gtk_spin_button_set_value(size_spin_button, max);
00752 }
00753 }
00754
00755 refresh_hex_datas_entry(main_window);
00756 }
00757
00758
00764 GList *is_data_type_name_already_used(GList *data_type_list, gchar *name)
00765 {
00766 gboolean result = FALSE;
00767 data_type_t *one_data_type = NULL;
00768
00769 while (data_type_list != NULL && result == FALSE)
00770 {
00771 one_data_type = (data_type_t *) data_type_list->data;
00772
00773 if (g_ascii_strcasecmp(name, one_data_type->name) == 0)
00774 {
00775 result = TRUE;
00776 }
00777 else
00778 {
00779 data_type_list = data_type_list->next;
00780 }
00781 }
00782
00783 if (result == TRUE)
00784 {
00785 return data_type_list;
00786 }
00787 else
00788 {
00789 return NULL;
00790 }
00791 }
00792
00793
00797 static gboolean delete_data_type_window_event(GtkWidget *widget, GdkEvent *event, gpointer data)
00798 {
00799 heraia_window_t *main_window = (heraia_window_t *) data;
00800
00801 close_data_type_window(main_window);
00802
00803 return TRUE;
00804 }
00805
00806
00810 static void destroy_data_type_window(GtkWidget *widget, GdkEvent *event, gpointer data)
00811 {
00812 heraia_window_t *main_window = (heraia_window_t *) data;
00813
00814 close_data_type_window(main_window);
00815 }
00816
00817
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00846 static void destroy_container_widget(treatment_container_t *tment_c, gboolean all)
00847 {
00848 if (tment_c != NULL)
00849 {
00850 destroy_a_single_widget(tment_c->plus);
00851 tment_c->plus = NULL;
00852
00853 destroy_a_single_widget(tment_c->moins);
00854 tment_c->moins = NULL;
00855
00856 destroy_a_single_widget(tment_c->result);
00857 tment_c->result = NULL;
00858
00859 destroy_a_single_widget(tment_c->tment_list);
00860 tment_c->tment_list = NULL;
00861
00862 destroy_a_single_widget(tment_c->button_box);
00863 tment_c->button_box = NULL;
00864
00865 destroy_a_single_widget(tment_c->combo_box);
00866 tment_c->combo_box = NULL;
00867
00868 destroy_a_single_widget(tment_c->container_box);
00869 tment_c->container_box = NULL;
00870
00871 if (all == TRUE)
00872 {
00873
00874 if (tment_c->treatment != NULL && tment_c->treatment->kill != NULL)
00875 {
00876 tment_c->treatment->kill(tment_c->treatment);
00877 }
00878
00879 g_free(tment_c);
00880 }
00881 }
00882 }
00883
00887 static void close_data_type_window(heraia_window_t *main_window)
00888 {
00889 data_type_t *a_data_type = NULL;
00890 GList *list = NULL;
00891
00892
00893 a_data_type = main_window->current_data_type;
00894
00895
00896 list = a_data_type->treatment_c_list;
00897
00898
00899
00900 while (list != NULL)
00901 {
00902 destroy_container_widget((treatment_container_t *)list->data, FALSE);
00903 list = g_list_next(list);
00904 }
00905
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916 gtk_widget_hide(heraia_get_widget(main_window->xmls->main, "data_type_window"));
00917 }
00918
00922 static void dt_ok_button_clicked(GtkWidget *widget, gpointer data)
00923 {
00924 heraia_window_t *main_window = (heraia_window_t *) data;
00925 data_type_t *a_data_type = NULL;
00926 GList *data_type_list = NULL;
00927
00928 a_data_type = main_window->current_data_type;
00929
00930 if (g_ascii_strcasecmp(a_data_type->name, "") != 0)
00931 {
00932 data_type_list = is_data_type_name_already_used(main_window->data_type_list, a_data_type->name);
00933
00934 if (data_type_list == NULL)
00935 {
00940 log_message(main_window, G_LOG_LEVEL_DEBUG, "Adding %s data type name to treeview", a_data_type->name);
00941 add_data_type_name_to_treeview(main_window, a_data_type->name);
00942
00943
00944 gtk_label_set_text(GTK_LABEL(a_data_type->di_label), a_data_type->name);
00945
00946 main_window->data_type_list = g_list_prepend(main_window->data_type_list, a_data_type);
00947 }
00948 else
00949 {
00954 log_message(main_window, G_LOG_LEVEL_DEBUG, "Editing mode (%s exists)", a_data_type->name);
00955
00956
00957 destroy_a_single_widget(main_window->current_data_type->di_label);
00958 destroy_a_single_widget(main_window->current_data_type->di_entry);
00959 destroy_a_single_widget(((data_type_t *)data_type_list->data)->di_label);
00960 destroy_a_single_widget(((data_type_t *)data_type_list->data)->di_entry);
00961
00962 free_data_type((data_type_t *)data_type_list->data);
00963 create_ud_data_interpretor_widgets(main_window, a_data_type);
00964
00965
00966 gtk_label_set_text(GTK_LABEL(a_data_type->di_label), a_data_type->name);
00967
00968 data_type_list->data = a_data_type;
00969 }
00970
00971 refresh_hex_datas_entry(main_window);
00972
00973 close_data_type_window(main_window);
00974 }
00975 }
00976
00977
00981 static void dt_cancel_button_clicked(GtkWidget *widget, gpointer data)
00982 {
00983 heraia_window_t *main_window = (heraia_window_t *) data;
00984 data_type_t *a_data_type = NULL;
00985
00986 a_data_type = main_window->current_data_type;
00987
00988
00989 destroy_a_single_widget(a_data_type->di_label);
00990 destroy_a_single_widget(a_data_type->di_entry);
00991
00992 close_data_type_window(main_window);
00993 }
00994
00995
01000 static void dt_size_spinbutton_value_changed(GtkWidget *widget, gpointer data)
01001 {
01002 heraia_window_t *main_window = (heraia_window_t *) data;
01003 GtkSpinButton *dt_size_spinbutton = GTK_SPIN_BUTTON(heraia_get_widget(main_window->xmls->main, "dt_size_spinbutton"));
01004 guint length = 0;
01005
01006 if (main_window != NULL)
01007 {
01008
01009 length = gtk_spin_button_get_value_as_int(dt_size_spinbutton);
01010
01011 if (length >= DT_SPIN_MIN && length <= DT_SPIN_MAX)
01012 {
01013 if (main_window->current_data_type != NULL)
01014 {
01015 main_window->current_data_type->size = length;
01016 }
01017 }
01018
01019 refresh_hex_datas_entry(main_window);
01020 }
01021 }
01022
01023
01029 static void dt_name_entry_leave_notify_event(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
01030 {
01031 heraia_window_t *main_window = (heraia_window_t *) data;
01032 GtkEntry *entry = NULL;
01033
01034 if (main_window != NULL && main_window->current_data_type != NULL)
01035 {
01036 entry = GTK_ENTRY(heraia_get_widget(main_window->xmls->main, "dt_name_entry"));
01037
01038 if (main_window->current_data_type->name != NULL)
01039 {
01040 g_free(main_window->current_data_type->name);
01041 }
01042
01043 main_window->current_data_type->name = g_strdup(gtk_entry_get_text(entry));
01044
01045 }
01046 }
01047
01048
01049
01053 static void connect_data_type_signals(heraia_window_t *main_window)
01054 {
01055
01056 if (main_window != NULL && main_window->xmls != NULL && main_window->xmls->main != NULL)
01057 {
01058
01059 g_signal_connect(G_OBJECT(heraia_get_widget(main_window->xmls->main, "data_type_window")), "delete_event",
01060 G_CALLBACK(delete_data_type_window_event), main_window);
01061
01062 g_signal_connect(G_OBJECT(heraia_get_widget(main_window->xmls->main, "data_type_window")), "destroy",
01063 G_CALLBACK(destroy_data_type_window), main_window);
01064
01065
01066 g_signal_connect (G_OBJECT(heraia_get_widget(main_window->xmls->main, "dt_ok_button")), "clicked",
01067 G_CALLBACK(dt_ok_button_clicked), main_window);
01068
01069
01070 g_signal_connect (G_OBJECT(heraia_get_widget(main_window->xmls->main, "dt_cancel_button")), "clicked",
01071 G_CALLBACK(dt_cancel_button_clicked), main_window);
01072
01073
01074 g_signal_connect(G_OBJECT(heraia_get_widget(main_window->xmls->main, "dt_size_spinbutton")), "value-changed",
01075 G_CALLBACK(dt_size_spinbutton_value_changed), main_window);
01076
01077
01078 g_signal_connect(G_OBJECT(heraia_get_widget(main_window->xmls->main, "dt_name_entry")), "leave-notify-event",
01079 G_CALLBACK(dt_name_entry_leave_notify_event), main_window);
01080
01081 }
01082 }
01083
01084
01091 void data_type_init_interface(heraia_window_t *main_window)
01092 {
01093 if (main_window != NULL)
01094 {
01095 connect_data_type_signals(main_window);
01096 }
01097 }