📄 awmodem.pas
字号:
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 + -