diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/fax/file.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/fax/file.c')
-rwxr-xr-x | sys/src/cmd/fax/file.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/sys/src/cmd/fax/file.c b/sys/src/cmd/fax/file.c new file mode 100755 index 000000000..3da7c7a96 --- /dev/null +++ b/sys/src/cmd/fax/file.c @@ -0,0 +1,164 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> + +#include "modem.h" + +static long wd[5] = { + 1728, 2048, 2432, 1216, 864 +}; + +void +setpageid(char *pageid, char *spool, long time, int pid, int pageno) +{ + sprint(pageid, "%s/%lud.%d.%3.3d", spool, time, pid, pageno); +} + +int +createfaxfile(Modem *m, char *spool) +{ + setpageid(m->pageid, spool, m->time, m->pid, m->pageno); + verbose("openfaxfile: %s", m->pageid); + if((m->pagefd = create(m->pageid, OTRUNC|OWRITE, 0666)) < 0) + return seterror(m, Esys); + + fprint(m->pagefd, "TYPE=ccitt-g31\n"); + fprint(m->pagefd, "WINDOW=0 0 %ld -1\n", wd[m->fdcs[2]]); + if(m->valid & Vftsi) + fprint(m->pagefd, "FTSI=%s\n", m->ftsi); + fprint(m->pagefd, "FDCS=%lud,%lud,%lud,%lud,%lud,%lud,%lud,%lud\n", + m->fdcs[0], m->fdcs[1], m->fdcs[2], m->fdcs[3], + m->fdcs[4], m->fdcs[5], m->fdcs[6], m->fdcs[7]); + fprint(m->pagefd, "\n"); + + return Eok; +} + +enum +{ + Gshdrsize= 0x40, +}; + +int +gsopen(Modem *m) +{ + int n; + char bytes[Gshdrsize]; + + /* + * Is this gs output + */ + n = Bread(m->bp, bytes, Gshdrsize); + if(n != Gshdrsize) + return seterror(m, Esys); + if(bytes[0]!='\0' || strcmp(bytes+1, "PC Research, Inc")!=0){ + Bseek(m->bp, 0, 0); + return seterror(m, Esys); + } + + m->valid |= Vtype; + if(bytes[0x1d]) + m->vr = 1; + else + m->vr = 0; + m->wd = 0; + m->ln = 2; + m->df = 0; + return Eok; +} + +int +picopen(Modem *m) +{ + char *p, *q; + int i, x; + + /* + * Look at the header. Every page should have a valid type. + * The first page should have WINDOW. + */ + while(p = Brdline(m->bp, '\n')){ + if(Blinelen(m->bp) == 1) + break; + p[Blinelen(m->bp)-1] = 0; + + verbose("openfaxfile: %s", p); + if(strcmp("TYPE=ccitt-g31", p) == 0) + m->valid |= Vtype; + /* + else if(m->pageno == 1 && strncmp("PHONE=", p, 6) == 0){ + strcpy(m->number, p+6); + m->valid |= Vphone; + } + */ + else if(m->pageno == 1 && strncmp("WINDOW=", p, 7) == 0){ + p += 7; + verbose("openfaxfile: WINDOW: %s", p); + for(i = 0; i < 4; i++){ + x = strtol(p, &q, 10); + if(i == 2) + m->wd = x; + if((p = q) == 0){ + Bterm(m->bp); + return seterror(m, Eproto); + } + } + for(i = 0; i < 5; i++){ + if(m->wd == wd[i]){ + m->wd = i; + m->valid |= Vwd; + break; + } + } + if((m->valid & Vwd) == 0){ + Bterm(m->bp); + return seterror(m, Eproto); + } + } + else if(m->pageno == 1 && strncmp("FDCS=", p, 5) == 0){ + p += 5; + m->df = m->vr = m->wd = 0; + m->ln = 2; + for(i = 0; i < 5; i++){ + x = strtol(p, &q, 10); + switch(i){ + case 0: + m->vr = x; + break; + case 3: + m->ln = x; + break; + case 4: + m->df = x; + break; + } + if((p = q) == 0){ + Bterm(m->bp); + return seterror(m, Eproto); + } + if(*p++ != ',') + break; + } + } + } + + verbose("openfaxfile: valid #%4.4ux", m->valid); + if((m->valid & (Vtype|Vwd)) != (Vtype|Vwd)){ + Bterm(m->bp); + return seterror(m, Eproto); + } + + return Eok; +} + +int +openfaxfile(Modem *m, char *file) +{ + if((m->bp = Bopen(file, OREAD)) == 0) + return seterror(m, Esys); + m->valid &= ~(Vtype); + + if(gsopen(m) == Eok) + return Eok; + return picopen(m); +} |