197 lines
4.6 KiB
Plaintext
197 lines
4.6 KiB
Plaintext
|
{
|
||
|
$Project$
|
||
|
$Workfile$
|
||
|
$Revision$
|
||
|
$DateUTC$
|
||
|
$Id$
|
||
|
|
||
|
This file is part of the Indy (Internet Direct) project, and is offered
|
||
|
under the dual-licensing agreement described on the Indy website.
|
||
|
(http://www.indyproject.org/)
|
||
|
|
||
|
Copyright:
|
||
|
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
|
||
|
}
|
||
|
{
|
||
|
$Log$
|
||
|
}
|
||
|
{
|
||
|
Rev 1.10 3/6/2004 3:05:08 PM JPMugaas
|
||
|
Added quit code 211 as per bug #83
|
||
|
|
||
|
Rev 1.9 2004.03.06 1:31:54 PM czhower
|
||
|
To match Disconnect changes to core.
|
||
|
|
||
|
Rev 1.8 2004.02.07 1:42:00 PM czhower
|
||
|
Fixed visibility
|
||
|
|
||
|
Rev 1.7 2004.02.03 5:44:22 PM czhower
|
||
|
Name changes
|
||
|
|
||
|
Rev 1.6 1/21/2004 4:03:40 PM JPMugaas
|
||
|
InitComponent
|
||
|
|
||
|
Rev 1.5 10/17/2003 1:08:06 AM DSiders
|
||
|
Added localization comments.
|
||
|
|
||
|
Rev 1.4 6/5/2003 04:54:12 AM JPMugaas
|
||
|
Reworkings and minor changes for new Reply exception framework.
|
||
|
|
||
|
Rev 1.3 1/27/2003 11:36:54 AM DSiders
|
||
|
Modified Connect to raise an exception when any response other than 220 is
|
||
|
received. Exception code and text comes from the server response.
|
||
|
Added TODOs needed to complete SNPP Level 1 support.
|
||
|
|
||
|
Rev 1.2 12/8/2002 07:25:48 PM JPMugaas
|
||
|
Added published host and port properties.
|
||
|
|
||
|
Rev 1.1 12/6/2002 05:30:34 PM JPMugaas
|
||
|
Now decend from TIdTCPClientCustom instead of TIdTCPClient.
|
||
|
|
||
|
Rev 1.0 11/13/2002 08:01:08 AM JPMugaas
|
||
|
}
|
||
|
|
||
|
unit IdSNPP;
|
||
|
|
||
|
interface
|
||
|
{$i IdCompilerDefines.inc}
|
||
|
|
||
|
uses
|
||
|
IdComponent, IdGlobal, IdException, IdGlobalProtocols,
|
||
|
IdReplyRFC,
|
||
|
IdTCPConnection,
|
||
|
IdTCPClient;
|
||
|
|
||
|
{
|
||
|
Simple Network Paging Protocol based on RFC 1861
|
||
|
Original Author: Mark Holmes
|
||
|
}
|
||
|
|
||
|
{ Note that this only supports Level One SNPP }
|
||
|
|
||
|
type
|
||
|
{ TODO : Unused... remove? }
|
||
|
TConnectionResult = (crCanPost, crNoPost, crAuthRequired, crTempUnavailable);
|
||
|
|
||
|
{ TODO : Unused... remove? }
|
||
|
TCheckResp = Record
|
||
|
Code : Int16;
|
||
|
Resp : String;
|
||
|
end;
|
||
|
|
||
|
{ TODO : Add optional HELP command }
|
||
|
|
||
|
{ TODO : Add QUIT procedure }
|
||
|
|
||
|
{ TODO : Add overridden GetResponse to handle multiline 214 response codes
|
||
|
that omit the continuation mark. For example:
|
||
|
|
||
|
214 First line...
|
||
|
214 Second line...
|
||
|
214 Final line
|
||
|
250 OK
|
||
|
}
|
||
|
|
||
|
{ TODO : Raise an exception when the fatal error response code 421
|
||
|
is received in SendMessage, SNPPMsg, Pager
|
||
|
}
|
||
|
|
||
|
TIdSNPP = class(TIdTCPClientCustom)
|
||
|
protected
|
||
|
function Pager(APagerId: String): Boolean;
|
||
|
function SNPPMsg(AMsg: String): Boolean;
|
||
|
procedure InitComponent; override;
|
||
|
public
|
||
|
procedure Connect; override;
|
||
|
procedure DisconnectNotifyPeer; override;
|
||
|
procedure Reset;
|
||
|
procedure SendMessage(APagerId, AMsg: String);
|
||
|
published
|
||
|
property Port default 7777;
|
||
|
property Host;
|
||
|
end;
|
||
|
|
||
|
EIdSNPPException = class(EIdException);
|
||
|
EIdSNPPConnectionRefused = class (EIdReplyRFCError);
|
||
|
EIdSNPPProtocolError = class (EIdReplyRFCError);
|
||
|
EIdSNPPNoMultiLineMessages = class(EIdSNPPException);
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
IdResourceStringsProtocols;
|
||
|
|
||
|
{ TIdSNPP }
|
||
|
|
||
|
procedure TIdSNPP.InitComponent;
|
||
|
begin
|
||
|
inherited InitComponent;
|
||
|
Port := 7777;
|
||
|
end;
|
||
|
|
||
|
procedure TIdSNPP.Connect;
|
||
|
begin
|
||
|
inherited Connect;
|
||
|
try
|
||
|
if GetResponse <> 220 then
|
||
|
begin
|
||
|
raise EIdSNPPConnectionRefused.CreateError(LastCmdResult.NumericCode,
|
||
|
LastCmdResult.Text.Text);
|
||
|
end;
|
||
|
except
|
||
|
Disconnect;
|
||
|
Raise;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TIdSNPP.DisconnectNotifyPeer;
|
||
|
begin
|
||
|
inherited;
|
||
|
SendCmd('QUIT', 211); {do not localize}
|
||
|
end;
|
||
|
|
||
|
function TIdSNPP.Pager(APagerId: String): Boolean;
|
||
|
begin
|
||
|
Result := False;
|
||
|
Writeln('PAGER ' + APagerID); {do not localize}
|
||
|
if GetResponse([]) = 250 then begin
|
||
|
Result := True
|
||
|
end else begin
|
||
|
DoStatus(hsStatusText, [LastCmdResult.Text[0]]);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TIdSNPP.Reset;
|
||
|
begin
|
||
|
Writeln('RESET'); {do not localize}
|
||
|
end;
|
||
|
|
||
|
procedure TIdSNPP.SendMessage(APagerId, AMsg : String);
|
||
|
begin
|
||
|
if (Pos(CR,AMsg)>0) or (Pos(LF,AMsg)>0) then
|
||
|
begin
|
||
|
EIdSNPPNoMultiLineMessages.Create(RSSNPPNoMultiLine);
|
||
|
end;
|
||
|
if (Length(APagerId) > 0) and (Length(AMsg) > 0) then begin
|
||
|
if Pager(APagerID) then begin
|
||
|
if SNPPMsg(AMsg) then begin
|
||
|
WriteLn('SEND'); {do not localize}
|
||
|
end;
|
||
|
GetResponse([250]);
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TIdSNPP.SNPPMsg(AMsg: String): Boolean;
|
||
|
begin
|
||
|
Result := False;
|
||
|
Writeln('MESS ' + AMsg); {do not localize}
|
||
|
if GetResponse([]) = 250 then begin
|
||
|
Result := True
|
||
|
end else begin
|
||
|
DoStatus(hsStatusText, [LastCmdResult.Text.Text]);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
end.
|