home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 13 / MA_Cover_13.bin / source / c / stefanb_src / private_projects / fax / sendfax.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-06  |  5.0 KB  |  224 lines

  1. #include "serio.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <clib/dos_protos.h>
  6.  
  7. static struct ReadArgs *rda;
  8. static char Template[]="DEVICE/K,UNIT/K/N,BAUD/K/N,FILE/K/A,NUMBER/K";
  9. static struct {
  10.                char *device;
  11.                long *unit;
  12.                long *baud;
  13.                char *file;
  14.                char *number;
  15.               } def={"serial.device",NULL,NULL,NULL,""};
  16. static struct SerialStream *ss;
  17. static BOOL notend;
  18. static UBYTE buffer[1024];
  19.  
  20. /* Read one reply line from modem */
  21. static void ReadLine(void *buf)
  22. {
  23.  char c='\0',*cp=buf;
  24.  
  25.  /* Read until EOL is reached */
  26.  while (c!='\n')
  27.   {
  28.    if (ReadSerialSynch(ss,&c,1)==0) break;
  29.    *cp++=c;
  30.   }
  31.  
  32.  /* Terminate string */
  33.  *cp='\0';
  34. }
  35.  
  36. /* Send FAX data */
  37. void faxsend(void)
  38. {
  39.  UBYTE c='\0';
  40.  FILE *fh;
  41.  
  42.  /* Wait until modem sent a XON */
  43.  while (c!='\x11') ReadSerialSynch(ss,&c,1);
  44.  
  45.  /* Start FAX data send */
  46.  if (fh=fopen(def.file,"r"))
  47.   {
  48.    int i;
  49.  
  50.    while (!feof(fh))
  51.     {
  52.      /* Read on byte from and send it */
  53.      c=fgetc(fh);
  54.      WriteSerialSynch(ss,&c,1);
  55.  
  56.      /* Special DLE processing: DLE -> DLE DLE */
  57.      if (c=='\x10') WriteSerialSynch(ss,&c,1);
  58.  
  59.      /* Check Flow control every 2000 characters */
  60.      if (++i==2000)
  61.       {
  62.        /* Reset counter */
  63.        i=0;
  64.  
  65.        /* Check for XOFF */
  66.        ReadSerialASynchStart(ss,&c,1);
  67.        RemoveIORequest((struct IORequest *) ss->ss_Read);
  68.        if ((ss->ss_Read->IOSer.io_Error==0) && (c=='\x13'))
  69.         do
  70.          ReadSerialSynch(ss,&c,1);
  71.         while(c!='\x11'); /* Wait on XON */
  72.       }
  73.     }
  74.  
  75.    /* End of FAX data, send DLE ETX */
  76.    WriteSerialSynch(ss,"\x10\x03",2);
  77.  
  78.    /* Close FAX data file */
  79.    fclose(fh);
  80.  
  81.    /* Wait on reply */
  82.    while (notend)
  83.     {
  84.      ReadLine(buffer);
  85.      printf("%s",buffer);
  86.      if (!strncmp(buffer,"OK",2)) break;
  87.      if (!strncmp(buffer,"NO CARRIER",10)) break;
  88.     }
  89.  
  90.    /* End of transmission */
  91.    WriteSerialSynch(ss,"AT+FET=2\r",9);
  92.    while (notend)
  93.     {
  94.      ReadLine(buffer);
  95.      printf("%s",buffer);
  96.      if (!strncmp(buffer,"OK",2)) break;
  97.     }
  98.   }
  99.  
  100.  /* Set exit flag */
  101.  notend=FALSE;
  102. }
  103.  
  104. /* Got a connect */
  105. void faxconnect(void)
  106. {
  107.  /* Set FAX parameters */
  108.  WriteSerialSynch(ss,"AT+FDT=0,1,0,2\r",15);
  109.  
  110.  /* Wait on CONNECT reply */
  111.  while (notend)
  112.   {
  113.    /* Wait on modem reply */
  114.    ReadLine(buffer);
  115.    printf("%s",buffer);
  116.  
  117.    if (strlen(buffer)==2) continue; /* Skip empty lines */
  118.    if (!strncmp(buffer,"CONNECT",7))     /* Got a connect? */
  119.     {
  120.      faxsend();
  121.      break;
  122.     }
  123.    if (!strncmp(buffer,"+FHNG",5))       break; /* Hang-up */
  124.    if (!strncmp(buffer,"NO CARRIER",10)) break; /* Carrier lost */
  125.   }
  126. }
  127.  
  128. /* CTRL-C shutdown routine */
  129. static int Shutdown(void)
  130. {
  131.  notend=FALSE;
  132.  return(0);
  133. }
  134.  
  135. int main(int argc, char *argv[])
  136. {
  137.  int (*oldbreak)();
  138.  ULONG Unit,Baud;
  139.  
  140.  /* Read command line arguments */
  141.  if (!(rda=ReadArgs(Template,(LONG *) &def,NULL)))
  142.   {
  143.    PrintFault(IoErr(),argv[0]);
  144.    exit(20);
  145.   }
  146.  Unit=(def.unit)?(*def.unit):0;
  147.  Baud=(def.baud)?(*def.baud):19200;
  148.  
  149.  /* Set CTRL-C shut down routine */
  150.  notend=TRUE;
  151.  oldbreak=onbreak(Shutdown);
  152.  printf("Using device '%s' unit %ld (%ldbps)\n",def.device,Unit,Baud);
  153.  printf("Sending file '%s' to '%s'\n",def.file,def.number);
  154.  
  155.  /* Open serial stream */
  156.  if (ss=CreateSerialStream(def.device,Unit,
  157.                            SERF_SHARED|SERF_7WIRE|SERF_RAD_BOOGIE))
  158.   {
  159.    if (SetSerialParamsTags(ss,SIO_Baud,Baud,TAG_DONE))
  160.     while (notend)
  161.      {
  162.       /* Reset modem */
  163.       WriteSerialSynch(ss,"ATZ\r",4);
  164.       Delay(100);
  165.       ClearSerial(ss);
  166.  
  167.       /* Init Modem */
  168.       WriteSerialSynch(ss,"AT+fbor=1+fclass=2\r",19);
  169.       Delay(50);
  170.       ReadLine(buffer);
  171.       printf("%s",buffer);
  172.       ReadLine(buffer);
  173.       printf("%s",buffer);
  174.  
  175.       /* Dial number */
  176.       if (strlen(def.number))
  177.        {
  178.         WriteSerialSynch(ss,"ATDP",4);
  179.         WriteSerialSynch(ss,def.number,strlen(def.number));
  180.         WriteSerialSynch(ss,"\r",1);
  181.        }
  182.       else WriteSerialSynch(ss,"ATD\r",4);
  183.       ReadLine(buffer);
  184.       printf("%s",buffer);
  185.       ReadLine(buffer);
  186.       printf("%s",buffer);
  187.  
  188.       /* Check connection status */
  189.       if (!strncmp(buffer,"BUSY",4))         continue;
  190.       if (!strncmp(buffer,"NO CARRIER",10))  continue;
  191.       if (!strncmp(buffer,"NO DIALTONE",11)) continue;
  192.  
  193.       /* Connected, wait for FAX connect */
  194.       while (notend)
  195.        {
  196.         /* Wait on modem reply */
  197.         ReadLine(buffer);
  198.         printf("%s",buffer);
  199.  
  200.         if (strlen(buffer)==2) continue; /* Skip empty lines */
  201.         if (!strncmp(buffer,"OK",2))     /* Got a connect? */
  202.          {
  203.           faxconnect();
  204.           break;
  205.          }
  206.         if (!strncmp(buffer,"+FHNG",5))       break; /* Hang-up */
  207.         if (!strncmp(buffer,"NO CARRIER",10)) break; /* Carrier lost */
  208.        }
  209.      }
  210.    else printf("Couldn't set parameters!\n");
  211.  
  212.    /* Free resources */
  213.    DeleteSerialStream(ss);
  214.   }
  215.  else printf("Couldn't open stream!\n");
  216.  
  217.  /* Free command line argumets */
  218.  FreeArgs(rda);
  219.  
  220.  /* Leave program */
  221.  onbreak(oldbreak);
  222.  return(0);
  223. }
  224.