⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 awmodem.pas

📁 测试用例
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      end;
    end;

    mRegisterModemHandler := ecOK;
  end;

  function mDeregisterModemHandler(Modem : PModemRec; HWindow : TApdHwnd; Notify : TApdNotifyProc) : Integer;
    {-Remove a window/notification procedure from the modem's notify list }
  var
    OnReg   : PModemRegisterList;

    function Matches : Bool;
    begin
      if (HWindow <> 0) then
        Matches := OnReg^.mrHWindow = HWindow
      else
        Matches := @OnReg^.mrNotify = @Notify;
    end;

  begin
    mDeregisterModemHandler := ecOK;

    with Modem^ do begin
      OnReg   := RegisterHead;

      while (OnReg <> nil) and not Matches do
        OnReg   := OnReg^.mrNext;

      if (OnReg <> nil) then
        OnReg^.mrDeleted := True;
    end;
  end;

  function mInitializeModem(Modem : PModemRec) : Integer;
    {-Send the initialization string to the modem }
  begin
    mInitializeModem := mPutModemCommand(Modem, Modem^.InitCmd);
  end;

  function mConfigureModem(Modem : PModemRec) : Integer;
    {-Send the configuration strings to the modem }
  var
    Code   : Integer;
    CmdPtr : PChar;
    SepPtr : PChar;
    OutCmd : TCmdStringZ;

  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mConfigureModem := ecModemNotStarted;
        Exit;
      end;

      if (ModemState <> msNone) then begin
        mConfigureModem := ecModemBusy;
        Exit;
      end;

      CmdPtr := ConfigCmd;
      while (CmdPtr <> nil) and (CmdPtr[0] <> #0) do begin
        SepPtr := StrScan(CmdPtr, CmdSepChar);
        if (SepPtr = nil) then begin
          StrCopy(OutCmd, CmdPtr);
          CmdPtr := nil;
        end else begin
          StrLCopy(OutCmd, CmdPtr, SepPtr - CmdPtr);
          CmdPtr := SepPtr + 1;
        end;

        if (OutCmd[0] <> #0) then begin
          Code := mPutModemCommand(Modem, OutCmd);
          if (Code < ecOK) then begin
            mConfigureModem := Code;
            Exit;
          end;

          Code := mWaitOnResponse(Modem);
          if (Code < ecOK) then begin
            mConfigureModem := Code;
            Exit;
          end;

          DelayTicks(DelayFactor, True);
        end;
      end;
    end;

    mConfigureModem := ecOK;
  end;

  function mDialModem(Modem : PModemRec; Number : PChar) : Integer;
    {-Dial the modem }
  var
    Code : Integer;

  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mDialModem := ecModemNotStarted;
        Exit;
      end;

      if (ModemState <> msNone) then begin
        mDialModem := ecModemBusy;
        Exit;
      end;

      if (Number[0] = #0) then begin
        mDialModem := ecOK;
        Exit;
      end;

      {initialize the last string}
      FillChar(LastString, SizeOf(LastString), 0);
      LastStringLen := 0;
      BlankPending := False;                               

      { initialize dialing variables }
      ErrorCorrection := False;
      DataCompression := False;
      ConnectSpeed    := 0;

      { enable dial response codes }
      Code := EnableResponses(Modem, DialWaitSet);
      if (Code < ecOK) then begin
        mDialModem := Code;
        Exit;
      end;

      Code := EnableFeatureTags(Modem);
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        mDialModem := Code;
        Exit;
      end;

      { add the timeout trigger }
      Code := Port.AddTimerTrigger;
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        mDialModem := Code;
        Exit;
      end;
      TimeoutIdx := Code;

      { send the dial command }
      Code := ModemPutXlatStr(Modem, DialCmd);
      if (Code = ecOK) then begin
        Code := ModemPutXlatStr(Modem, Number);
        if (Code = ecOK) then
          Code := ModemPutXlatStr(Modem, DialTerm);
      end;
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        Port.RemoveTrigger(TimeoutIdx);
        mDialModem := Code;
        Exit;
      end;

      { enable the timeout trigger }
      Code := Port.SetTimerTrigger(TimeoutIdx, TickSeconds, True);
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        Port.RemoveTrigger(TimeoutIdx);
        mDialModem := Code;
        Exit;
      end;

      ModemState := msDialing;
      CountDown  := DialTimeout;

      mDialModem := ecOK;
    end;
  end;

  function mIsAttemptingConnect(Modem : PModemRec) : Bool;
    {-Return TRUE if the modem is attempting to establish a connection }
  begin
    with Modem^ do
      mIsAttemptingConnect := ModemStarted and (ModemState in
        [msDialing, msAnswering, msWaitNumber, msWaitTerm, msWaitFeatures]);
  end;

  function mExtendConnectAttempt(Modem : PModemRec; DeltaSecs : Integer) : Integer;
    {-Extend the amount of time the modem waits for a CONNECT result }
  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mExtendConnectAttempt := ecModemNotStarted;
        Exit;
      end;

      if not mIsAttemptingConnect(Modem) then begin
        mExtendConnectAttempt := ecModemNotDialing;
        Exit;
      end;

      mExtendConnectAttempt := ecOK;
      if (ModemState = msAnswering) or ((ModemState = msDialing) and (DeltaSecs > 0)) then
        Inc(Modem^.CountDown, DeltaSecs);
    end;
  end;

  function mModemStarted(Modem : PModemRec) : Bool;
    {-Return TRUE if StartModem has been called }
  begin
    mModemStarted := Modem^.ModemStarted;
  end;

  function mCancelDialAnswer(Modem : PModemRec) : Integer;
    {-Cancel the dial in progress }
  begin
    mCancelDialAnswer := ecOK;

    with Modem^ do begin
      if not ModemStarted or
         ((ModemState <> msDialing) and
          (ModemState <> msWaitNumber) and
          (ModemState <> msWaitTerm) and
          (ModemState <> msAnswering) and
          (ModemState <> msWaitRing))
          then begin
        mCancelDialAnswer := ecModemNotDialing;
        Exit;
      end;

      if (ModemState <> msWaitRing) then begin
        mCancelDialAnswer := ModemPutXlatStr(Modem, DialCancel);
        DelayTicks(DelayFactor, False);
        DisableResponses(Modem, DialWaitSet);
        Port.RemoveTrigger(TimeoutIdx);
      end else begin
        Port.RemoveTrigger(TimeoutIdx);
        TimeoutIdx := 0;
        DisableResponses(Modem, [RspRing]);
      end;

      ModemState   := msNone;
      ConnectSpeed := 0;
    end;
  end;

  function mGetConnectSpeed(Modem : PModemRec) : LongInt;
    {-Get the actual speed of the connection }
  begin
    mGetConnectSpeed := Modem^.ConnectSpeed;
  end;

  function mHangupModem(Modem : PModemRec) : Integer;
  var
    Code : Integer;

  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mHangupModem := ecModemNotStarted;
        Exit;
      end;

      if (ModemState <> msNone) then begin
        mHangupModem := ecModemBusy;
        Exit;
      end;

      ConnectSpeed := 0;

      if (HangupCmd[0] = #0) or (StrIComp(HangupCmd, 'DTR') = 0) then begin
        Code := Port.SetDtr(False);
        if (Code < ecOK) then begin
          mHangupModem := Code;
          Exit;
        end;

        DelayTicks(DTRDropHold, True);

        Code := Port.SetDtr(True);
      end else
        Code := mPutModemCommand(Modem, HangupCmd);

      mHangupModem := Code;
    end;
  end;

  function mAnswerModem(Modem : PModemRec) : Integer;
    {-Answer the modem }
  var
    Code : Integer;

  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mAnswerModem := ecModemNotStarted;
        Exit;
      end;

      if (ModemState <> msNone) then begin
        mAnswerModem := ecModemBusy;
        Exit;
      end;

      {initialize the last string}
      FillChar(LastString, SizeOf(LastString), 0);
      LastStringLen := 0;
      BlankPending := False;                               

      ErrorCorrection := False;
      DataCompression := False;
      ConnectSpeed    := 0;

      { enable answer/dial response codes }
      Code := EnableResponses(Modem, DialWaitSet);
      if (Code < ecOK) then begin
        mAnswerModem := Code;
        Exit;
      end;

      Code := EnableFeatureTags(Modem);
      if (Code < ecOK) then begin
        mAnswerModem := Code;
        DisableResponses(Modem, DialWaitSet);
        Exit;
      end;

      { add the timeout trigger }
      Code := Port.AddTimerTrigger;
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        mAnswerModem := Code;
        Exit;
      end;

      TimeoutIdx := Code;

      { send the answer command }
      Code := ModemPutXlatStr(Modem, AnswerCmd);
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        Port.RemoveTrigger(TimeoutIdx);
        mAnswerModem := Code;
        Exit;
      end;

      { enable the timeout trigger }
      Code := Port.SetTimerTrigger(TimeoutIdx, TickSeconds, True);
      if (Code < ecOK) then begin
        DisableResponses(Modem, DialWaitSet);
        DisableFeatureTags(Modem);
        Port.RemoveTrigger(TimeoutIdx);
        mAnswerModem := Code;
        Exit;
      end;

      ModemState := msAnswering;
      CountDown  := AnswerTimeout;

      mAnswerModem := ecOK;
    end;
  end;

  function mAutoAnswerModem(Modem : PModemRec; Rings : Cardinal) : Integer;
    {-Answer the modem after Rings rings }
  var
    Code : Integer;

  begin
    with Modem^ do begin
      if not ModemStarted then begin
        mAutoAnswerModem := ecModemNotStarted;
        Exit;
      end;

      if (ModemState <> msNone) then begin
        mAutoAnswerModem := ecModemBusy;
        Exit;
      end;

      if (Rings = 0) then begin
        mAutoAnswerModem := ecBadArgument;
        Exit;
      end;

      RingWait := Rings;
      RingCnt  := Rings;

      Code := EnableResponses(Modem, [RspRing]);
      if (Code < ecOK) then begin
        mAutoAnswerModem := Code;
        Exit;
      end;

      { set, but don't enable, a timeout trigger }
      Code := Port.AddTimerTrigger;
      if (Code < ecOK) then begin
        DisableResponses(Modem, [RspRing]);
        mAutoAnswerModem := Code;
        Exit;
      end;

      TimeoutIdx := Code;
      ModemState := msWaitRing;
      mAutoAnswerModem := ecOK;
    end;
  end;

  function mAllFeatureWaitOver(Modem : PModemRec) : Bool;
    {-Return TRUE if all modem features have been received and processed }
  begin
    with Modem^ do
      case ModemState of
        msDialing,
        msAnswering   : mAllFeatureWaitOver := ErrorCorrection and Da

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -