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