diff options
Diffstat (limited to 'src/ufo-roof-read-file.c')
-rw-r--r-- | src/ufo-roof-read-file.c | 84 |
1 files changed, 0 insertions, 84 deletions
diff --git a/src/ufo-roof-read-file.c b/src/ufo-roof-read-file.c deleted file mode 100644 index 4ee11c6..0000000 --- a/src/ufo-roof-read-file.c +++ /dev/null @@ -1,84 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <stdint.h> - -#include "glib.h" - -#include "ufo-roof.h" -#include "ufo-roof-read-file.h" - -typedef struct { - UfoRoofReadInterface iface; - - UfoRoofConfig *cfg; - - gchar *fname; - FILE *fd; -} UfoRoofReadFile; - -static void ufo_roof_read_file_free(UfoRoofReadInterface *iface) { - UfoRoofReadFile *reader = (UfoRoofReadFile*)iface; - - if (reader) { - if (reader->fname) - g_free(reader->fname); - - if (reader->fd) - fclose(reader->fd); - - free(reader); - } -} - -static guint ufo_roof_read_file(UfoRoofReadInterface *iface, uint8_t *buffers, GError **error) { - UfoRoofReadFile *reader = (UfoRoofReadFile*)iface; - UfoRoofConfig *cfg = reader->cfg; - - size_t bytes = 0; - size_t packet_size = cfg->header_size + cfg->payload_size; - size_t expected = cfg->max_packets * packet_size; - - while ((!feof(reader->fd))&&(!ferror(reader->fd))&&(bytes < expected)) { - size_t ret = fread(buffers + bytes, 1, expected - bytes, reader->fd); - bytes += ret; - } - - guint packets = bytes / packet_size; - - if (ferror(reader->fd)) { - roof_network_error_with_retval(error, 0, "read failed, error %i", ferror(reader->fd)); - } else if ((feof(reader->fd))&&(bytes % packet_size)) { - roof_network_error_with_retval(error, packets, "extra data in the end of input"); - } - - return packets; -} - - -UfoRoofReadInterface *ufo_roof_read_file_new(UfoRoofConfig *cfg, const char *path, guint file_id, GError **error) { - UfoRoofReadFile *reader = (UfoRoofReadFile*)calloc(1, sizeof(UfoRoofReadFile)); - if (!reader) roof_new_error(error, "Can't allocate UfoRoofReadFile"); - - // FIXME: Shall we jump if max_packet_size > header+payload (or will be extra data included in the data files)? Report error for now. - if ((cfg->header_size + cfg->payload_size) != cfg->max_packet_size) - roof_new_error(error, "packet_size (%u) should be equal to max_packet_size (%u) if UfoRoofReadFile is used", cfg->header_size + cfg->payload_size, cfg->max_packet_size); - - reader->cfg = cfg; - reader->iface.close = ufo_roof_read_file_free; - reader->iface.read =ufo_roof_read_file; - - reader->fname = g_strdup_printf(path, file_id); - if (!reader->fname) { - free(reader); - roof_new_error(error, "Can't build file name"); - } - - reader->fd = fopen(reader->fname, "rb"); - if (!reader->fd) { - g_free(reader->fname); - g_free(reader); - roof_new_error(error, "Can't open file %i at path %s", file_id, path); - } - - return (UfoRoofReadInterface*)reader; -} |