summaryrefslogtreecommitdiff
path: root/sys/src/cmd/fax/file.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/fax/file.c164
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);
+}