Remove the ability to 'Import' .SDA files

We can instead 'Open' these files as they are just bastardized XML files.

This gets us back to a more consistent point where 'Import' gets data
directly from the dive computer (and hopefully soon we will add the
ability to load a dive directly from a uemis SDA to libdivecomputer),
and 'Open' loads a file from the filesystem of the computer we are
running on (this last sentence phrased so awkwardly as the uemis Zurich
SDA is a computer and presents a file system when connected via USB - it
just doesn't have the dive data in an accessible format in that file
system).

As a bonus we get to throw away quite a bit of code (the uemis specific
file handling, mini-XML parser with helper functions, the file open dialog
in the importer). Yay!

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2011-10-03 08:27:36 -07:00
parent 254b851e44
commit c15f798a85
5 changed files with 2 additions and 163 deletions

113
uemis.c
View file

@ -73,64 +73,6 @@ static void decode( uint8_t *inbuf, uint8_t *outbuf, int inbuf_len ) {
}
/* end code from Bob Trower */
/* small helper functions */
/* simpleregex allocates (and reallocates) the found buffer
* don't forget to free it when you are done
*/
static int simpleregex(char *buffer, char *regex, char **found) {
int status;
regex_t re;
regmatch_t match[5];
if (regcomp(&re, regex, 0) !=0) {
fprintf(stderr,"internal error, regex failed!\n");
exit(1);
}
status = regexec(&re,buffer,5,match,0);
if(status == 0) {
*found = realloc(*found,match[1].rm_eo-match[1].rm_so + 1);
strncpy(*found,buffer+match[1].rm_so,match[1].rm_eo-match[1].rm_so);
(*found)[match[1].rm_eo-match[1].rm_so] = '\0';
}
return(status == 0);
}
/* read in line of arbitrary length (important for SDA files that can
* have lines that are tens of kB long
* don't forget to free it when you are done
*/
#define MYGETL_INCR 1024
static char * mygetline(FILE * f) {
size_t size = 0;
size_t len = 0;
char * buf = NULL;
do {
size += MYGETL_INCR;
if ((buf = realloc(buf,size)) == NULL)
break;
fgets(buf+len,MYGETL_INCR,f);
len = strlen(buf);
} while (!feof(f) && buf[len-1]!='\n');
return buf;
}
/* text matching, used to build very poor man's XML parser */
int matchit(FILE *infd, char *regex, char *typeregex, char **found) {
char *buffer;
while (!feof(infd)) {
buffer = mygetline(infd);
if (buffer && simpleregex(buffer,regex,found)) {
buffer = mygetline(infd);
if (buffer && simpleregex(buffer,typeregex,found)) {
return 1;
}
}
}
return 0;
}
/*
* pressure_to_depth: In centibar. And when converting to
* depth, I'm just going to always use saltwater, because I
@ -233,58 +175,3 @@ void uemis_parse_divelog_binary(char *base64, void *datap) {
dive->duration.seconds = sample->time.seconds - 1;
return;
}
/* parse a single file
* TODO: we don't report any errors when the parse fails - we simply don't add them to the list
*/
void
parse_uemis_file(char *divelogfilename) {
char *found=NULL;
struct tm tm;
struct dive *dive;
FILE *divelogfile = fopen(divelogfilename,"r");
dive = alloc_dive();
if (! matchit(divelogfile,"val key=\"date\"","<ts>\\([^<]*\\)</ts>",&found)) {
/* some error handling */
goto bail;
}
strptime(found, "%Y-%m-%dT%H:%M:%S", &tm);
dive->when = utc_mktime(&tm);
if (! matchit(divelogfile,"<val key=\"duration\">",
"<float>\\([0-9.]*\\)</float>", &found)) {
/* some error handling */
goto bail;
}
dive->duration.seconds = 60.0 * atof(found);
if (! matchit(divelogfile,"<val key=\"depth\">",
"<int>\\([0-9.]*\\)</int>", &found)) {
/* some error handling */
goto bail;
}
dive->maxdepth.mm = pressure_to_depth(atoi(found));
if (! matchit(divelogfile,"<val key=\"file_content\">",
">\\([a-zA-Z0-9+/=]*\\)<", &found)) {
/* some error handling */
goto bail;
}
uemis_parse_divelog_binary(found,&dive);
record_dive(dive);
bail:
if (found)
free(found);
}
/*
* parse the two files extracted from the SDA
*/
void
uemis_import() {
if (open_import_file_dialog("*.SDA","uemis Zurich SDA files",
&parse_uemis_file))
report_dives();
}