modem.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:10k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * modem.cxx
  3.  *
  4.  * Asynchronous Serial I/O channel class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: modem.cxx,v $
  30.  * Revision 1.5  2000/01/21 17:42:53  craigs
  31.  * Added pragma to avoid problems when linking as Linux shared library
  32.  *
  33.  * Revision 1.4  1998/11/30 12:33:06  robertj
  34.  * Split serial channel and modem, modem to components library.
  35.  *
  36.  * Revision 1.3  1998/09/23 06:22:38  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  * Revision 1.2  1996/04/15 10:57:59  robertj
  40.  * Moved some functions from INL to serial.cxx so unix linker can make smaller executables.
  41.  *
  42.  * Revision 1.1  1996/04/14 02:54:14  robertj
  43.  * Initial revision
  44.  *
  45.  */
  46. #ifdef __GNUC__
  47. #pragma implementation "modem.h"
  48. #endif
  49. #include <ptlib.h>
  50. #include <ptclib/modem.h>
  51. #include <ctype.h>
  52. ///////////////////////////////////////////////////////////////////////////////
  53. // PModem
  54. PModem::PModem()
  55. {
  56.   status = Unopened;
  57. }
  58. PModem::PModem(const PString & port, DWORD speed, BYTE data,
  59.       Parity parity, BYTE stop, FlowControl inputFlow, FlowControl outputFlow)
  60.   : PSerialChannel(port, speed, data, parity, stop, inputFlow, outputFlow)
  61. {
  62.   status = IsOpen() ? Uninitialised : Unopened;
  63. }
  64. PModem::PModem(PConfig & cfg)
  65. {
  66.   status = Open(cfg) ? Uninitialised : Unopened;
  67. }
  68. void PModem::SetInitString(const PString & str)
  69. {
  70.   initCmd = str;
  71. }
  72. PString PModem::GetInitString() const
  73. {
  74.   return initCmd;
  75. }
  76. void PModem::SetDeinitString(const PString & str)
  77. {
  78.   deinitCmd = str;
  79. }
  80. PString PModem::GetDeinitString() const
  81. {
  82.   return deinitCmd;
  83. }
  84. void PModem::SetPreDialString(const PString & str)
  85. {
  86.   preDialCmd = str;
  87. }
  88. PString PModem::GetPreDialString() const
  89. {
  90.   return preDialCmd;
  91. }
  92. void PModem::SetPostDialString(const PString & str)
  93. {
  94.   postDialCmd = str;
  95. }
  96. PString PModem::GetPostDialString() const
  97. {
  98.   return postDialCmd;
  99. }
  100. void PModem::SetBusyString(const PString & str)
  101. {
  102.   busyReply = str;
  103. }
  104. PString PModem::GetBusyString() const
  105. {
  106.   return busyReply;
  107. }
  108. void PModem::SetNoCarrierString(const PString & str)
  109. {
  110.   noCarrierReply = str;
  111. }
  112. PString PModem::GetNoCarrierString() const
  113.   return noCarrierReply;
  114. }
  115. void PModem::SetConnectString(const PString & str)
  116. {
  117.   connectReply = str;
  118. }
  119. PString PModem::GetConnectString() const
  120. {
  121.   return connectReply;
  122. }
  123. void PModem::SetHangUpString(const PString & str)
  124. {
  125.   hangUpCmd = str;
  126. }
  127. PString PModem::GetHangUpString() const
  128. {
  129.   return hangUpCmd;
  130. }
  131. PModem::Status PModem::GetStatus() const
  132. {
  133.   return status;
  134. }
  135. BOOL PModem::Close()
  136. {
  137.   status = Unopened;
  138.   return PSerialChannel::Close();
  139. }
  140. BOOL PModem::Open(const PString & port, DWORD speed, BYTE data,
  141.       Parity parity, BYTE stop, FlowControl inputFlow, FlowControl outputFlow)
  142. {
  143.   if (!PSerialChannel::Open(port,
  144.                             speed, data, parity, stop, inputFlow, outputFlow))
  145.     return FALSE;
  146.   status = Uninitialised;
  147.   return TRUE;
  148. }
  149. static const char ModemInit[] = "ModemInit";
  150. static const char ModemDeinit[] = "ModemDeinit";
  151. static const char ModemPreDial[] = "ModemPreDial";
  152. static const char ModemPostDial[] = "ModemPostDial";
  153. static const char ModemBusy[] = "ModemBusy";
  154. static const char ModemNoCarrier[] = "ModemNoCarrier";
  155. static const char ModemConnect[] = "ModemConnect";
  156. static const char ModemHangUp[] = "ModemHangUp";
  157. BOOL PModem::Open(PConfig & cfg)
  158. {
  159.   initCmd = cfg.GetString(ModemInit, "ATZ\r\w2sOK\w100m");
  160.   deinitCmd = cfg.GetString(ModemDeinit, "\d2s+++\d2sATH0\r");
  161.   preDialCmd = cfg.GetString(ModemPreDial, "ATDT");
  162.   postDialCmd = cfg.GetString(ModemPostDial, "\r");
  163.   busyReply = cfg.GetString(ModemBusy, "BUSY");
  164.   noCarrierReply = cfg.GetString(ModemNoCarrier, "NO CARRIER");
  165.   connectReply = cfg.GetString(ModemConnect, "CONNECT");
  166.   hangUpCmd = cfg.GetString(ModemHangUp, "\d2s+++\d2sATH0\r");
  167.   if (!PSerialChannel::Open(cfg))
  168.     return FALSE;
  169.   status = Uninitialised;
  170.   return TRUE;
  171. }
  172. void PModem::SaveSettings(PConfig & cfg)
  173. {
  174.   PSerialChannel::SaveSettings(cfg);
  175.   cfg.SetString(ModemInit, initCmd);
  176.   cfg.SetString(ModemDeinit, deinitCmd);
  177.   cfg.SetString(ModemPreDial, preDialCmd);
  178.   cfg.SetString(ModemPostDial, postDialCmd);
  179.   cfg.SetString(ModemBusy, busyReply);
  180.   cfg.SetString(ModemNoCarrier, noCarrierReply);
  181.   cfg.SetString(ModemConnect, connectReply);
  182.   cfg.SetString(ModemHangUp, hangUpCmd);
  183. }
  184. BOOL PModem::CanInitialise() const
  185. {
  186.   switch (status) {
  187.     case Unopened :
  188.     case Initialising :
  189.     case Dialling :
  190.     case AwaitingResponse :
  191.     case HangingUp :
  192.     case Deinitialising :
  193.     case SendingUserCommand :
  194.       return FALSE;
  195.     default :
  196.       return TRUE;
  197.   }
  198. }
  199. BOOL PModem::Initialise()
  200. {
  201.   if (CanInitialise()) {
  202.     status = Initialising;
  203.     if (SendCommandString(initCmd)) {
  204.       status = Initialised;
  205.       return TRUE;
  206.     }
  207.     status = InitialiseFailed;
  208.   }
  209.   return FALSE;
  210. }
  211. BOOL PModem::CanDeinitialise() const
  212. {
  213.   switch (status) {
  214.     case Unopened :
  215.     case Initialising :
  216.     case Dialling :
  217.     case AwaitingResponse :
  218.     case Connected :
  219.     case HangingUp :
  220.     case Deinitialising :
  221.     case SendingUserCommand :
  222.       return FALSE;
  223.     default :
  224.       return TRUE;
  225.   }
  226. }
  227. BOOL PModem::Deinitialise()
  228. {
  229.   if (CanDeinitialise()) {
  230.     status = Deinitialising;
  231.     if (SendCommandString(deinitCmd)) {
  232.       status = Uninitialised;
  233.       return TRUE;
  234.     }
  235.     status = DeinitialiseFailed;
  236.   }
  237.   return FALSE;
  238. }
  239. BOOL PModem::CanDial() const
  240. {
  241.   switch (status) {
  242.     case Unopened :
  243.     case Uninitialised :
  244.     case Initialising :
  245.     case InitialiseFailed :
  246.     case Dialling :
  247.     case AwaitingResponse :
  248.     case Connected :
  249.     case HangingUp :
  250.     case Deinitialising :
  251.     case DeinitialiseFailed :
  252.     case SendingUserCommand :
  253.       return FALSE;
  254.     default :
  255.       return TRUE;
  256.   }
  257. }
  258. BOOL PModem::Dial(const PString & number)
  259. {
  260.   if (!CanDial())
  261.     return FALSE;
  262.   status = Dialling;
  263.   if (!SendCommandString(preDialCmd + "\s" + number + postDialCmd)) {
  264.     status = DialFailed;
  265.     return FALSE;
  266.   }
  267.   status = AwaitingResponse;
  268.   PTimer timeout = 120000;
  269.   PINDEX connectPosition = 0;
  270.   PINDEX busyPosition = 0;
  271.   PINDEX noCarrierPosition = 0;
  272.   for (;;) {
  273.     int nextChar;
  274.     if ((nextChar = ReadCharWithTimeout(timeout)) < 0)
  275.       return FALSE;
  276.     if (ReceiveCommandString(nextChar, connectReply, connectPosition, 0))
  277.       break;
  278.     if (ReceiveCommandString(nextChar, busyReply, busyPosition, 0)) {
  279.       status = LineBusy;
  280.       return FALSE;
  281.     }
  282.     if (ReceiveCommandString(nextChar, noCarrierReply, noCarrierPosition, 0)) {
  283.       status = NoCarrier;
  284.       return FALSE;
  285.     }
  286.   }
  287.   status = Connected;
  288.   return TRUE;
  289. }
  290. BOOL PModem::CanHangUp() const
  291. {
  292.   switch (status) {
  293.     case Unopened :
  294.     case Uninitialised :
  295.     case Initialising :
  296.     case InitialiseFailed :
  297.     case Dialling :
  298.     case AwaitingResponse :
  299.     case HangingUp :
  300.     case Deinitialising :
  301.     case SendingUserCommand :
  302.       return FALSE;
  303.     default :
  304.       return TRUE;
  305.   }
  306. }
  307. BOOL PModem::HangUp()
  308. {
  309.   if (CanHangUp()) {
  310.     status = HangingUp;
  311.     if (SendCommandString(hangUpCmd)) {
  312.       status = Initialised;
  313.       return TRUE;
  314.     }
  315.     status = HangUpFailed;
  316.   }
  317.   return FALSE;
  318. }
  319. BOOL PModem::CanSendUser() const
  320. {
  321.   switch (status) {
  322.     case Unopened :
  323.     case Uninitialised :
  324.     case Initialising :
  325.     case InitialiseFailed :
  326.     case Dialling :
  327.     case AwaitingResponse :
  328.     case HangingUp :
  329.     case Deinitialising :
  330.     case SendingUserCommand :
  331.       return FALSE;
  332.     default :
  333.       return TRUE;
  334.   }
  335. }
  336. BOOL PModem::SendUser(const PString & str)
  337. {
  338.   if (CanSendUser()) {
  339.     Status oldStatus = status;
  340.     status = SendingUserCommand;
  341.     if (SendCommandString(str)) {
  342.       status = oldStatus;
  343.       return TRUE;
  344.     }
  345.     status = oldStatus;
  346.   }
  347.   return FALSE;
  348. }
  349. void PModem::Abort()
  350. {
  351.   switch (status) {
  352.     case Initialising :
  353.       status = InitialiseFailed;
  354.       break;
  355.     case Dialling :
  356.     case AwaitingResponse :
  357.       status = DialFailed;
  358.       break;
  359.     case HangingUp :
  360.       status = HangUpFailed;
  361.       break;
  362.     case Deinitialising :
  363.       status = DeinitialiseFailed;
  364.       break;
  365.     default :
  366.       break;
  367.   }
  368. }
  369. BOOL PModem::CanRead() const
  370. {
  371.   switch (status) {
  372.     case Unopened :
  373.     case Initialising :
  374.     case Dialling :
  375.     case AwaitingResponse :
  376.     case HangingUp :
  377.     case Deinitialising :
  378.     case SendingUserCommand :
  379.       return FALSE;
  380.     default :
  381.       return TRUE;
  382.   }
  383. }
  384. // End Of File ///////////////////////////////////////////////////////////////