📄 idnntp.pas
字号:
231, FOnNewGroupsList);
end;
procedure TIdNNTP.GetNewNewsList(ANewsgroups: string;
ADate: TDateTime; AGMT: boolean; ADistributions: string);
var
s1: string;
CanContinue: Boolean;
begin
if not Assigned(FOnNewNewsList) then begin
raise EIdNNTPNoOnNewNewsList.Create(RSNNTPNoOnNewNewsList);
end;
BeginWork(wmRead,0); try
SendCmd('NEWNEWS ' + ANewsgroups + ' ' + ConvertDateTimeDist(ADate, AGMT, ADistributions), 230); {do not localize}
s1 := IOHandler.ReadLn;
CanContinue := True;
while (s1 <> '.') and CanContinue do begin
FOnNewNewsList(s1, CanContinue);
s1 := IOHandler.ReadLn;
end;
finally
EndWork(wmRead);
end;
end;
(*
3.9. The NEXT command
3.9.1. NEXT
NEXT
The internally maintained "current article pointer" is advanced to
the next article in the current newsgroup. If no more articles
remain in the current group, an error message is returned and the
current article remains selected.
The internally-maintained "current article pointer" is set by this
command.
A response indicating the current article number, and the message-id
string will be returned. No text is sent in response to this
command.
3.9.2. Responses
223 n a article retrieved - request text separately
(n = article number, a = unique article id)
412 no newsgroup selected
420 no current article has been selected
421 no next article in this group
*)
function TIdNNTP.Next: Boolean;
begin
Result := SendCmd('NEXT', [223, 421]) = 223; {do not localize}
end;
(*
3.5. The LAST command
3.5.1. LAST
LAST
The internally maintained "current article pointer" is set to the
previous article in the current newsgroup. If already positioned at
the first article of the newsgroup, an error message is returned and
the current article remains selected.
The internally-maintained "current article pointer" is set by this
command.
A response indicating the current article number, and a message-id
string will be returned. No text is sent in response to this
command.
3.5.2. Responses
223 n a article retrieved - request text separately
(n = article number, a = unique article id)
412 no newsgroup selected
420 no current article has been selected
422 no previous article in this group
*)
function TIdNNTP.Previous: Boolean;
begin
Result := SendCmd('LAST', [223, 422]) = 223; {do not localize}
end;
function TIdNNTP.SelectArticle(AMsgNo: Integer): Boolean;
begin
Result := SendCmd('STAT ' + IntToStr(AMsgNo), [223, 423]) = 223; {do not localize}
end;
procedure TIdNNTP.GetNewsgroupList(AList: TIdStrings);
begin
SendCmd('LIST', 215); {do not localize}
IOHandler.Capture(AList);
end;
procedure TIdNNTP.GetNewGroupsList(ADate: TDateTime; AGMT: boolean;
ADistributions: string; AList: TIdStrings);
begin
SendCmd('NEWGROUPS ' + ConvertDateTimeDist(ADate, AGMT, ADistributions), 231); {do not localize}
IOHandler.Capture(AList);
end;
procedure TIdNNTP.GetNewNewsList(ANewsgroups: string; ADate: TDateTime;
AGMT: boolean; ADistributions: string; AList: TIdStrings);
begin
SendCmd('NEWNEWS ' + ANewsgroups + ' ' + ConvertDateTimeDist(ADate, AGMT, ADistributions), 230); {do not localize}
IOHandler.Capture(AList);
end;
function TIdNNTP.ConvertDateTimeDist(ADate: TDateTime; AGMT: boolean;
ADistributions: string): string;
begin
Result := FormatDateTime('yymmdd hhnnss', ADate); {do not localize}
if AGMT then begin
Result:= Result + ' GMT'; {do not localize}
end;
if Length(ADistributions) > 0 then begin
Result := ' <' + ADistributions + '>';
end;
end;
(*
3.1. The ARTICLE, BODY, HEAD, and STAT commands
There are two forms to the ARTICLE command (and the related BODY,
HEAD, and STAT commands), each using a different method of specifying
which article is to be retrieved. When the ARTICLE command is
followed by a message-id in angle brackets ("<" and ">"), the first
form of the command is used; when a numeric parameter or no parameter
is supplied, the second form is invoked.
The text of the article is returned as a textual response, as
described earlier in this document.
The HEAD and BODY commands are identical to the ARTICLE command
except that they respectively return only the header lines or text
body of the article.
The STAT command is similar to the ARTICLE command except that no
text is returned. When selecting by message number within a group,
the STAT command serves to set the current article pointer without
sending text. The returned acknowledgement response will contain the
message-id, which may be of some value. Using the STAT command to
select by message-id is valid but of questionable value, since a
selection by message-id does NOT alter the "current article pointer".
3.1.1. ARTICLE (selection by message-id)
ARTICLE <message-id>
Display the header, a blank line, then the body (text) of the
specified article. Message-id is the message id of an article as
shown in that article's header. It is anticipated that the client
will obtain the message-id from a list provided by the NEWNEWS
command, from references contained within another article, or from
the message-id provided in the response to some other commands.
Please note that the internally-maintained "current article pointer"
is NOT ALTERED by this command. This is both to facilitate the
presentation of articles that may be referenced within an article
being read, and because of the semantic difficulties of determining
the proper sequence and membership of an article which may have been
posted to more than one newsgroup.
3.1.2. ARTICLE (selection by number)
ARTICLE [nnn]
Displays the header, a blank line, then the body (text) of the
current or specified article. The optional parameter nnn is the
numeric id of an article in the current newsgroup and must be chosen
from the range of articles provided when the newsgroup was selected.
If it is omitted, the current article is assumed.
The internally-maintained "current article pointer" is set by this
command if a valid article number is specified.
[the following applies to both forms of the article command.] A
response indicating the current article number, a message-id string,
and that text is to follow will be returned.
The message-id string returned is an identification string contained
within angle brackets ("<" and ">"), which is derived from the header
of the article itself. The Message-ID header line (required by
RFC850) from the article must be used to supply this information. If
the message-id header line is missing from the article, a single
digit "0" (zero) should be supplied within the angle brackets.
Since the message-id field is unique with each article, it may be
used by a news reading program to skip duplicate displays of articles
that have been posted more than once, or to more than one newsgroup.
3.1.3. Responses
220 n <a> article retrieved - head and body follow
(n = article number, <a> = message-id)
221 n <a> article retrieved - head follows
222 n <a> article retrieved - body follows
223 n <a> article retrieved - request text separately
412 no newsgroup has been selected
420 no current article has been selected
423 no such article number in this group
430 no such article found
*)
function TIdNNTP.GetArticle(AMsg: TIdMessage): Boolean;
begin
Result := True;
SendCmd('ARTICLE', 220); {do not localize}
AMsg.Clear;
//Don't call ReceiveBody if the message ended at the end of the headers
//(ReceiveHeader() would have returned '.' in that case)...
if ReceiveHeader(AMsg) = '' then begin
ReceiveBody(AMsg);
end;
end;
function TIdNNTP.GetArticle(AMsgNo: Integer; AMsg: TIdMessage): Boolean;
begin
Result := SendCmd('ARTICLE ' + IntToStr(AMsgNo), [220, 423]) = 220; {do not localize}
if Result then begin
AMsg.Clear;
//Don't call ReceiveBody if the message ended at the end of the headers
//(ReceiveHeader() would have returned '.' in that case)...
if ReceiveHeader(AMsg) = '' then begin
ReceiveBody(AMsg);
end;
end;
end;
function TIdNNTP.GetArticle(AMsgID: string; AMsg: TIdMessage): Boolean;
begin
Result := SendCmd('ARTICLE ' + EnsureMsgIDBrackets(AMsgID), [220, 430]) = 220; {do not localize}
if Result then begin
AMsg.Clear;
//Don't call ReceiveBody if the message ended at the end of the headers
//(ReceiveHeader() would have returned '.' in that case)...
if ReceiveHeader(AMsg) = '' then begin
ReceiveBody(AMsg);
end;
end;
end;
function TIdNNTP.GetArticle(AMsg: TIdStrings): Boolean;
begin
Result := True;
SendCmd('ARTICLE', 220); {do not localize}
AMsg.Clear;
IOHandler.Capture(AMsg);
end;
function TIdNNTP.GetArticle(AMsgNo: Integer; AMsg: TIdStrings): Boolean;
begin
Result := SendCmd('ARTICLE ' + IntToStr(AMsgNo), [220, 423]) = 220; {do not localize}
if Result then begin
AMsg.Clear;
IOHandler.Capture(AMsg);
end;
end;
function TIdNNTP.GetArticle(AMsgID: string; AMsg: TIdStrings): Boolean;
begin
Result := SendCmd('ARTICLE ' + EnsureMsgIDBrackets(AMsgID), [220, 430]) = 220; {do not localize}
if Result then begin
AMsg.Clear;
IOHandler.Capture(AMsg);
end;
end;
function TIdNNTP.GetArticle(AMsg: TStream): Boolean;
begin
Result := True;
SendCmd('ARTICLE', 220); {do not localize}
IOHandler.Capture(AMsg);
end;
function TIdNNTP.GetArticle(AMsgNo: Integer; AMsg: TStream): Boolean;
begin
Result := SendCmd('ARTICLE ' + IntToStr(AMsgNo), [220, 423]) = 220; {do not localize}
if Result then begin
IOHandler.Capture(AMsg);
end;
end;
function TIdNNTP.GetArticle(AMsgID: string; AMsg: TStream): Boolean;
begin
Result := SendCmd('ARTICLE ' + EnsureMsgIDBrackets(AMsgID), [220, 430]) = 220; {do not localize}
if Result then begin
IOHandler.Capture(AMsg);
end;
end;
function TIdNNTP.GetBody(AMsg: TIdMessage): Boolean;
begin
Result := True;
if Result then begin
SendCmd('BODY', 222); {do not localize}
AMsg.Clear;
ReceiveBody(AMsg);
end;
end;
function TIdNNTP.GetBody(AMsgNo: Integer; AMsg: TIdMessage): Boolean;
begin
Result := SendCmd('BODY ' + IntToStr(AMsgNo), [222, 423]) = 222; {do not localize}
if Result then begin
AMsg.Clear;
ReceiveBody(AMsg);
end;
end;
function TIdNNTP.GetBody(AMsgID: string; AMsg: TIdMessage): Boolean;
begin
Result := SendCmd('BODY ' + EnsureMsgIDBrackets(AMsgID), [222, 430]) = 222; {do not localize}
if Result then begin
AMsg.Clear;
ReceiveBody(AMsg);
end;
end;
function TIdNNTP.GetBody(AMsg: TIdStrings): Boolean;
begin
Result := True;
SendCmd('BODY', 222); {do not localize}
AMsg.Clear;
IOHandler.Capture(AMsg);
end;
function TIdNNTP.GetBody(AMsgNo: Integer; AMsg: TIdStrings): Boolean;
begin
Result := SendCmd('BODY ' + IntToStr(AMsgNo), [222, 423]) = 222; {do not localize}
if Result then begin
AMsg.Clear;
IOHandler.Capture(AMsg);
end;
end;
function TIdNNTP.GetBody(AMsgID: string; AMsg: TIdStrings): Boolean;
begin
Result := SendCmd('BODY ' + EnsureMsgIDBrackets(AMsgID), [222, 430]) = 222; {do not localize}
if Result then begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -