ghex_heraia_interface.c
Go to the documentation of this file.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
00026
00027 #include <libheraia.h>
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 doc_t *heraia_hex_document_new(heraia_struct_t *main_struct, char *filename)
00040 {
00041 Heraia_Document *hex_doc = NULL;
00042 GtkWidget *hex_widget = NULL;
00043 doc_t *doc = NULL;
00044
00045
00046 hex_doc = hex_document_new_from_file(filename);
00047
00048 if (hex_doc != NULL)
00049 {
00050
00051 hex_widget = hex_document_add_view(hex_doc);
00052
00053
00054 gtk_hex_show_offsets(GTK_HEX(hex_widget), is_toggle_button_activated(main_struct->xmls->main, "mp_display_offset_bt"));
00055
00056
00057 doc = new_doc_t(hex_doc, hex_widget);
00058
00059
00060 g_ptr_array_add(main_struct->documents, doc);
00061
00062
00063 connect_cursor_moved_signal(main_struct, hex_widget);
00064
00065 return doc;
00066 }
00067 else
00068 {
00069 return NULL;
00070 }
00071 }
00072
00073
00074
00075
00076
00077
00078
00079 gchar *heraia_hex_document_get_filename(Heraia_Document *hex_doc)
00080 {
00081 if (hex_doc != NULL)
00082 {
00083 return hex_doc->file_name;
00084 }
00085 else
00086 {
00087 return NULL;
00088 }
00089 }
00090
00091
00092
00093
00094
00095
00096
00097 gchar *doc_t_document_get_filename(doc_t *doc)
00098 {
00099 if (doc != NULL)
00100 {
00101 return heraia_hex_document_get_filename(doc->hex_doc);
00102 }
00103 else
00104 {
00105 return NULL;
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 HERAIA_ERROR heraia_hex_document_save(doc_t *current_doc)
00117 {
00118 gint return_value = FALSE;
00119
00120 if (current_doc != NULL)
00121 {
00122 if (current_doc->hex_doc != NULL)
00123 {
00124 return_value = hex_document_write(current_doc->hex_doc);
00125 }
00126 }
00127
00128 if (return_value != FALSE)
00129 {
00130 return HERAIA_NOERR;
00131 }
00132 else
00133 {
00134 return HERAIA_FILE_ERROR;
00135 }
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145 HERAIA_ERROR heraia_hex_document_save_as(doc_t *current_doc, gchar *filename)
00146 {
00147 gint return_value = FALSE;
00148 FILE *fp = NULL;
00149 gint i = 0;
00150 gchar *path_end = NULL;
00151
00152 if (current_doc != NULL && current_doc->hex_doc != NULL && filename != NULL)
00153 {
00154 fp = fopen(filename, "w");
00155 if (fp != NULL)
00156 {
00157 return_value = hex_document_write_to_file(current_doc->hex_doc, fp);
00158 fclose(fp);
00159
00160
00161 for(i = strlen(current_doc->hex_doc->file_name);
00162 (i >= 0) && (current_doc->hex_doc->file_name[i] != '/');
00163 i--);
00164 if (current_doc->hex_doc->file_name[i] == '/')
00165 {
00166 path_end = ¤t_doc->hex_doc->file_name[i+1];
00167 }
00168 else
00169 {
00170 path_end = current_doc->hex_doc->file_name;
00171 }
00172
00173 current_doc->hex_doc->path_end = g_filename_to_utf8(path_end, -1, NULL, NULL, NULL);
00174 }
00175 }
00176
00177 if (return_value != FALSE)
00178 {
00179 return HERAIA_NOERR;
00180 }
00181 else
00182 {
00183 return HERAIA_FILE_ERROR;
00184 }
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 static void change_endianness(guint len, guint endianness, guchar *result)
00206 {
00207 if (endianness == H_DI_BIG_ENDIAN)
00208 {
00209 if (len > 1)
00210 {
00211 swap_bytes(result, 0, len-1);
00212 }
00213 else
00214 {
00215 reverse_byte_order(result);
00216 }
00217 }
00218 else if (endianness == H_DI_MIDDLE_ENDIAN && len >= 4)
00219 {
00220 swap_bytes(result, 0, (len/2)-1);
00221 swap_bytes(result, (len/2), len-1);
00222 }
00223 }
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 gboolean ghex_memcpy(Heraia_Hex *gh, guint pos, guint len, guint endianness, guchar *result)
00243 {
00244 guint i;
00245
00246 if (result == NULL || gh == NULL)
00247 {
00248 return FALSE;
00249 }
00250 else if ((pos < 0) || ((pos+len) > ghex_file_size(gh)))
00251 {
00252 return FALSE;
00253 }
00254 else
00255 {
00256
00257 for (i=0; i<len ; i++)
00258 {
00259 result[i] = gtk_hex_get_byte(gh, pos+i);
00260 }
00261
00262
00263 change_endianness(len, endianness, result);
00264
00265 return TRUE;
00266 }
00267 }
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 gboolean ghex_get_data(GtkWidget *hex_widget, guint length, guint endianness, guchar *c)
00283 {
00284 gboolean result = FALSE;
00285 Heraia_Hex *gh = GTK_HEX(hex_widget);
00286
00287 if (gh != NULL)
00288 {
00289 result = ghex_memcpy(gh, gtk_hex_get_cursor(gh), length, endianness, c);
00290 }
00291 else
00292 {
00293 result = FALSE;
00294 }
00295
00296 return result;
00297 }
00298
00299
00300
00301
00302
00303
00304
00305 guint64 ghex_file_size(Heraia_Hex *gh)
00306 {
00307 if (gh != NULL && gh->document != NULL)
00308 {
00309 return gh->document->file_size;
00310 }
00311 else
00312 {
00313 return 0;
00314 }
00315 }
00316
00317
00318
00319
00320
00321
00322
00323 guint64 ghex_get_cursor_position(GtkWidget *hex_widget)
00324 {
00325 Heraia_Hex *gh = GTK_HEX(hex_widget);
00326
00327 if (gh != NULL)
00328 {
00329 return gtk_hex_get_cursor(gh);
00330 }
00331 else
00332 {
00333 return 0;
00334 }
00335 }
00336
00337
00338
00339
00340
00341
00342
00343 selection_t *ghex_get_selection(GtkWidget *hex_widget)
00344 {
00345 Heraia_Hex *gh = GTK_HEX(hex_widget);
00346 selection_t *sel = NULL;
00347
00348 if (gh != NULL)
00349 {
00350 sel = (selection_t *) g_malloc0(sizeof(selection_t));
00351
00352 if (gh->selection.start < gh->selection.end)
00353 {
00354 sel->start = gh->selection.start;
00355 sel->end = gh->selection.end;
00356 }
00357 else
00358 {
00359 sel->end = gh->selection.start;
00360 sel->start = gh->selection.end;
00361 }
00362
00363 return sel;
00364 }
00365 else
00366 {
00367 return NULL;
00368 }
00369 }
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379 doc_t *new_doc_t(Heraia_Document *hex_doc, GtkWidget *hex_widget)
00380 {
00381 doc_t *new_doc;
00382
00383 new_doc = (doc_t *) g_malloc0(sizeof(doc_t));
00384
00385 new_doc->hex_doc = hex_doc;
00386 new_doc->hex_widget = hex_widget;
00387 new_doc->modified = hex_doc->changed;
00388
00389 return new_doc;
00390 }
00391
00392
00393
00394
00395
00396
00397 void close_doc_t(doc_t *current_doc)
00398 {
00399
00400 if (current_doc != NULL)
00401 {
00402 gtk_widget_destroy(current_doc->hex_widget);
00403 g_free(current_doc);
00404 }
00405 }