home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Online / Dial / source / DialModem.c < prev    next >
C/C++ Source or Header  |  2000-01-20  |  7KB  |  264 lines

  1.  
  2. /* /// "includes"  */
  3. #include <exec/types.h>
  4. #include <exec/memory.h>
  5. #include <exec/io.h>
  6. #include <exec/libraries.h>
  7. #include <devices/serial.h>
  8. #include <hardware/cia.h>
  9.  
  10. #include <clib/exec_protos.h>
  11. #include <clib/alib_protos.h>
  12.  
  13. #include <stdio.h>
  14. #include <libraries/mui.h>
  15. #include "GUI.h"
  16. #include "listhooks.h"
  17. #include "extern.h"
  18. #include "OwnDevUnit.h"
  19. /* /// */
  20.  
  21. #define SERDELAY 3
  22.  
  23. struct MsgPort *SerialMP;               /* pointer to our message port */
  24. struct IOExtSer *SerialIO;              /* pointer to our IORequest */
  25. int device;
  26.  
  27. extern struct Library * OwnDevUnitBase;
  28. #include <inline/owndevunit.h>
  29.  
  30. /* /// "WriteSer"  */
  31. int WriteSer(struct IOExtSer *SerialIO, char *str)
  32. {
  33.         /* device opened, write null-terminated string */
  34.     SerialIO->IOSer.io_Length   = -1;
  35.     SerialIO->IOSer.io_Data    = (APTR)str;
  36.     SerialIO->IOSer.io_Command  = CMD_WRITE;
  37.     DoIO((struct IORequest *)SerialIO); /* execute write */
  38.  
  39.     SerialIO->IOSer.io_Command=CMD_FLUSH;
  40.     DoIO((struct IORequest *)SerialIO);
  41.  
  42.     return 1;
  43. }
  44. /* /// */
  45.  
  46. /* /// "ReadSer"  */
  47. int ReadSer(struct IOExtSer *SerialIO, char *str)
  48. {
  49.     int n;
  50.  
  51.     SerialIO->IOSer.io_Command=SDCMD_QUERY;
  52.     DoIO((struct IORequest *)SerialIO);
  53.  
  54.     if (n=SerialIO->IOSer.io_Actual)
  55.     {
  56.         SerialIO->IOSer.io_Length   = n;
  57.         SerialIO->IOSer.io_Data    = (APTR)str;
  58.         SerialIO->IOSer.io_Command  = CMD_READ;
  59.         DoIO((struct IORequest *)SerialIO); /* execute read */
  60.  
  61.         return 1;
  62.     }
  63.     else
  64.         return 0;
  65. }
  66. /* /// */
  67.  
  68. /* /// "CloseAll"  */
  69. void CloseAll(struct ObjApp *App)
  70. {
  71.     char *buf;
  72.     int unit;
  73.  
  74.     get(App->STR_unit,MUIA_String_Contents,&buf);
  75.     sscanf(buf,"%d",&unit);
  76.     get(App->STR_device,MUIA_String_Contents,&buf);
  77.  
  78.     if (!device) CloseDevice((struct IORequest *)SerialIO);
  79.     if (SerialIO) DeleteExtIO(SerialIO);
  80.     if (SerialMP) DeleteMsgPort(SerialMP);
  81.  
  82.     if (OwnDevUnitBase) FreeDevUnit(buf, unit);
  83. }
  84. /* /// */
  85. /* /// "OpenAll"  */
  86. int OpenAll(struct ObjApp *App)
  87. {
  88.     char *buf, *str;
  89.     int unit;
  90.  
  91.     get(App->STR_unit,MUIA_String_Contents,&buf);
  92.     sscanf(buf,"%d",&unit);
  93.     get(App->STR_device,MUIA_String_Contents,&buf);
  94.  
  95.     if (OwnDevUnitBase && (str=AttemptDevUnit(buf, unit, "Dial v3", 0)))
  96.     {
  97.         char buf2[256];
  98.         sprintf(buf2, "%s unit %d\nis used by \"%s\"", buf, unit, str);
  99.  
  100.         MUI_Request(App->App,App->window,0,"Dial","OK",buf2);
  101.          return 0;
  102.     }
  103.  
  104.  
  105.  
  106.     if (!(SerialMP=CreateMsgPort()))
  107.         { CloseAll(App); return(0); }
  108.  
  109.     if (!(SerialIO = (struct IOExtSer *)CreateExtIO(SerialMP,sizeof(struct IOExtSer))))
  110.         { CloseAll(App); return(0); }
  111.  
  112.     SerialIO->io_SerFlags=SERF_SHARED | SERF_XDISABLED;
  113.  
  114.     if (device=OpenDevice(buf,unit,(struct IORequest *)SerialIO,0L))
  115.         { CloseAll(App); return(0); }
  116.  
  117.     return(1);
  118. }
  119. /* /// */
  120.  
  121.  
  122. /* /// "DialModem"  */
  123. int DialModem(struct ObjApp *App, char *nummer, int dialwin)
  124. {
  125.     char buf[100]="\0";
  126.     char buf2[100]="\0";
  127.     char *DialCode;
  128.     char *TelSysCode;
  129.     LONG conceal,telsys;
  130.     LONG hangup;
  131.     int i;
  132.     char buf3[512];
  133.     struct ListEntry *LE;
  134.     char number[256];
  135.     ULONG sig, VoiceMode;
  136.  
  137.     get(App->CH_Conceal, MUIA_Selected, &conceal);
  138.     get(App->CH_system, MUIA_Selected, &telsys);
  139.     get(App->STR_system, MUIA_String_Contents, &TelSysCode);
  140.     get(App->CH_voice, MUIA_Selected, &VoiceMode);
  141.     get(App->STR_DialCode, MUIA_String_Contents, &DialCode);
  142.     get(App->SL_HangUp, MUIA_Slider_Level, &hangup);
  143.  
  144.     strcpy(number, nummer);
  145.     InsertCBC(App, number, 255);
  146.  
  147.     if (!OpenAll(App)) return(0);
  148.  
  149.  
  150.     DoMethod(App->LV_main, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &LE);
  151.     sprintf(buf3, "\ec%s\n%s\n%s", GetString(MSG_TX_dialling), number, LE->Name);
  152.     set(App->TX_dialling, MUIA_Text_Contents, buf3);
  153.     if (!dialwin) set(App->WI_dialling, MUIA_Window_Open, TRUE);
  154.  
  155.     WriteSer(SerialIO,"atz\r");
  156.     Delay(SERDELAY);
  157.     ReadSer(SerialIO, buf);
  158.  
  159.  
  160.     if (VoiceMode)
  161.     {
  162.          char *VoiceStr;
  163.         int i;
  164.         char buf[256] = "\0";
  165.  
  166.         get(App->STR_voice, MUIA_String_Contents, &VoiceStr);
  167.  
  168.         for (i=0; VoiceStr[i]!=0; i++)
  169.             if (VoiceStr[i]=='\\' && VoiceStr[i+1]=='r')
  170.             {
  171.                 i++;
  172.                 strcat(buf, "\r");
  173.  
  174.                 WriteSer(SerialIO, buf);
  175.                 Delay(SERDELAY);
  176.                 ReadSer(SerialIO, buf);
  177.  
  178.                 strcpy(buf, "\0");
  179.                 continue;
  180.             }
  181.             else
  182.                 strncat(buf, VoiceStr+i, 1);
  183.     }
  184.  
  185.  
  186.  
  187.     if (DoMethod(App->App,MUIM_Application_Input,&sig)==ID_AbortDialling)
  188.     {
  189.         set(App->WI_dialling, MUIA_Window_Open, FALSE);
  190.         CloseAll(App);
  191.         return 0;
  192.     }            
  193.  
  194.     strcpy(buf, "\0");
  195.     strcpy(buf2,"atdt");
  196.     if (telsys) strcat(buf, TelSysCode);
  197.     if (conceal) strcat(buf, "*31#");
  198.     strcat(buf,number);
  199.  
  200.     for(i=0;buf[i]!='\0';i++)
  201.     {
  202.         switch (buf[i])
  203.         {
  204.             case '+' :                                               strcat(buf2,DialCode); break;
  205.             case '!' :                                             strcat(buf2,"W"); break;
  206.             case '0' :                                               strcat(buf2,"0"); break;
  207.             case '1' :                                               strcat(buf2,"1"); break;
  208.             case '2' : case 'A' : case 'B' : case 'C' :            strcat(buf2,"2"); break;
  209.             case '3' : case 'D' : case 'E' : case 'F' :            strcat(buf2,"3"); break;
  210.             case '4' : case 'G' : case 'H' : case 'I' :               strcat(buf2,"4"); break;
  211.             case '5' : case 'J' : case 'K' : case 'L' :            strcat(buf2,"5"); break;
  212.             case '6' : case 'M' : case 'N' : case 'O' :            strcat(buf2,"6"); break;
  213.             case '7' : case 'P' : case 'Q' : case 'R' : case 'S' : strcat(buf2,"7"); break;
  214.             case '8' : case 'T' : case 'U' : case 'V' :            strcat(buf2,"8"); break;
  215.             case '9' : case 'W' : case 'X' : case 'Y' : case 'Z' : strcat(buf2,"9"); break;
  216.             case '*' :                                              strcat(buf2,"*"); break;
  217.             case '#' :                                              strcat(buf2,"#"); break;
  218.         }
  219.     }
  220.  
  221. #ifdef DEBUG
  222.     printf("dialling: %s\n", buf2);
  223. #endif
  224.  
  225.     strcat(buf2,"\r");
  226.     WriteSer(SerialIO,buf2);
  227.     Delay(SERDELAY);
  228.     ReadSer(SerialIO, buf);
  229.  
  230.     if (DoMethod(App->App,MUIM_Application_Input,&sig)==ID_AbortDialling)
  231.     {
  232.         set(App->WI_dialling, MUIA_Window_Open, FALSE);
  233.         CloseAll(App);
  234.         return 0;
  235.     }
  236.  
  237.  
  238.     /* wait [hangup] seconds */
  239.     for (i=0; i<50; i++)
  240.     {
  241.         if (VoiceMode) i=0;
  242.  
  243.         Delay(hangup);
  244.  
  245.         if (DoMethod(App->App,MUIM_Application_Input,&sig)==ID_AbortDialling)
  246.         {
  247.             set(App->WI_dialling, MUIA_Window_Open, FALSE);
  248.             CloseAll(App);
  249.             return 0;
  250.         }
  251.     }
  252.  
  253.     WriteSer(SerialIO,"ath\r");
  254.     Delay(SERDELAY);
  255.     ReadSer(SerialIO, buf);
  256.  
  257.     CloseAll(App);
  258.     set(App->WI_dialling, MUIA_Window_Open, FALSE);
  259.     
  260.     return(1);
  261. }
  262. /* /// */
  263.  
  264.