diff --git a/src/Makefile.am b/src/Makefile.am index b2bfd881..6da1704c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -66,6 +66,7 @@ file_C = filegen.c \ file_bld.c \ file_bmp.c \ file_bpg.c \ + file_bvr.c \ file_bz2.c \ file_c4d.c \ file_cab.c \ diff --git a/src/file_bvr.c b/src/file_bvr.c new file mode 100644 index 00000000..1b4a43db --- /dev/null +++ b/src/file_bvr.c @@ -0,0 +1,79 @@ +/* + + File: file_bvr.c + + Copyright (C) 2018 Christophe GRENIER + + This software is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#include +#include "types.h" +#include "filegen.h" + +static void register_header_check_bvr(file_stat_t *file_stat); + +const file_hint_t file_hint_bvr= { + .extension="bvr", + .description="Blue Iris DVR", + .max_filesize=PHOTOREC_MAX_FILE_SIZE, + .recover=1, + .enable_by_default=1, + .register_header_check=®ister_header_check_bvr +}; + +static data_check_t data_check_bvr(const unsigned char *buffer, const unsigned int buffer_size, file_recovery_t *file_recovery) +{ + while(file_recovery->calculated_file_size + buffer_size/2 >= file_recovery->file_size && + file_recovery->calculated_file_size + 16 < file_recovery->file_size + buffer_size/2) + { + const unsigned int i=file_recovery->calculated_file_size - file_recovery->file_size + buffer_size/2; + const uint32_t *valp=(const uint32_t *)&buffer[i+12]; + if(memcmp(&buffer[i], "BLUE", 4) != 0) + return DC_STOP; + file_recovery->calculated_file_size+=0x20 + *valp; + if(*valp == 0) + return DC_STOP; + } + return DC_CONTINUE; +} + +static int header_check_bvr(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) +{ + if(file_recovery->file_stat!=NULL && + file_recovery->file_stat->file_hint==&file_hint_bvr) + { + header_ignored(file_recovery_new); + return 0; + } + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_bvr.extension; + file_recovery_new->data_check=&data_check_bvr; + file_recovery_new->file_check=&file_check_size; + return 1; +} + +static void register_header_check_bvr(file_stat_t *file_stat) +{ + static const unsigned char bvrheader[8]= { 'B', 'L', 'U', 'E', 0x20, 0x00, 0x10, 0x00}; + register_header_check(0, bvrheader, sizeof(bvrheader), &header_check_bvr, file_stat); +} diff --git a/src/file_list.c b/src/file_list.c index aee00150..af971654 100644 --- a/src/file_list.c +++ b/src/file_list.c @@ -67,6 +67,7 @@ extern const file_hint_t file_hint_bkf; extern const file_hint_t file_hint_blend; extern const file_hint_t file_hint_bmp; extern const file_hint_t file_hint_bpg; +extern const file_hint_t file_hint_bvr; extern const file_hint_t file_hint_bz2; extern const file_hint_t file_hint_c4d; extern const file_hint_t file_hint_cab; @@ -398,6 +399,7 @@ file_enable_t list_file_enable[]= { .enable=0, .file_hint=&file_hint_blend }, { .enable=0, .file_hint=&file_hint_bmp }, { .enable=0, .file_hint=&file_hint_bpg }, + { .enable=0, .file_hint=&file_hint_bvr }, { .enable=0, .file_hint=&file_hint_bz2 }, { .enable=0, .file_hint=&file_hint_c4d }, { .enable=0, .file_hint=&file_hint_cab },